no

{{$:/language/OfficialPluginLibrary/Hint}}
show
hide
show
show
show
hide
show
show
hide
{
    "tiddlers": {
        "$:/Acknowledgements": {
            "title": "$:/Acknowledgements",
            "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 (c) 2004-2007, Jeremy Ruston\nCopyright (c) 2007-2021, UnaMesa Association\nAll rights reserved.\n\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 notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
        },
        "$:/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/add-comment": {
            "title": "$:/core/images/add-comment",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-add-comment tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 56H36a8 8 0 100 16h20v20a8 8 0 1016 0V72h20a8 8 0 100-16H72V36a8 8 0 10-16 0v20zm-12.595 58.362c-6.683 7.659-20.297 12.903-36.006 12.903-2.196 0-4.35-.102-6.451-.3 9.652-3.836 17.356-12.24 21.01-22.874C8.516 94.28 0 79.734 0 63.5 0 33.953 28.206 10 63 10s63 23.953 63 53.5S97.794 117 63 117c-6.841 0-13.428-.926-19.595-2.638z\"/></svg>"
        },
        "$:/core/images/advanced-search-button": {
            "title": "$:/core/images/advanced-search-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-advanced-search-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M74.565 87.985A47.776 47.776 0 0148 96C21.49 96 0 74.51 0 48S21.49 0 48 0s48 21.49 48 48c0 9.854-2.97 19.015-8.062 26.636l34.347 34.347a9.443 9.443 0 010 13.36 9.446 9.446 0 01-13.36 0l-34.36-34.358zM48 80c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/><circle cx=\"48\" cy=\"48\" r=\"8\"/><circle cx=\"28\" cy=\"48\" r=\"8\"/><circle cx=\"68\" cy=\"48\" r=\"8\"/></g></svg>"
        },
        "$:/core/images/auto-height": {
            "title": "$:/core/images/auto-height",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-auto-height tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M67.987 114.356l-.029-14.477a4 4 0 00-2.067-3.494l-15.966-8.813-1.933 7.502H79.9c4.222 0 5.564-5.693 1.786-7.58L49.797 71.572 48.01 79.15h31.982c4.217 0 5.564-5.682 1.795-7.575L49.805 55.517l-1.795 7.575h31.982c4.212 0 5.563-5.67 1.805-7.57l-16.034-8.105 2.195 3.57V35.614l9.214 9.213a4 4 0 105.656-5.656l-16-16a4 4 0 00-5.656 0l-16 16a4 4 0 105.656 5.656l9.13-9.13v15.288a4 4 0 002.195 3.57l16.035 8.106 1.804-7.57H48.01c-4.217 0-5.564 5.682-1.795 7.574l31.982 16.059 1.795-7.575H48.01c-4.222 0-5.564 5.693-1.787 7.579l31.89 15.923 1.787-7.578H47.992c-4.133 0-5.552 5.504-1.933 7.501l15.966 8.813-2.067-3.494.029 14.436-9.159-9.158a4 4 0 00-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656l-9.185 9.184zM16 20h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"
        },
        "$:/core/images/blank": {
            "title": "$:/core/images/blank",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-blank tc-image-button\" viewBox=\"0 0 128 128\"/>"
        },
        "$:/core/images/bold": {
            "title": "$:/core/images/bold",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-bold tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.146 51.81V21.87h26.353c2.51 0 4.93.21 7.26.628 2.33.418 4.392 1.165 6.185 2.24 1.793 1.076 3.227 2.57 4.302 4.482 1.076 1.913 1.614 4.363 1.614 7.35 0 5.379-1.613 9.263-4.84 11.653-3.227 2.39-7.35 3.586-12.37 3.586H41.146zM13 0v128h62.028a65.45 65.45 0 0016.762-2.151c5.438-1.434 10.278-3.645 14.52-6.633 4.244-2.988 7.62-6.842 10.13-11.563 2.51-4.721 3.764-10.308 3.764-16.762 0-8.008-1.942-14.85-5.826-20.527-3.884-5.677-9.77-9.65-17.658-11.921 5.737-2.75 10.069-6.275 12.997-10.577 2.928-4.303 4.392-9.681 4.392-16.135 0-5.976-.986-10.995-2.958-15.059-1.972-4.063-4.75-7.32-8.336-9.77-3.585-2.45-7.888-4.213-12.907-5.289C84.888.538 79.33 0 73.235 0H13zm28.146 106.129V70.992H71.8c6.095 0 10.995 1.404 14.7 4.212 3.705 2.81 5.558 7.5 5.558 14.073 0 3.347-.568 6.096-1.703 8.247-1.136 2.151-2.66 3.854-4.572 5.11-1.912 1.254-4.123 2.15-6.633 2.688-2.51.538-5.139.807-7.888.807H41.146z\"/></svg>"
        },
        "$:/core/images/cancel-button": {
            "title": "$:/core/images/cancel-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-cancel-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 76.314l-16.97 16.97a7.999 7.999 0 01-11.314 0c-3.118-3.118-3.124-8.19 0-11.313L52.686 65l-16.97-16.97a7.999 7.999 0 010-11.314c3.118-3.118 8.19-3.124 11.313 0L64 53.686l16.97-16.97a7.999 7.999 0 0111.314 0c3.118 3.118 3.124 8.19 0 11.313L75.314 65l16.97 16.97a7.999 7.999 0 010 11.314c-3.118 3.118-8.19 3.124-11.313 0L64 76.314zM64 129c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 1 0 29.654 0 65c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 17 64 17 16 38.49 16 65s21.49 48 48 48z\"/></svg>"
        },
        "$:/core/images/chevron-down": {
            "title": "$:/core/images/chevron-down",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-down tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.053 85.456a7.889 7.889 0 01-5.6-2.316L2.473 27.16a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0L64.05 66.344l50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.105 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.317z\"/><path d=\"M64.053 124.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></g></svg>"
        },
        "$:/core/images/chevron-left": {
            "title": "$:/core/images/chevron-left",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M47.544 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L66.656 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.105 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.317-5.595z\"/><path d=\"M8.931 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L28.041 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.104 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.316-5.595z\"/></g></svg>"
        },
        "$:/core/images/chevron-right": {
            "title": "$:/core/images/chevron-right",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-right tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M83.456 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196L64.344 63.95 13.963 13.567a7.92 7.92 0 010-11.195c3.086-3.085 8.105-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.317 5.595z\"/><path d=\"M122.069 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></g></svg>"
        },
        "$:/core/images/chevron-up": {
            "title": "$:/core/images/chevron-up",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-up tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M63.947 44.544c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 63.656l-50.382 50.382a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.317z\"/><path d=\"M63.947 5.931c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 25.041 13.567 75.423a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.104 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.316z\"/></g></svg>"
        },
        "$:/core/images/clone-button": {
            "title": "$:/core/images/clone-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-clone-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M32.265 96v24.002A7.996 7.996 0 0040.263 128h79.74a7.996 7.996 0 007.997-7.998v-79.74a7.996 7.996 0 00-7.998-7.997H96V48h12.859a2.99 2.99 0 012.994 2.994v57.865a2.99 2.99 0 01-2.994 2.994H50.994A2.99 2.99 0 0148 108.859V96H32.265z\"/><path d=\"M40 56h-7.993C27.588 56 24 52.418 24 48c0-4.41 3.585-8 8.007-8H40v-7.993C40 27.588 43.582 24 48 24c4.41 0 8 3.585 8 8.007V40h7.993C68.412 40 72 43.582 72 48c0 4.41-3.585 8-8.007 8H56v7.993C56 68.412 52.418 72 48 72c-4.41 0-8-3.585-8-8.007V56zM8 0C3.58 0 0 3.588 0 8v80c0 4.419 3.588 8 8 8h80c4.419 0 8-3.588 8-8V8c0-4.419-3.588-8-8-8H8zM19 16A2.997 2.997 0 0016 19.001v57.998A2.997 2.997 0 0019.001 80h57.998A2.997 2.997 0 0080 76.999V19.001A2.997 2.997 0 0076.999 16H19.001z\"/></g></svg>"
        },
        "$:/core/images/close-all-button": {
            "title": "$:/core/images/close-all-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-close-all-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M28 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L16.686 100 2.543 85.856a8 8 0 0111.313-11.313L28 88.686l14.144-14.143a8 8 0 0111.313 11.313L39.314 100l14.143 14.144a8 8 0 01-11.313 11.313L28 111.314zM28 39.314L13.856 53.457A8 8 0 012.543 42.144L16.686 28 2.543 13.856A8 8 0 0113.856 2.543L28 16.686 42.144 2.543a8 8 0 0111.313 11.313L39.314 28l14.143 14.144a8 8 0 01-11.313 11.313L28 39.314zM100 39.314L85.856 53.457a8 8 0 01-11.313-11.313L88.686 28 74.543 13.856A8 8 0 0185.856 2.543L100 16.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 28l14.143 14.144a8 8 0 01-11.313 11.313L100 39.314zM100 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L88.686 100 74.543 85.856a8 8 0 0111.313-11.313L100 88.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 100l14.143 14.144a8 8 0 01-11.313 11.313L100 111.314z\"/></g></svg>"
        },
        "$:/core/images/close-button": {
            "title": "$:/core/images/close-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M65.086 75.41l-50.113 50.113c-3.121 3.121-8.192 3.126-11.316.002-3.118-3.118-3.123-8.19.002-11.316l50.114-50.114L3.659 13.982C.538 10.86.533 5.79 3.657 2.666c3.118-3.118 8.19-3.123 11.316.002l50.113 50.114L115.2 2.668c3.121-3.121 8.192-3.126 11.316-.002 3.118 3.118 3.123 8.19-.002 11.316L76.4 64.095l50.114 50.114c3.121 3.121 3.126 8.192.002 11.316-3.118 3.118-8.19 3.123-11.316-.002L65.086 75.409z\"/></svg>"
        },
        "$:/core/images/close-others-button": {
            "title": "$:/core/images/close-others-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-others-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48zm0-16c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32zm0-16c8.837 0 16-7.163 16-16s-7.163-16-16-16-16 7.163-16 16 7.163 16 16 16z\"/></svg>"
        },
        "$:/core/images/copy-clipboard": {
            "title": "$:/core/images/copy-clipboard",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-copy-clipboard tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"33\" height=\"8\" x=\"40\" y=\"40\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"82\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"54\" rx=\"4\"/><rect width=\"33\" height=\"8\" x=\"40\" y=\"96\" rx=\"4\"/><rect width=\"12\" height=\"8\" x=\"40\" y=\"68\" rx=\"4\"/><path d=\"M40 16H24c-4.419 0-8 3.59-8 8a8.031 8.031 0 000 .01v95.98a8.03 8.03 0 000 .01c0 4.41 3.581 8 8 8h80a7.975 7.975 0 005.652-2.34 7.958 7.958 0 002.348-5.652v-16.016c0-4.414-3.582-7.992-8-7.992-4.41 0-8 3.578-8 7.992V112H32V32h64v8.008C96 44.422 99.582 48 104 48c4.41 0 8-3.578 8-7.992V23.992a7.963 7.963 0 00-2.343-5.651A7.995 7.995 0 00104.001 16H88c0-4.41-3.585-8-8.007-8H48.007C43.588 8 40 11.582 40 16zm4-1.004A4.001 4.001 0 0148 11h32c2.21 0 4 1.797 4 3.996v4.008A4.001 4.001 0 0180 23H48c-2.21 0-4-1.797-4-3.996v-4.008z\"/><rect width=\"66\" height=\"16\" x=\"62\" y=\"64\" rx=\"8\"/><path d=\"M84.657 82.343l-16-16v11.314l16-16a8 8 0 10-11.314-11.314l-16 16a8 8 0 000 11.314l16 16a8 8 0 1011.314-11.314z\"/></g></svg>"
        },
        "$:/core/images/delete-button": {
            "title": "$:/core/images/delete-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-delete-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(12)\"><rect width=\"105\" height=\"16\" y=\"11\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"28\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"8\" y=\"16\" rx=\"8\"/><rect width=\"88\" height=\"16\" x=\"8\" y=\"112\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"80\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"56\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"32\" y=\"16\" rx=\"8\"/></g></svg>"
        },
        "$:/core/images/done-button": {
            "title": "$:/core/images/done-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-done-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M42.26 111.032c-2.051.001-4.103-.78-5.668-2.345L2.662 74.758a8 8 0 01-.005-11.32c3.118-3.117 8.192-3.12 11.32.007l28.278 28.278 72.124-72.124a8.002 8.002 0 0111.314-.001c3.118 3.118 3.124 8.19 0 11.315l-77.78 77.78a7.978 7.978 0 01-5.658 2.343z\"/></svg>"
        },
        "$:/core/images/down-arrow": {
            "title": "$:/core/images/down-arrow",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-down-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.177 100.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.086 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></svg>"
        },
        "$:/core/images/download-button": {
            "title": "$:/core/images/download-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-download-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\" class=\"tc-image-download-button-ring\"/><path d=\"M34.35 66.43l26.892 27.205a4.57 4.57 0 006.516 0L94.65 66.43a4.7 4.7 0 000-6.593 4.581 4.581 0 00-3.258-1.365h-8.46c-2.545 0-4.608-2.087-4.608-4.661v-15.15c0-2.575-2.063-4.662-4.608-4.662H55.284c-2.545 0-4.608 2.087-4.608 4.662v15.15c0 2.574-2.063 4.661-4.608 4.661h-8.46c-2.545 0-4.608 2.087-4.608 4.662a4.69 4.69 0 001.35 3.296z\"/></g></svg>"
        },
        "$:/core/images/edit-button": {
            "title": "$:/core/images/edit-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-edit-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M95.627 10.059l-5.656 5.657 11.313 11.313 5.657-5.656-11.314-11.314zm5.657-5.657l1.966-1.966c3.123-3.122 8.194-3.129 11.319-.005 3.117 3.118 3.122 8.192-.005 11.32l-1.966 1.965-11.314-11.314zm-16.97 16.97l-60.25 60.25a8.12 8.12 0 00-.322.342c-.1.087-.198.179-.295.275-5.735 5.735-10.702 22.016-10.702 22.016s16.405-5.09 22.016-10.702c.095-.096.186-.193.272-.292a8.12 8.12 0 00.345-.325l60.25-60.25-11.314-11.313zM35.171 124.19c6.788-.577 13.898-2.272 23.689-5.348 1.825-.573 3.57-1.136 6.336-2.04 16-5.226 21.877-6.807 28.745-7.146 8.358-.413 13.854 2.13 17.58 8.699a4 4 0 006.959-3.946c-5.334-9.406-13.745-13.296-24.933-12.744-7.875.39-14.057 2.052-30.835 7.533-2.739.894-4.46 1.45-6.25 2.012-19.46 6.112-30.77 7.072-39.597 1.747a4 4 0 10-4.132 6.85c6.333 3.82 13.754 5.12 22.438 4.383z\"/></g></svg>"
        },
        "$:/core/images/erase": {
            "title": "$:/core/images/erase",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-erase tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.087 127.996l63.015-63.015c6.535-6.535 6.528-17.115-.003-23.646L99.466 17.702c-6.539-6.538-17.117-6.532-23.646-.003L4.898 88.62c-6.535 6.534-6.528 17.115.003 23.646l15.73 15.73h39.456zm-34.95-7.313l-14.324-14.325c-3.267-3.268-3.268-8.564-.008-11.824L46.269 59.07l35.462 35.462-26.15 26.15H25.137z\"/></svg>"
        },
        "$:/core/images/excise": {
            "title": "$:/core/images/excise",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-excise tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 107.314l-2.343 2.343a8 8 0 11-11.314-11.314l16-16a8 8 0 0111.314 0l16 16a8 8 0 11-11.314 11.314L72 107.314v14.284c0 3.536-3.582 6.402-8 6.402s-8-2.866-8-6.402v-14.284zM0 40.007C0 35.585 3.59 32 8 32c4.418 0 8 3.588 8 8.007v31.986C16 76.415 12.41 80 8 80c-4.418 0-8-3.588-8-8.007V40.007zm32 0C32 35.585 35.59 32 40 32c4.418 0 8 3.588 8 8.007v31.986C48 76.415 44.41 80 40 80c-4.418 0-8-3.588-8-8.007V40.007zm48 0C80 35.585 83.59 32 88 32c4.418 0 8 3.588 8 8.007v31.986C96 76.415 92.41 80 88 80c-4.418 0-8-3.588-8-8.007V40.007zm-24-32C56 3.585 59.59 0 64 0c4.418 0 8 3.588 8 8.007v31.986C72 44.415 68.41 48 64 48c-4.418 0-8-3.588-8-8.007V8.007zm56 32c0-4.422 3.59-8.007 8-8.007 4.418 0 8 3.588 8 8.007v31.986c0 4.422-3.59 8.007-8 8.007-4.418 0-8-3.588-8-8.007V40.007z\"/></svg>"
        },
        "$:/core/images/export-button": {
            "title": "$:/core/images/export-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-export-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.003 128H119.993a7.984 7.984 0 005.664-2.349v.007A7.975 7.975 0 00128 120V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v56H16V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v64c0 4.418 3.59 8 8 8h.003zm48.62-100.689l-8.965 8.966c-3.125 3.125-8.195 3.13-11.319.005-3.118-3.118-3.122-8.192.005-11.319L58.962 2.346A7.986 7.986 0 0164.625 0l-.006.002c2.05-.001 4.102.78 5.666 2.344l22.618 22.617c3.124 3.125 3.129 8.195.005 11.319-3.118 3.118-8.192 3.122-11.319-.005l-8.965-8.966v61.256c0 4.411-3.582 8-8 8-4.41 0-8-3.582-8-8V27.311z\"/></svg>"
        },
        "$:/core/images/file": {
            "title": "$:/core/images/file",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-file tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M111.968 30.5H112V120a8 8 0 01-8 8H24a8 8 0 01-8-8V8a8 8 0 018-8h57v.02a7.978 7.978 0 015.998 2.337l22.627 22.627a7.975 7.975 0 012.343 5.516zM81 8H24v112h80V30.5H89c-4.418 0-8-3.578-8-8V8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"68\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"84\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"100\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/></svg>"
        },
        "$:/core/images/fixed-height": {
            "title": "$:/core/images/fixed-height",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fixed-height tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60 35.657l-9.172 9.171a4 4 0 11-5.656-5.656l16-16a4 4 0 015.656 0l16 16a4 4 0 01-5.656 5.656L68 35.657v57.686l9.172-9.171a4 4 0 115.656 5.656l-16 16a4 4 0 01-5.656 0l-16-16a4 4 0 115.656-5.656L60 93.343V35.657zM16 116h96a4 4 0 100-8H16a4 4 0 100 8zm0-96h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"
        },
        "$:/core/images/fold-all-button": {
            "title": "$:/core/images/fold-all-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M64.03 20.004c-2.05 0-4.102.78-5.667 2.344L35.746 44.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 22.348a7.986 7.986 0 00-5.663-2.346zM64.03 85.002c-2.05-.001-4.102.78-5.667 2.344l-22.617 22.617c-3.125 3.125-3.13 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.966 16.966 16.966c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.192-.005-11.319L69.687 87.346A7.986 7.986 0 0064.024 85z\"/></g></svg>"
        },
        "$:/core/images/fold-button": {
            "title": "$:/core/images/fold-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M64.03 25.004c-2.05 0-4.102.78-5.667 2.344L35.746 49.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 27.348a7.986 7.986 0 00-5.663-2.346zM64.005 67.379c-2.05 0-4.102.78-5.666 2.344L35.722 92.34c-3.125 3.125-3.13 8.195-.006 11.32 3.118 3.117 8.192 3.121 11.32-.006L64 86.69l16.965 16.965c3.125 3.125 8.195 3.13 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L69.663 69.723A7.986 7.986 0 0064 67.377z\"/></g></svg>"
        },
        "$:/core/images/fold-others-button": {
            "title": "$:/core/images/fold-others-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-others tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" y=\"56.031\" rx=\"8\"/><path d=\"M86.632 79.976c-2.05 0-4.102.78-5.666 2.345L64 99.286 47.034 82.321a7.986 7.986 0 00-5.662-2.346l.005.001c-2.05 0-4.102.78-5.666 2.345l-22.618 22.617c-3.124 3.125-3.129 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.966-16.966 16.965 16.966a7.986 7.986 0 005.663 2.346l-.005-.002c2.05 0 4.102-.78 5.666-2.344l16.965-16.966 16.966 16.966c3.125 3.124 8.194 3.129 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L92.289 82.321a7.986 7.986 0 00-5.663-2.346zM86.7 48.024c-2.05 0-4.102-.78-5.666-2.345L64.07 28.714 47.103 45.679a7.986 7.986 0 01-5.663 2.346l.005-.001c-2.05 0-4.101-.78-5.666-2.345L13.162 23.062c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L41.44 28.714l16.966-16.966a7.986 7.986 0 015.662-2.346l-.005.002c2.05 0 4.102.78 5.666 2.344l16.966 16.966 16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L92.358 45.679a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
        },
        "$:/core/images/folder": {
            "title": "$:/core/images/folder",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-folder tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.694 128H8C3.58 128 0 124.414 0 119.996V48.004C0 43.584 3.584 40 7.999 40H16v-8c0-4.418 3.578-8 8-8h32a8 8 0 018 8v8h40.001c4.418 0 7.999 3.586 7.999 8.004V59.83l-8-.082v-7.749A4 4 0 0099.997 48H56V36c0-2.21-1.793-4-4.004-4H28.004A4 4 0 0024 36v12H12.003A4 4 0 008 52v64a4 4 0 004.003 4h46.76l-3.069 8z\"/><path d=\"M23.873 55.5h96.003c4.417 0 7.004 4.053 5.774 9.063l-13.344 54.374c-1.228 5.005-5.808 9.063-10.223 9.063H6.08c-4.417 0-7.003-4.053-5.774-9.063L13.65 64.563c1.228-5.005 5.808-9.063 10.223-9.063zm1.78 8.5h87.994c2.211 0 3.504 2.093 2.891 4.666l-11.12 46.668c-.614 2.577-2.902 4.666-5.115 4.666H12.31c-2.211 0-3.504-2.093-2.891-4.666l11.12-46.668C21.152 66.09 23.44 64 25.653 64z\"/></g></svg>"
        },
        "$:/core/images/full-screen-button": {
            "title": "$:/core/images/full-screen-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-full-screen-button tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 8a8 8 0 018-8h32a8 8 0 110 16H16v24a8 8 0 11-16 0V8zM128 120a8 8 0 01-8 8H88a8 8 0 110-16h24V88a8 8 0 1116 0v32zM8 128a8 8 0 01-8-8V88a8 8 0 1116 0v24h24a8 8 0 110 16H8zM120 0a8 8 0 018 8v32a8 8 0 11-16 0V16H88a8 8 0 110-16h32z\"/></svg>"
        },
        "$:/core/images/github": {
            "title": "$:/core/images/github",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-github tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M63.938 1.607c-35.336 0-63.994 28.69-63.994 64.084 0 28.312 18.336 52.329 43.768 60.802 3.202.59 4.37-1.388 4.37-3.088 0-1.518-.056-5.55-.087-10.897-17.802 3.871-21.558-8.591-21.558-8.591-2.911-7.404-7.108-9.375-7.108-9.375-5.81-3.973.44-3.895.44-3.895 6.424.453 9.803 6.606 9.803 6.606 5.709 9.791 14.981 6.963 18.627 5.322.582-4.138 2.236-6.963 4.063-8.564-14.211-1.617-29.153-7.117-29.153-31.672 0-6.995 2.495-12.718 6.589-17.195-.66-1.621-2.856-8.14.629-16.96 0 0 5.37-1.722 17.597 6.57 5.104-1.424 10.58-2.132 16.022-2.16 5.438.028 10.91.736 16.022 2.16 12.22-8.292 17.582-6.57 17.582-6.57 3.493 8.82 1.297 15.339.64 16.96 4.102 4.477 6.578 10.2 6.578 17.195 0 24.618-14.966 30.035-29.22 31.62 2.295 1.98 4.342 5.89 4.342 11.87 0 8.564-.079 15.476-.079 17.576 0 1.715 1.155 3.71 4.4 3.084 25.413-8.493 43.733-32.494 43.733-60.798 0-35.394-28.657-64.084-64.006-64.084\"/></svg>"
        },
        "$:/core/images/gitter": {
            "title": "$:/core/images/gitter",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-gitter tc-image-button\" viewBox=\"0 0 18 25\"><path d=\"M15 5h2v10h-2zM10 5h2v20h-2zM5 5h2v20H5zM0 0h2v15H0z\"/></svg>"
        },
        "$:/core/images/globe": {
            "title": "$:/core/images/globe",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-globe tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M72.811 37.128v2.554c0 2.196.978 6.881 0 8.832-1.466 2.928-4.65 3.54-6.394 5.867-1.182 1.577-4.618 10.601-3.69 12.92 3.969 9.922 11.534 3.187 17.962 9.293.864.821 2.887 2.273 3.296 3.296 3.29 8.223-7.576 15.009 3.757 26.3 1.245 1.24 3.813-3.817 4.079-4.614.852-2.563 6.725-5.45 9.088-7.053 2.02-1.37 4.873-2.667 6.328-4.745 2.27-3.244 1.48-7.514 3.098-10.745 2.139-4.274 3.828-9.635 5.998-13.966 3.898-7.781 4.721 2.093 5.067 2.439.358.357 1.011 0 1.517 0 .094 0 1.447.099 1.516 0 .65-.935-1.043-17.92-1.318-19.297-1.404-7.01-6.944-15.781-11.865-20.5-6.274-6.015-7.09-16.197-18.259-14.954-.204.022-5.084 10.148-7.777 13.512-3.728 4.657-2.47-4.153-6.526-4.153-.081 0-1.183-.103-1.253 0-.586.88-1.44 3.896-2.306 4.417-.265.16-1.722-.239-1.846 0-2.243 4.3 8.256 2.212 5.792 7.952-2.352 5.481-6.328-1.997-6.328 8.56M44.467 7.01c9.685 6.13.682 12.198 2.694 16.215 1.655 3.303 4.241 5.395 1.714 9.814-2.063 3.608-6.87 3.966-9.623 6.723-3.04 3.044-5.464 8.94-6.79 12.911-1.617 4.843 14.547 6.866 12.063 11.008-1.386 2.311-6.746 1.466-8.437.198-1.165-.873-3.593-.546-4.417-1.78-2.613-3.915-2.26-8.023-3.625-12.128-.938-2.822-6.313-2.12-7.844-.593-.523.522-.33 1.792-.33 2.505 0 5.285 7.12 3.316 7.12 6.46 0 14.636 3.927 6.534 11.14 11.336 10.036 6.683 7.844 7.303 14.946 14.404 3.673 3.673 7.741 3.686 9.425 9.294 1.602 5.331-9.327 5.339-11.716 7.448-1.123.991-2.813 4.146-4.219 4.615-1.792.598-3.234.496-4.944 1.78-2.427 1.82-3.9 4.932-4.02 4.81-2.148-2.147-3.52-15.479-3.89-18.257-.588-4.42-5.59-5.54-6.986-9.03-1.57-3.927 1.524-9.52-1.129-13.761-6.52-10.424-11.821-14.5-15.35-26.292-.942-3.148 3.342-6.529 4.877-8.833 1.877-2.816 2.662-5.854 4.746-8.635C22.147 24.19 40.855 9.461 43.857 8.635l.61-1.625z\"/><path d=\"M64 126c34.242 0 62-27.758 62-62 0-34.242-27.758-62-62-62C29.758 2 2 29.758 2 64c0 34.242 27.758 62 62 62zm0-6c30.928 0 56-25.072 56-56S94.928 8 64 8 8 33.072 8 64s25.072 56 56 56z\"/></g></svg>"
        },
        "$:/core/images/heading-1": {
            "title": "$:/core/images/heading-1",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-1 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M14 30h13.25v30.104H61.7V30h13.25v75.684H61.7V71.552H27.25v34.132H14V30zm70.335 13.78c2.544 0 5.017-.212 7.42-.636 2.403-.424 4.576-1.13 6.52-2.12 1.942-.99 3.603-2.261 4.981-3.816 1.378-1.555 2.28-3.463 2.703-5.724h9.858v74.2h-13.25V53.32H84.335v-9.54z\"/></svg>"
        },
        "$:/core/images/heading-2": {
            "title": "$:/core/images/heading-2",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-2 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm119.52 75.684H74.85c.07-6.148 1.555-11.519 4.452-16.112 2.897-4.593 6.855-8.586 11.872-11.978a133.725 133.725 0 017.526-5.141 59.6 59.6 0 007.208-5.353c2.19-1.908 3.993-3.975 5.406-6.201 1.413-2.226 2.155-4.788 2.226-7.685 0-1.343-.159-2.774-.477-4.293a11.357 11.357 0 00-1.855-4.24c-.919-1.307-2.19-2.403-3.816-3.286-1.625-.883-3.745-1.325-6.36-1.325-2.403 0-4.399.477-5.989 1.431-1.59.954-2.862 2.261-3.816 3.922-.954 1.66-1.66 3.622-2.12 5.883-.46 2.261-.724 4.7-.795 7.314H76.23c0-4.099.548-7.897 1.643-11.395 1.095-3.498 2.738-6.519 4.93-9.063 2.19-2.544 4.857-4.54 8.002-5.989C93.95 30.724 97.606 30 101.775 30c4.523 0 8.303.742 11.342 2.226 3.039 1.484 5.494 3.357 7.367 5.618 1.873 2.261 3.198 4.717 3.975 7.367.777 2.65 1.166 5.176 1.166 7.579 0 2.968-.46 5.653-1.378 8.056a25.942 25.942 0 01-3.71 6.625 37.5 37.5 0 01-5.3 5.565 79.468 79.468 0 01-6.148 4.77 165.627 165.627 0 01-6.36 4.24 94.28 94.28 0 00-5.883 4.028c-1.802 1.343-3.374 2.738-4.717 4.187-1.343 1.449-2.261 2.986-2.756 4.611h36.146v10.812z\"/></svg>"
        },
        "$:/core/images/heading-3": {
            "title": "$:/core/images/heading-3",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-3 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm88.885 32.224c1.979.07 3.957-.07 5.936-.424 1.979-.353 3.745-.972 5.3-1.855a10.365 10.365 0 003.763-3.657c.954-1.555 1.431-3.463 1.431-5.724 0-3.18-1.078-5.724-3.233-7.632-2.155-1.908-4.929-2.862-8.32-2.862-2.12 0-3.958.424-5.513 1.272a11.318 11.318 0 00-3.869 3.445c-1.025 1.449-1.784 3.074-2.279 4.876a18.335 18.335 0 00-.636 5.565H75.381c.141-3.604.813-6.943 2.014-10.017 1.201-3.074 2.844-5.742 4.93-8.003 2.084-2.261 4.61-4.028 7.578-5.3C92.871 30.636 96.228 30 99.973 30a29.2 29.2 0 018.533 1.272c2.791.848 5.3 2.085 7.526 3.71s4.01 3.692 5.353 6.201c1.343 2.509 2.014 5.388 2.014 8.639 0 3.745-.848 7.014-2.544 9.805-1.696 2.791-4.346 4.823-7.95 6.095v.212c4.24.848 7.544 2.95 9.911 6.307s3.551 7.438 3.551 12.243c0 3.533-.707 6.696-2.12 9.487a21.538 21.538 0 01-5.724 7.102c-2.403 1.943-5.194 3.445-8.374 4.505-3.18 1.06-6.537 1.59-10.07 1.59-4.31 0-8.074-.618-11.289-1.855s-5.9-2.986-8.056-5.247c-2.155-2.261-3.798-4.982-4.929-8.162-1.13-3.18-1.731-6.713-1.802-10.6h12.084c-.141 4.523.972 8.286 3.34 11.289 2.366 3.003 5.917 4.505 10.652 4.505 4.028 0 7.402-1.148 10.123-3.445 2.72-2.297 4.081-5.565 4.081-9.805 0-2.897-.565-5.194-1.696-6.89a10.97 10.97 0 00-4.452-3.869c-1.837-.883-3.904-1.431-6.2-1.643a58.067 58.067 0 00-7.05-.212v-9.01z\"/></svg>"
        },
        "$:/core/images/heading-4": {
            "title": "$:/core/images/heading-4",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-4 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8 30h13.25v30.104H55.7V30h13.25v75.684H55.7V71.552H21.25v34.132H8V30zm76.59 48.548h22.471V45.9h-.212L84.59 78.548zm43.46 9.54h-9.54v17.596H107.06V88.088h-31.8V76.11l31.8-44.626h11.448v47.064h9.54v9.54z\"/></svg>"
        },
        "$:/core/images/heading-5": {
            "title": "$:/core/images/heading-5",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-5 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm77.755 1.484h38.372v10.812H92.765L88.95 61.164l.212.212c1.625-1.837 3.692-3.233 6.201-4.187 2.509-.954 5-1.431 7.473-1.431 3.675 0 6.96.618 9.858 1.855 2.897 1.237 5.335 2.968 7.314 5.194s3.48 4.858 4.505 7.897c1.025 3.039 1.537 6.325 1.537 9.858 0 2.968-.477 6.024-1.43 9.169a25.161 25.161 0 01-4.559 8.586c-2.085 2.58-4.752 4.7-8.003 6.36-3.25 1.66-7.137 2.491-11.66 2.491-3.604 0-6.943-.477-10.017-1.431-3.074-.954-5.777-2.385-8.109-4.293-2.332-1.908-4.187-4.258-5.565-7.049-1.378-2.791-2.138-6.06-2.279-9.805h12.084c.353 4.028 1.731 7.12 4.134 9.275 2.403 2.155 5.583 3.233 9.54 3.233 2.544 0 4.7-.424 6.466-1.272 1.767-.848 3.198-2.014 4.293-3.498 1.095-1.484 1.873-3.215 2.332-5.194.46-1.979.69-4.099.69-6.36 0-2.05-.284-4.01-.849-5.883-.565-1.873-1.413-3.516-2.544-4.929-1.13-1.413-2.597-2.544-4.399-3.392-1.802-.848-3.904-1.272-6.307-1.272-2.544 0-4.929.477-7.155 1.431-2.226.954-3.834 2.738-4.823 5.353H75.805l7.95-40.598z\"/></svg>"
        },
        "$:/core/images/heading-6": {
            "title": "$:/core/images/heading-6",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-6 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm106.587 20.246c-.283-3.039-1.36-5.494-3.233-7.367-1.873-1.873-4.399-2.809-7.579-2.809-2.19 0-4.08.406-5.67 1.219a12.435 12.435 0 00-4.029 3.233c-1.095 1.343-1.979 2.88-2.65 4.611a37.696 37.696 0 00-1.643 5.459 46.08 46.08 0 00-.9 5.671 722.213 722.213 0 00-.478 5.247l.212.212c1.625-2.968 3.87-5.176 6.731-6.625 2.862-1.449 5.954-2.173 9.275-2.173 3.675 0 6.96.636 9.858 1.908 2.897 1.272 5.353 3.021 7.367 5.247 2.014 2.226 3.551 4.858 4.611 7.897 1.06 3.039 1.59 6.325 1.59 9.858 0 3.604-.583 6.943-1.749 10.017-1.166 3.074-2.844 5.76-5.035 8.056-2.19 2.297-4.805 4.081-7.844 5.353-3.039 1.272-6.395 1.908-10.07 1.908-5.441 0-9.91-1.007-13.409-3.021-3.498-2.014-6.254-4.77-8.268-8.268-2.014-3.498-3.41-7.597-4.187-12.296-.777-4.7-1.166-9.77-1.166-15.211 0-4.452.477-8.94 1.431-13.462.954-4.523 2.526-8.639 4.717-12.349 2.19-3.71 5.07-6.731 8.64-9.063C92.676 31.166 97.075 30 102.304 30c2.968 0 5.76.495 8.374 1.484 2.615.99 4.93 2.367 6.943 4.134 2.014 1.767 3.657 3.887 4.93 6.36 1.271 2.473 1.978 5.23 2.12 8.268h-12.085zm-11.66 46.852c2.19 0 4.099-.442 5.724-1.325a12.869 12.869 0 004.081-3.445c1.095-1.413 1.908-3.056 2.438-4.929.53-1.873.795-3.798.795-5.777s-.265-3.887-.795-5.724c-.53-1.837-1.343-3.445-2.438-4.823-1.095-1.378-2.456-2.491-4.08-3.339-1.626-.848-3.534-1.272-5.725-1.272-2.19 0-4.116.406-5.777 1.219-1.66.813-3.056 1.908-4.187 3.286-1.13 1.378-1.979 2.986-2.544 4.823-.565 1.837-.848 3.78-.848 5.83 0 2.05.283 3.993.848 5.83.565 1.837 1.413 3.48 2.544 4.929a12.39 12.39 0 004.187 3.445c1.66.848 3.586 1.272 5.777 1.272z\"/></svg>"
        },
        "$:/core/images/help": {
            "title": "$:/core/images/help",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-help tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M36.055 111.441c-5.24 4.396-15.168 7.362-26.555 7.362-1.635 0-3.24-.06-4.806-.179 7.919-2.64 14.062-8.6 16.367-16.014C8.747 92.845 1.05 78.936 1.05 63.5c0-29.547 28.206-53.5 63-53.5s63 23.953 63 53.5-28.206 53.5-63 53.5c-10.055 0-19.56-2-27.994-5.559zm35.35-33.843a536.471 536.471 0 00.018-4.682 199.02 199.02 0 00-.023-3.042c.008-1.357.595-2.087 3.727-4.235.112-.077 1.085-.74 1.386-.948 3.093-2.133 5.022-3.786 6.762-6.187 2.34-3.228 3.558-7.077 3.558-11.649 0-13.292-9.86-21.952-21.455-21.952-11.103 0-22.499 9.609-24.066 22.295a6.023 6.023 0 1011.956 1.477c.806-6.527 6.972-11.726 12.11-11.726 5.265 0 9.408 3.64 9.408 9.906 0 3.634-1.1 5.153-5.111 7.919l-1.362.93c-2.682 1.84-4.227 3.1-5.7 4.931-2.109 2.62-3.242 5.717-3.258 9.314.013.892.02 1.86.022 2.981a470.766 470.766 0 01-.022 4.943 6.023 6.023 0 1012.046.12l.003-.395zm-6.027 24.499a7.529 7.529 0 100-15.058 7.529 7.529 0 000 15.058z\"/></svg>"
        },
        "$:/core/images/home-button": {
            "title": "$:/core/images/home-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-home-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112.985 119.502c.01-.165.015-.331.015-.499V67.568c3.137 2.948 8.076 2.884 11.134-.174a7.999 7.999 0 00-.002-11.316L70.396 2.343A7.978 7.978 0 0064.734 0a7.957 7.957 0 00-5.656 2.343L33 28.42V8.007C33 3.585 29.41 0 25 0c-4.418 0-8 3.59-8 8.007V44.42L5.342 56.078c-3.125 3.125-3.12 8.198-.002 11.316a7.999 7.999 0 0011.316-.003l.344-.343v52.945a8.11 8.11 0 000 .007c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8a8.11 8.11 0 00-.015-.498zM97 112V51.574L64.737 19.31 33 51.048V112h64z\"/></svg>"
        },
        "$:/core/images/import-button": {
            "title": "$:/core/images/import-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-import-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M114.832 60.436s3.235-3.27 6.921.417c3.686 3.686.231 7.14.231 7.14l-42.153 42.92s-30.765 32.367-58.798 4.333C-7 87.213 24.59 55.623 24.59 55.623L67.363 12.85s22.725-24.6 43.587-3.738c20.862 20.862-3.96 43.09-3.96 43.09l-35.04 35.04S49.903 112.546 36.426 99.07c-13.476-13.477 11.83-35.523 11.83-35.523l35.04-35.04s3.902-3.902 7.78-.023c3.879 3.878.118 7.921.118 7.921l-35.04 35.04s-13.212 13.212-8.872 17.551c4.34 4.34 16.77-9.653 16.77-9.653l35.04-35.04s16.668-14.598 3.966-27.3c-13.893-13.892-27.565 3.702-27.565 3.702l-42.91 42.91s-23.698 23.698-3.658 43.738 43.012-4.385 43.012-4.385l42.895-42.533z\"/></svg>"
        },
        "$:/core/images/info-button": {
            "title": "$:/core/images/info-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-info-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(.05)\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\"/><circle cx=\"64\" cy=\"32\" r=\"8\"/><rect width=\"16\" height=\"56\" x=\"56\" y=\"48\" rx=\"8\"/></g></svg>"
        },
        "$:/core/images/italic": {
            "title": "$:/core/images/italic",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-italic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M66.711 0h22.41L62.408 128H40z\"/></svg>"
        },
        "$:/core/images/left-arrow": {
            "title": "$:/core/images/left-arrow",
            "created": "20150315234410875",
            "modified": "20150315235324760",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-left-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 64.177c0-2.026.771-4.054 2.317-5.6l55.98-55.98a7.92 7.92 0 0111.195.001c3.086 3.085 3.092 8.104.001 11.195L19.111 64.175l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.086-8.105 3.092-11.196.001l-55.98-55.98A7.892 7.892 0 010 64.177z\"/></svg>"
        },
        "$:/core/images/line-width": {
            "title": "$:/core/images/line-width",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-line-width tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M16 18h96a2 2 0 000-4H16a2 2 0 100 4zm0 17h96a4 4 0 100-8H16a4 4 0 100 8zm0 21h96a6 6 0 000-12H16a6 6 0 100 12zm0 29h96c5.523 0 10-4.477 10-10s-4.477-10-10-10H16c-5.523 0-10 4.477-10 10s4.477 10 10 10zm0 43h96c8.837 0 16-7.163 16-16s-7.163-16-16-16H16c-8.837 0-16 7.163-16 16s7.163 16 16 16z\"/></svg>"
        },
        "$:/core/images/link": {
            "title": "$:/core/images/link",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-link tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M42.263 69.38a31.919 31.919 0 006.841 10.13c12.5 12.5 32.758 12.496 45.255 0l22.627-22.628c12.502-12.501 12.497-32.758 0-45.255-12.5-12.5-32.758-12.496-45.254 0L49.104 34.255a32.333 32.333 0 00-2.666 3.019 36.156 36.156 0 0121.94.334l14.663-14.663c6.25-6.25 16.382-6.254 22.632-.004 6.248 6.249 6.254 16.373-.004 22.631l-22.62 22.62c-6.25 6.25-16.381 6.254-22.631.004a15.93 15.93 0 01-4.428-8.433 11.948 11.948 0 00-7.59 3.48l-6.137 6.137z\"/><path d=\"M86.35 59.234a31.919 31.919 0 00-6.84-10.13c-12.5-12.5-32.758-12.497-45.255 0L11.627 71.732c-12.501 12.5-12.496 32.758 0 45.254 12.5 12.5 32.758 12.497 45.255 0L79.51 94.36a32.333 32.333 0 002.665-3.02 36.156 36.156 0 01-21.94-.333l-14.663 14.663c-6.25 6.25-16.381 6.253-22.63.004-6.25-6.249-6.255-16.374.003-22.632l22.62-22.62c6.25-6.25 16.381-6.253 22.631-.003a15.93 15.93 0 014.428 8.432 11.948 11.948 0 007.59-3.48l6.137-6.136z\"/></g></svg>"
        },
        "$:/core/images/linkify": {
            "title": "$:/core/images/linkify",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-linkify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M17.031 31.919H9.048V96.85h7.983v6.92H0V25h17.031v6.919zm24.66 0h-7.983V96.85h7.983v6.92H24.66V25h17.03v6.919zM67.77 56.422l11.975-3.903 2.306 7.096-12.063 3.903 7.628 10.379-6.12 4.435-7.63-10.467-7.45 10.2-5.943-4.523L58.1 63.518 45.95 59.35l2.306-7.096 12.064 4.17V43.825h7.45v12.596zM86.31 96.85h7.982V31.92H86.31V25h17.031v78.77H86.31v-6.92zm24.659 0h7.983V31.92h-7.983V25H128v78.77h-17.031v-6.92z\"/></svg>"
        },
        "$:/core/images/list-bullet": {
            "title": "$:/core/images/list-bullet",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-bullet tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M11.636 40.273c6.427 0 11.637-5.21 11.637-11.637C23.273 22.21 18.063 17 11.636 17 5.21 17 0 22.21 0 28.636c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.637 0-6.426-5.21-11.636-11.637-11.636C5.21 51.91 0 57.12 0 63.545c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.636 0-6.427-5.21-11.637-11.637-11.637C5.21 86.818 0 92.028 0 98.455c0 6.426 5.21 11.636 11.636 11.636zM34.91 22.818H128v11.637H34.91V22.818zm0 34.91H128v11.636H34.91V57.727zm0 34.908H128v11.637H34.91V92.636z\"/></svg>"
        },
        "$:/core/images/list-number": {
            "title": "$:/core/images/list-number",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-number tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M33.84 22.356H128v11.77H33.84v-11.77zm0 35.31H128v11.77H33.84v-11.77zm0 35.311H128v11.77H33.84v-11.77zM.38 42.631v-2.223h.998c.826 0 1.445-.14 1.858-.42.413-.28.619-.948.619-2.002V22.769c0-1.442-.193-2.336-.58-2.683-.385-.347-1.477-.52-3.275-.52v-2.143c3.502-.147 6.252-.955 8.25-2.423h2.117v22.865c0 .921.15 1.575.449 1.963.3.387.949.58 1.948.58h.998v2.223H.38zm-.3 35.356v-1.902c7.19-6.554 10.786-12.58 10.786-18.08 0-1.562-.326-2.81-.979-3.744-.652-.934-1.524-1.402-2.616-1.402-.893 0-1.655.317-2.287.952-.633.634-.95 1.364-.95 2.192 0 .974.247 1.829.74 2.563.106.16.16.28.16.36 0 .147-.16.28-.48.4-.213.08-.752.308-1.618.681-.839.374-1.358.561-1.558.561-.24 0-.512-.37-.819-1.111A6.2 6.2 0 010 57.064c0-1.949.849-3.544 2.547-4.785 1.698-1.242 3.798-1.862 6.302-1.862 2.463 0 4.53.67 6.202 2.012 1.67 1.341 2.506 3.093 2.506 5.256a8.644 8.644 0 01-.849 3.724c-.566 1.201-1.92 3.053-4.064 5.556a165.471 165.471 0 01-6.272 6.938h11.445l-1.019 5.726h-2.117c.08-.28.12-.534.12-.76 0-.388-.1-.631-.3-.731-.2-.1-.599-.15-1.198-.15H.08zm12.124 19.207c1.745.04 3.236.637 4.474 1.792 1.239 1.154 1.858 2.773 1.858 4.855 0 2.99-1.132 5.393-3.396 7.208-2.263 1.815-5 2.723-8.209 2.723-2.01 0-3.669-.384-4.974-1.151C.652 111.853 0 110.849 0 109.607c0-.774.27-1.398.809-1.872.54-.474 1.128-.71 1.768-.71.639 0 1.162.2 1.568.6.406.4.782 1.055 1.128 1.962.466 1.268 1.239 1.902 2.317 1.902 1.265 0 2.287-.477 3.066-1.431.78-.955 1.169-2.686 1.169-5.196 0-1.709-.12-3.023-.36-3.944-.24-.921-.792-1.382-1.658-1.382-.586 0-1.185.307-1.797.921-.493.494-.932.741-1.319.741-.333 0-.602-.147-.809-.44-.206-.294-.31-.574-.31-.841 0-.32.104-.594.31-.821.207-.227.69-.594 1.449-1.102 2.876-1.922 4.314-4.017 4.314-6.287 0-1.188-.306-2.092-.919-2.713a3.001 3.001 0 00-2.217-.93c-.799 0-1.525.263-2.177.79-.653.528-.979 1.158-.979 1.892 0 .641.253 1.235.76 1.782.172.2.259.367.259.5 0 .121-.57.428-1.708.922-1.139.494-1.854.74-2.147.74-.413 0-.75-.333-1.009-1-.26-.668-.39-1.282-.39-1.842 0-1.749.93-3.224 2.787-4.425 1.858-1.202 3.965-1.802 6.322-1.802 2.064 0 3.851.447 5.363 1.341 1.511.895 2.267 2.116 2.267 3.664 0 1.362-.57 2.623-1.708 3.784a13.387 13.387 0 01-3.945 2.784z\"/></svg>"
        },
        "$:/core/images/list": {
            "title": "$:/core/images/list",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M87.748 128H23.999c-4.418 0-7.999-3.59-7.999-8.007V8.007C16 3.585 19.588 0 24 0h80c4.419 0 8 3.59 8 8.007V104H91.25c-.965 0-1.84.392-2.473 1.025a3.476 3.476 0 00-1.029 2.476V128zm8-.12l15.88-15.88h-15.88v15.88zM40 15.508A3.502 3.502 0 0143.5 12h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 20h-55a3.498 3.498 0 01-3.5-3.509v-.982zM32 22a6 6 0 100-12 6 6 0 000 12zm8 9.509A3.502 3.502 0 0143.5 28h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 36h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 44h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 52h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 60h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 68h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 76h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 84h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 92h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 100h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.505 3.505 0 0143.497 108h33.006A3.497 3.497 0 0180 111.509v.982A3.505 3.505 0 0176.503 116H43.497A3.497 3.497 0 0140 112.491v-.982zM32 38a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12z\"/></svg>"
        },
        "$:/core/images/locked-padlock": {
            "title": "$:/core/images/locked-padlock",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-locked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M96.472 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h8c.003-15.723.303-47.731 32.16-47.731 31.794 0 32.305 32.057 32.312 47.731zm-15.897 0H48.44c.002-16.287.142-32 15.719-32 15.684 0 16.977 16.136 16.415 32zM67.732 92.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"
        },
        "$:/core/images/mail": {
            "title": "$:/core/images/mail",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mail tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M122.827 104.894a7.986 7.986 0 01-2.834.516H8.007c-.812 0-1.597-.12-2.335-.345l34.163-34.163 20.842 20.842a3.998 3.998 0 003.418 1.134 4.003 4.003 0 003.395-1.134L88.594 70.64c.075.09.155.176.24.26l33.993 33.994zm5.076-6.237c.064-.406.097-.823.097-1.247v-64c0-.669-.082-1.318-.237-1.94L94.23 65.006c.09.075.177.154.261.239l33.413 33.413zm-127.698.56A8.023 8.023 0 010 97.41v-64c0-.716.094-1.41.271-2.071l33.907 33.906L.205 99.218zM5.93 25.684a8.012 8.012 0 012.078-.273h111.986c.766 0 1.507.108 2.209.308L64.083 83.837 5.93 25.683z\"/></svg>"
        },
        "$:/core/images/menu-button": {
            "title": "$:/core/images/menu-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-menu-button tc-image-button\" viewBox=\"0 0 128 128\"><rect width=\"128\" height=\"16\" y=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"56\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"96\" rx=\"8\"/></svg>"
        },
        "$:/core/images/mono-block": {
            "title": "$:/core/images/mono-block",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-block tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M23.965 32.967h.357c.755 0 1.328.192 1.72.577.39.384.586.947.586 1.688 0 .824-.206 1.418-.618 1.782-.413.363-1.094.545-2.045.545h-6.31c-.965 0-1.65-.178-2.056-.535-.405-.356-.608-.954-.608-1.792 0-.811.203-1.391.608-1.74.406-.35 1.09-.525 2.055-.525h.734l-.86-2.453H8.471l-.902 2.453h.734c.95 0 1.632.178 2.044.535.413.356.619.933.619 1.73 0 .824-.206 1.418-.619 1.782-.412.363-1.094.545-2.044.545h-5.41c-.964 0-1.649-.182-2.054-.545-.406-.364-.608-.958-.608-1.782 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.719-.577h.356l5.62-15.641H6.835c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.95-.619-1.76 0-.825.207-1.42.619-1.783.412-.363 1.094-.545 2.044-.545h7.863c1.244 0 2.118.67 2.62 2.013v.063l6.647 18.2zM12.98 17.326l-3.04 8.848h6.08l-3.04-8.848zm22.402 9.372v6.395h3.145c2.223 0 3.788-.245 4.697-.734.908-.49 1.362-1.307 1.362-2.453 0-1.16-.433-1.985-1.3-2.474-.866-.49-2.383-.734-4.55-.734h-3.354zm10.693-2.327c1.524.559 2.642 1.324 3.355 2.295.713.972 1.07 2.212 1.07 3.722 0 1.272-.308 2.432-.923 3.48-.615 1.049-1.496 1.909-2.642 2.58a7.499 7.499 0 01-2.254.849c-.832.174-2.01.262-3.533.262H30.202c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.782 0-.741.189-1.304.566-1.688.378-.385.93-.577 1.657-.577h.356V17.326h-.356c-.727 0-1.28-.196-1.657-.587-.377-.392-.566-.965-.566-1.72 0-.81.203-1.401.608-1.771.406-.37 1.062-.556 1.971-.556h9.645c2.95 0 5.19.573 6.72 1.72 1.53 1.145 2.296 2.823 2.296 5.031 0 1.09-.234 2.052-.703 2.883-.468.832-1.163 1.513-2.086 2.045zM35.381 17.2v5.284h2.83c1.72 0 2.932-.203 3.638-.609.706-.405 1.06-1.09 1.06-2.054 0-.909-.319-1.573-.955-1.992-.636-.42-1.667-.63-3.093-.63h-3.48zm35.863-3.816c.28-.503.566-.86.86-1.07.293-.21.664-.314 1.111-.314.685 0 1.17.182 1.457.545.287.364.43.986.43 1.866l.042 5.452c0 .964-.157 1.614-.472 1.95-.314.335-.884.503-1.709.503-.587 0-1.037-.14-1.352-.42-.314-.28-.584-.796-.807-1.551-.364-1.328-.944-2.282-1.74-2.862-.797-.58-1.901-.87-3.313-.87-2.153 0-3.802.727-4.948 2.18-1.147 1.454-1.72 3.558-1.72 6.311 0 2.74.58 4.844 1.74 6.311 1.16 1.468 2.817 2.202 4.97 2.202 1.467 0 3.085-.49 4.854-1.468 1.768-.978 2.883-1.467 3.344-1.467.545 0 1.003.23 1.373.692.37.46.556 1.034.556 1.719 0 1.23-1.084 2.39-3.25 3.48-2.167 1.09-4.606 1.636-7.318 1.636-3.662 0-6.625-1.21-8.89-3.627-2.264-2.419-3.396-5.578-3.396-9.478 0-3.76 1.146-6.884 3.438-9.372 2.293-2.488 5.2-3.732 8.723-3.732.992 0 1.97.112 2.935.335.964.224 1.992.574 3.082 1.049zm10.22 19.583V17.326h-.356c-.755 0-1.328-.196-1.72-.587-.39-.392-.586-.965-.586-1.72 0-.81.21-1.401.629-1.771.42-.37 1.097-.556 2.034-.556h5.178c2.922 0 5.06.126 6.416.377 1.356.252 2.51.671 3.46 1.258 1.691 1.007 2.988 2.443 3.89 4.31.9 1.865 1.352 4.021 1.352 6.467 0 2.586-.514 4.847-1.541 6.783-1.028 1.936-2.485 3.4-4.372 4.393-.853.447-1.852.772-2.998.975-1.147.203-2.852.304-5.116.304h-6.269c-.965 0-1.65-.178-2.055-.535-.406-.356-.608-.954-.608-1.792 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.72-.577h.356zm5.41-15.725v15.725h1.195c2.642 0 4.592-.646 5.85-1.94 1.258-1.292 1.887-3.28 1.887-5.965 0-2.641-.64-4.612-1.918-5.912-1.28-1.3-3.205-1.95-5.777-1.95-.335 0-.59.003-.765.01a7.992 7.992 0 00-.472.032zm35.067-.126h-9.75v5.368h3.69v-.252c0-.797.175-1.39.524-1.782.35-.392.88-.587 1.594-.587.629 0 1.142.178 1.54.534.4.357.598.808.598 1.353 0 .028.007.118.021.272.014.154.021.308.021.462v4.34c0 .936-.167 1.607-.503 2.013-.335.405-.88.608-1.635.608-.713 0-1.251-.19-1.615-.567-.363-.377-.545-.936-.545-1.677v-.377h-3.69v6.269h9.75v-2.495c0-.937.178-1.608.534-2.013.357-.405.94-.608 1.75-.608.798 0 1.367.2 1.71.597.342.399.513 1.073.513 2.024v5.074c0 .755-.146 1.258-.44 1.51-.293.251-.873.377-1.74.377h-17.172c-.923 0-1.583-.182-1.982-.545-.398-.364-.597-.958-.597-1.782 0-.741.189-1.304.566-1.688.377-.385.93-.577 1.656-.577h.357V17.326h-.357c-.712 0-1.261-.2-1.646-.598-.384-.398-.576-.968-.576-1.709 0-.81.203-1.401.608-1.771.405-.37 1.062-.556 1.97-.556h17.173c.853 0 1.43.13 1.73.388.3.258.45.772.45 1.54v4.698c0 .95-.174 1.631-.524 2.044-.35.412-.915.618-1.698.618-.81 0-1.394-.21-1.75-.629-.357-.419-.535-1.097-.535-2.033v-2.202zM19.77 47.641c.267-.504.55-.86.85-1.07.3-.21.675-.314 1.122-.314.685 0 1.17.181 1.457.545.287.363.43.985.43 1.866l.042 5.451c0 .965-.157 1.615-.472 1.95-.314.336-.891.504-1.73.504-.587 0-1.045-.144-1.373-.43-.329-.287-.598-.8-.807-1.541-.378-1.342-.958-2.3-1.74-2.873-.783-.573-1.88-.86-3.292-.86-2.153 0-3.799.727-4.938 2.181-1.14 1.454-1.709 3.557-1.709 6.311s.598 4.882 1.793 6.385C10.599 67.248 12.294 68 14.488 68c.503 0 1.077-.06 1.72-.179a23.809 23.809 0 002.264-.555v-3.313h-2.37c-.95 0-1.624-.175-2.023-.524-.398-.35-.597-.93-.597-1.74 0-.84.199-1.437.597-1.793.399-.357 1.073-.535 2.024-.535h7.569c.978 0 1.667.175 2.065.524.398.35.598.937.598 1.762 0 .74-.2 1.31-.598 1.708-.398.399-.975.598-1.73.598h-.335v5.242c0 .447-.05.758-.147.933-.098.174-.293.353-.587.534-.797.476-2.062.895-3.795 1.258a25.576 25.576 0 01-5.263.546c-3.662 0-6.625-1.21-8.89-3.628-2.264-2.418-3.397-5.577-3.397-9.477 0-3.76 1.147-6.884 3.44-9.372 2.292-2.488 5.199-3.732 8.721-3.732.979 0 1.954.112 2.925.335.972.224 2.003.573 3.093 1.049zm15.84 3.941v4.823h6.857v-4.823h-.336c-.754 0-1.331-.195-1.73-.587-.398-.391-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.364 1.093-.545 2.044-.545h5.41c.95 0 1.624.181 2.023.545.398.363.597.957.597 1.782 0 .755-.192 1.328-.576 1.72-.385.39-.947.586-1.688.586h-.357v15.642h.357c.755 0 1.328.192 1.719.576.391.385.587.947.587 1.688 0 .825-.203 1.419-.608 1.782-.405.364-1.09.546-2.055.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.2-1.303.598-1.688.398-.384.975-.576 1.73-.576h.335v-6.186h-6.856v6.186h.335c.755 0 1.331.192 1.73.576.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.412.364-1.094.546-2.044.546h-5.41c-.964 0-1.65-.179-2.055-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.392-.384.965-.576 1.72-.576h.356V51.582h-.356c-.741 0-1.304-.195-1.688-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.073-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.335zm31.754 0v15.642h3.523c.95 0 1.632.178 2.044.534.412.357.618.933.618 1.73 0 .811-.21 1.402-.629 1.772-.419.37-1.097.556-2.033.556H58.433c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.957-.619-1.782 0-.81.203-1.39.608-1.74.406-.35 1.09-.524 2.055-.524h3.523V51.582h-3.523c-.95 0-1.632-.181-2.044-.545-.412-.363-.619-.95-.619-1.761 0-.825.203-1.412.608-1.761.406-.35 1.09-.524 2.055-.524h12.455c.992 0 1.684.174 2.075.524.392.35.587.936.587 1.761 0 .81-.202 1.398-.608 1.761-.405.364-1.09.545-2.054.545h-3.523zm30.496 0v11.994c0 1.873-.122 3.228-.367 4.067a5.876 5.876 0 01-1.227 2.244c-.74.852-1.768 1.495-3.082 1.929-1.314.433-2.893.65-4.738.65-1.3 0-2.555-.126-3.764-.378a16.843 16.843 0 01-3.491-1.132c-.615-.28-1.017-.643-1.206-1.09-.188-.448-.283-1.175-.283-2.18v-4.32c0-1.202.175-2.04.525-2.516.349-.475.957-.713 1.824-.713 1.244 0 1.929.915 2.054 2.747.014.321.035.566.063.733.168 1.622.545 2.73 1.133 3.324.587.594 1.523.89 2.81.89 1.593 0 2.714-.422 3.364-1.268.65-.845.975-2.386.975-4.623V51.582H88.93c-.95 0-1.632-.181-2.044-.545-.413-.363-.619-.95-.619-1.761 0-.825.2-1.412.598-1.761.398-.35 1.086-.524 2.065-.524h10.693c.979 0 1.667.174 2.065.524.399.35.598.936.598 1.761 0 .81-.206 1.398-.619 1.761-.412.364-1.093.545-2.044.545h-1.761zm14.644 0v6.353l6.48-6.478c-.728-.084-1.238-.29-1.531-.619-.294-.328-.44-.85-.44-1.562 0-.825.198-1.419.597-1.782.398-.364 1.073-.545 2.023-.545h5.137c.95 0 1.625.181 2.023.545.399.363.598.957.598 1.782 0 .769-.2 1.345-.598 1.73-.398.384-.982.576-1.75.576h-.483l-6.101 6.06c1.132.839 2.167 1.94 3.103 3.302.937 1.363 2.034 3.456 3.292 6.28h.692c.825 0 1.44.188 1.845.566.405.377.608.943.608 1.698 0 .825-.206 1.419-.619 1.782-.412.364-1.093.546-2.044.546h-2.579c-1.132 0-2.048-.762-2.746-2.286-.126-.28-.224-.503-.294-.67-.923-1.958-1.768-3.467-2.537-4.53a16.616 16.616 0 00-2.705-2.914l-1.97 1.887v3.92h.335c.755 0 1.331.193 1.73.577.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.413.364-1.094.546-2.045.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.391-.384.965-.576 1.72-.576h.356V51.582h-.357c-.74 0-1.303-.195-1.687-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.072-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.336zM13.44 96.326l4.005-11.889c.251-.782.6-1.352 1.048-1.709.447-.356 1.041-.534 1.782-.534h3.271c.95 0 1.632.182 2.044.545.413.363.619.957.619 1.782 0 .755-.2 1.328-.598 1.72-.398.39-.975.587-1.73.587h-.335l.587 15.641h.357c.754 0 1.32.192 1.698.577.377.384.566.947.566 1.687 0 .825-.2 1.42-.598 1.783-.398.363-1.072.545-2.023.545h-4.718c-.95 0-1.624-.178-2.023-.535-.398-.356-.597-.954-.597-1.793 0-.74.192-1.303.576-1.687.385-.385.954-.577 1.709-.577h.335l-.293-12.79-3.061 9.52c-.224.712-.542 1.226-.954 1.54-.413.315-.982.472-1.709.472-.727 0-1.303-.157-1.73-.472-.426-.314-.751-.828-.975-1.54l-3.04-9.52-.294 12.79h.336c.755 0 1.324.192 1.709.577.384.384.576.947.576 1.687 0 .825-.202 1.42-.608 1.783-.405.363-1.076.545-2.013.545H2.621c-.937 0-1.608-.182-2.013-.545-.405-.364-.608-.958-.608-1.783 0-.74.192-1.303.577-1.687.384-.385.954-.577 1.708-.577h.336l.608-15.641h-.336c-.754 0-1.331-.196-1.73-.588-.398-.39-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.363 1.093-.545 2.044-.545h3.27c.728 0 1.311.175 1.752.524.44.35.8.923 1.08 1.72l4.109 11.888zm30.454 2.054V86.828H42.74c-.922 0-1.583-.182-1.981-.546-.398-.363-.598-.95-.598-1.76 0-.812.2-1.402.598-1.773.398-.37 1.059-.555 1.981-.555h5.955c.909 0 1.566.185 1.97.555.406.37.609.961.609 1.772 0 .741-.192 1.31-.577 1.709-.384.398-.933.598-1.646.598h-.356v19.038c0 .657-.07 1.069-.21 1.237-.14.167-.454.251-.943.251h-2.097c-.67 0-1.143-.07-1.415-.21-.273-.14-.507-.384-.703-.733l-8.722-15.327v11.385h1.216c.909 0 1.559.175 1.95.524.392.35.587.93.587 1.74 0 .825-.199 1.42-.597 1.783-.399.363-1.045.545-1.94.545h-6.017c-.909 0-1.566-.182-1.971-.545-.406-.364-.608-.958-.608-1.783 0-.74.188-1.303.566-1.687.377-.385.936-.577 1.677-.577h.336V86.828h-.336c-.713 0-1.265-.2-1.656-.598-.392-.398-.587-.968-.587-1.709 0-.81.206-1.401.618-1.772.413-.37 1.066-.555 1.96-.555h3.44c.824 0 1.383.108 1.677.325.293.216.622.653.985 1.31l7.989 14.551zM64.66 86.366c-1.803 0-3.218.727-4.245 2.18-1.028 1.455-1.541 3.474-1.541 6.06 0 2.586.517 4.613 1.551 6.08 1.034 1.468 2.446 2.202 4.235 2.202 1.804 0 3.222-.73 4.257-2.19 1.034-1.461 1.551-3.492 1.551-6.092 0-2.586-.513-4.605-1.54-6.06-1.028-1.453-2.45-2.18-4.268-2.18zm0-4.864c3.44 0 6.27 1.23 8.492 3.69 2.223 2.46 3.334 5.598 3.334 9.414 0 3.844-1.104 6.99-3.313 9.436-2.208 2.446-5.046 3.669-8.513 3.669-3.424 0-6.255-1.234-8.491-3.701-2.237-2.467-3.355-5.602-3.355-9.404 0-3.83 1.108-6.971 3.323-9.424 2.216-2.454 5.057-3.68 8.523-3.68zM87.461 98.17v4.298h2.16c.908 0 1.555.175 1.94.524.384.35.576.93.576 1.74 0 .825-.196 1.42-.587 1.783-.392.363-1.035.545-1.93.545h-7.254c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.783 0-.74.189-1.303.566-1.687.378-.385.93-.577 1.657-.577h.356V86.828h-.356c-.713 0-1.262-.2-1.646-.598-.385-.398-.577-.968-.577-1.709 0-.81.203-1.401.608-1.772.406-.37 1.063-.555 1.971-.555h8.66c3.424 0 6.014.657 7.768 1.97 1.754 1.315 2.631 3.25 2.631 5.809 0 2.697-.873 4.738-2.62 6.122-1.748 1.384-4.34 2.076-7.78 2.076h-3.564zm0-11.343v6.625h2.977c1.65 0 2.89-.28 3.722-.839.832-.559 1.248-1.397 1.248-2.516 0-1.048-.43-1.855-1.29-2.421-.86-.566-2.086-.85-3.68-.85h-2.977zm27.267 20.568l-1.636 1.636a12.37 12.37 0 011.772-.44c.58-.098 1.15-.147 1.709-.147 1.104 0 2.268.164 3.491.492 1.223.329 1.967.493 2.233.493.447 0 1.03-.15 1.75-.45.72-.301 1.206-.452 1.458-.452.517 0 .947.2 1.29.598.342.398.513.898.513 1.5 0 .796-.472 1.474-1.415 2.033-.944.56-2.1.839-3.47.839-.937 0-2.139-.22-3.607-.66-1.467-.441-2.53-.661-3.187-.661-.992 0-2.11.272-3.354.817-1.244.546-2.013.818-2.307.818a2.14 2.14 0 01-1.53-.597c-.42-.399-.63-.878-.63-1.437 0-.391.134-.807.4-1.247.265-.44.733-1.01 1.404-1.709l2.118-2.139c-2.335-.852-4.194-2.386-5.578-4.602-1.384-2.215-2.075-4.763-2.075-7.642 0-3.802 1.104-6.909 3.312-9.32 2.209-2.411 5.053-3.617 8.534-3.617 3.467 0 6.304 1.209 8.513 3.627 2.208 2.418 3.312 5.522 3.312 9.31 0 3.774-1.097 6.884-3.291 9.33-2.195 2.446-4.977 3.67-8.345 3.67a22.5 22.5 0 01-1.384-.043zm1.195-21.03c-1.803 0-3.218.727-4.246 2.18-1.027 1.455-1.54 3.474-1.54 6.06 0 2.586.516 4.613 1.55 6.08 1.035 1.468 2.447 2.202 4.236 2.202 1.803 0 3.222-.73 4.256-2.19 1.035-1.461 1.552-3.492 1.552-6.092 0-2.586-.514-4.605-1.541-6.06-1.028-1.453-2.45-2.18-4.267-2.18z\"/></svg>"
        },
        "$:/core/images/mono-line": {
            "title": "$:/core/images/mono-line",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-line tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.437 84.523h.908c1.922 0 3.381.489 4.378 1.468.997.979 1.495 2.411 1.495 4.298 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388h-16.07c-2.456 0-4.2-.454-5.232-1.361-1.032-.908-1.548-2.43-1.548-4.565 0-2.065.516-3.542 1.548-4.432 1.032-.89 2.776-1.334 5.232-1.334h1.869l-2.19-6.247H20.983l-2.296 6.247h1.87c2.42 0 4.155.453 5.205 1.361 1.05.908 1.575 2.376 1.575 4.405 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388H6.781c-2.456 0-4.2-.463-5.233-1.388C.516 93.9 0 92.389 0 90.289c0-1.887.498-3.32 1.495-4.298.997-.979 2.456-1.468 4.378-1.468h.908l14.308-39.83h-4.271c-2.42 0-4.156-.462-5.206-1.387-1.05-.926-1.575-2.42-1.575-4.485 0-2.1.525-3.613 1.575-4.538 1.05-.926 2.785-1.388 5.206-1.388h20.021c3.168 0 5.392 1.708 6.674 5.125v.16l16.924 46.343zm-27.976-39.83L24.72 67.225h15.483l-7.742-22.53zM89.506 68.56v16.284h8.008c5.66 0 9.646-.623 11.96-1.869 2.313-1.245 3.47-3.328 3.47-6.246 0-2.955-1.103-5.055-3.31-6.3-2.207-1.246-6.069-1.869-11.586-1.869h-8.542zm27.229-5.926c3.88 1.423 6.727 3.372 8.542 5.846 1.815 2.474 2.723 5.633 2.723 9.477 0 3.239-.783 6.193-2.35 8.862-1.565 2.67-3.808 4.859-6.726 6.567-1.709.997-3.622 1.718-5.74 2.163-2.118.445-5.116.667-8.996.667h-27.87c-2.349 0-4.03-.463-5.045-1.388-1.014-.926-1.521-2.438-1.521-4.538 0-1.887.48-3.32 1.441-4.298.961-.979 2.367-1.468 4.218-1.468h.907v-39.83h-.907c-1.851 0-3.257-.498-4.218-1.494-.961-.997-1.441-2.456-1.441-4.378 0-2.065.516-3.568 1.548-4.512 1.032-.943 2.705-1.414 5.018-1.414h24.56c7.51 0 13.214 1.459 17.111 4.377 3.898 2.92 5.847 7.19 5.847 12.814 0 2.776-.597 5.223-1.789 7.341-1.192 2.118-2.963 3.853-5.312 5.206zm-27.23-18.26v13.455h7.208c4.378 0 7.466-.516 9.264-1.549 1.797-1.032 2.696-2.776 2.696-5.232 0-2.313-.81-4.004-2.43-5.072-1.619-1.068-4.244-1.602-7.874-1.602h-8.863z\"/></svg>"
        },
        "$:/core/images/new-button": {
            "title": "$:/core/images/new-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 72H8.007C3.591 72 0 68.418 0 64c0-4.41 3.585-8 8.007-8H56V8.007C56 3.591 59.582 0 64 0c4.41 0 8 3.585 8 8.007V56h47.993c4.416 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H72v47.993c0 4.416-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V72z\"/></svg>"
        },
        "$:/core/images/new-here-button": {
            "title": "$:/core/images/new-here-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-here-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.838 20.935l-3.572.938c-3.688.968-8.23 4.43-10.136 7.731L3.37 96.738c-1.905 3.3-.771 7.524 2.534 9.432l33.717 19.466c3.297 1.904 7.53.78 9.435-2.521l38.76-67.134c1.905-3.3 2.632-8.963 1.623-12.646L83.285 20.88c-1.009-3.68-4.821-5.884-8.513-4.915l-7.603 1.995.043.287c.524 3.394 2.053 7.498 4.18 11.55.418.163.829.36 1.23.59a8.864 8.864 0 014.438 8.169c.104.132.21.264.316.395l-.386.318a8.663 8.663 0 01-1.082 3.137c-2.42 4.192-7.816 5.608-12.051 3.163-4.12-2.379-5.624-7.534-3.476-11.671-2.177-4.394-3.788-8.874-4.543-12.964z\"/><path d=\"M69.554 44.76c-5.944-7.476-10.74-17.196-11.955-25.059-1.68-10.875 3.503-18.216 15.082-18.04 10.407.158 19.975 5.851 24.728 13.785 5.208 8.695 2.95 17.868-6.855 20.496l-2.037-7.601c4.232-1.134 4.999-4.248 2.24-8.853-3.37-5.626-10.465-9.848-18.146-9.965-6.392-.097-8.31 2.62-7.323 9.01.999 6.465 5.318 15.138 10.582 21.65l-.072.06c.559 1.553-4.17 6.44-5.938 4.888l-.005.004-.028-.034a1.323 1.323 0 01-.124-.135 2.618 2.618 0 01-.149-.205z\"/><rect width=\"16\" height=\"48\" x=\"96\" y=\"80\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"80\" y=\"96\" rx=\"8\"/></g></svg>"
        },
        "$:/core/images/new-image-button": {
            "title": "$:/core/images/new-image-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-image-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.362 73.627l15.826-27.41a2.626 2.626 0 00-.962-3.59l-50.01-28.872a2.626 2.626 0 00-3.588.961L30.058 36.49l10.04-5.261c3.042-1.595 6.771.114 7.55 3.46l3.607 17.702 9.88.85a5.25 5.25 0 014.571 3.77c.034.115.1.344.199.671.165.553.353 1.172.562 1.843.595 1.914 1.23 3.85 1.872 5.678.207.588.412 1.156.614 1.701.625 1.685 1.209 3.114 1.725 4.207.255.54.485.977.726 1.427.214.212.547.425 1.011.622 1.141.482 2.784.74 4.657.758.864.008 1.71-.034 2.492-.11.448-.043.753-.085.871-.104.315-.053.625-.077.927-.076zM37.47 2.649A5.257 5.257 0 0144.649.725l63.645 36.746a5.257 5.257 0 011.923 7.178L73.47 108.294a5.257 5.257 0 01-7.177 1.923L2.649 73.47a5.257 5.257 0 01-1.924-7.177L37.471 2.649zm42.837 50.49a5.25 5.25 0 105.25-9.092 5.25 5.25 0 00-5.25 9.093zM96 112h-7.993c-4.419 0-8.007-3.582-8.007-8 0-4.41 3.585-8 8.007-8H96v-7.993C96 83.588 99.582 80 104 80c4.41 0 8 3.585 8 8.007V96h7.993c4.419 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H112v7.993c0 4.419-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V112zM33.347 51.791c7.428 7.948 9.01 10.69 7.449 13.394-1.56 2.703-13.838-2.328-16.094 1.58-2.256 3.908-.907 3.258-2.437 5.908l19.73 11.39s-5.605-8.255-4.235-10.628c2.515-4.356 8.77-1.256 10.365-4.019 2.414-4.181-5.103-9.639-14.778-17.625z\"/></svg>"
        },
        "$:/core/images/new-journal-button": {
            "title": "$:/core/images/new-journal-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-journal-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.545 112.818v11.818c0 1.306 1.086 2.364 2.425 2.364h6.06c1.34 0 2.425-1.058 2.425-2.364v-11.818h12.12c1.34 0 2.425-1.058 2.425-2.363v-5.91c0-1.305-1.085-2.363-2.424-2.363h-12.121V90.364c0-1.306-1.086-2.364-2.425-2.364h-6.06c-1.34 0-2.425 1.058-2.425 2.364v11.818h-12.12c-1.34 0-2.425 1.058-2.425 2.363v5.91c0 1.305 1.085 2.363 2.424 2.363h12.121zM60.016 4.965c-4.781-2.76-10.897-1.118-13.656 3.66L5.553 79.305A9.993 9.993 0 009.21 92.963l51.04 29.468c4.78 2.76 10.897 1.118 13.655-3.66l40.808-70.681a9.993 9.993 0 00-3.658-13.656L60.016 4.965zm-3.567 27.963a6 6 0 106-10.393 6 6 0 00-6 10.393zm31.697 17.928a6 6 0 106-10.392 6 6 0 00-6 10.392z\"/><text class=\"tc-fill-background\" font-family=\"Helvetica\" font-size=\"47.172\" font-weight=\"bold\" transform=\"rotate(30 25.742 95.82)\"><tspan x=\"42\" y=\"77.485\" text-anchor=\"middle\"><<now \"DD\">></tspan></text></g></svg>"
        },
        "$:/core/images/opacity": {
            "title": "$:/core/images/opacity",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-opacity tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.362 65a51.595 51.595 0 01-1.942 6H82.584a35.867 35.867 0 002.997-6h16.78zm.472-2c.423-1.961.734-3.963.929-6H87.656a35.78 35.78 0 01-1.368 6h16.546zm-3.249 10a51.847 51.847 0 01-3.135 6H75.812a36.205 36.205 0 005.432-6h18.341zm-4.416 8c-1.424 2.116-3 4.12-4.71 6H60.46a35.843 35.843 0 0012.874-6h21.834zm-7.513-34h16.107C101.247 20.627 79.033 0 52 0 23.281 0 0 23.281 0 52c0 25.228 17.965 46.26 41.8 51h20.4a51.66 51.66 0 0015.875-6H39v-2h42.25a52.257 52.257 0 007.288-6H39v-2h4.539C27.739 83.194 16 68.968 16 52c0-19.882 16.118-36 36-36 18.186 0 33.222 13.484 35.656 31zm.22 2h16.039a52.823 52.823 0 010 6H87.877a36.483 36.483 0 000-6z\"/><path d=\"M76 128c28.719 0 52-23.281 52-52s-23.281-52-52-52-52 23.281-52 52 23.281 52 52 52zm0-16c19.882 0 36-16.118 36-36S95.882 40 76 40 40 56.118 40 76s16.118 36 36 36z\"/><path d=\"M37 58h53v4H37v-4zm3-8h53v4H40v-4zm0-8h53v4H40v-4zm-8 24h53v4H32v-4zm-2 8h53v4H30v-4zm-3 8h53v4H27v-4z\"/></g></svg>"
        },
        "$:/core/images/open-window": {
            "title": "$:/core/images/open-window",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-open-window tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M16 112h88.994c3.87 0 7.006 3.59 7.006 8 0 4.418-3.142 8-7.006 8H7.006C3.136 128 0 124.41 0 120a9.321 9.321 0 010-.01V24.01C0 19.586 3.59 16 8 16c4.418 0 8 3.584 8 8.01V112z\"/><path d=\"M96 43.196V56a8 8 0 1016 0V24c0-4.41-3.585-8-8.007-8H72.007C67.588 16 64 19.582 64 24c0 4.41 3.585 8 8.007 8H84.57l-36.3 36.299a8 8 0 00-.001 11.316c3.117 3.117 8.19 3.123 11.316-.003L96 43.196zM32 7.999C32 3.581 35.588 0 40 0h80c4.419 0 8 3.588 8 8v80c0 4.419-3.588 8-8 8H40c-4.419 0-8-3.588-8-8V8z\"/></g></svg>"
        },
        "$:/core/images/options-button": {
            "title": "$:/core/images/options-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-options-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M110.488 76a47.712 47.712 0 01-5.134 12.384l6.724 6.724c3.123 3.123 3.132 8.192.011 11.313l-5.668 5.668c-3.12 3.12-8.186 3.117-11.313-.01l-6.724-6.725c-3.82 2.258-7.98 4-12.384 5.134v9.505c0 4.417-3.578 8.007-7.992 8.007h-8.016C55.58 128 52 124.415 52 119.993v-9.505a47.712 47.712 0 01-12.384-5.134l-6.724 6.725c-3.123 3.122-8.192 3.131-11.313.01l-5.668-5.668c-3.12-3.12-3.116-8.186.01-11.313l6.725-6.724c-2.257-3.82-4-7.98-5.134-12.384H8.007C3.591 76 0 72.422 0 68.01v-8.017C0 55.58 3.585 52 8.007 52h9.505a47.712 47.712 0 015.134-12.383l-6.724-6.725c-3.123-3.122-3.132-8.191-.011-11.312l5.668-5.669c3.12-3.12 8.186-3.116 11.313.01l6.724 6.725c3.82-2.257 7.98-4 12.384-5.134V8.007C52 3.591 55.578 0 59.992 0h8.016C72.42 0 76 3.585 76 8.007v9.505a47.712 47.712 0 0112.384 5.134l6.724-6.724c3.123-3.123 8.192-3.132 11.313-.01l5.668 5.668c3.12 3.12 3.116 8.186-.01 11.312l-6.725 6.725c2.257 3.82 4 7.979 5.134 12.383h9.505c4.416 0 8.007 3.578 8.007 7.992v8.017c0 4.411-3.585 7.991-8.007 7.991h-9.505zM64 96c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/></svg>"
        },
        "$:/core/images/paint": {
            "title": "$:/core/images/paint",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-paint tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M83.527 76.19C90.43 69.287 91.892 59 87.91 50.665l37.903-37.902c2.919-2.92 2.913-7.659 0-10.572a7.474 7.474 0 00-10.572 0L77.338 40.093c-8.335-3.982-18.622-2.521-25.526 4.383l31.715 31.715zm-2.643 2.644L49.169 47.119S8.506 81.243 0 80.282c0 0 3.782 5.592 6.827 8.039 14.024-5.69 37.326-24.6 37.326-24.6l.661.66S19.45 90.222 9.18 92.047c1.222 1.44 4.354 4.053 6.247 5.776 5.417-1.488 34.733-28.57 34.733-28.57l.661.66-32.407 31.022 5.285 5.286L56.106 75.2l.662.66s-27.864 30.536-28.684 32.432c0 0 6.032 6.853 7.569 7.824.702-2.836 27.884-33.485 27.884-33.485l.661.66s-20.597 23.755-24.964 36.732c3.21 3.549 7.5 5.137 10.926 6.298-2.19-11.817 30.724-47.487 30.724-47.487z\"/></svg>"
        },
        "$:/core/images/palette": {
            "title": "$:/core/images/palette",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-palette tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.247 39.182a93.52 93.52 0 00-16.228-1.4C28.662 37.781 0 57.131 0 81.002c0 9.642 4.676 18.546 12.58 25.735C23.504 91.19 26.34 72.395 36.89 63.562c15.183-12.713 26.538-7.828 26.538-7.828l16.82-16.552zm26.535 9.655c13.049 7.913 21.257 19.392 21.257 32.166 0 9.35.519 17.411-11.874 25.08-10.797 6.681-3.824-6.536-11.844-10.898s-19.946 1.308-18.213 7.906c3.2 12.181 19.422 11.455 6.314 16.658-13.107 5.202-18.202 4.476-28.403 4.476-7.821 0-15.315-.947-22.243-2.68 9.844-4.197 27.88-12.539 33.354-19.456C82.788 92.409 87.37 80 83.324 72.484c-.194-.359 11.215-11.668 23.458-23.647zM1.134 123.867l-.66.002c33.479-14.94 22.161-64.226 58.818-64.226.317 1.418.644 2.944 1.062 4.494-25.907-4.166-23.567 48.031-59.22 59.73zm.713-.007c38.872-.506 78.152-22.347 78.152-44.813-9.27 0-14.073-3.48-16.816-7.942-16.597-7.003-30.365 45.715-61.336 52.755zm65.351-64.008c-4.45 4.115 4.886 16.433 11.318 11.318l45.27-45.27c11.317-11.318 0-22.635-11.318-11.318-11.317 11.318-33.518 34.405-45.27 45.27z\"/></svg>"
        },
        "$:/core/images/permalink-button": {
            "title": "$:/core/images/permalink-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permalink-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.483 48l-7.387 32h-25.58l7.388-32h25.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L100.598 32h3.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-7.096l-7.387 32H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H85.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L69.402 96h-25.58L38.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L27.402 96h-3.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h7.096l7.387-32H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h18.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L58.598 32h25.58z\"/></svg>"
        },
        "$:/core/images/permaview-button": {
            "title": "$:/core/images/permaview-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permaview-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.483 48l-1.846 8h-5.58l1.847-8h5.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L101.598 32h2.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-6.096l-1.847 8h7.944c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H92.364l-1.846 8H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H86.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L70.402 96h-5.58L59.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L48.402 96h-5.58L37.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L26.402 96h-2.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h6.096l1.847-8h-7.944C19.59 72 16 68.418 16 64c0-4.41 3.581-8 8-8h11.637l1.846-8H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h17.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L57.598 32h5.58L68.8 7.642c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L79.598 32h5.58zM53.904 48l-1.847 8h5.58l1.846-8h-5.579zm22.039 24l-1.847 8h-5.58l1.847-8h5.58zm-27.58 0l-1.846 8h5.579l1.847-8h-5.58z\"/></svg>"
        },
        "$:/core/images/picture": {
            "title": "$:/core/images/picture",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-picture tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112 68.233v-48.23A4.001 4.001 0 00107.997 16H20.003A4.001 4.001 0 0016 20.003v38.31l9.241-14.593c2.8-4.422 9.023-5.008 12.6-1.186l18.247 20.613 13.687-6.407a8 8 0 018.903 1.492 264.97 264.97 0 002.92 2.739 249.44 249.44 0 006.798 6.066 166.5 166.5 0 002.106 1.778c2.108 1.747 3.967 3.188 5.482 4.237.748.518 1.383.92 2.044 1.33.444.117 1.046.144 1.809.05 1.873-.233 4.238-1.144 6.723-2.547a36.016 36.016 0 003.205-2.044c.558-.4.93-.686 1.07-.802.376-.31.765-.577 1.165-.806zM0 8.007A8.01 8.01 0 018.007 0h111.986A8.01 8.01 0 01128 8.007v111.986a8.01 8.01 0 01-8.007 8.007H8.007A8.01 8.01 0 010 119.993V8.007zM95 42a8 8 0 100-16 8 8 0 000 16zM32 76c15.859 4.83 20.035 7.244 20.035 12S32 95.471 32 102.347c0 6.876 1.285 4.99 1.285 9.653H68s-13.685-6.625-13.685-10.8c0-7.665 10.615-8.34 10.615-13.2 0-7.357-14.078-8.833-32.93-12z\"/></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\" class=\"tc-image-plugin-generic-language tc-image-button\"><path fill-rule=\"evenodd\" d=\"M61.207 68.137c-4.324 2.795-6.999 6.656-6.999 10.921 0 7.906 9.19 14.424 21.042 15.336 2.162 3.902 8.598 6.785 16.318 7.01-5.126-1.125-9.117-3.742-10.62-7.01C92.805 93.487 102 86.967 102 79.059c0-8.53-10.699-15.445-23.896-15.445-6.599 0-12.572 1.729-16.897 4.524zm12.794-14.158c-4.324 2.795-10.298 4.524-16.897 4.524-2.619 0-5.14-.272-7.497-.775-3.312 2.25-8.383 3.69-14.067 3.69l-.255-.002c4.119-.892 7.511-2.747 9.478-5.13-6.925-2.704-11.555-7.617-11.555-13.228 0-8.53 10.699-15.445 23.896-15.445C70.301 27.613 81 34.528 81 43.058c0 4.265-2.675 8.126-6.999 10.921zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></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\" class=\"tc-image-plugin-generic-plugin tc-image-button\"><path fill-rule=\"evenodd\" d=\"M40.397 76.446V95.34h14.12l-.001-.005a6.912 6.912 0 005.364-11.593l.046-.023a6.912 6.912 0 119.979.526l.086.055a6.914 6.914 0 004.408 10.948l-.023.092h21.32V75.568l-.15.038a6.912 6.912 0 00-11.593-5.364l-.022-.046a6.912 6.912 0 11.526-9.979l.055-.086a6.914 6.914 0 0010.948-4.408c.079.018.158.038.236.059v-15.74h-21.32l.023-.094a6.914 6.914 0 01-4.408-10.947 10.23 10.23 0 00-.086-.055 6.912 6.912 0 10-9.979-.526l-.046.023a6.912 6.912 0 01-5.364 11.593l.001.005h-14.12v12.847A6.912 6.912 0 0129.5 59.843l-.054.086a6.912 6.912 0 10-.526 9.979l.023.046a6.912 6.912 0 0111.455 6.492zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></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\" class=\"tc-image-plugin-generic-theme tc-image-button\"><path fill-rule=\"evenodd\" d=\"M29.408 91.472L51.469 69.41l-.004-.005a2.22 2.22 0 01.004-3.146c.87-.87 2.281-.872 3.147-.005l9.465 9.464a2.22 2.22 0 01-.005 3.147c-.87.87-2.28.871-3.147.005l-.005-.005-22.061 22.062a6.686 6.686 0 11-9.455-9.455zM60.802 66.38c-2.436-2.704-4.465-5.091-5.817-6.869-6.855-9.014-10.313-4.268-14.226 0-3.913 4.268 1.03 7.726-2.683 10.741-3.713 3.015-3.484 4.06-9.752-1.455-6.267-5.516-6.7-7.034-3.823-10.181 2.877-3.147 5.281 1.808 11.159-3.785 5.877-5.593.94-10.55.94-10.55s12.237-25.014 28.588-23.167c16.351 1.848-6.186-2.392-11.792 17.226-2.4 8.4.447 6.42 4.998 9.968 1.394 1.086 6.03 4.401 11.794 8.685l20.677-20.676 1.615-4.766 7.84-4.689 3.151 3.152-4.688 7.84-4.766 1.615-20.224 20.223c12.663 9.547 28.312 22.146 28.312 26.709 0 7.217-3.071 11.526-9.535 9.164-4.693-1.715-18.768-15.192-28.753-25.897l-2.893 2.893-3.151-3.152 3.029-3.029zM63.953 0l54.56 32v64l-54.56 32-54.56-32V32l54.56-32z\"/></svg>"
        },
        "$:/core/images/preview-closed": {
            "title": "$:/core/images/preview-closed",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-closed tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M.088 64a7.144 7.144 0 001.378 5.458C16.246 88.818 39.17 100.414 64 100.414c24.83 0 47.753-11.596 62.534-30.956A7.144 7.144 0 00127.912 64C110.582 78.416 88.304 87.086 64 87.086 39.696 87.086 17.418 78.416.088 64z\"/><rect width=\"4\" height=\"16\" x=\"62\" y=\"96\" rx=\"4\"/><rect width=\"4\" height=\"16\" x=\"78\" y=\"93\" rx=\"4\" transform=\"rotate(-5 80 101)\"/><rect width=\"4\" height=\"16\" x=\"46\" y=\"93\" rx=\"4\" transform=\"rotate(5 48 101)\"/><rect width=\"4\" height=\"16\" x=\"30\" y=\"88\" rx=\"4\" transform=\"rotate(10 32 96)\"/><rect width=\"4\" height=\"16\" x=\"94\" y=\"88\" rx=\"4\" transform=\"rotate(-10 96 96)\"/><rect width=\"4\" height=\"16\" x=\"110\" y=\"80\" rx=\"4\" transform=\"rotate(-20 112 88)\"/><rect width=\"4\" height=\"16\" x=\"14\" y=\"80\" rx=\"4\" transform=\"rotate(20 16 88)\"/></g></svg>"
        },
        "$:/core/images/preview-open": {
            "title": "$:/core/images/preview-open",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-open tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.11 99.588c-24.83 0-47.754-11.596-62.534-30.957a7.148 7.148 0 010-8.675C16.356 40.596 39.28 29 64.11 29c24.83 0 47.753 11.596 62.534 30.956a7.148 7.148 0 010 8.675c-14.78 19.36-37.703 30.957-62.534 30.957zm46.104-32.007c1.44-1.524 1.44-3.638 0-5.162C99.326 50.9 82.439 44 64.147 44S28.968 50.9 18.08 62.42c-1.44 1.523-1.44 3.637 0 5.16C28.968 79.1 45.855 86 64.147 86s35.179-6.9 46.067-18.42z\"/><path d=\"M63.5 88C76.479 88 87 77.479 87 64.5S76.479 41 63.5 41 40 51.521 40 64.5 50.521 88 63.5 88z\"/></g></svg>"
        },
        "$:/core/images/print-button": {
            "title": "$:/core/images/print-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-print-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M112 71V30.5h-.032c-.035-2-.816-3.99-2.343-5.516L86.998 2.357A7.978 7.978 0 0081 .02V0H24a8 8 0 00-8 8v63h8V8h57v14.5c0 4.422 3.582 8 8 8h15V71h8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/><path d=\"M0 80.005C0 71.165 7.156 64 16 64h96c8.836 0 16 7.155 16 16.005v31.99c0 8.84-7.156 16.005-16 16.005H16c-8.836 0-16-7.155-16-16.005v-31.99zM104 96a8 8 0 100-16 8 8 0 000 16z\"/></g></svg>"
        },
        "$:/core/images/quote": {
            "title": "$:/core/images/quote",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-quote tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M51.219 117.713V62.199H27.427c0-8.891 1.683-16.401 5.047-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.36 3.184-20.728 6.669-6.368 3.484-11.835 7.87-16.401 13.157C9.524 27.113 5.98 33.241 3.456 40.21.933 47.18-.21 54.63.03 62.56v55.153H51.22zm76.781 0V62.199h-23.791c0-8.891 1.682-16.401 5.046-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.359 3.184-20.727 6.669-6.369 3.484-11.836 7.87-16.402 13.157-4.566 5.287-8.11 11.415-10.634 18.384-2.523 6.97-3.665 14.42-3.424 22.35v55.153H128z\"/></svg>"
        },
        "$:/core/images/refresh-button": {
            "title": "$:/core/images/refresh-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-refresh-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M106.369 39.433c10.16 20.879 6.57 46.764-10.771 64.106-21.87 21.87-57.327 21.87-79.196 0-21.87-21.87-21.87-57.326 0-79.196a8 8 0 1111.314 11.314c-15.621 15.62-15.621 40.947 0 56.568 15.62 15.621 40.947 15.621 56.568 0C97.72 78.79 99.6 58.175 89.924 42.73l-6.44 12.264a8 8 0 11-14.166-7.437L84.435 18.76a8 8 0 0110.838-3.345l28.873 15.345a8 8 0 11-7.51 14.129l-10.267-5.457zm-8.222-12.368c-.167-.19-.336-.38-.506-.57l.96-.296-.454.866z\"/></svg>"
        },
        "$:/core/images/right-arrow": {
            "title": "$:/core/images/right-arrow",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-right-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M99.069 64.173c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></svg>"
        },
        "$:/core/images/rotate-left": {
            "title": "$:/core/images/rotate-left",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-rotate-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"32\" height=\"80\" rx=\"8\"/><rect width=\"80\" height=\"32\" x=\"48\" y=\"96\" rx=\"8\"/><path d=\"M61.32 36.65c19.743 2.45 35.023 19.287 35.023 39.693a4 4 0 01-8 0c0-15.663-11.254-28.698-26.117-31.46l3.916 3.916a4 4 0 11-5.657 5.657L49.172 43.142a4 4 0 010-5.657l11.313-11.313a4 4 0 115.657 5.656l-4.821 4.822z\"/></g></svg>"
        },
        "$:/core/images/save-button": {
            "title": "$:/core/images/save-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-save-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z\"/></svg>"
        },
        "$:/core/images/size": {
            "title": "$:/core/images/size",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-size tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M92.343 26l-9.171 9.172a4 4 0 105.656 5.656l16-16a4 4 0 000-5.656l-16-16a4 4 0 10-5.656 5.656L92.343 18H22a4 4 0 00-4 4v70.343l-9.172-9.171a4 4 0 10-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656L26 92.343V22l-4 4h70.343zM112 52v64l4-4H52a4 4 0 100 8h64a4 4 0 004-4V52a4 4 0 10-8 0z\"/></svg>"
        },
        "$:/core/images/spiral": {
            "title": "$:/core/images/spiral",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-spiral tc-image-button\" viewBox=\"0 0 128 128\"><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.074a4.785 4.785 0 00-4.52-5.03 4.778 4.778 0 00-5.03 4.52c-.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-.01a1.047 1.047 0 01-.264-.332c-.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\"/></svg>"
        },
        "$:/core/images/stamp": {
            "title": "$:/core/images/stamp",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-stamp tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M49.733 64H16.01C11.584 64 8 67.583 8 72.003V97h112V72.003A8 8 0 00111.99 64H78.267A22.813 22.813 0 0175.5 53.077c0-6.475 2.687-12.324 7.009-16.497A22.818 22.818 0 0087 22.952C87 10.276 76.703 0 64 0S41 10.276 41 22.952c0 5.103 1.669 9.817 4.491 13.628 4.322 4.173 7.009 10.022 7.009 16.497 0 3.954-1.002 7.675-2.767 10.923zM8 104h112v8H8v-8z\"/></svg>"
        },
        "$:/core/images/star-filled": {
            "title": "$:/core/images/star-filled",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-star-filled tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M61.836 96.823l37.327 27.287c2.72 1.99 6.379-.69 5.343-3.912L90.29 75.988l-1.26 3.91 37.285-27.345c2.718-1.993 1.32-6.327-2.041-6.33l-46.113-.036 3.3 2.416L67.176 4.416c-1.04-3.221-5.563-3.221-6.604 0L46.29 48.603l3.3-2.416-46.113.036c-3.362.003-4.759 4.337-2.04 6.33L38.72 79.898l-1.26-3.91-14.216 44.21c-1.036 3.223 2.622 5.901 5.343 3.912l37.326-27.287h-4.078z\"/></svg>"
        },
        "$:/core/images/storyview-classic": {
            "title": "$:/core/images/storyview-classic",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-classic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm0 48C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0 32C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"
        },
        "$:/core/images/storyview-pop": {
            "title": "$:/core/images/storyview-pop",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-pop tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm-7.99 40C11.587 56 8 59.578 8 63.992v16.016C8 84.422 11.584 88 16.01 88h95.98c4.424 0 8.01-3.578 8.01-7.992V63.992c0-4.414-3.584-7.992-8.01-7.992H16.01zM24 96C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0-32C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"
        },
        "$:/core/images/storyview-zoomin": {
            "title": "$:/core/images/storyview-zoomin",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-zoomin tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16A8 8 0 0016 24.009V71.99C16 76.414 19.588 80 24 80h80a8 8 0 008-8.009V24.01c0-4.423-3.588-8.009-8-8.009H24z\"/></svg>"
        },
        "$:/core/images/strikethrough": {
            "title": "$:/core/images/strikethrough",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-strikethrough tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M92.794 38.726h15.422c-.229-6.74-1.514-12.538-3.856-17.393-2.342-4.855-5.54-8.881-9.596-12.08-4.055-3.199-8.767-5.54-14.136-7.025C75.258.743 69.433 0 63.15 0a62.76 62.76 0 00-16.364 2.142C41.474 3.57 36.733 5.74 32.564 8.653c-4.17 2.913-7.511 6.626-10.025 11.138-2.513 4.512-3.77 9.853-3.77 16.022 0 5.597 1.115 10.252 3.342 13.965 2.228 3.712 5.198 6.74 8.91 9.081 3.713 2.342 7.911 4.227 12.595 5.655a194.641 194.641 0 0014.308 3.77c4.855 1.085 9.624 2.142 14.308 3.17 4.683 1.028 8.881 2.37 12.594 4.027 3.713 1.656 6.683 3.798 8.91 6.425 2.228 2.628 3.342 6.055 3.342 10.281 0 4.456-.914 8.111-2.742 10.967a19.953 19.953 0 01-7.197 6.768c-2.97 1.657-6.311 2.828-10.024 3.513a60.771 60.771 0 01-11.052 1.028c-4.57 0-9.025-.571-13.366-1.713-4.34-1.143-8.139-2.913-11.394-5.312-3.256-2.4-5.884-5.455-7.883-9.168-1.999-3.712-2.998-8.139-2.998-13.28H15c0 7.426 1.342 13.852 4.027 19.278 2.684 5.426 6.34 9.881 10.966 13.365 4.627 3.484 9.996 6.083 16.107 7.797 6.112 1.713 12.595 2.57 19.449 2.57 5.597 0 11.223-.657 16.878-1.97 5.655-1.314 10.767-3.428 15.336-6.34 4.57-2.914 8.31-6.683 11.224-11.31 2.913-4.626 4.37-10.195 4.37-16.707 0-6.054-1.115-11.08-3.342-15.079-2.228-3.998-5.198-7.31-8.91-9.938-3.713-2.627-7.911-4.712-12.595-6.254a170.83 170.83 0 00-14.308-4.027 549.669 549.669 0 00-14.308-3.17c-4.683-.971-8.881-2.2-12.594-3.684-3.713-1.485-6.683-3.399-8.91-5.74-2.228-2.342-3.342-5.398-3.342-9.168 0-3.998.771-7.34 2.313-10.024 1.543-2.685 3.599-4.826 6.17-6.426 2.57-1.599 5.51-2.741 8.824-3.427a49.767 49.767 0 0110.11-1.028c8.453 0 15.393 1.97 20.819 5.912 5.426 3.94 8.596 10.31 9.51 19.106z\"/><path d=\"M5 54h118v16H5z\"/></g></svg>"
        },
        "$:/core/images/subscript": {
            "title": "$:/core/images/subscript",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-subscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 128.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"
        },
        "$:/core/images/superscript": {
            "title": "$:/core/images/superscript",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-superscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 63.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"
        },
        "$:/core/images/tag-button": {
            "title": "$:/core/images/tag-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tag-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M18.164 47.66l.004 4.105c.003 3.823 2.19 9.097 4.885 11.792l61.85 61.85c2.697 2.697 7.068 2.69 9.769-.01L125.767 94.3a6.903 6.903 0 00.01-9.77L63.928 22.683c-2.697-2.697-7.976-4.88-11.796-4.881l-27.076-.007a6.902 6.902 0 00-6.91 6.91l.008 9.96.287.033c3.73.411 8.489-.044 13.365-1.153a9.702 9.702 0 0111.14-3.662l.291-.13.128.285a9.7 9.7 0 013.3 2.17c3.796 3.796 3.801 9.945.012 13.734-3.618 3.618-9.386 3.777-13.204.482-5.365 1.122-10.674 1.596-15.309 1.237z\"/><path d=\"M47.633 39.532l.023.051c-9.689 4.356-21.584 6.799-30.396 5.828C5.273 44.089-1.028 36.43 2.443 24.078 5.562 12.976 14.3 4.361 24.047 1.548c10.68-3.083 19.749 1.968 19.749 13.225h-8.623c0-4.859-3.078-6.573-8.735-4.94-6.91 1.995-13.392 8.383-15.694 16.577-1.915 6.818.417 9.653 7.46 10.43 7.126.785 17.531-1.352 25.917-5.121l.027.06.036-.017c1.76-.758 6.266 6.549 3.524 7.74a2.8 2.8 0 01-.075.03z\"/></g></svg>"
        },
        "$:/core/images/theme-button": {
            "title": "$:/core/images/theme-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-theme-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.854 66.945a122.626 122.626 0 01-3.9-4.819c-11.064-14.548-16.645-6.888-22.96 0-6.315 6.888 1.664 12.47-4.33 17.335-5.993 4.866-5.623 6.552-15.737-2.35-10.115-8.9-10.815-11.351-6.172-16.43 4.644-5.08 8.524 2.918 18.01-6.108 9.485-9.026 1.517-17.026 1.517-17.026S42.03-2.824 68.42.157c26.39 2.982-9.984-3.86-19.031 27.801-3.874 13.556.72 10.362 8.066 16.087 1.707 1.33 6.428 4.732 12.671 9.318-6.129 5.879-11.157 10.669-14.273 13.582zm11.641 12.947c16.013 17.036 37.742 37.726 45.117 40.42 10.432 3.813 15.388-3.141 15.388-14.79 0-7.151-23.83-26.542-43.924-41.769-7.408 7.156-13.376 12.953-16.58 16.139z\"/><path d=\"M11.069 109.828L46.31 74.587a3.56 3.56 0 115.037-5.032l15.098 15.098a3.56 3.56 0 11-5.032 5.037l-35.24 35.241c-4.171 4.17-10.933 4.17-15.104 0-4.17-4.17-4.17-10.933 0-15.103zM124.344 6.622l5.034 5.034-7.49 12.524-7.613 2.58L61.413 79.62l-5.034-5.034 52.861-52.862 2.58-7.614 12.524-7.49z\"/></g></svg>"
        },
        "$:/core/images/timestamp-off": {
            "title": "$:/core/images/timestamp-off",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-off tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M58.25 35.88c-18.777 0-33.998 15.224-33.998 33.998 0 18.773 15.22 34.002 33.998 34.002 18.784 0 34.002-15.23 34.002-34.002 0-18.774-15.218-33.998-34.002-33.998zm-3.03 50.123H44.196v-34H55.22v34zm16.976 0H61.17v-34h11.025v34z\"/></g></svg>"
        },
        "$:/core/images/timestamp-on": {
            "title": "$:/core/images/timestamp-on",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-on tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M13.41 27.178a5.005 5.005 0 01-7.045-.613 5.008 5.008 0 01.616-7.047l9.95-8.348a5 5 0 016.429 7.661l-9.95 8.348zm89.573 0a5.005 5.005 0 007.045-.613 5.008 5.008 0 00-.616-7.047l-9.95-8.348a5 5 0 00-6.428 7.661l9.95 8.348zM65.097 71.072c0 3.826-3.09 6.928-6.897 6.928-3.804.006-6.9-3.102-6.903-6.928 0 0 4.76-39.072 6.903-39.072s6.897 39.072 6.897 39.072z\"/></g></svg>"
        },
        "$:/core/images/tip": {
            "title": "$:/core/images/tip",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tip tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128.242c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64 0 35.346 28.654 64 64 64zm11.936-36.789c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349C54.33 94.05 58.824 95.82 64 95.82c5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.456c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zM64.3 24.242c11.618 0 23.699 7.82 23.699 24.2S75.92 71.754 75.92 83.576c0 5.873-5.868 9.26-11.92 9.26s-12.027-3.006-12.027-9.26C51.973 71.147 40 65.47 40 48.442s12.683-24.2 24.301-24.2z\"/></svg>"
        },
        "$:/core/images/transcludify": {
            "title": "$:/core/images/transcludify",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-transcludify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M0 59.482c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.651-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02C1.36 67.377.591 67.288 0 67.288v-7.806zm24.66 0c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.65-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02c-.946-.177-1.715-.266-2.306-.266v-7.806zm43.965-3.538L80.6 52.041l2.306 7.097-12.063 3.903 7.628 10.378-6.12 4.435-7.63-10.467-7.45 10.201-5.943-4.524 7.628-10.023-12.152-4.17 2.306-7.096 12.064 4.17V43.347h7.451v12.596zm34.425 11.344c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806zm24.66 0c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806z\"/></svg>"
        },
        "$:/core/images/twitter": {
            "title": "$:/core/images/twitter",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-twitter tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.626 115.803A73.376 73.376 0 012 104.235c2.022.238 4.08.36 6.166.36 12.111 0 23.258-4.117 32.105-11.023-11.312-.208-20.859-7.653-24.148-17.883a25.98 25.98 0 0011.674-.441C15.971 72.881 7.061 62.474 7.061 49.997c0-.108 0-.216.002-.323a25.824 25.824 0 0011.709 3.22c-6.936-4.617-11.5-12.5-11.5-21.433 0-4.719 1.274-9.142 3.5-12.945 12.75 15.579 31.797 25.83 53.281 26.904-.44-1.884-.67-3.85-.67-5.868 0-14.22 11.575-25.75 25.852-25.75a25.865 25.865 0 0118.869 8.132 51.892 51.892 0 0016.415-6.248c-1.93 6.012-6.029 11.059-11.366 14.246A51.844 51.844 0 00128 25.878a52.428 52.428 0 01-12.9 13.33c.05 1.104.075 2.214.075 3.33 0 34.028-26 73.265-73.549 73.265\"/></svg>"
        },
        "$:/core/images/underline": {
            "title": "$:/core/images/underline",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-underline tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M7 117.421h114.248V128H7v-10.579zm97.871-18.525V0h-16.26v55.856c0 4.463-.605 8.576-1.816 12.338-1.212 3.762-3.03 7.046-5.452 9.851-2.423 2.806-5.452 4.974-9.086 6.504-3.635 1.53-7.939 2.296-12.912 2.296-6.25 0-11.159-1.786-14.73-5.356-3.57-3.571-5.356-8.417-5.356-14.538V0H23v65.038c0 5.356.542 10.234 1.626 14.633 1.084 4.4 2.965 8.194 5.643 11.382 2.678 3.188 6.185 5.643 10.52 7.365 4.337 1.721 9.756 2.582 16.26 2.582 7.27 0 13.582-1.435 18.938-4.304 5.356-2.87 9.755-7.365 13.199-13.486h.382v15.686h15.303z\"/></svg>"
        },
        "$:/core/images/unfold-all-button": {
            "title": "$:/core/images/unfold-all-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M63.945 60.624c-2.05 0-4.101-.78-5.666-2.345L35.662 35.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 41.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 58.279a7.986 7.986 0 01-5.663 2.346zM64.004 124.565c-2.05 0-4.102-.78-5.666-2.345L35.721 99.603c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 105.255l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.662 122.22a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
        },
        "$:/core/images/unfold-button": {
            "title": "$:/core/images/unfold-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M63.945 63.624c-2.05 0-4.101-.78-5.666-2.345L35.662 38.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 44.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 61.279a7.986 7.986 0 01-5.663 2.346zM64.004 105.682c-2.05.001-4.102-.78-5.666-2.344L35.721 80.721c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 86.373l16.966-16.966c3.124-3.125 8.194-3.13 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319l-22.617 22.617a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
        },
        "$:/core/images/unlocked-padlock": {
            "title": "$:/core/images/unlocked-padlock",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unlocked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M48.627 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h6.136c-10.455-12.651-27.364-35.788-4.3-55.142 24.636-20.672 45.835 4.353 55.777 16.201 9.943 11.85-2.676 22.437-12.457 9.892-9.78-12.545-21.167-24.146-33.207-14.043-12.041 10.104-1.757 22.36 8.813 34.958 2.467 2.94 3.641 5.732 3.865 8.134zm19.105 28.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"
        },
        "$:/core/images/up-arrow": {
            "title": "$:/core/images/up-arrow",
            "created": "20150316000544368",
            "modified": "20150316000831867",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-up-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M63.892.281c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.104 3.092-11.196 0L63.894 19.393 13.513 69.774a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98A7.892 7.892 0 0163.893.28z\"/></svg>"
        },
        "$:/core/images/video": {
            "title": "$:/core/images/video",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-video tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 12c-34.91 0-55.273 2.917-58.182 5.833C2.91 20.75 0 41.167 0 64.5c0 23.333 2.91 43.75 5.818 46.667C8.728 114.083 29.091 117 64 117c34.91 0 55.273-2.917 58.182-5.833C125.09 108.25 128 87.833 128 64.5c0-23.333-2.91-43.75-5.818-46.667C119.272 14.917 98.909 12 64 12zm-9.084 32.618c-3.813-2.542-6.905-.879-6.905 3.698v31.368c0 4.585 3.099 6.235 6.905 3.698l22.168-14.779c3.813-2.542 3.806-6.669 0-9.206L54.916 44.618z\"/></svg>"
        },
        "$:/core/images/warning": {
            "title": "$:/core/images/warning",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-warning tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z\"/></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/CopyToClipboard/Caption": {
            "title": "$:/language/Buttons/CopyToClipboard/Caption",
            "text": "copy to clipboard"
        },
        "$:/language/Buttons/CopyToClipboard/Hint": {
            "title": "$:/language/Buttons/CopyToClipboard/Hint",
            "text": "Copy this text to the clipboard"
        },
        "$:/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/SidebarSearch/Hint": {
            "title": "$:/language/Buttons/SidebarSearch/Hint",
            "text": "Select the sidebar search field"
        },
        "$:/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/Manager/Caption": {
            "title": "$:/language/Buttons/Manager/Caption",
            "text": "tiddler manager"
        },
        "$:/language/Buttons/Manager/Hint": {
            "title": "$:/language/Buttons/Manager/Hint",
            "text": "Open tiddler manager"
        },
        "$:/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/NewImage/Caption": {
            "title": "$:/language/Buttons/NewImage/Caption",
            "text": "new image"
        },
        "$:/language/Buttons/NewImage/Hint": {
            "title": "$:/language/Buttons/NewImage/Hint",
            "text": "Create a new image tiddler"
        },
        "$:/language/Buttons/NewMarkdown/Caption": {
            "title": "$:/language/Buttons/NewMarkdown/Caption",
            "text": "new Markdown tiddler"
        },
        "$:/language/Buttons/NewMarkdown/Hint": {
            "title": "$:/language/Buttons/NewMarkdown/Hint",
            "text": "Create a new Markdown tiddler"
        },
        "$:/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/Print/Caption": {
            "title": "$:/language/Buttons/Print/Caption",
            "text": "print page"
        },
        "$:/language/Buttons/Print/Hint": {
            "title": "$:/language/Buttons/Print/Hint",
            "text": "Print the current page"
        },
        "$:/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/Timestamp/Caption": {
            "title": "$:/language/Buttons/Timestamp/Caption",
            "text": "timestamps"
        },
        "$:/language/Buttons/Timestamp/Hint": {
            "title": "$:/language/Buttons/Timestamp/Hint",
            "text": "Choose whether modifications update timestamps"
        },
        "$:/language/Buttons/Timestamp/On/Caption": {
            "title": "$:/language/Buttons/Timestamp/On/Caption",
            "text": "timestamps are on"
        },
        "$:/language/Buttons/Timestamp/On/Hint": {
            "title": "$:/language/Buttons/Timestamp/On/Hint",
            "text": "Update timestamps when tiddlers are modified"
        },
        "$:/language/Buttons/Timestamp/Off/Caption": {
            "title": "$:/language/Buttons/Timestamp/Off/Caption",
            "text": "timestamps are off"
        },
        "$:/language/Buttons/Timestamp/Off/Hint": {
            "title": "$:/language/Buttons/Timestamp/Off/Hint",
            "text": "Don't update timestamps when tiddlers are modified"
        },
        "$:/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/Buttons/Bold/Caption": {
            "title": "$:/language/Buttons/Bold/Caption",
            "text": "bold"
        },
        "$:/language/Buttons/Bold/Hint": {
            "title": "$:/language/Buttons/Bold/Hint",
            "text": "Apply bold formatting to selection"
        },
        "$:/language/Buttons/Clear/Caption": {
            "title": "$:/language/Buttons/Clear/Caption",
            "text": "clear"
        },
        "$:/language/Buttons/Clear/Hint": {
            "title": "$:/language/Buttons/Clear/Hint",
            "text": "Clear image to solid colour"
        },
        "$:/language/Buttons/EditorHeight/Caption": {
            "title": "$:/language/Buttons/EditorHeight/Caption",
            "text": "editor height"
        },
        "$:/language/Buttons/EditorHeight/Caption/Auto": {
            "title": "$:/language/Buttons/EditorHeight/Caption/Auto",
            "text": "Automatically adjust height to fit content"
        },
        "$:/language/Buttons/EditorHeight/Caption/Fixed": {
            "title": "$:/language/Buttons/EditorHeight/Caption/Fixed",
            "text": "Fixed height:"
        },
        "$:/language/Buttons/EditorHeight/Hint": {
            "title": "$:/language/Buttons/EditorHeight/Hint",
            "text": "Choose the height of the text editor"
        },
        "$:/language/Buttons/Excise/Caption": {
            "title": "$:/language/Buttons/Excise/Caption",
            "text": "excise"
        },
        "$:/language/Buttons/Excise/Caption/Excise": {
            "title": "$:/language/Buttons/Excise/Caption/Excise",
            "text": "Perform excision"
        },
        "$:/language/Buttons/Excise/Caption/MacroName": {
            "title": "$:/language/Buttons/Excise/Caption/MacroName",
            "text": "Macro name:"
        },
        "$:/language/Buttons/Excise/Caption/NewTitle": {
            "title": "$:/language/Buttons/Excise/Caption/NewTitle",
            "text": "Title of new tiddler:"
        },
        "$:/language/Buttons/Excise/Caption/Replace": {
            "title": "$:/language/Buttons/Excise/Caption/Replace",
            "text": "Replace excised text with:"
        },
        "$:/language/Buttons/Excise/Caption/Replace/Macro": {
            "title": "$:/language/Buttons/Excise/Caption/Replace/Macro",
            "text": "macro"
        },
        "$:/language/Buttons/Excise/Caption/Replace/Link": {
            "title": "$:/language/Buttons/Excise/Caption/Replace/Link",
            "text": "link"
        },
        "$:/language/Buttons/Excise/Caption/Replace/Transclusion": {
            "title": "$:/language/Buttons/Excise/Caption/Replace/Transclusion",
            "text": "transclusion"
        },
        "$:/language/Buttons/Excise/Caption/Tag": {
            "title": "$:/language/Buttons/Excise/Caption/Tag",
            "text": "Tag new tiddler with the title of this tiddler"
        },
        "$:/language/Buttons/Excise/Caption/TiddlerExists": {
            "title": "$:/language/Buttons/Excise/Caption/TiddlerExists",
            "text": "Warning: tiddler already exists"
        },
        "$:/language/Buttons/Excise/Hint": {
            "title": "$:/language/Buttons/Excise/Hint",
            "text": "Excise the selected text into a new tiddler"
        },
        "$:/language/Buttons/Heading1/Caption": {
            "title": "$:/language/Buttons/Heading1/Caption",
            "text": "heading 1"
        },
        "$:/language/Buttons/Heading1/Hint": {
            "title": "$:/language/Buttons/Heading1/Hint",
            "text": "Apply heading level 1 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading2/Caption": {
            "title": "$:/language/Buttons/Heading2/Caption",
            "text": "heading 2"
        },
        "$:/language/Buttons/Heading2/Hint": {
            "title": "$:/language/Buttons/Heading2/Hint",
            "text": "Apply heading level 2 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading3/Caption": {
            "title": "$:/language/Buttons/Heading3/Caption",
            "text": "heading 3"
        },
        "$:/language/Buttons/Heading3/Hint": {
            "title": "$:/language/Buttons/Heading3/Hint",
            "text": "Apply heading level 3 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading4/Caption": {
            "title": "$:/language/Buttons/Heading4/Caption",
            "text": "heading 4"
        },
        "$:/language/Buttons/Heading4/Hint": {
            "title": "$:/language/Buttons/Heading4/Hint",
            "text": "Apply heading level 4 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading5/Caption": {
            "title": "$:/language/Buttons/Heading5/Caption",
            "text": "heading 5"
        },
        "$:/language/Buttons/Heading5/Hint": {
            "title": "$:/language/Buttons/Heading5/Hint",
            "text": "Apply heading level 5 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading6/Caption": {
            "title": "$:/language/Buttons/Heading6/Caption",
            "text": "heading 6"
        },
        "$:/language/Buttons/Heading6/Hint": {
            "title": "$:/language/Buttons/Heading6/Hint",
            "text": "Apply heading level 6 formatting to lines containing selection"
        },
        "$:/language/Buttons/Italic/Caption": {
            "title": "$:/language/Buttons/Italic/Caption",
            "text": "italic"
        },
        "$:/language/Buttons/Italic/Hint": {
            "title": "$:/language/Buttons/Italic/Hint",
            "text": "Apply italic formatting to selection"
        },
        "$:/language/Buttons/LineWidth/Caption": {
            "title": "$:/language/Buttons/LineWidth/Caption",
            "text": "line width"
        },
        "$:/language/Buttons/LineWidth/Hint": {
            "title": "$:/language/Buttons/LineWidth/Hint",
            "text": "Set line width for painting"
        },
        "$:/language/Buttons/Link/Caption": {
            "title": "$:/language/Buttons/Link/Caption",
            "text": "link"
        },
        "$:/language/Buttons/Link/Hint": {
            "title": "$:/language/Buttons/Link/Hint",
            "text": "Create wikitext link"
        },
        "$:/language/Buttons/Linkify/Caption": {
            "title": "$:/language/Buttons/Linkify/Caption",
            "text": "wikilink"
        },
        "$:/language/Buttons/Linkify/Hint": {
            "title": "$:/language/Buttons/Linkify/Hint",
            "text": "Wrap selection in square brackets"
        },
        "$:/language/Buttons/ListBullet/Caption": {
            "title": "$:/language/Buttons/ListBullet/Caption",
            "text": "bulleted list"
        },
        "$:/language/Buttons/ListBullet/Hint": {
            "title": "$:/language/Buttons/ListBullet/Hint",
            "text": "Apply bulleted list formatting to lines containing selection"
        },
        "$:/language/Buttons/ListNumber/Caption": {
            "title": "$:/language/Buttons/ListNumber/Caption",
            "text": "numbered list"
        },
        "$:/language/Buttons/ListNumber/Hint": {
            "title": "$:/language/Buttons/ListNumber/Hint",
            "text": "Apply numbered list formatting to lines containing selection"
        },
        "$:/language/Buttons/MonoBlock/Caption": {
            "title": "$:/language/Buttons/MonoBlock/Caption",
            "text": "monospaced block"
        },
        "$:/language/Buttons/MonoBlock/Hint": {
            "title": "$:/language/Buttons/MonoBlock/Hint",
            "text": "Apply monospaced block formatting to lines containing selection"
        },
        "$:/language/Buttons/MonoLine/Caption": {
            "title": "$:/language/Buttons/MonoLine/Caption",
            "text": "monospaced"
        },
        "$:/language/Buttons/MonoLine/Hint": {
            "title": "$:/language/Buttons/MonoLine/Hint",
            "text": "Apply monospaced character formatting to selection"
        },
        "$:/language/Buttons/Opacity/Caption": {
            "title": "$:/language/Buttons/Opacity/Caption",
            "text": "opacity"
        },
        "$:/language/Buttons/Opacity/Hint": {
            "title": "$:/language/Buttons/Opacity/Hint",
            "text": "Set painting opacity"
        },
        "$:/language/Buttons/Paint/Caption": {
            "title": "$:/language/Buttons/Paint/Caption",
            "text": "paint colour"
        },
        "$:/language/Buttons/Paint/Hint": {
            "title": "$:/language/Buttons/Paint/Hint",
            "text": "Set painting colour"
        },
        "$:/language/Buttons/Picture/Caption": {
            "title": "$:/language/Buttons/Picture/Caption",
            "text": "picture"
        },
        "$:/language/Buttons/Picture/Hint": {
            "title": "$:/language/Buttons/Picture/Hint",
            "text": "Insert picture"
        },
        "$:/language/Buttons/Preview/Caption": {
            "title": "$:/language/Buttons/Preview/Caption",
            "text": "preview"
        },
        "$:/language/Buttons/Preview/Hint": {
            "title": "$:/language/Buttons/Preview/Hint",
            "text": "Show preview pane"
        },
        "$:/language/Buttons/PreviewType/Caption": {
            "title": "$:/language/Buttons/PreviewType/Caption",
            "text": "preview type"
        },
        "$:/language/Buttons/PreviewType/Hint": {
            "title": "$:/language/Buttons/PreviewType/Hint",
            "text": "Choose preview type"
        },
        "$:/language/Buttons/Quote/Caption": {
            "title": "$:/language/Buttons/Quote/Caption",
            "text": "quote"
        },
        "$:/language/Buttons/Quote/Hint": {
            "title": "$:/language/Buttons/Quote/Hint",
            "text": "Apply quoted text formatting to lines containing selection"
        },
        "$:/language/Buttons/RotateLeft/Caption": {
            "title": "$:/language/Buttons/RotateLeft/Caption",
            "text": "rotate left"
        },
        "$:/language/Buttons/RotateLeft/Hint": {
            "title": "$:/language/Buttons/RotateLeft/Hint",
            "text": "Rotate image left by 90 degrees"
        },
        "$:/language/Buttons/Size/Caption": {
            "title": "$:/language/Buttons/Size/Caption",
            "text": "image size"
        },
        "$:/language/Buttons/Size/Caption/Height": {
            "title": "$:/language/Buttons/Size/Caption/Height",
            "text": "Height:"
        },
        "$:/language/Buttons/Size/Caption/Resize": {
            "title": "$:/language/Buttons/Size/Caption/Resize",
            "text": "Resize image"
        },
        "$:/language/Buttons/Size/Caption/Width": {
            "title": "$:/language/Buttons/Size/Caption/Width",
            "text": "Width:"
        },
        "$:/language/Buttons/Size/Hint": {
            "title": "$:/language/Buttons/Size/Hint",
            "text": "Set image size"
        },
        "$:/language/Buttons/Stamp/Caption": {
            "title": "$:/language/Buttons/Stamp/Caption",
            "text": "stamp"
        },
        "$:/language/Buttons/Stamp/Caption/New": {
            "title": "$:/language/Buttons/Stamp/Caption/New",
            "text": "Add your own"
        },
        "$:/language/Buttons/Stamp/Hint": {
            "title": "$:/language/Buttons/Stamp/Hint",
            "text": "Insert a preconfigured snippet of text"
        },
        "$:/language/Buttons/Stamp/New/Title": {
            "title": "$:/language/Buttons/Stamp/New/Title",
            "text": "Name as shown in menu"
        },
        "$:/language/Buttons/Stamp/New/Text": {
            "title": "$:/language/Buttons/Stamp/New/Text",
            "text": "Text of snippet. (Remember to add a descriptive title in the caption field)."
        },
        "$:/language/Buttons/Strikethrough/Caption": {
            "title": "$:/language/Buttons/Strikethrough/Caption",
            "text": "strikethrough"
        },
        "$:/language/Buttons/Strikethrough/Hint": {
            "title": "$:/language/Buttons/Strikethrough/Hint",
            "text": "Apply strikethrough formatting to selection"
        },
        "$:/language/Buttons/Subscript/Caption": {
            "title": "$:/language/Buttons/Subscript/Caption",
            "text": "subscript"
        },
        "$:/language/Buttons/Subscript/Hint": {
            "title": "$:/language/Buttons/Subscript/Hint",
            "text": "Apply subscript formatting to selection"
        },
        "$:/language/Buttons/Superscript/Caption": {
            "title": "$:/language/Buttons/Superscript/Caption",
            "text": "superscript"
        },
        "$:/language/Buttons/Superscript/Hint": {
            "title": "$:/language/Buttons/Superscript/Hint",
            "text": "Apply superscript formatting to selection"
        },
        "$:/language/Buttons/ToggleSidebar/Hint": {
            "title": "$:/language/Buttons/ToggleSidebar/Hint",
            "text": "Toggle the sidebar visibility"
        },
        "$:/language/Buttons/Transcludify/Caption": {
            "title": "$:/language/Buttons/Transcludify/Caption",
            "text": "transclusion"
        },
        "$:/language/Buttons/Transcludify/Hint": {
            "title": "$:/language/Buttons/Transcludify/Hint",
            "text": "Wrap selection in curly brackets"
        },
        "$:/language/Buttons/Underline/Caption": {
            "title": "$:/language/Buttons/Underline/Caption",
            "text": "underline"
        },
        "$:/language/Buttons/Underline/Hint": {
            "title": "$:/language/Buttons/Underline/Hint",
            "text": "Apply underline formatting to selection"
        },
        "$:/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/AutoFocus/Prompt": {
            "title": "$:/language/ControlPanel/Basics/AutoFocus/Prompt",
            "text": "Default focus field for new tiddlers"
        },
        "$:/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/Text/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewJournal/Text/Prompt",
            "text": "Text for 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/NewTiddler/Title/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt",
            "text": "Title of new tiddlers"
        },
        "$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt",
            "text": "Tags for new tiddlers"
        },
        "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt": {
            "title": "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt",
            "text": "Number of overridden shadow tiddlers"
        },
        "$:/language/ControlPanel/Basics/RemoveTags": {
            "title": "$:/language/ControlPanel/Basics/RemoveTags",
            "text": "Update to current format"
        },
        "$:/language/ControlPanel/Basics/RemoveTags/Hint": {
            "title": "$:/language/ControlPanel/Basics/RemoveTags/Hint",
            "text": "Update the tags configuration to the latest format"
        },
        "$:/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/KeyboardShortcuts/Add/Prompt": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt",
            "text": "Type shortcut here"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Add/Caption": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Caption",
            "text": "add shortcut"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Caption": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Caption",
            "text": "Keyboard Shortcuts"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Hint": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Hint",
            "text": "Manage keyboard shortcut assignments"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption",
            "text": "No keyboard shortcuts assigned"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint",
            "text": "remove keyboard shortcut"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/All": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/All",
            "text": "All platforms"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac",
            "text": "Macintosh platform only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac",
            "text": "Non-Macintosh platforms only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux",
            "text": "Linux platform only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux",
            "text": "Non-Linux platforms only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows",
            "text": "Windows platform only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows",
            "text": "Non-Windows platforms only"
        },
        "$:/language/ControlPanel/LayoutSwitcher/Caption": {
            "title": "$:/language/ControlPanel/LayoutSwitcher/Caption",
            "text": "Layout"
        },
        "$:/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/Delete/Hint": {
            "title": "$:/language/ControlPanel/Palette/Editor/Delete/Hint",
            "text": "delete this entry from the current palette"
        },
        "$:/language/ControlPanel/Palette/Editor/Names/External/Show": {
            "title": "$:/language/ControlPanel/Palette/Editor/Names/External/Show",
            "text": "Show color names that are not part of the current palette"
        },
        "$:/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/enable wiki parser rules. For changes to take effect, save and reload your wiki. Disabling certain parser rules can prevent <$text text=\"TiddlyWiki\"/> from functioning correctly. Use [[safe mode|https://tiddlywiki.com/#SafeMode]] to restore normal operation."
        },
        "$:/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/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Add/Caption",
            "text": "Get more plugins"
        },
        "$:/language/ControlPanel/Plugins/Add/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Add/Hint",
            "text": "Install plugins from the official library"
        },
        "$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint": {
            "title": "$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint",
            "text": "This plugin is already installed at version <$text text=<<installedVersion>>/>"
        },
        "$:/language/ControlPanel/Plugins/AlsoRequires": {
            "title": "$:/language/ControlPanel/Plugins/AlsoRequires",
            "text": "Also requires:"
        },
        "$:/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/Downgrade/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Downgrade/Caption",
            "text": "downgrade"
        },
        "$:/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/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Install/Caption",
            "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/NoInfoFound/Hint": {
            "title": "$:/language/ControlPanel/Plugins/NoInfoFound/Hint",
            "text": "No ''\"<$text text=<<currentTab>>/>\"'' found"
        },
        "$:/language/ControlPanel/Plugins/NotInstalled/Hint": {
            "title": "$:/language/ControlPanel/Plugins/NotInstalled/Hint",
            "text": "This plugin is not currently installed"
        },
        "$:/language/ControlPanel/Plugins/OpenPluginLibrary": {
            "title": "$:/language/ControlPanel/Plugins/OpenPluginLibrary",
            "text": "open plugin library"
        },
        "$:/language/ControlPanel/Plugins/ClosePluginLibrary": {
            "title": "$:/language/ControlPanel/Plugins/ClosePluginLibrary",
            "text": "close plugin library"
        },
        "$:/language/ControlPanel/Plugins/PluginWillRequireReload": {
            "title": "$:/language/ControlPanel/Plugins/PluginWillRequireReload",
            "text": "(requires reload)"
        },
        "$:/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/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Reinstall/Caption",
            "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/Plugins/Update/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Update/Caption",
            "text": "update"
        },
        "$:/language/ControlPanel/Plugins/Updates/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Updates/Caption",
            "text": "Updates"
        },
        "$:/language/ControlPanel/Plugins/Updates/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Updates/Hint",
            "text": "Available updates to installed plugins"
        },
        "$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption",
            "text": "Update <<update-count>> plugins"
        },
        "$:/language/ControlPanel/Plugins/SubPluginPrompt": {
            "title": "$:/language/ControlPanel/Plugins/SubPluginPrompt",
            "text": "With <<count>> sub-plugins available"
        },
        "$:/language/ControlPanel/Saving/Caption": {
            "title": "$:/language/ControlPanel/Saving/Caption",
            "text": "Saving"
        },
        "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description": {
            "title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description",
            "text": "Permit automatic saving for the download saver"
        },
        "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint": {
            "title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint",
            "text": "Enable Autosave for Download Saver"
        },
        "$:/language/ControlPanel/Saving/DownloadSaver/Caption": {
            "title": "$:/language/ControlPanel/Saving/DownloadSaver/Caption",
            "text": "Download Saver"
        },
        "$:/language/ControlPanel/Saving/DownloadSaver/Hint": {
            "title": "$:/language/ControlPanel/Saving/DownloadSaver/Hint",
            "text": "These settings apply to the HTML5-compatible download saver"
        },
        "$:/language/ControlPanel/Saving/General/Caption": {
            "title": "$:/language/ControlPanel/Saving/General/Caption",
            "text": "General"
        },
        "$:/language/ControlPanel/Saving/General/Hint": {
            "title": "$:/language/ControlPanel/Saving/General/Hint",
            "text": "These settings apply to all the loaded savers"
        },
        "$:/language/ControlPanel/Saving/Hint": {
            "title": "$:/language/ControlPanel/Saving/Hint",
            "text": "Settings used for saving the entire TiddlyWiki as a single file via a saver module"
        },
        "$:/language/ControlPanel/Saving/GitService/Branch": {
            "title": "$:/language/ControlPanel/Saving/GitService/Branch",
            "text": "Target branch for saving"
        },
        "$:/language/ControlPanel/Saving/GitService/CommitMessage": {
            "title": "$:/language/ControlPanel/Saving/GitService/CommitMessage",
            "text": "Saved by TiddlyWiki"
        },
        "$:/language/ControlPanel/Saving/GitService/Description": {
            "title": "$:/language/ControlPanel/Saving/GitService/Description",
            "text": "These settings are only used when saving to <<service-name>>"
        },
        "$:/language/ControlPanel/Saving/GitService/Filename": {
            "title": "$:/language/ControlPanel/Saving/GitService/Filename",
            "text": "Filename of target file (e.g. `index.html`)"
        },
        "$:/language/ControlPanel/Saving/GitService/Path": {
            "title": "$:/language/ControlPanel/Saving/GitService/Path",
            "text": "Path to target file (e.g. `/wiki/`)"
        },
        "$:/language/ControlPanel/Saving/GitService/Repo": {
            "title": "$:/language/ControlPanel/Saving/GitService/Repo",
            "text": "Target repository (e.g. `Jermolene/TiddlyWiki5`)"
        },
        "$:/language/ControlPanel/Saving/GitService/ServerURL": {
            "title": "$:/language/ControlPanel/Saving/GitService/ServerURL",
            "text": "Server API URL"
        },
        "$:/language/ControlPanel/Saving/GitService/UserName": {
            "title": "$:/language/ControlPanel/Saving/GitService/UserName",
            "text": "Username"
        },
        "$:/language/ControlPanel/Saving/GitService/GitHub/Caption": {
            "title": "$:/language/ControlPanel/Saving/GitService/GitHub/Caption",
            "text": "~GitHub Saver"
        },
        "$:/language/ControlPanel/Saving/GitService/GitHub/Password": {
            "title": "$:/language/ControlPanel/Saving/GitService/GitHub/Password",
            "text": "Password, OAUTH token, or personal access token (see [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] for details)"
        },
        "$:/language/ControlPanel/Saving/GitService/GitLab/Caption": {
            "title": "$:/language/ControlPanel/Saving/GitService/GitLab/Caption",
            "text": "~GitLab Saver"
        },
        "$:/language/ControlPanel/Saving/GitService/GitLab/Password": {
            "title": "$:/language/ControlPanel/Saving/GitService/GitLab/Password",
            "text": "Personal access token for API (see [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] for details)"
        },
        "$:/language/ControlPanel/Saving/GitService/Gitea/Caption": {
            "title": "$:/language/ControlPanel/Saving/GitService/Gitea/Caption",
            "text": "Gitea Saver"
        },
        "$:/language/ControlPanel/Saving/GitService/Gitea/Password": {
            "title": "$:/language/ControlPanel/Saving/GitService/Gitea/Password",
            "text": "Personal access token for API (via Gitea’s web interface: `Settings | Applications | Generate New Token`)"
        },
        "$:/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/ControlPanel": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/ControlPanel",
            "text": "~TiddlySpot Control Panel"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Backups": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Backups",
            "text": "Backups"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Caption": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Caption",
            "text": "~TiddlySpot Saver"
        },
        "$:/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/ReadOnly": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/ReadOnly",
            "text": "The ~TiddlySpot service is currently only available in read-only form. Please see http://tiddlyspot.com/ for the latest details. The ~TiddlySpot saver can still be used to save to compatible servers."
        },
        "$:/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": "Attempt to automatically save changes during editing when using a supporting saver"
        },
        "$:/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/EditorToolbar/Caption": {
            "title": "$:/language/ControlPanel/Settings/EditorToolbar/Caption",
            "text": "Editor Toolbar"
        },
        "$:/language/ControlPanel/Settings/EditorToolbar/Hint": {
            "title": "$:/language/ControlPanel/Settings/EditorToolbar/Hint",
            "text": "Enable or disable the editor toolbar:"
        },
        "$:/language/ControlPanel/Settings/EditorToolbar/Description": {
            "title": "$:/language/ControlPanel/Settings/EditorToolbar/Description",
            "text": "Show editor toolbar"
        },
        "$:/language/ControlPanel/Settings/InfoPanelMode/Caption": {
            "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Caption",
            "text": "Tiddler Info Panel Mode"
        },
        "$:/language/ControlPanel/Settings/InfoPanelMode/Hint": {
            "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Hint",
            "text": "Control when the tiddler info panel closes:"
        },
        "$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description": {
            "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description",
            "text": "Tiddler info panel closes automatically"
        },
        "$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description": {
            "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description",
            "text": "Tiddler info panel stays open until explicitly closed"
        },
        "$:/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/NavigationPermalinkviewMode/Caption": {
            "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption",
            "text": "Permalink/permaview Mode"
        },
        "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint": {
            "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint",
            "text": "Choose how permalink/permaview is handled:"
        },
        "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description",
            "text": "Copy permalink/permaview URL to clipboard"
        },
        "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description",
            "text": "Update address bar with permalink/permaview URL"
        },
        "$:/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/DefaultMoreSidebarTab/Caption": {
            "title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption",
            "text": "Default More Sidebar Tab"
        },
        "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint": {
            "title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint",
            "text": "Specify which More 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/Settings/MissingLinks/Caption": {
            "title": "$:/language/ControlPanel/Settings/MissingLinks/Caption",
            "text": "Wiki Links"
        },
        "$:/language/ControlPanel/Settings/MissingLinks/Hint": {
            "title": "$:/language/ControlPanel/Settings/MissingLinks/Hint",
            "text": "Choose whether to link to tiddlers that do not exist yet"
        },
        "$:/language/ControlPanel/Settings/MissingLinks/Description": {
            "title": "$:/language/ControlPanel/Settings/MissingLinks/Description",
            "text": "Enable links to missing tiddlers"
        },
        "$:/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/Stylesheets/Caption": {
            "title": "$:/language/ControlPanel/Stylesheets/Caption",
            "text": "Stylesheets"
        },
        "$:/language/ControlPanel/Stylesheets/Expand/Caption": {
            "title": "$:/language/ControlPanel/Stylesheets/Expand/Caption",
            "text": "Expand All"
        },
        "$:/language/ControlPanel/Stylesheets/Hint": {
            "title": "$:/language/ControlPanel/Stylesheets/Hint",
            "text": "This is the rendered CSS of the current stylesheet tiddlers tagged with <<tag \"$:/tags/Stylesheet\">>"
        },
        "$:/language/ControlPanel/Stylesheets/Restore/Caption": {
            "title": "$:/language/ControlPanel/Stylesheets/Restore/Caption",
            "text": "Restore"
        },
        "$:/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. Drag and drop to change the ordering"
        },
        "$:/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. Drag and drop to change the ordering"
        },
        "$:/language/ControlPanel/Toolbars/EditorToolbar/Caption": {
            "title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Caption",
            "text": "Editor Toolbar"
        },
        "$:/language/ControlPanel/Toolbars/EditorToolbar/Hint": {
            "title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Hint",
            "text": "Choose which buttons are displayed in the editor toolbar. Note that some buttons will only appear when editing tiddlers of a certain type. Drag and drop to change the ordering"
        },
        "$:/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. Drag and drop to change the ordering"
        },
        "$:/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/allfilteroperator": {
            "title": "$:/language/Docs/ModuleTypes/allfilteroperator",
            "text": "A sub-operator for the ''all'' filter operator."
        },
        "$:/language/Docs/ModuleTypes/animation": {
            "title": "$:/language/Docs/ModuleTypes/animation",
            "text": "Animations that may be used with the RevealWidget."
        },
        "$:/language/Docs/ModuleTypes/authenticator": {
            "title": "$:/language/Docs/ModuleTypes/authenticator",
            "text": "Defines how requests are authenticated by the built-in HTTP server."
        },
        "$:/language/Docs/ModuleTypes/bitmapeditoroperation": {
            "title": "$:/language/Docs/ModuleTypes/bitmapeditoroperation",
            "text": "A bitmap editor toolbar operation."
        },
        "$:/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/info": {
            "title": "$:/language/Docs/ModuleTypes/info",
            "text": "Publishes system information via the [[$:/temp/info-plugin]] pseudo-plugin."
        },
        "$:/language/Docs/ModuleTypes/isfilteroperator": {
            "title": "$:/language/Docs/ModuleTypes/isfilteroperator",
            "text": "Operands for the ''is'' filter operator."
        },
        "$:/language/Docs/ModuleTypes/library": {
            "title": "$:/language/Docs/ModuleTypes/library",
            "text": "Generic module type for general purpose JavaScript modules."
        },
        "$:/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/route": {
            "title": "$:/language/Docs/ModuleTypes/route",
            "text": "Defines how individual URL patterns are handled by the built-in HTTP server."
        },
        "$:/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/texteditoroperation": {
            "title": "$:/language/Docs/ModuleTypes/texteditoroperation",
            "text": "A text editor toolbar operation."
        },
        "$:/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-browser": {
            "title": "$:/language/Docs/ModuleTypes/utils-browser",
            "text": "Adds browser-specific 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/menubar-background": {
            "title": "$:/language/Docs/PaletteColours/menubar-background",
            "text": "Menu bar background"
        },
        "$:/language/Docs/PaletteColours/menubar-foreground": {
            "title": "$:/language/Docs/PaletteColours/menubar-foreground",
            "text": "Menu bar 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/select-tag-background": {
            "title": "$:/language/Docs/PaletteColours/select-tag-background",
            "text": "`<select>` element background"
        },
        "$:/language/Docs/PaletteColours/select-tag-foreground": {
            "title": "$:/language/Docs/PaletteColours/select-tag-foreground",
            "text": "`<select>` element text"
        },
        "$:/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 tiddler shows content stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself"
        },
        "$:/language/EditTemplate/Body/Placeholder": {
            "title": "$:/language/EditTemplate/Body/Placeholder",
            "text": "Type the text for this tiddler"
        },
        "$:/language/EditTemplate/Body/Preview/Type/Output": {
            "title": "$:/language/EditTemplate/Body/Preview/Type/Output",
            "text": "output"
        },
        "$:/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/Field/Dropdown/Caption": {
            "title": "$:/language/EditTemplate/Field/Dropdown/Caption",
            "text": "field list"
        },
        "$:/language/EditTemplate/Field/Dropdown/Hint": {
            "title": "$:/language/EditTemplate/Field/Dropdown/Hint",
            "text": "Show field list"
        },
        "$:/language/EditTemplate/Fields/Add/Button": {
            "title": "$:/language/EditTemplate/Fields/Add/Button",
            "text": "add"
        },
        "$:/language/EditTemplate/Fields/Add/Button/Hint": {
            "title": "$:/language/EditTemplate/Fields/Add/Button/Hint",
            "text": "Add the new field to the tiddler"
        },
        "$:/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/Button/Hint": {
            "title": "$:/language/EditTemplate/Tags/Add/Button/Hint",
            "text": "add tag"
        },
        "$:/language/EditTemplate/Tags/Add/Placeholder": {
            "title": "$:/language/EditTemplate/Tags/Add/Placeholder",
            "text": "tag name"
        },
        "$:/language/EditTemplate/Tags/ClearInput/Caption": {
            "title": "$:/language/EditTemplate/Tags/ClearInput/Caption",
            "text": "clear input"
        },
        "$:/language/EditTemplate/Tags/ClearInput/Hint": {
            "title": "$:/language/EditTemplate/Tags/ClearInput/Hint",
            "text": "Clear tag input"
        },
        "$:/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/Title/BadCharacterWarning": {
            "title": "$:/language/EditTemplate/Title/BadCharacterWarning",
            "text": "Warning: avoid using any of the characters <<bad-chars>> in tiddler titles"
        },
        "$:/language/EditTemplate/Title/Exists/Prompt": {
            "title": "$:/language/EditTemplate/Title/Exists/Prompt",
            "text": "Target tiddler already exists"
        },
        "$:/language/EditTemplate/Title/Relink/Prompt": {
            "title": "$:/language/EditTemplate/Title/Relink/Prompt",
            "text": "Update ''<$text text=<<fromTitle>>/>'' to ''<$text text=<<toTitle>>/>'' in the //tags// and //list// fields of other tiddlers"
        },
        "$:/language/EditTemplate/Title/References/Prompt": {
            "title": "$:/language/EditTemplate/Title/References/Prompt",
            "text": "The following references to this tiddler will not be automatically updated:"
        },
        "$:/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/hide-body": {
            "title": "$:/language/Docs/Fields/hide-body",
            "text": "The view template will hide bodies of tiddlers if set to: ''yes''"
        },
        "$:/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": "Indicates that a tiddler should be saved as a JavaScript library if set to: ''yes''"
        },
        "$:/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, or at the end of the list if this field is present but empty"
        },
        "$:/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/throttle.refresh": {
            "title": "$:/language/Docs/Fields/throttle.refresh",
            "text": "If present, throttles refreshes of this tiddler"
        },
        "$:/language/Docs/Fields/title": {
            "title": "$:/language/Docs/Fields/title",
            "text": "The unique name of a tiddler"
        },
        "$:/language/Docs/Fields/toc-link": {
            "title": "$:/language/Docs/Fields/toc-link",
            "text": "Suppresses the tiddler's link in a Table of Contents tree if set to: ''no''"
        },
        "$:/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/Docs/Fields/_is_skinny": {
            "title": "$:/language/Docs/Fields/_is_skinny",
            "text": "If present, indicates that the tiddler text field must be loaded from the server"
        },
        "$:/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/SessionTiddlers": {
            "title": "$:/language/Filters/SessionTiddlers",
            "text": "Tiddlers modified since the wiki was loaded"
        },
        "$:/language/Filters/SystemTags": {
            "title": "$:/language/Filters/SystemTags",
            "text": "System tags"
        },
        "$:/language/Filters/StoryList": {
            "title": "$:/language/Filters/StoryList",
            "text": "Tiddlers in the story river, excluding <$text text=\"$:/AdvancedSearch\"/>"
        },
        "$:/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 vital to make sure that you can reliably save changes. See https://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 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/deletetiddlers": {
            "title": "$:/language/Help/deletetiddlers",
            "description": "Deletes a group of tiddlers",
            "text": "<<.from-version \"5.1.20\">> Deletes a group of tiddlers identified by a filter.\n\n```\n--deletetiddlers <filter>\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/fetch": {
            "title": "$:/language/Help/fetch",
            "description": "Fetch tiddlers from wiki by URL",
            "text": "Fetch one or more files over HTTP/HTTPS, and import the tiddlers matching a filter, optionally transforming the incoming titles.\n\n```\n--fetch file <url> <import-filter> <transform-filter>\n--fetch files <url-filter> <import-filter> <transform-filter>\n--fetch raw-file <url> <transform-filter>\n--fetch raw-files <url-filter> <transform-filter>\n```\n\nThe \"file\" and \"files\" variants fetch the specified files and attempt to import the tiddlers within them (the same processing as if the files were dragged into the browser window). The \"raw-file\" and \"raw-files\" variants fetch the specified files and then store the raw file data in tiddlers, without applying the import logic.\n\nWith the \"file\" and \"raw-file\" variants only a single file is fetched and the first parameter is the URL of the file to read.\n\nWith the \"files\" and \"raw-files\" variants, multiple files are fetched and the first parameter is a filter yielding a list of URLs of the files to read. For example, given a set of tiddlers tagged \"remote-server\" that have a field \"url\" the filter `[tag[remote-server]get[url]]` will retrieve all the available URLs.\n\nFor the \"file\" and \"files\" variants, the `<import-filter>` parameter specifies a filter determining which tiddlers are imported. It defaults to `[all[tiddlers]]` if not provided.\n\nFor all variants, the `<transform-filter>` parameter specifies an optional filter that transforms the titles of the imported tiddlers. For example, `[addprefix[$:/myimports/]]` would add the prefix `$:/myimports/` to each title.\n\nPreceding the `--fetch` command with `--verbose` will output progress information during the import.\n\nNote that TiddlyWiki will not fetch an older version of an already loaded plugin.\n\nThe following example retrieves all the non-system tiddlers from https://tiddlywiki.com and saves them to a JSON file:\n\n```\ntiddlywiki --verbose --fetch file \"https://tiddlywiki.com/\" \"[!is[system]]\" \"\" --rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[!is[system]]\"\n```\n\nThe following example retrieves the \"favicon\" file from tiddlywiki.com and saves it in a file called \"output.ico\". Note that the intermediate tiddler \"Icon Tiddler\" is quoted in the \"--fetch\" command because it is being used as a transformation filter to replace the default title, while there are no quotes for the \"--savetiddler\" command because it is being used directly as a title.\n\n```\ntiddlywiki --verbose --fetch raw-file \"https://tiddlywiki.com/favicon.ico\" \"[[Icon Tiddler]]\" --savetiddler \"Icon Tiddler\" output.ico\n```\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/import": {
            "title": "$:/language/Help/import",
            "description": "Import tiddlers from a file",
            "text": "Import tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The deserializer must be explicitly specified, unlike the `load` command which infers the deserializer from the file extension.\n\n```\n--import <filepath> <deserializer> [<title>] [<encoding>]\n```\n\nThe deserializers in the core include:\n\n* application/javascript\n* application/json\n* application/x-tiddler\n* application/x-tiddler-html-div\n* application/x-tiddlers\n* text/html\n* text/plain\n\nThe title of the imported tiddler defaults to the filename.\n\nThe encoding defaults to \"utf8\", but can be \"base64\" for importing binary files.\n\nNote that TiddlyWiki will not import an older version of an already loaded plugin.\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/listen": {
            "title": "$:/language/Help/listen",
            "description": "Provides an HTTP server interface to TiddlyWiki",
            "text": "Serves a wiki over HTTP.\n\nThe listen command uses NamedCommandParameters:\n\n```\n--listen [<name>=<value>]...\n```\n\nAll parameters are optional with safe defaults, and can be specified in any order. The recognised parameters are:\n\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''credentials'' - pathname of credentials CSV file (relative to wiki folder)\n* ''anon-username'' - the username for signing edits for anonymous users\n* ''username'' - optional username for basic authentication\n* ''password'' - optional password for basic authentication\n* ''authenticated-user-header'' - optional name of header to be used for trusted authentication\n* ''readers'' - comma separated list of principals allowed to read from this wiki\n* ''writers'' - comma separated list of principals allowed to write to this wiki\n* ''csrf-disable'' - set to \"yes\" to disable CSRF checks (defaults to \"no\")\n* ''sse-enabled'' - set to \"yes\" to enable Server-sent events (defaults to \"no\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''tls-cert'' - pathname of TLS certificate file (relative to wiki folder)\n* ''tls-key'' - pathname of TLS key file (relative to wiki folder)\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n* ''gzip'' - set to \"yes\" to enable gzip compression for some http endpoints (defaults to \"no\")\n\nFor information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\n"
        },
        "$:/language/Help/load": {
            "title": "$:/language/Help/load",
            "description": "Load tiddlers from a file",
            "text": "Load tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The processing applied to incoming files is determined by the file extension. Use the alternative `import` command if you need to specify the deserializer and encoding explicitly.\n\n```\n--load <filepath> [noerror]\n--load <dirpath> [noerror]\n```\n\nBy default, the load command raises an error if no tiddlers are found. The error can be suppressed by providing the optional \"noerror\" parameter.\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/render": {
            "title": "$:/language/Help/render",
            "description": "Renders individual tiddlers to files",
            "text": "Render individual tiddlers identified by a filter and save the results to the specified files.\n\nOptionally, the title of a template tiddler can be specified. In this case, instead of directly rendering each tiddler, the template tiddler is rendered with the \"currentTiddler\" variable set to the title of the tiddler that is being rendered.\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [ [<name>] [<value>] ]*\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be rendered\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]addsuffix[.html]]`, which uses the unchanged tiddler title as the filename\n* ''render-type'': Optional render type: `text/html` (the default) returns the full HTML text and `text/plain` just returns the text content (ie it ignores HTML tags and other unprintable material)\n* ''template'': Optional template through which each tiddler is rendered\n* ''name'': Name of optional variables\n* ''value'': Value of optional variables\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\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When referring to a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--render \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being rendered, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* Multiple ''name''/''value'' pairs can be used to pass more than one variable\n* The `--render` command is a more flexible replacement for both the `--rendertiddler` and `--rendertiddlers` commands, which are deprecated\n\nExamples:\n\n* `--render \"[!is[system]]\" \"[encodeuricomponent[]addprefix[tiddlers/]addsuffix[.html]]\"` -- renders all non-system tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles and the extension HTML\n\n"
        },
        "$:/language/Help/rendertiddler": {
            "title": "$:/language/Help/rendertiddler",
            "description": "Render an individual tiddler as a specified ContentType",
            "text": "(Note: The `--rendertiddler` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender an individual tiddler as a specified ContentType, defaulting to `text/html` and save it to the specified filename.\n\nOptionally the title of a template tiddler 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\nA name and value for an additional variable may optionally also be specified.\n\n```\n--rendertiddler <title> <filename> [<type>] [<template>] [<name>] [<value>]\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\nFor example, the following command saves all tiddlers matching the filter `[tag[done]]` to a JSON file titled `output.json` by employing the core template `$:/core/templates/exporters/JsonFile`.\n\n```\n--rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[tag[done]]\"\n```\n"
        },
        "$:/language/Help/rendertiddlers": {
            "title": "$:/language/Help/rendertiddlers",
            "description": "Render tiddlers matching a filter to a specified ContentType",
            "text": "(Note: The `--rendertiddlers` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender 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/save": {
            "title": "$:/language/Help/save",
            "description": "Saves individual raw tiddlers to files",
            "text": "Saves individual tiddlers identified by a filter in their raw text or binary format to the specified files.\n\n```\n--save <tiddler-filter> <filename-filter>\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be saved\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]]`, which uses the unchanged tiddler title as the filename\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\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When saving a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--save \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being saved, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--save` command is a more flexible replacement for both the `--savetiddler` and `--savetiddlers` commands, which are deprecated\n\nExamples:\n\n* `--save \"[!is[system]is[image]]\" \"[encodeuricomponent[]addprefix[tiddlers/]]\"` -- saves all non-system image tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles\n"
        },
        "$:/language/Help/savetiddler": {
            "title": "$:/language/Help/savetiddler",
            "description": "Saves a raw tiddler to a file",
            "text": "(Note: The `--savetiddler` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves 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": "(Note: The `--savetiddlers` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves 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/savewikifolder": {
            "title": "$:/language/Help/savewikifolder",
            "description": "Saves a wiki to a new wiki folder",
            "text": "<<.from-version \"5.1.20\">> Saves the current wiki as a wiki folder, including tiddlers, plugins and configuration:\n\n```\n--savewikifolder <wikifolderpath> [<filter>]\n```\n\n* The target wiki folder must be empty or non-existent\n* The filter specifies which tiddlers should be included. It is optional, defaulting to `[all[tiddlers]]`\n* Plugins from the official plugin library are replaced with references to those plugins in the `tiddlywiki.info` file\n* Custom plugins are unpacked into their own folder\n\nA common usage is to convert a TiddlyWiki HTML file into a wiki folder:\n\n```\ntiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder\n```\n"
        },
        "$:/language/Help/server": {
            "title": "$:/language/Help/server",
            "description": "Provides an HTTP server interface to TiddlyWiki (deprecated in favour of the new listen command)",
            "text": "Legacy command to serve a wiki over HTTP.\n\n```\n--server <port> <root-tiddler> <root-render-type> <root-serve-type> <username> <password> <host> <path-prefix> <debug-level>\n```\n\nThe parameters are:\n\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - 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* ''path-prefix'' - optional prefix for paths\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\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 should only be used on a trusted network or over HTTPS.\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```\n--server 8080 $:/core/save/all text/plain text/html \"\" \"\" 192.168.0.245\n```\n\nUsing an address like this exposes your system to the local network. For information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\nTo run multiple TiddlyWiki servers at the same time you'll need to put each one on a different port. It can be useful to use an environment variable to pass the port number to the Node.js process. This example references an environment variable called \"MY_PORT_NUMBER\":\n\n```\n--server MY_PORT_NUMBER $:/core/save/all text/plain text/html MyUserName passw0rd\n```\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/Hint": {
            "title": "$:/language/Import/Imported/Hint",
            "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/Listing/Preview": {
            "title": "$:/language/Import/Listing/Preview",
            "text": "Preview:"
        },
        "$:/language/Import/Listing/Preview/Text": {
            "title": "$:/language/Import/Listing/Preview/Text",
            "text": "Text"
        },
        "$:/language/Import/Listing/Preview/TextRaw": {
            "title": "$:/language/Import/Listing/Preview/TextRaw",
            "text": "Text (Raw)"
        },
        "$:/language/Import/Listing/Preview/Fields": {
            "title": "$:/language/Import/Listing/Preview/Fields",
            "text": "Fields"
        },
        "$:/language/Import/Listing/Preview/Diff": {
            "title": "$:/language/Import/Listing/Preview/Diff",
            "text": "Diff"
        },
        "$:/language/Import/Listing/Preview/DiffFields": {
            "title": "$:/language/Import/Listing/Preview/DiffFields",
            "text": "Diff (Fields)"
        },
        "$:/language/Import/Listing/Rename/Tooltip": {
            "title": "$:/language/Import/Listing/Rename/Tooltip",
            "text": "Rename tiddler before importing"
        },
        "$:/language/Import/Listing/Rename/Prompt": {
            "title": "$:/language/Import/Listing/Rename/Prompt",
            "text": "Rename to:"
        },
        "$:/language/Import/Listing/Rename/ConfirmRename": {
            "title": "$:/language/Import/Listing/Rename/ConfirmRename",
            "text": "Rename tiddler"
        },
        "$:/language/Import/Listing/Rename/CancelRename": {
            "title": "$:/language/Import/Listing/Rename/CancelRename",
            "text": "Cancel"
        },
        "$:/language/Import/Listing/Rename/OverwriteWarning": {
            "title": "$:/language/Import/Listing/Rename/OverwriteWarning",
            "text": "A tiddler with this title already exists."
        },
        "$:/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>> not being newer 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/System/Warning": {
            "title": "$:/language/Import/Upgrader/System/Warning",
            "text": "Core module tiddler."
        },
        "$:/language/Import/Upgrader/System/Alert": {
            "title": "$:/language/Import/Upgrader/System/Alert",
            "text": "You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable."
        },
        "$:/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|https://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 https://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/ColourPicker/Recent": {
            "title": "$:/language/ColourPicker/Recent",
            "text": "Recent:"
        },
        "$:/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/ConfirmAction": {
            "title": "$:/language/ConfirmAction",
            "text": "Do you wish to proceed?"
        },
        "$:/language/Count": {
            "title": "$:/language/Count",
            "text": "count"
        },
        "$:/language/DefaultNewTiddlerTitle": {
            "title": "$:/language/DefaultNewTiddlerTitle",
            "text": "New Tiddler"
        },
        "$:/language/Diffs/CountMessage": {
            "title": "$:/language/Diffs/CountMessage",
            "text": "<<diff-count>> differences"
        },
        "$:/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/Error/Caption": {
            "title": "$:/language/Error/Caption",
            "text": "Error"
        },
        "$:/language/Error/EditConflict": {
            "title": "$:/language/Error/EditConflict",
            "text": "File changed on server"
        },
        "$:/language/Error/Filter": {
            "title": "$:/language/Error/Filter",
            "text": "Filter error"
        },
        "$:/language/Error/FilterSyntax": {
            "title": "$:/language/Error/FilterSyntax",
            "text": "Syntax error in filter expression"
        },
        "$:/language/Error/FilterRunPrefix": {
            "title": "$:/language/Error/FilterRunPrefix",
            "text": "Filter Error: Unknown prefix for filter run"
        },
        "$:/language/Error/IsFilterOperator": {
            "title": "$:/language/Error/IsFilterOperator",
            "text": "Filter Error: Unknown operand for the 'is' filter operator"
        },
        "$:/language/Error/FormatFilterOperator": {
            "title": "$:/language/Error/FormatFilterOperator",
            "text": "Filter Error: Unknown suffix for the 'format' filter operator"
        },
        "$:/language/Error/LoadingPluginLibrary": {
            "title": "$:/language/Error/LoadingPluginLibrary",
            "text": "Error loading plugin library"
        },
        "$:/language/Error/NetworkErrorAlert": {
            "title": "$:/language/Error/NetworkErrorAlert",
            "text": "`<h2>''Network Error''</h2>It looks like the connection to the server has been lost. This may indicate a problem with your network connection. Please attempt to restore network connectivity before continuing.<br><br>''Any unsaved changes will be automatically synchronised when connectivity is restored''.`"
        },
        "$:/language/Error/RecursiveTransclusion": {
            "title": "$:/language/Error/RecursiveTransclusion",
            "text": "Recursive transclusion error in transclude widget"
        },
        "$:/language/Error/RetrievingSkinny": {
            "title": "$:/language/Error/RetrievingSkinny",
            "text": "Error retrieving skinny tiddler list"
        },
        "$:/language/Error/SavingToTWEdit": {
            "title": "$:/language/Error/SavingToTWEdit",
            "text": "Error saving to TWEdit"
        },
        "$:/language/Error/WhileSaving": {
            "title": "$:/language/Error/WhileSaving",
            "text": "Error while saving"
        },
        "$:/language/Error/XMLHttpRequest": {
            "title": "$:/language/Error/XMLHttpRequest",
            "text": "XMLHttpRequest error code"
        },
        "$:/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/LayoutSwitcher/Description": {
            "title": "$:/language/LayoutSwitcher/Description",
            "text": "Open the layout switcher"
        },
        "$:/language/LazyLoadingWarning": {
            "title": "$:/language/LazyLoadingWarning",
            "text": "<p>Trying to load external content from ''<$text text={{!!_canonical_uri}}/>''</p><p>If this message doesn't disappear, either the tiddler content type doesn't match the type of the external content, or you may be using a browser that doesn't support external content for wikis loaded as standalone files. See https://tiddlywiki.com/#ExternalText</p>"
        },
        "$:/language/LoginToTiddlySpace": {
            "title": "$:/language/LoginToTiddlySpace",
            "text": "Login to TiddlySpace"
        },
        "$:/language/Manager/Controls/FilterByTag/None": {
            "title": "$:/language/Manager/Controls/FilterByTag/None",
            "text": "(none)"
        },
        "$:/language/Manager/Controls/FilterByTag/Prompt": {
            "title": "$:/language/Manager/Controls/FilterByTag/Prompt",
            "text": "Filter by tag:"
        },
        "$:/language/Manager/Controls/Order/Prompt": {
            "title": "$:/language/Manager/Controls/Order/Prompt",
            "text": "Reverse order"
        },
        "$:/language/Manager/Controls/Search/Placeholder": {
            "title": "$:/language/Manager/Controls/Search/Placeholder",
            "text": "Search"
        },
        "$:/language/Manager/Controls/Search/Prompt": {
            "title": "$:/language/Manager/Controls/Search/Prompt",
            "text": "Search:"
        },
        "$:/language/Manager/Controls/Show/Option/Tags": {
            "title": "$:/language/Manager/Controls/Show/Option/Tags",
            "text": "tags"
        },
        "$:/language/Manager/Controls/Show/Option/Tiddlers": {
            "title": "$:/language/Manager/Controls/Show/Option/Tiddlers",
            "text": "tiddlers"
        },
        "$:/language/Manager/Controls/Show/Prompt": {
            "title": "$:/language/Manager/Controls/Show/Prompt",
            "text": "Show:"
        },
        "$:/language/Manager/Controls/Sort/Prompt": {
            "title": "$:/language/Manager/Controls/Sort/Prompt",
            "text": "Sort by:"
        },
        "$:/language/Manager/Item/Colour": {
            "title": "$:/language/Manager/Item/Colour",
            "text": "Colour"
        },
        "$:/language/Manager/Item/Fields": {
            "title": "$:/language/Manager/Item/Fields",
            "text": "Fields"
        },
        "$:/language/Manager/Item/Icon/None": {
            "title": "$:/language/Manager/Item/Icon/None",
            "text": "(none)"
        },
        "$:/language/Manager/Item/Icon": {
            "title": "$:/language/Manager/Item/Icon",
            "text": "Icon"
        },
        "$:/language/Manager/Item/RawText": {
            "title": "$:/language/Manager/Item/RawText",
            "text": "Raw text"
        },
        "$:/language/Manager/Item/Tags": {
            "title": "$:/language/Manager/Item/Tags",
            "text": "Tags"
        },
        "$:/language/Manager/Item/Tools": {
            "title": "$:/language/Manager/Item/Tools",
            "text": "Tools"
        },
        "$:/language/Manager/Item/WikifiedText": {
            "title": "$:/language/Manager/Item/WikifiedText",
            "text": "Wikified text"
        },
        "$:/language/MissingTiddler/Hint": {
            "title": "$:/language/MissingTiddler/Hint",
            "text": "Missing tiddler \"<$text text=<<currentTiddler>>/>\" -- click {{||$:/core/ui/Buttons/edit}} to create"
        },
        "$:/language/No": {
            "title": "$:/language/No",
            "text": "No"
        },
        "$:/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/PageTemplate/Description": {
            "title": "$:/language/PageTemplate/Description",
            "text": "the default ~TiddlyWiki layout"
        },
        "$:/language/PageTemplate/Name": {
            "title": "$:/language/PageTemplate/Name",
            "text": "Default ~PageTemplate"
        },
        "$:/language/PluginReloadWarning": {
            "title": "$:/language/PluginReloadWarning",
            "text": "Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect"
        },
        "$:/language/RecentChanges/DateFormat": {
            "title": "$:/language/RecentChanges/DateFormat",
            "text": "DDth MMM YYYY"
        },
        "$:/language/Shortcuts/Input/AdvancedSearch/Hint": {
            "title": "$:/language/Shortcuts/Input/AdvancedSearch/Hint",
            "text": "Open the ~AdvancedSearch panel from within the sidebar search field"
        },
        "$:/language/Shortcuts/Input/Accept/Hint": {
            "title": "$:/language/Shortcuts/Input/Accept/Hint",
            "text": "Accept the selected item"
        },
        "$:/language/Shortcuts/Input/AcceptVariant/Hint": {
            "title": "$:/language/Shortcuts/Input/AcceptVariant/Hint",
            "text": "Accept the selected item (variant)"
        },
        "$:/language/Shortcuts/Input/Cancel/Hint": {
            "title": "$:/language/Shortcuts/Input/Cancel/Hint",
            "text": "Clear the input field"
        },
        "$:/language/Shortcuts/Input/Down/Hint": {
            "title": "$:/language/Shortcuts/Input/Down/Hint",
            "text": "Select the next item"
        },
        "$:/language/Shortcuts/Input/Tab-Left/Hint": {
            "title": "$:/language/Shortcuts/Input/Tab-Left/Hint",
            "text": "Select the previous Tab"
        },
        "$:/language/Shortcuts/Input/Tab-Right/Hint": {
            "title": "$:/language/Shortcuts/Input/Tab-Right/Hint",
            "text": "Select the next Tab"
        },
        "$:/language/Shortcuts/Input/Up/Hint": {
            "title": "$:/language/Shortcuts/Input/Up/Hint",
            "text": "Select the previous item"
        },
        "$:/language/Shortcuts/SidebarLayout/Hint": {
            "title": "$:/language/Shortcuts/SidebarLayout/Hint",
            "text": "Change the sidebar layout"
        },
        "$:/language/Switcher/Subtitle/theme": {
            "title": "$:/language/Switcher/Subtitle/theme",
            "text": "Switch Theme"
        },
        "$:/language/Switcher/Subtitle/layout": {
            "title": "$:/language/Switcher/Subtitle/layout",
            "text": "Switch Layout"
        },
        "$:/language/Switcher/Subtitle/language": {
            "title": "$:/language/Switcher/Subtitle/language",
            "text": "Switch Language"
        },
        "$:/language/Switcher/Subtitle/palette": {
            "title": "$:/language/Switcher/Subtitle/palette",
            "text": "Switch Palette"
        },
        "$:/language/SystemTiddler/Tooltip": {
            "title": "$:/language/SystemTiddler/Tooltip",
            "text": "This is a system tiddler"
        },
        "$:/language/SystemTiddlers/Include/Prompt": {
            "title": "$:/language/SystemTiddlers/Include/Prompt",
            "text": "Include system tiddlers"
        },
        "$:/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/Icons/None": {
            "title": "$:/language/TagManager/Icons/None",
            "text": "None"
        },
        "$:/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/Yes": {
            "title": "$:/language/Yes",
            "text": "Yes"
        },
        "$:/language/Modals/Download": {
            "title": "$:/language/Modals/Download",
            "subtitle": "Download changes",
            "footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
            "help": "https://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",
            "subtitle": "Save your work",
            "footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
            "help": "https://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/Text": {
            "title": "$:/config/NewJournal/Text",
            "text": ""
        },
        "$:/config/NewJournal/Tags": {
            "title": "$:/config/NewJournal/Tags",
            "text": "Journal\n"
        },
        "$:/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/Notifications/CopiedToClipboard/Succeeded": {
            "title": "$:/language/Notifications/CopiedToClipboard/Succeeded",
            "text": "Copied to clipboard!"
        },
        "$:/language/Notifications/CopiedToClipboard/Failed": {
            "title": "$:/language/Notifications/CopiedToClipboard/Failed",
            "text": "Failed to copy to clipboard!"
        },
        "$:/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|https://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/Search/TooShort": {
            "title": "$:/language/Search/Search/TooShort",
            "text": "Search text too short"
        },
        "$:/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/Explorer/Caption": {
            "title": "$:/language/SideBar/Explorer/Caption",
            "text": "Explorer"
        },
        "$:/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/Snippets/ListByTag": {
            "title": "$:/language/Snippets/ListByTag",
            "tags": "$:/tags/TextEditor/Snippet",
            "caption": "List of tiddlers by tag",
            "text": "<<list-links \"[tag[task]sort[title]]\">>\n"
        },
        "$:/language/Snippets/MacroDefinition": {
            "title": "$:/language/Snippets/MacroDefinition",
            "tags": "$:/tags/TextEditor/Snippet",
            "caption": "Macro definition",
            "text": "\\define macroName(param1:\"default value\",param2)\nText of the macro\n\\end\n"
        },
        "$:/language/Snippets/Table4x3": {
            "title": "$:/language/Snippets/Table4x3",
            "tags": "$:/tags/TextEditor/Snippet",
            "caption": "Table with 4 columns by 3 rows",
            "text": "|! |!Alpha |!Beta |!Gamma |!Delta |\n|!One | | | | |\n|!Two | | | | |\n|!Three | | | | |\n"
        },
        "$:/language/Snippets/TableOfContents": {
            "title": "$:/language/Snippets/TableOfContents",
            "tags": "$:/tags/TextEditor/Snippet",
            "caption": "Table of Contents",
            "text": "<div class=\"tc-table-of-contents\">\n\n<<toc-selective-expandable 'TableOfContents'>>\n\n</div>"
        },
        "$:/language/ThemeTweaks/ThemeTweaks": {
            "title": "$:/language/ThemeTweaks/ThemeTweaks",
            "text": "Theme Tweaks"
        },
        "$:/language/ThemeTweaks/ThemeTweaks/Hint": {
            "title": "$:/language/ThemeTweaks/ThemeTweaks/Hint",
            "text": "You can tweak certain aspects of the ''Vanilla'' theme."
        },
        "$:/language/ThemeTweaks/Options": {
            "title": "$:/language/ThemeTweaks/Options",
            "text": "Options"
        },
        "$:/language/ThemeTweaks/Options/SidebarLayout": {
            "title": "$:/language/ThemeTweaks/Options/SidebarLayout",
            "text": "Sidebar layout"
        },
        "$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid": {
            "title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid",
            "text": "Fixed story, fluid sidebar"
        },
        "$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed": {
            "title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed",
            "text": "Fluid story, fixed sidebar"
        },
        "$:/language/ThemeTweaks/Options/StickyTitles": {
            "title": "$:/language/ThemeTweaks/Options/StickyTitles",
            "text": "Sticky titles"
        },
        "$:/language/ThemeTweaks/Options/StickyTitles/Hint": {
            "title": "$:/language/ThemeTweaks/Options/StickyTitles/Hint",
            "text": "Causes tiddler titles to \"stick\" to the top of the browser window"
        },
        "$:/language/ThemeTweaks/Options/CodeWrapping": {
            "title": "$:/language/ThemeTweaks/Options/CodeWrapping",
            "text": "Wrap long lines in code blocks"
        },
        "$:/language/ThemeTweaks/Settings": {
            "title": "$:/language/ThemeTweaks/Settings",
            "text": "Settings"
        },
        "$:/language/ThemeTweaks/Settings/FontFamily": {
            "title": "$:/language/ThemeTweaks/Settings/FontFamily",
            "text": "Font family"
        },
        "$:/language/ThemeTweaks/Settings/CodeFontFamily": {
            "title": "$:/language/ThemeTweaks/Settings/CodeFontFamily",
            "text": "Code font family"
        },
        "$:/language/ThemeTweaks/Settings/EditorFontFamily": {
            "title": "$:/language/ThemeTweaks/Settings/EditorFontFamily",
            "text": "Editor font family"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImage": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImage",
            "text": "Page background image"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment",
            "text": "Page background image attachment"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll",
            "text": "Scroll with tiddlers"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed",
            "text": "Fixed to window"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageSize": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize",
            "text": "Page background image size"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto",
            "text": "Auto"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover",
            "text": "Cover"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain",
            "text": "Contain"
        },
        "$:/language/ThemeTweaks/Metrics": {
            "title": "$:/language/ThemeTweaks/Metrics",
            "text": "Sizes"
        },
        "$:/language/ThemeTweaks/Metrics/FontSize": {
            "title": "$:/language/ThemeTweaks/Metrics/FontSize",
            "text": "Font size"
        },
        "$:/language/ThemeTweaks/Metrics/LineHeight": {
            "title": "$:/language/ThemeTweaks/Metrics/LineHeight",
            "text": "Line height"
        },
        "$:/language/ThemeTweaks/Metrics/BodyFontSize": {
            "title": "$:/language/ThemeTweaks/Metrics/BodyFontSize",
            "text": "Font size for tiddler body"
        },
        "$:/language/ThemeTweaks/Metrics/BodyLineHeight": {
            "title": "$:/language/ThemeTweaks/Metrics/BodyLineHeight",
            "text": "Line height for tiddler body"
        },
        "$:/language/ThemeTweaks/Metrics/StoryLeft": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryLeft",
            "text": "Story left position"
        },
        "$:/language/ThemeTweaks/Metrics/StoryLeft/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryLeft/Hint",
            "text": "how far the left margin of the story river<br>(tiddler area) is from the left of the page"
        },
        "$:/language/ThemeTweaks/Metrics/StoryTop": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryTop",
            "text": "Story top position"
        },
        "$:/language/ThemeTweaks/Metrics/StoryTop/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryTop/Hint",
            "text": "how far the top margin of the story river<br>is from the top of the page"
        },
        "$:/language/ThemeTweaks/Metrics/StoryRight": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryRight",
            "text": "Story right"
        },
        "$:/language/ThemeTweaks/Metrics/StoryRight/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryRight/Hint",
            "text": "how far the left margin of the sidebar <br>is from the left of the page"
        },
        "$:/language/ThemeTweaks/Metrics/StoryWidth": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryWidth",
            "text": "Story width"
        },
        "$:/language/ThemeTweaks/Metrics/StoryWidth/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryWidth/Hint",
            "text": "the overall width of the story river"
        },
        "$:/language/ThemeTweaks/Metrics/TiddlerWidth": {
            "title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth",
            "text": "Tiddler width"
        },
        "$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint",
            "text": "within the story river"
        },
        "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint": {
            "title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint",
            "text": "Sidebar breakpoint"
        },
        "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint",
            "text": "the minimum page width at which the story<br>river and sidebar will appear side by side"
        },
        "$:/language/ThemeTweaks/Metrics/SidebarWidth": {
            "title": "$:/language/ThemeTweaks/Metrics/SidebarWidth",
            "text": "Sidebar width"
        },
        "$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint",
            "text": "the width of the sidebar in fluid-fixed layout"
        },
        "$:/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": "Backlinks"
        },
        "$:/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",
            "group-sort": "2"
        },
        "$:/language/Docs/Types/application/json": {
            "title": "$:/language/Docs/Types/application/json",
            "description": "JSON data",
            "name": "application/json",
            "group": "Developer",
            "group-sort": "2"
        },
        "$:/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",
            "group-sort": "2"
        },
        "$:/language/Docs/Types/image/gif": {
            "title": "$:/language/Docs/Types/image/gif",
            "description": "GIF image",
            "name": "image/gif",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/image/jpeg": {
            "title": "$:/language/Docs/Types/image/jpeg",
            "description": "JPEG image",
            "name": "image/jpeg",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/image/png": {
            "title": "$:/language/Docs/Types/image/png",
            "description": "PNG image",
            "name": "image/png",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/image/svg+xml": {
            "title": "$:/language/Docs/Types/image/svg+xml",
            "description": "Structured Vector Graphics image",
            "name": "image/svg+xml",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/image/x-icon": {
            "title": "$:/language/Docs/Types/image/x-icon",
            "description": "ICO format icon file",
            "name": "image/x-icon",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/text/css": {
            "title": "$:/language/Docs/Types/text/css",
            "description": "Static stylesheet",
            "name": "text/css",
            "group": "Developer",
            "group-sort": "2"
        },
        "$:/language/Docs/Types/text/html": {
            "title": "$:/language/Docs/Types/text/html",
            "description": "HTML markup",
            "name": "text/html",
            "group": "Text",
            "group-sort": "0"
        },
        "$:/language/Docs/Types/text/plain": {
            "title": "$:/language/Docs/Types/text/plain",
            "description": "Plain text",
            "name": "text/plain",
            "group": "Text",
            "group-sort": "0"
        },
        "$:/language/Docs/Types/text/vnd.tiddlywiki": {
            "title": "$:/language/Docs/Types/text/vnd.tiddlywiki",
            "description": "TiddlyWiki 5",
            "name": "text/vnd.tiddlywiki",
            "group": "Text",
            "group-sort": "0"
        },
        "$:/language/Docs/Types/text/x-tiddlywiki": {
            "title": "$:/language/Docs/Types/text/x-tiddlywiki",
            "description": "TiddlyWiki Classic",
            "name": "text/x-tiddlywiki",
            "group": "Text",
            "group-sort": "0"
        },
        "$:/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": {
            "title": "$:/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/*\nLog a string if verbose flag is set\n*/\nCommander.prototype.log = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str + \"\\n\");\n\t}\n};\n\n/*\nWrite a string if verbose flag is set\n*/\nCommander.prototype.write = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str);\n\t}\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\t// Parse named parameters if required\n\t\t\t\tif(command.info.namedParameterMode) {\n\t\t\t\t\tparams = this.extractNamedParameters(params,command.info.mandatoryParameters);\n\t\t\t\t\tif(typeof params === \"string\") {\n\t\t\t\t\t\treturn this.callback(params);\n\t\t\t\t\t}\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\n/*\nGiven an array of parameter strings `params` in name:value format, and an array of mandatory parameter names in `mandatoryParameters`, returns a hashmap of values or a string if error\n*/\nCommander.prototype.extractNamedParameters = function(params,mandatoryParameters) {\n\tmandatoryParameters = mandatoryParameters || [];\n\tvar errors = [],\n\t\tparamsByName = Object.create(null);\n\t// Extract the parameters\n\t$tw.utils.each(params,function(param) {\n\t\tvar index = param.indexOf(\"=\");\n\t\tif(index < 1) {\n\t\t\terrors.push(\"malformed named parameter: '\" + param + \"'\");\n\t\t}\n\t\tparamsByName[param.slice(0,index)] = $tw.utils.trim(param.slice(index+1));\n\t});\n\t// Check the mandatory parameters are present\n\t$tw.utils.each(mandatoryParameters,function(mandatoryParameter) {\n\t\tif(!$tw.utils.hop(paramsByName,mandatoryParameter)) {\n\t\t\terrors.push(\"missing mandatory parameter: '\" + mandatoryParameter + \"'\");\n\t\t}\n\t});\n\t// Return any errors\n\tif(errors.length > 0) {\n\t\treturn errors.join(\" and\\n\");\n\t} else {\n\t\treturn paramsByName;\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",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/commands/build.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/clearpassword.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/deletetiddlers.js": {
            "title": "$:/core/modules/commands/deletetiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/deletetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to delete tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"deletetiddlers\",\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 filter\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\twiki.deleteTiddler(title);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/editions.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/fetch.js": {
            "title": "$:/core/modules/commands/fetch.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/fetch.js\ntype: application/javascript\nmodule-type: command\n\nCommands to fetch external tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"fetch\",\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 subcommand and url\";\n\t}\n\tswitch(this.params[0]) {\n\t\tcase \"raw-file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turl: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turl: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"raw-files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t}\n\treturn null;\n};\n\nCommand.prototype.fetchFiles = function(options) {\n\tvar self = this;\n\t// Get the list of URLs\n\tvar urls;\n\tif(options.url) {\n\t\turls = [options.url]\n\t} else if(options.urlFilter) {\n\t\turls = this.commander.wiki.filterTiddlers(options.urlFilter);\n\t} else {\n\t\treturn \"Missing URL\";\n\t}\n\t// Process each URL in turn\n\tvar next = 0;\n\tvar getNextFile = function(err) {\n\t\tif(err) {\n\t\t\treturn options.callback(err);\n\t\t}\n\t\tif(next < urls.length) {\n\t\t\tself.fetchFile(urls[next++],options,getNextFile);\n\t\t} else {\n\t\t\toptions.callback(null);\n\t\t}\n\t};\n\tgetNextFile(null);\n\t// Success\n\treturn null;\n};\n\nCommand.prototype.fetchFile = function(url,options,callback,redirectCount) {\n\tif(redirectCount > 10) {\n\t\treturn callback(\"Error too many redirects retrieving \" + url);\n\t}\n\tvar self = this,\n\t\tlib = url.substr(0,8) === \"https://\" ? require(\"https\") : require(\"http\");\n\tlib.get(url).on(\"response\",function(response) {\n\t    var type = (response.headers[\"content-type\"] || \"\").split(\";\")[0],\n\t    \tdata = [];\n\t    self.commander.write(\"Reading \" + url + \": \");\n\t    response.on(\"data\",function(chunk) {\n\t        data.push(chunk);\n\t        self.commander.write(\".\");\n\t    });\n\t    response.on(\"end\",function() {\n\t        self.commander.write(\"\\n\");\n\t        if(response.statusCode === 200) {\n\t\t        self.processBody(Buffer.concat(data),type,options,url);\n\t\t        callback(null);\n\t        } else {\n\t        \tif(response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {\n\t        \t\treturn self.fetchFile(response.headers.location,options,callback,redirectCount + 1);\n\t        \t} else {\n\t\t        \treturn callback(\"Error \" + response.statusCode + \" retrieving \" + url)\t        \t\t\n\t        \t}\n\t        }\n\t   \t});\n\t   \tresponse.on(\"error\",function(e) {\n\t\t\tconsole.log(\"Error on GET request: \" + e);\n\t\t\tcallback(e);\n\t   \t});\n\t});\n\treturn null;\n};\n\nCommand.prototype.processBody = function(body,type,options,url) {\n\tvar self = this;\n\t// Collect the tiddlers in a wiki\n\tvar incomingWiki = new $tw.Wiki();\n\tif(options.raw) {\n\t\tvar typeInfo = type ? $tw.config.contentTypeInfo[type] : null,\n\t\t\tencoding = typeInfo ? typeInfo.encoding : \"utf8\";\n\t\tincomingWiki.addTiddler(new $tw.Tiddler({\n\t\t\ttitle: url,\n\t\t\ttype: type,\n\t\t\ttext: body.toString(encoding)\n\t\t}));\n\t} else {\n\t\t// Deserialise the file to extract the tiddlers\n\t\tvar tiddlers = this.commander.wiki.deserializeTiddlers(type || \"text/html\",body.toString(\"utf8\"),{});\n\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\tincomingWiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t});\n\t}\n\t// Filter the tiddlers to select the ones we want\n\tvar filteredTitles = incomingWiki.filterTiddlers(options.importFilter || \"[all[tiddlers]]\");\n\t// Import the selected tiddlers\n\tvar count = 0;\n\tincomingWiki.each(function(tiddler,title) {\n\t\tif(filteredTitles.indexOf(title) !== -1) {\n\t\t\tvar newTiddler;\n\t\t\tif(options.transformFilter) {\n\t\t\t\tvar transformedTitle = (incomingWiki.filterTiddlers(options.transformFilter,null,self.commander.wiki.makeTiddlerIterator([title])) || [\"\"])[0];\n\t\t\t\tif(transformedTitle) {\n\t\t\t\t\tself.commander.log(\"Importing \" + title + \" as \" + transformedTitle)\n\t\t\t\t\tnewTiddler = new $tw.Tiddler(tiddler,{title: transformedTitle});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.commander.log(\"Importing \" + title)\n\t\t\t\tnewTiddler = tiddler;\n\t\t\t}\n\t\t\tself.commander.wiki.importTiddler(newTiddler);\n\t\t\tcount++;\n\t\t}\n\t});\n\tself.commander.log(\"Imported \" + count + \" tiddlers\")\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/help.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/import.js": {
            "title": "$:/core/modules/commands/import.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/import.js\ntype: application/javascript\nmodule-type: command\n\nCommand to import 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: \"import\",\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 self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 2) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar filename = self.params[0],\n\t\tdeserializer = self.params[1],\n\t\ttitle = self.params[2] || filename,\n\t\tencoding = self.params[3] || \"utf8\",\n\t\ttext = fs.readFileSync(filename,encoding),\n\t\ttiddlers = this.commander.wiki.deserializeTiddlers(null,text,{title: title},{deserializer: deserializer});\n\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t});\n\tthis.commander.log(tiddlers.length + \" tiddler(s) imported\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/init.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/listen.js": {
            "title": "$:/core/modules/commands/listen.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/listen.js\ntype: application/javascript\nmodule-type: command\n\nListen for HTTP requests and serve tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"listen\",\n\tsynchronous: true,\n\tnamedParameterMode: true,\n\tmandatoryParameters: [],\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\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\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: self.params\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/load.js": {
            "title": "$:/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 or directory\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 tiddlers = $tw.loadTiddlersFromPath(self.params[0]),\n\t\tcount = 0;\n\t$tw.utils.each(tiddlers,function(tiddlerInfo) {\n\t\t$tw.utils.each(tiddlerInfo.tiddlers,function(tiddler) {\n\t\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t\t\tcount++;\n\t\t});\n\t});\n\tif(!count && self.params[1] !== \"noerror\") {\n\t\tself.callback(\"No tiddlers found in file \\\"\" + self.params[0] + \"\\\"\");\n\t} else {\n\t\tself.callback(null);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/makelibrary.js": {
            "title": "$:/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 = $tw.utils.getSubdirectories(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 = $tw.utils.getSubdirectories(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\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.pluginsPath,$tw.config.pluginsEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.themesPath,$tw.config.themesEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.languagesPath,$tw.config.languagesEnvVar),collectPlugins);\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})\n\t};\n\twiki.addTiddler(new $tw.Tiddler(pluginFields));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/output.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/password.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/render.js": {
            "title": "$:/core/modules/commands/render.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/render.js\ntype: application/javascript\nmodule-type: command\n\nRender individual tiddlers and save the results to the specified 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: \"render\",\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 tiddler filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]addsuffix[.html]]\",\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tvariableList = this.params.slice(4),\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter),\n\t\tvariables =  Object.create(null);\n\t\twhile(variableList.length >= 2) {\n\t\t\tvariables[variableList[0]] = variableList[1];\n\t\t\tvariableList = variableList.slice(2);\n\t\t}\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template || title);\n\t\tvar widgetNode = wiki.makeWidget(parser,{variables: $tw.utils.extend({},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\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Rendering \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/rendertiddler.js": {
            "title": "$:/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\tname = this.params[4],\n\t\tvalue = this.params[5],\n\t\tvariables = {};\n\t$tw.utils.createFileDirectories(filename);\n\tif(template) {\n\t\tvariables.currentTiddler = title;\n\t\ttitle = template;\n\t}\n\tif(name && value) {\n\t\tvariables[name] = value;\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",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/rendertiddlers.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/save.js": {
            "title": "$:/core/modules/commands/save.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/save.js\ntype: application/javascript\nmodule-type: command\n\nSaves individual tiddlers in their raw text or binary format to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"save\",\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 filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]]\",\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\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\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Saving \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/savelibrarytiddlers.js": {
            "title": "$:/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> <tiddler-filter> <pathname> <skinnylisting>\n\nThe tiddler identifies the bundle tiddler that contains the subtiddlers.\n\nThe tiddler filter specifies the plugins to be included.\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),\"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\tdoesRequireReload = !!self.commander.wiki.doesPluginInfoRequireReload(pluginTiddlers),\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,{\n\t\t\ttext: undefined,\n\t\t\treadme: readmeContent,\n\t\t\t\"requires-reload\": doesRequireReload ? \"yes\" : \"no\",\n\t\t\ticon: iconContent\n\t\t}));\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",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/savetiddler.js": {
            "title": "$:/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\tif(tiddler) {\n\t\tvar type = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"};\n\t\t$tw.utils.createFileDirectories(filename);\n\t\tfs.writeFile(filename,tiddler.fields.text,contentTypeInfo.encoding,function(err) {\n\t\t\tself.callback(err);\n\t\t});\n\t} else {\n\t\treturn \"Missing tiddler: \" + title;\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/savetiddlers.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/savewikifolder.js": {
            "title": "$:/core/modules/commands/savewikifolder.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/savewikifolder.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the current wiki as a wiki folder\n\n--savewikifolder <wikifolderpath> [<filter>]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savewikifolder\",\n\tsynchronous: true\n};\n\nvar fs,path;\nif($tw.node) {\n\tfs = require(\"fs\");\n\tpath = require(\"path\");\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 wiki folder path\";\n\t}\n\tvar wikifoldermaker = new WikiFolderMaker(this.params[0],this.params[1],this.commander);\n\treturn wikifoldermaker.save();\n};\n\nfunction WikiFolderMaker(wikiFolderPath,wikiFilter,commander) {\n\tthis.wikiFolderPath = wikiFolderPath;\n\tthis.wikiFilter = wikiFilter || \"[all[tiddlers]]\";\n\tthis.commander = commander;\n\tthis.wiki = commander.wiki;\n\tthis.savedPaths = []; // So that we can detect filename clashes\n}\n\nWikiFolderMaker.prototype.log = function(str) {\n\tif(this.commander.verbose) {\n\t\tconsole.log(str);\n\t}\n};\n\nWikiFolderMaker.prototype.tiddlersToIgnore = [\n\t\"$:/boot/boot.css\",\n\t\"$:/boot/boot.js\",\n\t\"$:/boot/bootprefix.js\",\n\t\"$:/core\",\n\t\"$:/library/sjcl.js\",\n\t\"$:/temp/info-plugin\"\n];\n\n/*\nReturns null if successful, or an error string if there was an error\n*/\nWikiFolderMaker.prototype.save = function() {\n\tvar self = this;\n\t// Check that the output directory doesn't exist\n\tif(fs.existsSync(this.wikiFolderPath) && !$tw.utils.isDirectoryEmpty(this.wikiFolderPath)) {\n\t\treturn \"The unpackwiki command requires that the output wiki folder be empty\";\n\t}\n\t// Get the tiddlers from the source wiki\n\tvar tiddlerTitles = this.wiki.filterTiddlers(this.wikiFilter);\n\t// Initialise a new tiddlwiki.info file\n\tvar newWikiInfo = {};\n\t// Process each incoming tiddler in turn\n\t$tw.utils.each(tiddlerTitles,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tif(self.tiddlersToIgnore.indexOf(title) !== -1) {\n\t\t\t\t// Ignore the core plugin and the ephemeral info plugin\n\t\t\t\tself.log(\"Ignoring tiddler: \" + title);\n\t\t\t} else {\n\t\t\t\tvar type = tiddler.fields.type,\n\t\t\t\t\tpluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif(type === \"application/json\" && pluginType) {\n\t\t\t\t\t// Plugin tiddler\n\t\t\t\t\tvar libraryDetails = self.findPluginInLibrary(title);\n\t\t\t\t\tif(libraryDetails) {\n\t\t\t\t\t\t// A plugin from the core library\n\t\t\t\t\t\tself.log(\"Adding built-in plugin: \" + libraryDetails.name);\n\t\t\t\t\t\tnewWikiInfo[libraryDetails.type] = newWikiInfo[libraryDetails.type]  || [];\n\t\t\t\t\t\t$tw.utils.pushTop(newWikiInfo[libraryDetails.type],libraryDetails.name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// A custom plugin\n\t\t\t\t\t\tself.log(\"Processing custom plugin: \" + title);\n\t\t\t\t\t\tself.saveCustomPlugin(tiddler);\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\t// Ordinary tiddler\n\t\t\t\t\tself.saveTiddler(\"tiddlers\",tiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Save the tiddlywiki.info file\n\tthis.saveJSONFile(\"tiddlywiki.info\",newWikiInfo);\n\tself.log(\"Writing tiddlywiki.info: \" + JSON.stringify(newWikiInfo,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\n/*\nTest whether the specified tiddler is a plugin in the plugin library\n*/\nWikiFolderMaker.prototype.findPluginInLibrary = function(title) {\n\tvar parts = title.split(\"/\"),\n\t\tpluginPath, type, name;\n\tif(parts[0] === \"$:\") {\n\t\tif(parts[1] === \"languages\" && parts.length === 3) {\n\t\t\tpluginPath = \"languages\" + path.sep + parts[2];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2];\n\t\t} else if(parts[1] === \"plugins\" || parts[1] === \"themes\" && parts.length === 4) {\n\t\t\tpluginPath = parts[1] + path.sep + parts[2] + path.sep + parts[3];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2] + \"/\" + parts[3];\n\t\t}\n\t}\n\tif(pluginPath && type && name) {\n\t\tpluginPath = path.resolve($tw.boot.bootPath,\"..\",pluginPath);\n\t\tif(fs.existsSync(pluginPath)) {\n\t\t\treturn {\n\t\t\t\tpluginPath: pluginPath,\n\t\t\t\ttype: type,\n\t\t\t\tname: name\n\t\t\t};\n\t\t}\n\t}\n\treturn false;\n};\n\nWikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) {\n\tvar self = this,\n\t\tpluginTitle = pluginTiddler.fields.title,\n\t\ttitleParts = pluginTitle.split(\"/\"),\n\t\tdirectory = $tw.utils.generateTiddlerFilepath(titleParts[titleParts.length - 1],{\n\t\t\tdirectory: path.resolve(this.wikiFolderPath,pluginTiddler.fields[\"plugin-type\"] + \"s\")\n\t\t}),\n\t\tpluginInfo = pluginTiddler.getFieldStrings({exclude: [\"text\",\"type\"]});\n\tthis.saveJSONFile(directory + path.sep + \"plugin.info\",pluginInfo);\n\tself.log(\"Writing \" + directory + path.sep + \"plugin.info: \" + JSON.stringify(pluginInfo,null,$tw.config.preferences.jsonSpaces));\n\tvar pluginTiddlers = JSON.parse(pluginTiddler.fields.text).tiddlers; // A hashmap of tiddlers in the plugin\n\t$tw.utils.each(pluginTiddlers,function(tiddler) {\n\t\tself.saveTiddler(directory,new $tw.Tiddler(tiddler));\n\t});\n};\n\nWikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) {\n\tvar title = tiddler.fields.title, fileInfo, pathFilters, extFilters;\n\tif(this.wiki.tiddlerExists(\"$:/config/FileSystemPaths\")) {\n\t\tpathFilters = this.wiki.getTiddlerText(\"$:/config/FileSystemPaths\",\"\").split(\"\\n\");\n\t}\n\tif(this.wiki.tiddlerExists(\"$:/config/FileSystemExtensions\")) {\n\t\textFilters = this.wiki.getTiddlerText(\"$:/config/FileSystemExtensions\",\"\").split(\"\\n\");\n\t}\n\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\n\t\tdirectory: path.resolve(this.wikiFolderPath,directory),\n\t\twiki: this.wiki,\n\t\tpathFilters: pathFilters,\n\t\textFilters: extFilters,\n\t\toriginalpath: this.wiki.extractTiddlerDataItem(\"$:/config/OriginalTiddlerPaths\",title, \"\")\n\t});\n\ttry {\n\t\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\n\t} catch (err) {\n\t\tconsole.log(\"SaveWikiFolder: Error saving file '\" + fileInfo.filepath + \"', tiddler: '\" + tiddler.fields.title);\n\t}\n};\n\nWikiFolderMaker.prototype.saveJSONFile = function(filename,json) {\n\tthis.saveTextFile(filename,JSON.stringify(json,null,$tw.config.preferences.jsonSpaces));\n};\n\nWikiFolderMaker.prototype.saveTextFile = function(filename,data) {\n\tthis.saveFile(filename,\"utf8\",data);\n};\n\nWikiFolderMaker.prototype.saveFile = function(filename,encoding,data) {\n\tvar filepath = path.resolve(this.wikiFolderPath,filename);\n\t$tw.utils.createFileDirectories(filepath);\n\tfs.writeFileSync(filepath,data,encoding);\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/server.js": {
            "title": "$:/core/modules/commands/server.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/server.js\ntype: application/javascript\nmodule-type: command\n\nDeprecated legacy command for serving tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"server\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\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\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: {\n\t\t\tport: this.params[0],\n\t\t\thost: this.params[6],\n\t\t\t\"root-tiddler\": this.params[1],\n\t\t\t\"root-render-type\": this.params[2],\n\t\t\t\"root-serve-type\": this.params[3],\n\t\t\tusername: this.params[4],\n\t\t\tpassword: this.params[5],\n\t\t\t\"path-prefix\": this.params[7],\n\t\t\t\"debug-level\": this.params[8]\n\t\t}\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/setfield.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/unpackplugin.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/verbose.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/version.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/config.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "config"
        },
        "$:/core/modules/deserializers.js": {
            "title": "$:/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,\n\t\tresults = [];\n\ttry {\n\t\tincoming = JSON.parse(text);\n\t} catch(e) {\n\t\tincoming = [{\n\t\t\ttitle: \"JSON error: \" + e,\n\t\t\ttext: \"\"\n\t\t}]\n\t}\n\tif(!$tw.utils.isArray(incoming)) {\n\t\tincoming = [incoming];\n\t}\n\tfor(var t=0; t<incoming.length; t++) {\n\t\tvar incomingFields = incoming[t],\n\t\t\tfields = {};\n\t\tfor(var f in incomingFields) {\n\t\t\tif(typeof incomingFields[f] === \"string\") {\n\t\t\t\tfields[f] = incomingFields[f];\n\t\t\t}\n\t\t}\n\t\tresults.push(fields);\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",
            "type": "application/javascript",
            "module-type": "tiddlerdeserializer"
        },
        "$:/core/modules/editor/engines/framed.js": {
            "title": "$:/core/modules/editor/engines/framed.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/engines/framed.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea\n\n\\*/\n(function(){\n\n/*jslint node: true,browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction FramedEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Create our hidden dummy text area for reading styles\n\tthis.dummyTextArea = this.widget.document.createElement(\"textarea\");\n\tif(this.widget.editClass) {\n\t\tthis.dummyTextArea.className = this.widget.editClass;\n\t}\n\tthis.dummyTextArea.setAttribute(\"hidden\",\"true\");\n\tthis.parentNode.insertBefore(this.dummyTextArea,this.nextSibling);\n\tthis.widget.domNodes.push(this.dummyTextArea);\n\t// Create the iframe\n\tthis.iframeNode = this.widget.document.createElement(\"iframe\");\n\tthis.parentNode.insertBefore(this.iframeNode,this.nextSibling);\n\tthis.iframeDoc = this.iframeNode.contentWindow.document;\n\t// (Firefox requires us to put some empty content in the iframe)\n\tthis.iframeDoc.open();\n\tthis.iframeDoc.write(\"\");\n\tthis.iframeDoc.close();\n\t// Style the iframe\n\tthis.iframeNode.className = this.dummyTextArea.className;\n\tthis.iframeNode.style.border = \"none\";\n\tthis.iframeNode.style.padding = \"0\";\n\tthis.iframeNode.style.resize = \"none\";\n\tthis.iframeDoc.body.style.margin = \"0\";\n\tthis.iframeDoc.body.style.padding = \"0\";\n\tthis.widget.domNodes.push(this.iframeNode);\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.iframeDoc.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.iframeDoc.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.iframeNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\tif(this.widget.editAutoComplete) {\n\t\tthis.domNode.setAttribute(\"autocomplete\",this.widget.editAutoComplete);\n\t}\n\tif(this.widget.isDisabled === \"yes\") {\n\t\tthis.domNode.setAttribute(\"disabled\",true);\n\t}\t\n\t// Copy the styles from the dummy textarea\n\tthis.copyStyles();\n\t// Add event listeners\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"click\",handlerObject: this,handlerMethod: \"handleClickEvent\"},\n\t\t{name: \"input\",handlerObject: this,handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"keydown\",handlerObject: this.widget,handlerMethod: \"handleKeydownEvent\"},\n\t\t{name: \"focus\",handlerObject: this,handlerMethod: \"handleFocusEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.iframeDoc.body.appendChild(this.domNode);\n}\n\n/*\nCopy styles from the dummy text area to the textarea in the iframe\n*/\nFramedEngine.prototype.copyStyles = function() {\n\t// Copy all styles\n\t$tw.utils.copyStyles(this.dummyTextArea,this.domNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\tthis.domNode.style.display = \"block\";\n\tthis.domNode.style.width = \"100%\";\n\tthis.domNode.style.margin = \"0\";\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\tthis.domNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n};\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nFramedEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.updateDomNodeText(text);\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nUpdate the DomNode with the new text\n*/\nFramedEngine.prototype.updateDomNodeText = function(text) {\n\tthis.domNode.value = text;\n};\n\n/*\nGet the text of the engine\n*/\nFramedEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nFramedEngine.prototype.fixHeight = function() {\n\t// Make sure styles are updated\n\tthis.copyStyles();\n\t// Adjust height\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tvar newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t\tthis.iframeNode.style.height = (newHeight + 14) + \"px\"; // +14 for the border on the textarea\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t\tthis.iframeNode.style.height = (fixedHeight + 14) + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nFramedEngine.prototype.focus  = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a focus event\n*/\nFramedEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editCancelPopups) {\n\t\t$tw.popup.cancel(0);\t\n\t}\n};\n\n/*\nHandle a click\n*/\nFramedEngine.prototype.handleClickEvent = function(event) {\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nFramedEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\tif(this.widget.editInputActions) {\n\t\tthis.widget.invokeActionString(this.widget.editInputActions);\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nFramedEngine.prototype.createTextOperation = function() {\n\tvar operation = {\n\t\ttext: this.domNode.value,\n\t\tselStart: this.domNode.selectionStart,\n\t\tselEnd: this.domNode.selectionEnd,\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nFramedEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t\t// Attempt to use a execCommand to modify the value of the control\n\t\tif(this.iframeDoc.queryCommandSupported(\"insertText\") && this.iframeDoc.queryCommandSupported(\"delete\") && !$tw.browser.isFirefox) {\n\t\t\tthis.domNode.focus();\n\t\t\tthis.domNode.setSelectionRange(operation.cutStart,operation.cutEnd);\n\t\t\tif(operation.replacement === \"\") {\n\t\t\t\tthis.iframeDoc.execCommand(\"delete\",false,\"\");\n\t\t\t} else {\n\t\t\t\tthis.iframeDoc.execCommand(\"insertText\",false,operation.replacement);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.domNode.value = newText;\n\t\t}\n\t\tthis.domNode.focus();\n\t\tthis.domNode.setSelectionRange(operation.newSelStart,operation.newSelEnd);\n\t}\n\tthis.domNode.focus();\n\treturn newText;\n};\n\nexports.FramedEngine = FramedEngine;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/core/modules/editor/engines/simple.js": {
            "title": "$:/core/modules/editor/engines/simple.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/engines/simple.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction SimpleEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.widget.document.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.widget.document.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.domNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\tif(this.widget.editAutoComplete) {\n\t\tthis.domNode.setAttribute(\"autocomplete\",this.widget.editAutoComplete);\n\t}\n\tif(this.widget.isDisabled === \"yes\") {\n\t\tthis.domNode.setAttribute(\"disabled\",true);\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(this.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\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n}\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nSimpleEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode || text === \"\") {\n\t\t\tthis.updateDomNodeText(text);\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nUpdate the DomNode with the new text\n*/\nSimpleEngine.prototype.updateDomNodeText = function(text) {\n\tthis.domNode.value = text;\n};\n\n/*\nGet the text of the engine\n*/\nSimpleEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nSimpleEngine.prototype.fixHeight = function() {\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\t$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nSimpleEngine.prototype.focus  = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nSimpleEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\tif(this.widget.editInputActions) {\n\t\tthis.widget.invokeActionString(this.widget.editInputActions);\n\t}\n\treturn true;\n};\n\n/*\nHandle a dom \"focus\" event\n*/\nSimpleEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editCancelPopups) {\n\t\t$tw.popup.cancel(0);\n\t}\n\tif(this.widget.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNode,\n\t\t\ttitle: this.widget.editFocusPopup,\n\t\t\twiki: this.widget.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nSimpleEngine.prototype.createTextOperation = function() {\n\treturn null;\n};\n\n/*\nExecute a text operation\n*/\nSimpleEngine.prototype.executeTextOperation = function(operation) {\n};\n\nexports.SimpleEngine = SimpleEngine;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/core/modules/editor/factory.js": {
            "title": "$:/core/modules/editor/factory.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/factory.js\ntype: application/javascript\nmodule-type: library\n\nFactory for constructing text editor widgets with specified engines for the toolbar and non-toolbar cases\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\n// Configuration tiddlers\nvar HEIGHT_MODE_TITLE = \"$:/config/TextEditor/EditorHeight/Mode\";\nvar ENABLE_TOOLBAR_TITLE = \"$:/config/TextEditor/EnableToolbar\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nfunction editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {\n\n\tvar EditTextWidget = function(parseTreeNode,options) {\n\t\t// Initialise the editor operations if they've not been done already\n\t\tif(!this.editorOperations) {\n\t\t\tEditTextWidget.prototype.editorOperations = {};\n\t\t\t$tw.modules.applyMethods(\"texteditoroperation\",this.editorOperations);\n\t\t}\n\t\tthis.initialise(parseTreeNode,options);\n\t};\n\n\t/*\n\tInherit from the base widget class\n\t*/\n\tEditTextWidget.prototype = new Widget();\n\n\t/*\n\tRender this widget into the DOM\n\t*/\n\tEditTextWidget.prototype.render = function(parent,nextSibling) {\n\t\t// Save the parent dom node\n\t\tthis.parentDomNode = parent;\n\t\t// Compute our attributes\n\t\tthis.computeAttributes();\n\t\t// Execute our logic\n\t\tthis.execute();\n\t\t// Create the wrapper for the toolbar and render its content\n\t\tif(this.editShowToolbar) {\n\t\t\tthis.toolbarNode = this.document.createElement(\"div\");\n\t\t\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\t\t\tparent.insertBefore(this.toolbarNode,nextSibling);\n\t\t\tthis.renderChildren(this.toolbarNode,null);\n\t\t\tthis.domNodes.push(this.toolbarNode);\n\t\t}\n\t\t// Create our element\n\t\tvar editInfo = this.getEditInfo(),\n\t\t\tEngine = this.editShowToolbar ? toolbarEngine : nonToolbarEngine;\n\t\tthis.engine = new Engine({\n\t\t\t\twidget: this,\n\t\t\t\tvalue: editInfo.value,\n\t\t\t\ttype: editInfo.type,\n\t\t\t\tparentNode: parent,\n\t\t\t\tnextSibling: nextSibling\n\t\t\t});\n\t\t// Call the postRender hook\n\t\tif(this.postRender) {\n\t\t\tthis.postRender();\n\t\t}\n\t\t// Fix height\n\t\tthis.engine.fixHeight();\n\t\t// Focus if required\n\t\tif(this.editFocus === \"true\" || this.editFocus === \"yes\") {\n\t\t\tthis.engine.focus();\n\t\t}\n\t\t// Add widget message listeners\n\t\tthis.addEventListeners([\n\t\t\t{type: \"tm-edit-text-operation\", handler: \"handleEditTextOperationMessage\"}\n\t\t]);\n\t};\n\n\t/*\n\tGet the tiddler being edited and current value\n\t*/\n\tEditTextWidget.prototype.getEditInfo = function() {\n\t\t// Get the edit value\n\t\tvar self = this,\n\t\t\tvalue,\n\t\t\ttype = \"text/plain\",\n\t\t\tupdate;\n\t\tif(this.editIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\t\tupdate = function(value) {\n\t\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\t// Get the current tiddler and the field name\n\t\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\t\tif(tiddler) {\n\t\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t\t\tif(this.editField === \"text\") {\n\t\t\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\t\tswitch(this.editField) {\n\t\t\t\t\tcase \"text\":\n\t\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\t\ttype = \"text/vnd.tiddlywiki\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"title\":\n\t\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvalue = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(this.editDefault !== undefined) {\n\t\t\t\t\tvalue = this.editDefault;\n\t\t\t\t}\n\t\t\t}\n\t\t\tupdate = function(value) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\t\tupdateFields = {\n\t\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t\t};\n\t\t\t\tupdateFields[self.editField] = value;\n\t\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t\t};\n\t\t}\n\t\tif(this.editType) {\n\t\t\ttype = this.editType;\n\t\t}\n\t\treturn {value: value || \"\", type: type, update: update};\n\t};\n\n\t/*\n\tHandle an edit text operation message from the toolbar\n\t*/\n\tEditTextWidget.prototype.handleEditTextOperationMessage = function(event) {\n\t\t// Prepare information about the operation\n\t\tvar operation = this.engine.createTextOperation();\n\t\t// Invoke the handler for the selected operation\n\t\tvar handler = this.editorOperations[event.param];\n\t\tif(handler) {\n\t\t\thandler.call(this,event,operation);\n\t\t}\n\t\t// Execute the operation via the engine\n\t\tvar newText = this.engine.executeTextOperation(operation);\n\t\t// Fix the tiddler height and save changes\n\t\tthis.engine.fixHeight();\n\t\tthis.saveChanges(newText);\n\t};\n\n\t/*\n\tCompute the internal state of the widget\n\t*/\n\tEditTextWidget.prototype.execute = function() {\n\t\t// Get our parameters\n\t\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t\tthis.editField = this.getAttribute(\"field\",\"text\");\n\t\tthis.editIndex = this.getAttribute(\"index\");\n\t\tthis.editDefault = this.getAttribute(\"default\");\n\t\tthis.editClass = this.getAttribute(\"class\");\n\t\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\t\tthis.editSize = this.getAttribute(\"size\");\n\t\tthis.editRows = this.getAttribute(\"rows\");\n\t\tthis.editAutoHeight = this.wiki.getTiddlerText(HEIGHT_MODE_TITLE,\"auto\");\n\t\tthis.editAutoHeight = this.getAttribute(\"autoHeight\",this.editAutoHeight === \"auto\" ? \"yes\" : \"no\") === \"yes\";\n\t\tthis.editMinHeight = this.getAttribute(\"minHeight\",DEFAULT_MIN_TEXT_AREA_HEIGHT);\n\t\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\t\tthis.editFocus = this.getAttribute(\"focus\");\n\t\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\t\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"\") === \"yes\";\n\t\tthis.editInputActions = this.getAttribute(\"inputActions\");\n\t\tthis.editRefreshTitle = this.getAttribute(\"refreshTitle\");\n\t\tthis.editAutoComplete = this.getAttribute(\"autocomplete\");\n\t\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t\t// Get the default editor element tag and type\n\t\tvar tag,type;\n\t\tif(this.editField === \"text\") {\n\t\t\ttag = \"textarea\";\n\t\t} else {\n\t\t\ttag = \"input\";\n\t\t\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\n\t\t\tif(fieldModule && fieldModule.editTag) {\n\t\t\t\ttag = fieldModule.editTag;\n\t\t\t}\n\t\t\tif(fieldModule && fieldModule.editType) {\n\t\t\t\ttype = fieldModule.editType;\n\t\t\t}\n\t\t\ttype = type || \"text\";\n\t\t}\n\t\t// Get the rest of our parameters\n\t\tthis.editTag = this.getAttribute(\"tag\",tag) || \"input\";\n\t\tthis.editType = this.getAttribute(\"type\",type);\n\t\t// Make the child widgets\n\t\tthis.makeChildWidgets();\n\t\t// Determine whether to show the toolbar\n\t\tthis.editShowToolbar = this.wiki.getTiddlerText(ENABLE_TOOLBAR_TITLE,\"yes\");\n\t\tthis.editShowToolbar = (this.editShowToolbar === \"yes\") && !!(this.children && this.children.length > 0) && (!this.document.isTiddlyWikiFakeDom);\n\t};\n\n\t/*\n\tSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n\t*/\n\tEditTextWidget.prototype.refresh = function(changedTiddlers) {\n\t\tvar changedAttributes = this.computeAttributes();\n\t\t// Completely rerender if any of our attributes have changed\n\t\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup ||  changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE] || changedAttributes.disabled) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t\t} else if (changedTiddlers[this.editRefreshTitle]) {\n\t\t\tthis.engine.updateDomNodeText(this.getEditInfo().value);\n\t\t} else if(changedTiddlers[this.editTitle]) {\n\t\t\tvar editInfo = this.getEditInfo();\n\t\t\tthis.updateEditor(editInfo.value,editInfo.type);\n\t\t}\n\t\tthis.engine.fixHeight();\n\t\tif(this.editShowToolbar) {\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/*\n\tUpdate the editor with new text. This method is separate from updateEditorDomNode()\n\tso that subclasses can override updateEditor() and still use updateEditorDomNode()\n\t*/\n\tEditTextWidget.prototype.updateEditor = function(text,type) {\n\t\tthis.updateEditorDomNode(text,type);\n\t};\n\n\t/*\n\tUpdate the editor dom node with new text\n\t*/\n\tEditTextWidget.prototype.updateEditorDomNode = function(text,type) {\n\t\tthis.engine.setText(text,type);\n\t};\n\n\t/*\n\tSave changes back to the tiddler store\n\t*/\n\tEditTextWidget.prototype.saveChanges = function(text) {\n\t\tvar editInfo = this.getEditInfo();\n\t\tif(text !== editInfo.value) {\n\t\t\teditInfo.update(text);\n\t\t}\n\t};\n\n\t/*\n\tHandle a dom \"keydown\" event, which we'll bubble up to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.handleKeydownEvent = function(event) {\n\t\t// Check for a keyboard shortcut\n\t\tif(this.toolbarNode) {\n\t\t\tvar shortcutElements = this.toolbarNode.querySelectorAll(\"[data-tw-keyboard-shortcut]\");\n\t\t\tfor(var index=0; index<shortcutElements.length; index++) {\n\t\t\t\tvar el = shortcutElements[index],\n\t\t\t\t\tshortcutData = el.getAttribute(\"data-tw-keyboard-shortcut\"),\n\t\t\t\t\tkeyInfoArray = $tw.keyboardManager.parseKeyDescriptors(shortcutData,{\n\t\t\t\t\t\twiki: this.wiki\n\t\t\t\t\t});\n\t\t\t\tif($tw.keyboardManager.checkKeyDescriptors(event,keyInfoArray)) {\n\t\t\t\t\tvar clickEvent = this.document.createEvent(\"Events\");\n\t\t\t\t    clickEvent.initEvent(\"click\",true,false);\n\t\t\t\t    el.dispatchEvent(clickEvent);\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Propogate the event to the container\n\t\tif(this.propogateKeydownEvent(event)) {\n\t\t\t// Ignore the keydown if it was already handled\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\t// Otherwise, process the keydown normally\n\t\treturn false;\n\t};\n\n\t/*\n\tPropogate keydown events to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.propogateKeydownEvent = function(event) {\n\t\tvar newEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent(\"Events\");\n\t\tif(newEvent.initEvent) {\n\t\t\tnewEvent.initEvent(\"keydown\", true, true);\n\t\t}\n\t\tnewEvent.keyCode = event.keyCode;\n\t\tnewEvent.which = event.which;\n\t\tnewEvent.metaKey = event.metaKey;\n\t\tnewEvent.ctrlKey = event.ctrlKey;\n\t\tnewEvent.altKey = event.altKey;\n\t\tnewEvent.shiftKey = event.shiftKey;\n\t\treturn !this.parentDomNode.dispatchEvent(newEvent);\n\t};\n\n\treturn EditTextWidget;\n\n}\n\nexports.editTextWidgetFactory = editTextWidgetFactory;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/core/modules/editor/operations/bitmap/clear.js": {
            "title": "$:/core/modules/editor/operations/bitmap/clear.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/clear.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to clear the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"clear\"] = function(event) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.globalAlpha = 1;\n\tctx.fillStyle = event.paramObject.colour || \"white\";\n\tctx.fillRect(0,0,this.canvasDomNode.width,this.canvasDomNode.height);\n\t// Save changes\n\tthis.strokeEnd();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "bitmapeditoroperation"
        },
        "$:/core/modules/editor/operations/bitmap/resize.js": {
            "title": "$:/core/modules/editor/operations/bitmap/resize.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/resize.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to resize the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"resize\"] = function(event) {\n\t// Get the new width\n\tvar newWidth = parseInt(event.paramObject.width || this.canvasDomNode.width,10),\n\t\tnewHeight = parseInt(event.paramObject.height || this.canvasDomNode.height,10);\n\t// Update if necessary\n\tif(newWidth > 0 && newHeight > 0 && !(newWidth === this.currCanvas.width && newHeight === this.currCanvas.height)) {\n\t\tthis.changeCanvasSize(newWidth,newHeight);\n\t}\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "bitmapeditoroperation"
        },
        "$:/core/modules/editor/operations/bitmap/rotate-left.js": {
            "title": "$:/core/modules/editor/operations/bitmap/rotate-left.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/rotate-left.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to rotate the image left by 90 degrees\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"rotate-left\"] = function(event) {\n\t// Rotate the canvas left by 90 degrees\n\tthis.rotateCanvasLeft();\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "bitmapeditoroperation"
        },
        "$:/core/modules/editor/operations/text/excise.js": {
            "title": "$:/core/modules/editor/operations/text/excise.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/excise.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to excise the selection to a new tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"excise\"] = function(event,operation) {\n\tvar editTiddler = this.wiki.getTiddler(this.editTitle),\n\t\teditTiddlerTitle = this.editTitle;\n\tif(editTiddler && editTiddler.fields[\"draft.of\"]) {\n\t\teditTiddlerTitle = editTiddler.fields[\"draft.of\"];\n\t}\n\tvar excisionTitle = event.paramObject.title || this.wiki.generateNewTitle(\"New Excision\");\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\tthis.wiki.getModificationFields(),\n\t\t{\n\t\t\ttitle: excisionTitle,\n\t\t\ttext: operation.selection,\n\t\t\ttags: event.paramObject.tagnew === \"yes\" ?  [editTiddlerTitle] : []\n\t\t}\n\t));\n\toperation.replacement = excisionTitle;\n\tswitch(event.paramObject.type || \"transclude\") {\n\t\tcase \"transclude\":\n\t\t\toperation.replacement = \"{{\" + operation.replacement+ \"}}\";\n\t\t\tbreak;\n\t\tcase \"link\":\n\t\t\toperation.replacement = \"[[\" + operation.replacement+ \"]]\";\n\t\t\tbreak;\n\t\tcase \"macro\":\n\t\t\toperation.replacement = \"<<\" + (event.paramObject.macro || \"translink\") + \" \\\"\\\"\\\"\" + operation.replacement + \"\\\"\\\"\\\">>\";\n\t\t\tbreak;\n\t}\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/make-link.js": {
            "title": "$:/core/modules/editor/operations/text/make-link.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/make-link.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to make a link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"make-link\"] = function(event,operation) {\n\tif(operation.selection) {\n\t\toperation.replacement = \"[[\" + operation.selection + \"|\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t} else {\n\t\toperation.replacement = \"[[\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t}\n\toperation.newSelStart = operation.selStart + operation.replacement.length;\n\toperation.newSelEnd = operation.newSelStart;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/prefix-lines.js": {
            "title": "$:/core/modules/editor/operations/text/prefix-lines.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/prefix-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to add a prefix to the selected lines\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"prefix-lines\"] = function(event,operation) {\n\tvar targetCount = parseInt(event.paramObject.count + \"\",10);\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Compose the required prefix\n\tvar prefix = $tw.utils.repeat(event.paramObject.character,targetCount);\n\t// Process each line\n\tvar lines = operation.text.substring(operation.cutStart,operation.cutEnd).split(/\\r?\\n/mg);\n\t$tw.utils.each(lines,function(line,index) {\n\t\t// Remove and count any existing prefix characters\n\t\tvar count = 0;\n\t\twhile(line.charAt(0) === event.paramObject.character) {\n\t\t\tline = line.substring(1);\n\t\t\tcount++;\n\t\t}\n\t\t// Remove any whitespace\n\t\twhile(line.charAt(0) === \" \") {\n\t\t\tline = line.substring(1);\n\t\t}\n\t\t// We're done if we removed the exact required prefix, otherwise add it\n\t\tif(count !== targetCount) {\n\t\t\t// Apply the prefix\n\t\t\tline =  prefix + \" \" + line;\n\t\t}\n\t\t// Save the modified line\n\t\tlines[index] = line;\n\t});\n\t// Stitch the replacement text together and set the selection\n\toperation.replacement = lines.join(\"\\n\");\n\tif(lines.length === 1) {\n\t\toperation.newSelStart = operation.cutStart + operation.replacement.length;\n\t\toperation.newSelEnd = operation.newSelStart;\n\t} else {\n\t\toperation.newSelStart = operation.cutStart;\n\t\toperation.newSelEnd = operation.newSelStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/replace-all.js": {
            "title": "$:/core/modules/editor/operations/text/replace-all.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-all.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the entire text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-all\"] = function(event,operation) {\n\toperation.cutStart = 0;\n\toperation.cutEnd = operation.text.length;\n\toperation.replacement = event.paramObject.text;\n\toperation.newSelStart = 0;\n\toperation.newSelEnd = operation.replacement.length;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/replace-selection.js": {
            "title": "$:/core/modules/editor/operations/text/replace-selection.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the selection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-selection\"] = function(event,operation) {\n\toperation.replacement = event.paramObject.text;\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/save-selection.js": {
            "title": "$:/core/modules/editor/operations/text/save-selection.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/save-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to save the current selection in a specified tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"save-selection\"] = function(event,operation) {\n\tvar tiddler = event.paramObject.tiddler,\n\t\tfield = event.paramObject.field || \"text\";\n\tif(tiddler && field) {\n\t\tthis.wiki.setText(tiddler,field,null,operation.text.substring(operation.selStart,operation.selEnd));\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/wrap-lines.js": {
            "title": "$:/core/modules/editor/operations/text/wrap-lines.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selected lines with a prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-lines\"] = function(event,operation) {\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Add the prefix and suffix\n\toperation.replacement = event.paramObject.prefix + \"\\n\" +\n\t\t\t\toperation.text.substring(operation.cutStart,operation.cutEnd) + \"\\n\" +\n\t\t\t\tevent.paramObject.suffix + \"\\n\";\n\toperation.newSelStart = operation.cutStart + event.paramObject.prefix.length + 1;\n\toperation.newSelEnd = operation.newSelStart + (operation.cutEnd - operation.cutStart);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/wrap-selection.js": {
            "title": "$:/core/modules/editor/operations/text/wrap-selection.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selection with the specified prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-selection\"] = function(event,operation) {\n\tif(operation.selStart === operation.selEnd) {\n\t\t// No selection; check if we're within the prefix/suffix\n\t\tif(operation.text.substring(operation.selStart - event.paramObject.prefix.length,operation.selStart + event.paramObject.suffix.length) === event.paramObject.prefix + event.paramObject.suffix) {\n\t\t\t// Remove the prefix and suffix\n\t\t\toperation.cutStart = operation.selStart - event.paramObject.prefix.length;\n\t\t\toperation.cutEnd = operation.selEnd + event.paramObject.suffix.length;\n\t\t\toperation.replacement = \"\";\n\t\t\toperation.newSelStart = operation.cutStart;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t} else {\n\t\t\t// Wrap the cursor instead\n\t\t\toperation.cutStart = operation.selStart;\n\t\t\toperation.cutEnd = operation.selEnd;\n\t\t\toperation.replacement = event.paramObject.prefix + event.paramObject.suffix;\n\t\t\toperation.newSelStart = operation.selStart + event.paramObject.prefix.length;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t}\n\t} else if(operation.text.substring(operation.selStart,operation.selStart + event.paramObject.prefix.length) === event.paramObject.prefix && operation.text.substring(operation.selEnd - event.paramObject.suffix.length,operation.selEnd) === event.paramObject.suffix) {\n\t\t// Prefix and suffix are already present, so remove them\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = operation.selection.substring(event.paramObject.prefix.length,operation.selection.length - event.paramObject.suffix.length);\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t} else {\n\t\t// Add the prefix and suffix\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = event.paramObject.prefix + operation.selection + event.paramObject.suffix;\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/filterrunprefixes/all.js": {
            "title": "$:/core/modules/filterrunprefixes/all.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/all.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nUnion of sets without de-duplication.\nEquivalent to = filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.all = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.push.apply(results, operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/and.js": {
            "title": "$:/core/modules/filterrunprefixes/and.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/and.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nIntersection of sets.\nEquivalent to + filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.and = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\n\t\tsource = options.wiki.makeTiddlerIterator(results.toArray());\n\t\tresults.clear();\n\t\tresults.pushTop(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/else.js": {
            "title": "$:/core/modules/filterrunprefixes/else.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/else.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nEquivalent to ~ filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.else = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length === 0) {\n\t\t\t// Main result so far is empty\n\t\t\tresults.pushTop(operationSubFunction(source,widget));\n\t\t}\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/except.js": {
            "title": "$:/core/modules/filterrunprefixes/except.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/except.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nDifference of sets.\nEquivalent to - filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.except = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.remove(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/filter.js": {
            "title": "$:/core/modules/filterrunprefixes/filter.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/filter.js\ntype: application/javascript\nmodule-type: filterrunprefix\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.filter = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar resultsToRemove = [];\n\t\t\tresults.each(function(result) {\n\t\t\t\tvar filtered = operationSubFunction(options.wiki.makeTiddlerIterator([result]),widget);\n\t\t\t\tif(filtered.length === 0) {\n\t\t\t\t\tresultsToRemove.push(result);\n\t\t\t\t}\n\t\t\t});\n\t\t\tresults.remove(resultsToRemove);\n\t\t}\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/intersection.js": {
            "title": "$:/core/modules/filterrunprefixes/intersection.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/intersection.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.intersection = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length !== 0) {\n\t\t\tvar secondRunResults = operationSubFunction(source,widget);\n\t\t\tvar firstRunResults = results.toArray();\n\t\t\tresults.clear();\n\t\t\t$tw.utils.each(firstRunResults,function(title) {\n\t\t\t\tif(secondRunResults.indexOf(title) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/or.js": {
            "title": "$:/core/modules/filterrunprefixes/or.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/or.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nEquivalent to a filter run with no prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.or = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.pushTop(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/reduce.js": {
            "title": "$:/core/modules/filterrunprefixes/reduce.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/reduce.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.reduce = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar accumulator = \"\";\n\t\t\tvar index = 0;\n\t\t\tresults.each(function(title) {\n\t\t\t\tvar list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{\n\t\t\t\t\t\tgetVariable: function(name) {\n\t\t\t\t\t\t\tswitch(name) {\n\t\t\t\t\t\t\t\tcase \"currentTiddler\":\n\t\t\t\t\t\t\t\t\treturn \"\" + title;\n\t\t\t\t\t\t\t\tcase \"accumulator\":\n\t\t\t\t\t\t\t\t\treturn \"\" + accumulator;\n\t\t\t\t\t\t\t\tcase \"index\":\n\t\t\t\t\t\t\t\t\treturn \"\" + index;\n\t\t\t\t\t\t\t\tcase \"revIndex\":\n\t\t\t\t\t\t\t\t\treturn \"\" +  (results.length - 1 - index);\n\t\t\t\t\t\t\t\tcase \"length\":\n\t\t\t\t\t\t\t\t\treturn \"\" + results.length;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\treturn widget.getVariable(name);\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\tif(list.length > 0) {\n\t\t\t\t\taccumulator = \"\" + list[0];\n\t\t\t\t}\n\t\t\t\t++index;\n\t\t\t});\n\t\t\tresults.clear();\n\t\t\tresults.push(accumulator);\t\n\t\t}\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filters/addprefix.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/addsuffix.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/after.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/all/current.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/missing.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/orphans.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/shadows.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/tags.js": {
            "title": "$:/core/modules/filters/all/tags.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/tags.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tags]]\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,prefix,options) {\n\treturn Object.keys(options.wiki.getTagMap());\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/tiddlers.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all.js": {
            "title": "$:/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 = new $tw.utils.LinkedList(),\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\tresults.pushTop(subop(source,operator.prefix,options));\n\t\t}\n\t}\n\treturn results.toArray();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/backlinks.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/before.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/commands.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/compare.js": {
            "title": "$:/core/modules/filters/compare.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/compare.js\ntype: application/javascript\nmodule-type: filteroperator\n\nGeneral purpose comparison operator\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.compare = function(source,operator,options) {\n\tvar suffixes = operator.suffixes || [],\n\t\ttype = (suffixes[0] || [])[0],\n\t\tmode = (suffixes[1] || [])[0],\n\t\ttypeFn = $tw.utils.makeCompareFunction(type,{defaultType: \"number\"}),\n\t\tmodeFn = modes[mode] || modes.eq,\n\t\tinvert = operator.prefix === \"!\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tif(modeFn(typeFn(title,operator.operand)) !== invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nvar modes = {\n\t\"eq\": function(value) {return value === 0;},\n\t\"ne\": function(value) {return value !== 0;},\n\t\"gteq\": function(value) {return value >= 0;},\n\t\"gt\": function(value) {return value > 0;},\n\t\"lteq\": function(value) {return value <= 0;},\n\t\"lt\": function(value) {return value < 0;}\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/contains.js": {
            "title": "$:/core/modules/filters/contains.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/contains.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for finding values in array fields\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.contains = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"list\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t} else {\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) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) !== -1) {\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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/count.js": {
            "title": "$:/core/modules/filters/count.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/count.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the number of entries in the current 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.count = function(source,operator,options) {\n\tvar count = 0;\n\tsource(function(tiddler,title) {\n\t\tcount++;\n\t});\n\treturn [count + \"\"];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/days.js": {
            "title": "$:/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\ttargetTimeStamp = targetTimeStamp - 1000*60*60*24*dayIntervalSign;\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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/duplicateslugs.js": {
            "title": "$:/core/modules/filters/duplicateslugs.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/duplicateslugs.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter function for [duplicateslugs[]]\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.duplicateslugs = function(source,operator,options) {\n\tvar slugs = Object.create(null), // Hashmap by slug of title, replaced with \"true\" if the duplicate title has already been output\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tvar slug = options.wiki.slugify(title);\n\t\tif(slug in slugs) {\n\t\t\tif(slugs[slug] !== true) {\n\t\t\t\tresults.push(slugs[slug]);\n\t\t\t\tslugs[slug] = true;\n\t\t\t}\n\t\t\tresults.push(title);\n\t\t} else {\n\t\t\tslugs[slug] = title;\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/each.js": {
            "title": "$:/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\tvalue,values = {},\n\tfield = operator.operand || \"title\";\n\tif(operator.suffix === \"value\" && field === \"title\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(values,title)) {\n\t\t\t\tvalues[title] = true;\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else if(operator.suffix !== \"list-item\") {\n\t\tif(field === \"title\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && !$tw.utils.hop(values,title)) {\n\t\t\t\t\tvalues[title] = true;\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\tvalue = tiddler.getFieldString(field);\n\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\tvalues[value] = true;\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} 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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/eachday.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/editiondescription.js": {
            "title": "$:/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\tif($tw.node) {\n\t\tvar editionInfo = $tw.utils.getEditionInfo();\n\t\tif(editionInfo) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif($tw.utils.hop(editionInfo,title)) {\n\t\t\t\t\tresults.push(editionInfo[title].description || \"\");\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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/editions.js": {
            "title": "$:/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\tif($tw.node) {\n\t\tvar editionInfo = $tw.utils.getEditionInfo();\n\t\tif(editionInfo) {\n\t\t\t$tw.utils.each(editionInfo,function(info,name) {\n\t\t\t\tresults.push(name);\n\t\t\t});\n\t\t}\n\t\tresults.sort();\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/else.js": {
            "title": "$:/core/modules/filters/else.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/else.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing an empty input list with a constant, passing a non-empty input list straight through\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.else = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tif(results.length === 0) {\n\t\treturn [operator.operand];\n\t} else {\n\t\treturn results;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/decodeuricomponent.js": {
            "title": "$:/core/modules/filters/decodeuricomponent.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/decodeuricomponent.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for applying decodeURIComponent() to each item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter functions\n*/\n\nexports.decodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURIComponent(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURIComponent(title));\n\t});\n\treturn results;\n};\n\nexports.decodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURI(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURI(title));\n\t});\n\treturn results;\n};\n\nexports.decodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlDecode(title));\n\t});\n\treturn results;\n};\n\nexports.encodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlEncode(title));\n\t});\n\treturn results;\n};\n\nexports.stringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.stringify(title,(operator.suffix === \"rawunicode\")));\n\t});\n\treturn results;\n};\n\nexports.jsonstringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.jsonStringify(title,(operator.suffix === \"rawunicode\")));\n\t});\n\treturn results;\n};\n\nexports.escaperegexp = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.escapeRegExp(title));\n\t});\n\treturn results;\n};\n\nexports.escapecss = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t// escape any character with a special meaning in CSS using CSS.escape()\n\t\tresults.push(CSS.escape(title));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/enlist.js": {
            "title": "$:/core/modules/filters/enlist.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/enlist.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand parsed as 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.enlist = function(source,operator,options) {\n\tvar allowDuplicates = false;\n\tswitch(operator.suffix) {\n\t\tcase \"raw\":\n\t\t\tallowDuplicates = true;\n\t\t\tbreak;\n\t\tcase \"dedupe\":\n\t\t\tallowDuplicates = false;\n\t\t\tbreak;\n\t}\n\tvar list = $tw.utils.parseStringArray(operator.operand,allowDuplicates);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\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\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/field.js": {
            "title": "$:/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 = [],indexedResults,\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\tif(source.byField && operator.operand) {\n\t\t\t\tindexedResults = source.byField(fieldname,operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults\n\t\t\t\t}\n\t\t\t}\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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/fields.js": {
            "title": "$:/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\t\tfieldName,\n\t\tsuffixes = (operator.suffixes || [])[0] || [],\n\t\toperand = $tw.utils.parseStringArray(operator.operand);\n\t\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(suffixes.indexOf(\"include\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? $tw.utils.pushTop(results,fieldName) : \"\";\n\t\t\t\t}\n\t\t\t} else if (suffixes.indexOf(\"exclude\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? \"\" : $tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else if\n\t\t\telse {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else\n\t\t} // if (tiddler)\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/filter.js": {
            "title": "$:/core/modules/filters/filter.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/filter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning those input titles that pass a subfilter\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.filter = function(source,operator,options) {\n\tvar filterFn = options.wiki.compileFilter(operator.operand),\n\t\tresults = [],\n\t\ttarget = operator.prefix !== \"!\";\n\tsource(function(tiddler,title) {\n\t\tvar list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]));\n\t\tif((list.length > 0) === target) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/format/date.js": {
            "title": "$:/core/modules/filters/format/date.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/format/date.js\ntype: application/javascript\nmodule-type: formatfilteroperator\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.date = function(source,operand,options) {\n\tvar results = [];\t\n\tsource(function(tiddler,title) {\n\t\tvar value = $tw.utils.parseDate(title);\n\t\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\t\tresults.push($tw.utils.formatDateString(value,operand || \"YYYY MM DD 0hh:0mm\"));\n\t\t}\n\t});\t\n\treturn results;\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "formatfilteroperator"
        },
        "$:/core/modules/filters/format/relativedate.js": {
            "title": "$:/core/modules/filters/format/relativedate.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/format/relativedate.js\ntype: application/javascript\nmodule-type: formatfilteroperator\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.relativedate = function(source,operand,options) {\n\tvar results = [];\t\n\tsource(function(tiddler,title) {\n\t\tvar value = $tw.utils.parseDate(title);\n\t\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\t\tresults.push($tw.utils.getRelativeDate((new Date()) - (new Date(value))).description);\n\t\t}\n\t});\t\n\treturn results;\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "formatfilteroperator"
        },
        "$:/core/modules/filters/format.js": {
            "title": "$:/core/modules/filters/format.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/format.js\ntype: application/javascript\nmodule-type: filteroperator\nFilter operator for formatting strings\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar formatFilterOperators;\n\nfunction getFormatFilterOperators() {\n\tif(!formatFilterOperators) {\n\t\tformatFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"formatfilteroperator\",formatFilterOperators);\n\t}\n\treturn formatFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.format = function(source,operator,options) {\n\t// Dispatch to the correct formatfilteroperator\n\tvar formatFilterOperators = getFormatFilterOperators();\n\tif(operator.suffix) {\n\t\tvar formatFilterOperator = formatFilterOperators[operator.suffix];\n\t\tif(formatFilterOperator) {\n\t\t\treturn formatFilterOperator(source,operator.operand,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/FormatFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all unchanged if the suffix is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/get.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/getindex.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/getvariable.js": {
            "title": "$:/core/modules/filters/getvariable.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/getvariable.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing input values by the value of the variable with the same name, or blank if the variable 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.getvariable = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.widget.getVariable(title) || \"\");\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/has.js": {
            "title": "$:/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 or index\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\t\tinvert = operator.prefix === \"!\";\n\n\tif(operator.suffix === \"field\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand)))) {\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 && $tw.utils.hop(tiddler.fields,operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse if(operator.suffix === \"index\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)))) {\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 && $tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || !$tw.utils.hop(tiddler.fields,operator.operand) || (tiddler.fields[operator.operand].length === 0)) {\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 && $tw.utils.hop(tiddler.fields,operator.operand) && (tiddler.fields[operator.operand].length !== 0)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\t\t\t\t\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/haschanged.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/indexes.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/insertbefore.js": {
            "title": "$:/core/modules/filters/insertbefore.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/insertbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nInsert an item before another item in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.insertbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar target = options.widget && options.widget.getVariable(operator.suffix || \"currentTiddler\");\n\tif(target !== operator.operand) {\n\t\t// Remove the entry from the list if it is present\n\t\tvar pos = results.indexOf(operator.operand);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,1);\n\t\t}\n\t\t// Insert the entry before the target marker\n\t\tpos = results.indexOf(target);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,0,operator.operand);\n\t\t} else {\n\t\t\tresults.push(operator.operand);\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/is/binary.js": {
            "title": "$:/core/modules/filters/is/binary.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/binary.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[binary]]\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.binary = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isBinaryTiddler(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.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/blank.js": {
            "title": "$:/core/modules/filters/is/blank.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/blank.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[blank]]\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.blank = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(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(!title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/current.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/draft.js": {
            "title": "$:/core/modules/filters/is/draft.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/draft.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[draft]] analagous to [has[draft.of]]\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.draft = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !$tw.utils.hop(tiddler.fields,\"draft.of\")) {\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,\"draft.of\") && (tiddler.fields[\"draft.of\"].length !== 0)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\t\t\t\t\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/image.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/missing.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/orphan.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/shadow.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/system.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/tag.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/tiddler.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/variable.js": {
            "title": "$:/core/modules/filters/is/variable.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/variable.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[variable]]\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.variable = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!(title in options.widget.variables)) {\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 in options.widget.variables) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is.js": {
            "title": "$:/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\tif(operator.operand) {\n\t\tvar isFilterOperator = isFilterOperators[operator.operand];\n\t\tif(isFilterOperator) {\n\t\t\treturn isFilterOperator(source,operator.prefix,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/IsFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all tiddlers if the operand is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/limit.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/links.js": {
            "title": "$:/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 = new $tw.utils.LinkedList();\n\tsource(function(tiddler,title) {\n\t\tresults.pushTop(options.wiki.getTiddlerLinks(title));\n\t});\n\treturn results.toArray();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/list.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/listed.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/listops.js": {
            "title": "$:/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/*\nOrder a list\n*/\nexports.order = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.operand.toLowerCase() === \"reverse\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.unshift(title);\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t}\n\treturn results;\n};\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 = $tw.utils.getInt(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 = $tw.utils.getInt(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 = $tw.utils.getInt(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 = $tw.utils.getInt(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 = $tw.utils.getInt(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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/lookup.js": {
            "title": "$:/core/modules/filters/lookup.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/lookup.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that looks up values via a title prefix\n\n[lookup:<field>[<prefix>]]\n\nPrepends the prefix to the selected items and returns the specified field 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.lookup = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.getTiddlerText(operator.operand + title) || operator.suffix || '');\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/match.js": {
            "title": "$:/core/modules/filters/match.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/match.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title matches a string\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.match = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() !== (operator.operand || \"\").toLowerCase()) {\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(title.toLowerCase() === (operator.operand || \"\").toLowerCase()) {\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.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title !== operator.operand) {\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(title === operator.operand) {\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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/math.js": {
            "title": "$:/core/modules/filters/math.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/math.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for math. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\nNote that strings are converted to numbers automatically. Trailing non-digits are ignored.\n\n* \"\" converts to 0\n* \"12kk\" converts to 12\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.negate = makeNumericBinaryOperator(\n\tfunction(a) {return -a}\n);\n\nexports.abs = makeNumericBinaryOperator(\n\tfunction(a) {return Math.abs(a)}\n);\n\nexports.ceil = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(a)}\n);\n\nexports.floor = makeNumericBinaryOperator(\n\tfunction(a) {return Math.floor(a)}\n);\n\nexports.round = makeNumericBinaryOperator(\n\tfunction(a) {return Math.round(a)}\n);\n\nexports.trunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.trunc(a)}\n);\n\nexports.untrunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(Math.abs(a)) * Math.sign(a)}\n);\n\nexports.sign = makeNumericBinaryOperator(\n\tfunction(a) {return Math.sign(a)}\n);\n\nexports.add = makeNumericBinaryOperator(\n\tfunction(a,b) {return a + b;}\n);\n\nexports.subtract = makeNumericBinaryOperator(\n\tfunction(a,b) {return a - b;}\n);\n\nexports.multiply = makeNumericBinaryOperator(\n\tfunction(a,b) {return a * b;}\n);\n\nexports.divide = makeNumericBinaryOperator(\n\tfunction(a,b) {return a / b;}\n);\n\nexports.remainder = makeNumericBinaryOperator(\n\tfunction(a,b) {return a % b;}\n);\n\nexports.max = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.max(a,b);}\n);\n\nexports.min = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.min(a,b);}\n);\n\nexports.fixed = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toFixed.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.precision = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toPrecision.call(a,Math.min(Math.max(b,1),100));}\n);\n\nexports.exponential = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toExponential.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.power = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.pow(a,b);}\n);\n\nexports.log = makeNumericBinaryOperator(\n\tfunction(a,b) {\n\t\tif(b) {\n\t\t\treturn Math.log(a)/Math.log(b);\n\t\t} else {\n\t\t\treturn Math.log(a);\n\t\t}\n\t}\n);\n\nexports.sum = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator + value},\n\t0 // Initial value\n);\n\nexports.product = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator * value},\n\t1 // Initial value\n);\n\nexports.maxall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.max(accumulator,value)},\n\t-Infinity // Initial value\n);\n\nexports.minall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.min(accumulator,value)},\n\tInfinity // Initial value\n);\n\nfunction makeNumericBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [],\n\t\t\tnumOperand = $tw.utils.parseNumber(operator.operand);\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push($tw.utils.stringifyNumber(fnCalc($tw.utils.parseNumber(title),numOperand)));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeNumericReducingOperator(fnCalc,initialValue) {\n\tinitialValue = initialValue || 0;\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\treturn [$tw.utils.stringifyNumber(result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,$tw.utils.parseNumber(currentValue));\n\t\t},initialValue))];\n\t};\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/minlength.js": {
            "title": "$:/core/modules/filters/minlength.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/minlength.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for filtering out titles that don't meet the minimum length 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.minlength = function(source,operator,options) {\n\tvar results = [],\n\t\tminLength = parseInt(operator.operand || \"\",10) || 0;\n\tsource(function(tiddler,title) {\n\t\tif(title.length >= minLength) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/modules.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/moduletypes.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/next.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/plugintiddlers.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/prefix.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/previous.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/range.js": {
            "title": "$:/core/modules/filters/range.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/range.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for generating a numeric range.\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.range = function(source,operator,options) {\n\tvar results = [];\n\t// Split the operand into numbers delimited by these symbols\n\tvar parts = operator.operand.split(/[,:;]/g),\n\t\tbeg, end, inc, i, fixed = 0;\n\tfor (i=0; i<parts.length; i++) {\n\t\t// Validate real number\n\t\tif(!/^\\s*[+-]?((\\d+(\\.\\d*)?)|(\\.\\d+))\\s*$/.test(parts[i])) {\n\t\t\treturn [\"range: bad number \\\"\" + parts[i] + \"\\\"\"];\n\t\t}\n\t\t// Count digits; the most precise number determines decimal places in output.\n\t\tvar frac = /\\.\\d+/.exec(parts[i]);\n\t\tif(frac) {\n\t\t\tfixed = Math.max(fixed,frac[0].length-1);\n\t\t}\n\t\tparts[i] = parseFloat(parts[i]);\n\t}\n\tswitch(parts.length) {\n\t\tcase 1:\n\t\t\tend = parts[0];\n\t\t\tif (end >= 1) {\n\t\t\t\tbeg = 1;\n\t\t\t}\n\t\t\telse if (end <= -1) {\n\t\t\t\tbeg = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = Math.abs(parts[2]);\n\t\t\tbreak;\n\t}\n\tif(inc === 0) {\n\t\treturn [\"range: increment 0 causes infinite loop\"];\n\t}\n\t// May need to count backwards\n\tvar direction = ((end < beg) ? -1 : 1);\n\tinc *= direction;\n\t// Estimate number of resulting elements\n\tif((end - beg) / inc > 10000) {\n\t\treturn [\"range: too many steps (over 10K)\"];\n\t}\n\t// Avoid rounding error on last step\n\tend += direction * 0.5 * Math.pow(0.1,fixed);\n\tvar safety = 10010;\n\t// Enumerate the range\n\tif (end<beg) {\n\t\tfor(i=beg; i>end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor(i=beg; i<end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif(safety<0) {\n\t\treturn [\"range: unexpectedly large output\"];\n\t}\n\t// Reverse?\n\tif(operator.prefix === \"!\") {\n\t\tresults.reverse();\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/reduce.js": {
            "title": "$:/core/modules/filters/reduce.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/reduce.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator evaluates a subfilter for each item, making the running total available in the variable `accumulator`, and the current index available in the variable `index`\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.reduce = function(source,operator,options) {\n\t// Accumulate the list\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Run the filter over each item\n\tvar filterFn = options.wiki.compileFilter(operator.operand),\n\t\taccumulator = operator.operands[1] || \"\";\n\tfor(var index=0; index<results.length; index++) {\n\t\tvar title = results[index],\n\t\t\tlist = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),{\n\t\t\t\tgetVariable: function(name) {\n\t\t\t\t\tswitch(name) {\n\t\t\t\t\t\tcase \"currentTiddler\":\n\t\t\t\t\t\t\treturn \"\" + title;\n\t\t\t\t\t\tcase \"accumulator\":\n\t\t\t\t\t\t\treturn \"\" + accumulator;\n\t\t\t\t\t\tcase \"index\":\n\t\t\t\t\t\t\treturn \"\" + index;\n\t\t\t\t\t\tcase \"revIndex\":\n\t\t\t\t\t\t\treturn \"\" + (results.length - 1 - index);\n\t\t\t\t\t\tcase \"length\":\n\t\t\t\t\t\t\treturn \"\" + results.length;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn options.widget.getVariable(name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\tif(list.length > 0) {\n\t\t\taccumulator = \"\" +  list[0];\n\t\t}\n\t}\n\tif(results.length > 0) {\n\t\treturn [accumulator];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/regexp.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/removeprefix.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/removesuffix.js": {
            "title": "$:/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 && 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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/sameday.js": {
            "title": "$:/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\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(tiddler.getFieldDay(fieldName) === targetDate) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/search.js": {
            "title": "$:/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.suffixes) {\n\t\tvar hasFlag = function(flag) {\n\t\t\t\treturn (operator.suffixes[1] || []).indexOf(flag) !== -1;\n\t\t\t},\n\t\t\texcludeFields = false,\n\t\t\tfieldList = operator.suffixes[0] || [],\n\t\t\tfirstField = fieldList[0] || \"\", \n\t\t\tfirstChar = firstField.charAt(0),\n\t\t\tfields;\n\t\tif(firstChar === \"-\") {\n\t\t\tfields = [firstField.slice(1)].concat(fieldList.slice(1));\n\t\t\texcludeFields = true;\n\t\t} else if(fieldList[0] === \"*\"){\n\t\t\tfields = [];\n\t\t\texcludeFields = true;\n\t\t} else {\n\t\t\tfields = fieldList.slice(0);\n\t\t}\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert,\n\t\t\tfield: fields,\n\t\t\texcludeField: excludeFields,\n\t\t\tcaseSensitive: hasFlag(\"casesensitive\"),\n\t\t\tliteral: hasFlag(\"literal\"),\n\t\t\twhitespace: hasFlag(\"whitespace\"),\n\t\t\tanchored: hasFlag(\"anchored\"),\n\t\t\tregexp: hasFlag(\"regexp\"),\n\t\t\twords: hasFlag(\"words\")\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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/shadowsource.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/slugify.js": {
            "title": "$:/core/modules/filters/slugify.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/slugify.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for slugifying a tiddler title\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.slugify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.slugify(title));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/sort.js": {
            "title": "$:/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.sortan = function(source, operator, options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results, operator.operand || \"title\", operator.prefix === \"!\",false,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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/sortsub.js": {
            "title": "$:/core/modules/filters/sortsub.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/sortsub.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting by a subfilter\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.sortsub = function(source,operator,options) {\n\t// Compile the subfilter\n\tvar filterFn = options.wiki.compileFilter(operator.operand);\n\t// Collect the input titles and the corresponding sort keys\n\tvar inputTitles = [],\n\t\tsortKeys = [];\n\tsource(function(tiddler,title) {\n\t\tinputTitles.push(title);\n\t\tvar r = filterFn.call(options.wiki,function(iterator) {\n\t\t\titerator(options.wiki.getTiddler(title),title);\n\t\t},{\n\t\t\tgetVariable: function(name) {\n\t\t\t\tif(name === \"currentTiddler\") {\n\t\t\t\t\treturn title;\n\t\t\t\t} else {\n\t\t\t\t\treturn options.widget.getVariable(name);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tsortKeys.push(r[0] || \"\");\n\t});\n\t// Rather than sorting the titles array, we'll sort the indexes so that we can consult both arrays\n\tvar indexes = new Array(inputTitles.length);\n\tfor(var t=0; t<inputTitles.length; t++) {\n\t\tindexes[t] = t;\n\t}\n\t// Sort the indexes\n\tvar compareFn = $tw.utils.makeCompareFunction(operator.suffix,{defaultType: \"string\",invert: operator.prefix === \"!\"});\n\tindexes = indexes.sort(function(a,b) {\n\t\treturn compareFn(sortKeys[a],sortKeys[b]);\n\t});\n\t// Make the results array in order\n\tvar results = [];\n\t$tw.utils.each(indexes,function(index) {\n\t\tresults.push(inputTitles[index]);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/splitbefore.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/storyviews.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/strings.js": {
            "title": "$:/core/modules/filters/strings.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/strings.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for strings. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.length = makeStringBinaryOperator(\n\tfunction(a) {return [\"\" + (\"\" + a).length];}\n);\n\nexports.uppercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toUpperCase()];}\n);\n\nexports.lowercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toLowerCase()];}\n);\n\nexports.sentencecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toSentenceCase(a)];}\n);\n\nexports.titlecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toTitleCase(a)];}\n);\n\nexports.trim = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\toperand = (operator.operand || \"\"),\n\t\tfnCalc;\n\tif(suffix === \"prefix\") {\n\t\tfnCalc = function(a,b) {return [$tw.utils.trimPrefix(a,b)];}\n\t} else if(suffix === \"suffix\") {\n\t\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix(a,b)];}\n\t} else {\n\t\tif(operand === \"\") {\n\t\t\tfnCalc = function(a) {return [$tw.utils.trim(a)];}\n\t\t} else {\n\t\t\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix($tw.utils.trimPrefix(a,b),b)];}\n\t\t}\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,fnCalc(title,operand));\n\t});\n\treturn result;\n};\n\nexports.split = makeStringBinaryOperator(\n\tfunction(a,b) {return (\"\" + a).split(b);}\n);\n\nexports[\"enlist-input\"] = makeStringBinaryOperator(\n\tfunction(a,o,s) {return $tw.utils.parseStringArray(\"\" + a,(s === \"raw\"));}\n);\n\nexports.join = makeStringReducingOperator(\n\tfunction(accumulator,value,operand) {\n\t\tif(accumulator === null) {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn accumulator + operand + value;\n\t\t}\n\t},null\n);\n\nfunction makeStringBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tArray.prototype.push.apply(result,fnCalc(title,operator.operand || \"\",operator.suffix || \"\"));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeStringReducingOperator(fnCalc,initialValue) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\tif(result.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\treturn [result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,currentValue,operator.operand || \"\");\n\t\t},initialValue) || \"\"];\n\t};\n}\n\nexports.splitregexp = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\tflags = (suffix.indexOf(\"m\") !== -1 ? \"m\" : \"\") + (suffix.indexOf(\"i\") !== -1 ? \"i\" : \"\"),\n\t\tregExp;\n\ttry {\n\t\tregExp = new RegExp(operator.operand || \"\",flags);\t\t\n\t} catch(ex) {\n\t\treturn [\"RegExp error: \" + ex];\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,title.split(regExp));\n\t});\t\t\n\treturn result;\n};\n\nexports[\"search-replace\"] = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = operator.suffixes || [],\n\t\tflagSuffix = (suffixes[0] ? (suffixes[0][0] || \"\") : \"\"),\n\t\tflags = (flagSuffix.indexOf(\"g\") !== -1 ? \"g\" : \"\") + (flagSuffix.indexOf(\"i\") !== -1 ? \"i\" : \"\"),\n\t\tisRegExp = (suffixes[1] && suffixes[1][0] === \"regexp\") ? true : false,\n\t\tsearchTerm,\n\t\tregExp;\n\t\n\tsource(function(tiddler,title) {\n\t\tif(title && (operator.operands.length > 1)) {\n\t\t\t//Escape regexp characters if the operand is not a regular expression\n\t\t\tsearchTerm = isRegExp ? operator.operand : $tw.utils.escapeRegExp(operator.operand);\n\t\t\ttry {\n\t\t\t\tregExp = new RegExp(searchTerm,flags);\n\t\t\t} catch(ex) {\n\t\t\t\treturn [\"RegExp error: \" + ex];\n\t\t\t}\n\t\t\tresults.push(\n\t\t\t\ttitle.replace(regExp,operator.operands[1])\n\t\t\t);\n\t\t} else {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nexports.pad = function(source,operator,options) {\n\tvar results = [],\n\t\ttargetLength = operator.operand ? parseInt(operator.operand) : 0,\n\t\tfill = operator.operands[1] || \"0\";\n\n\tsource(function(tiddler,title) {\n\t\tif(title && title.length) {\n\t\t\tif(title.length >= targetLength) {\n\t\t\t\tresults.push(title);\n\t\t\t} else {\n\t\t\t\tvar padString = \"\",\n\t\t\t\t\tpadStringLength = targetLength - title.length;\n\t\t\t\twhile (padStringLength > padString.length) {\n\t\t\t\t\tpadString += fill;\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t//make sure we do not exceed the specified length\n\t\t\t\tpadString = padString.slice(0,padStringLength);\n\t\t\t\tif(operator.suffix && (operator.suffix === \"suffix\")) {\n\t\t\t\t\ttitle = title + padString;\n\t\t\t\t} else {\n\t\t\t\t\ttitle = padString + title;\n\t\t\t\t}\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/subfilter.js": {
            "title": "$:/core/modules/filters/subfilter.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/subfilter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand evaluated as a filter\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.subfilter = function(source,operator,options) {\n\tvar list = options.wiki.filterTiddlers(operator.operand,options.widget,source);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\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\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/subtiddlerfields.js": {
            "title": "$:/core/modules/filters/subtiddlerfields.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/subtiddlerfields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected subtiddlers of the plugin 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.subtiddlerfields = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar subtiddler = options.wiki.getSubTiddler(operator.operand,title);\n\t\tif(subtiddler) {\n\t\t\tfor(var fieldName in subtiddler.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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/suffix.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/tag.js": {
            "title": "$:/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 = [],indexedResults;\n\tif((operator.suffix || \"\").toLowerCase() === \"strict\" && !operator.operand) {\n\t\t// New semantics:\n\t\t// Always return copy of input if operator.operand is missing\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t} else {\n\t\t// Old semantics:\n\t\tvar tiddlers;\n\t\tif(operator.prefix === \"!\") {\n\t\t\t// Returns a copy of the input if operator.operand is missing\n\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddlers.indexOf(title) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// Returns empty results if operator.operand is missing\n\t\t\tif(source.byTag) {\n\t\t\t\tindexedResults = source.byTag(operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\t\tsource(function(tiddler,title) {\n\t\t\t\t\tif(tiddlers.indexOf(title) !== -1) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tresults = options.wiki.sortByList(results,operator.operand);\n\t\t\t}\n\t\t}\t\t\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/tagging.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/tags.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/then.js": {
            "title": "$:/core/modules/filters/then.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/then.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing any titles with a constant\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.then = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/title.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/untagged.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/variables.js": {
            "title": "$:/core/modules/filters/variables.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/variables.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the active variables\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.variables = function(source,operator,options) {\n\tvar names = [];\n\tfor(var variable in options.widget.variables) {\n\t\tnames.push(variable);\n\t}\n\treturn names.sort();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/wikiparserrules.js": {
            "title": "$:/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\toperand = operator.operand;\n\t$tw.utils.each($tw.modules.types.wikirule,function(mod) {\n\t\tvar exp = mod.exports;\n\t\tif(!operand || exp.types[operand]) {\n\t\t\tresults.push(exp.name);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/x-listops.js": {
            "title": "$:/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\t/*jslint node: true, browser: true */\n\t/*global $tw: false */\n\t\"use strict\";\n\n\t/*\n\tFetch titles from the current list\n\t*/\n\tvar prepare_results = function (source) {\n\tvar results = [];\n\t\tsource(function (tiddler, title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list before the item named in the operand\n\t*/\n\texports.putbefore = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -1) :\n\t\t\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list after the item named in the operand\n\t*/\n\texports.putafter = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -1) :\n\t\t\tresults.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n\t};\n\n\t/*\n\tReplaces the item named in the operand with a number of items from the tail of the current list\n\t*/\n\texports.replace = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -count) :\n\t\t\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list to the head of the list\n\t*/\n\texports.putfirst = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn results.slice(-count).concat(results.slice(0, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the head of the current list to the tail of the list\n\t*/\n\texports.putlast = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn results.slice(count).concat(results.slice(0, count));\n\t};\n\n\t/*\n\tMoves the item named in the operand a number of places forward or backward in the list\n\t*/\n\texports.move = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1),\n\t\t\tmarker = results.splice(index, 1),\n\t\t\toffset =  (index + count) > 0 ? index + count : 0;\n\t\treturn results.slice(0, offset).concat(marker).concat(results.slice(offset));\n\t};\n\n\t/*\n\tReturns the items from the current list that are after the item named in the operand\n\t*/\n\texports.allafter = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand);\n\t\treturn (index === -1) ? [] :\n\t\t\t(operator.suffix) ? results.slice(index) :\n\t\t\tresults.slice(index + 1);\n\t};\n\n\t/*\n\tReturns the items from the current list that are before the item named in the operand\n\t*/\n\texports.allbefore = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand);\n\t\treturn (index === -1) ? [] :\n\t\t\t(operator.suffix) ? results.slice(0, index + 1) :\n\t\t\tresults.slice(0, index);\n\t};\n\n\t/*\n\tAppends the items listed in the operand array to the tail of the current list\n\t*/\n\texports.append = function (source, operator) {\n\t\tvar append = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = parseInt(operator.suffix) || append.length;\n\t\treturn (append.length === 0) ? results :\n\t\t\t(operator.prefix) ? results.concat(append.slice(-count)) :\n\t\t\tresults.concat(append.slice(0, count));\n\t};\n\n\t/*\n\tPrepends the items listed in the operand array to the head of the current list\n\t*/\n\texports.prepend = function (source, operator) {\n\t\tvar prepend = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,prepend.length);\n\t\treturn (prepend.length === 0) ? results :\n\t\t\t(operator.prefix) ? prepend.slice(-count).concat(results) :\n\t\t\tprepend.slice(0, count).concat(results);\n\t};\n\n\t/*\n\tReturns all items from the current list except the items listed in the operand array\n\t*/\n\texports.remove = function (source, operator) {\n\t\tvar array = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = parseInt(operator.suffix) || array.length,\n\t\t\tp,\n\t\t\tlen,\n\t\t\tindex;\n\t\tlen = array.length - 1;\n\t\tfor (p = 0; p < count; ++p) {\n\t\t\tif (operator.prefix) {\n\t\t\t\tindex = results.indexOf(array[len - p]);\n\t\t\t} else {\n\t\t\t\tindex = results.indexOf(array[p]);\n\t\t\t}\n\t\t\tif (index !== -1) {\n\t\t\t\tresults.splice(index, 1);\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t};\n\n\t/*\n\tReturns all items from the current list sorted in the order of the items in the operand array\n\t*/\n\texports.sortby = function (source, operator) {\n\t\tvar results = prepare_results(source);\n\t\tif (!results || results.length < 2) {\n\t\t\treturn results;\n\t\t}\n\t\tvar lookup = $tw.utils.parseStringArray(operator.operand, \"true\");\n\t\tresults.sort(function (a, b) {\n\t\t\treturn lookup.indexOf(a) - lookup.indexOf(b);\n\t\t});\n\t\treturn results;\n\t};\n\n\t/*\n\tRemoves all duplicate items from the current list\n\t*/\n\texports.unique = function (source, operator) {\n\t\tvar results = prepare_results(source);\n\t\tvar set = results.reduce(function (a, b) {\n\t\t\tif (a.indexOf(b) < 0) {\n\t\t\t\ta.push(b);\n\t\t\t}\n\t\t\treturn a;\n\t\t}, []);\n\t\treturn set;\n\t};\n\n\tvar cycleValueInArray = function(results,operands,stepSize) {\n\t\tvar resultsIndex,\n\t\t\tstep = stepSize || 1,\n\t\t\ti = 0,\n\t\t\topLength = operands.length,\n\t\t\tnextOperandIndex;\t\t\n\t\tfor(i; i < opLength; i++) {\n\t\t\tresultsIndex = results.indexOf(operands[i]);\n\t\t\tif(resultsIndex !== -1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif(resultsIndex !== -1) {\n\t\t\ti = i + step;\n\t\t\tnextOperandIndex = (i < opLength ? i : i - opLength);\n\t\t\tif(operands.length > 1) {\n\t\t\t\tresults.splice(resultsIndex,1,operands[nextOperandIndex]);\n\t\t\t} else {\n\t\t\t\tresults.splice(resultsIndex,1);\n\t\t\t}\n\t\t} else {\n\t\t\tresults.push(operands[0]);\n\t\t}\n\t\treturn results;\t\t\n\t}\n\n\t/*\n\tToggles an item in the current list.\n\t*/\t\n\texports.toggle = function(source,operator) {\n\t\treturn cycleValueInArray(prepare_results(source),operator.operands);\n\t}\n\n\texports.cycle = function(source,operator) {\n\t\tvar results = prepare_results(source),\n\t\t\toperands = (operator.operand.length ? $tw.utils.parseStringArray(operator.operand, \"true\") : [\"\"]),\n\t\t\tstep = $tw.utils.getInt(operator.operands[1]||\"\",1);\n\t\tif(step < 0) {\n\t\t\toperands.reverse();\n\t\t\tstep = Math.abs(step);\n\t\t}\t\n\t\treturn cycleValueInArray(results,operands,step);\n\t}\n\t\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters.js": {
            "title": "$:/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 nextBracketPos, operator;\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\tnextBracketPos = 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// Any suffix?\n\t\tvar colon = operator.operator.indexOf(':');\n\t\tif(colon > -1) {\n\t\t\t// The raw suffix for older filters\n\t\t\toperator.suffix = operator.operator.substring(colon + 1);\n\t\t\toperator.operator = operator.operator.substring(0,colon) || \"field\";\n\t\t\t// The processed suffix for newer filters\n\t\t\toperator.suffixes = [];\n\t\t\t$tw.utils.each(operator.suffix.split(\":\"),function(subsuffix) {\n\t\t\t\toperator.suffixes.push([]);\n\t\t\t\t$tw.utils.each(subsuffix.split(\",\"),function(entry) {\n\t\t\t\t\tentry = $tw.utils.trim(entry);\n\t\t\t\t\tif(entry) {\n\t\t\t\t\t\toperator.suffixes[operator.suffixes.length - 1].push(entry); \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\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\t\toperator.operands = [];\n\t\tvar parseOperand = function(bracketType) {\n\t\t\tvar operand = {};\n\t\t\tswitch (bracketType) {\n\t\t\t\tcase \"{\": // Curly brackets\n\t\t\t\t\toperand.indirect = true;\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"[\": // Square brackets\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<\": // Angle brackets\n\t\t\t\t\toperand.variable = true;\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"/\": // regexp brackets\n\t\t\t\t\tvar rex = /^((?:[^\\\\\\/]|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\t\tif(rexMatch) {\n\t\t\t\t\t\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\n\t// DEPRECATION WARNING\n\tconsole.log(\"WARNING: Filter\",operator.operator,\"has a deprecated regexp operand\",operator.regexp);\n\t\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthrow \"Unterminated regular expression in filter expression\";\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(nextBracketPos === -1) {\n\t\t\t\tthrow \"Missing closing bracket in filter expression\";\n\t\t\t}\n\t\t\tif(!operator.regexp) {\n\t\t\t\toperand.text = filterString.substring(p,nextBracketPos);\n\t\t\t\toperator.operands.push(operand);\n\t\t\t}\n\t\t\tp = nextBracketPos + 1;\n\t\t}\n\t\t\n\t\tp = nextBracketPos + 1;\n\t\tparseOperand(bracket);\n\t\t\n\t\t// Check for multiple operands\n\t\twhile(filterString.charAt(p) === \",\") {\n\t\t\tp++;\n\t\t\tif(/^[\\[\\{<\\/]/.test(filterString.substring(p))) {\n\t\t\t\tnextBracketPos = p;\n\t\t\t\tp++;\n\t\t\t\tparseOperand(filterString.charAt(nextBracketPos));\n\t\t\t} else {\n\t\t\t\tthrow \"Missing [ in filter expression\";\n\t\t\t}\n\t\t}\n\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 = /((?:\\+|\\-|~|=|\\:(\\w+))?)(?:(\\[)|(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\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 $tw.language.getString(\"Error/FilterSyntax\");\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 = p + operation.prefix.length;\n\t\t\t\tif(match[2]) {\n\t\t\t\t\toperation.namedPrefix = match[2];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(match[3]) { // 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[4] || match[5] || match[6]) { // Double quoted string, single quoted string or unquoted title\n\t\t\t\toperation.operators.push(\n\t\t\t\t\t{operator: \"title\", operands: [{text: match[4] || match[5] || match[6]}]}\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.getFilterRunPrefixes = function() {\n\tif(!this.filterRunPrefixes) {\n\t\t$tw.Wiki.prototype.filterRunPrefixes = {};\n\t\t$tw.modules.applyMethods(\"filterrunprefix\",this.filterRunPrefixes);\n\t}\n\treturn this.filterRunPrefixes;\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 [$tw.language.getString(\"Error/Filter\") + \": \" + 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 operands = [],\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\t\n\t\t\t\t$tw.utils.each(operator.operands,function(operand) {\n\t\t\t\t\tif(operand.indirect) {\n\t\t\t\t\t\toperand.value = self.getTextReference(operand.text,\"\",currTiddlerTitle);\n\t\t\t\t\t} else if(operand.variable) {\n\t\t\t\t\t\toperand.value = widget.getVariable(operand.text,{defaultValue: \"\"});\n\t\t\t\t\t} else {\n\t\t\t\t\t\toperand.value = operand.text;\n\t\t\t\t\t}\n\t\t\t\t\toperands.push(operand.value);\n\t\t\t\t});\n\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: operands.length > 0 ? operands[0] : undefined,\n\t\t\t\t\t\t\toperands: operands,\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\tsuffixes: operator.suffixes,\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\tvar filterRunPrefixes = self.getFilterRunPrefixes();\n\t\t// Wrap the operator functions in a wrapper function that depends on the prefix\n\t\toperationFunctions.push((function() {\n\t\t\tvar options = {wiki: self};\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 filterRunPrefixes[\"or\"](operationSubFunction, options);\n\t\t\t\tcase \"=\": // The results of the operation are pushed into the result without deduplication\n\t\t\t\t\treturn filterRunPrefixes[\"all\"](operationSubFunction, options);\n\t\t\t\tcase \"-\": // The results of this operation are removed from the main result\n\t\t\t\t\treturn filterRunPrefixes[\"except\"](operationSubFunction, options);\n\t\t\t\tcase \"+\": // This operation is applied to the main results so far\n\t\t\t\t\treturn filterRunPrefixes[\"and\"](operationSubFunction, options);\n\t\t\t\tcase \"~\": // This operation is unioned into the result only if the main result so far is empty\n\t\t\t\t\treturn filterRunPrefixes[\"else\"](operationSubFunction, options);\n\t\t\t\tdefault: \n\t\t\t\t\tif(operation.namedPrefix && filterRunPrefixes[operation.namedPrefix]) {\n\t\t\t\t\t\treturn filterRunPrefixes[operation.namedPrefix](operationSubFunction, options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t\tresults.clear();\n\t\t\t\t\t\t\tresults.push($tw.language.getString(\"Error/FilterRunPrefix\"));\n\t\t\t\t\t\t};\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: \" + filterString,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 = new $tw.utils.LinkedList();\n\t\t$tw.utils.each(operationFunctions,function(operationFunction) {\n\t\t\toperationFunction(results,source,widget);\n\t\t});\n\t\treturn results.toArray();\n\t});\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikimethod"
        },
        "$:/core/modules/indexers/backlinks-indexer.js": {
            "title": "$:/core/modules/indexers/backlinks-indexer.js",
            "text": "/*\\\ntitle: $:/core/modules/indexers/backlinks-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers' backlinks\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\n\nfunction BacklinksIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nBacklinksIndexer.prototype.init = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype.rebuild = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype._getLinks = function(tiddler) {\n\tvar parser =  this.wiki.parseText(tiddler.fields.type, tiddler.fields.text, {});\n\tif(parser) {\n\t\treturn this.wiki.extractLinks(parser.tree);\n\t}\n\treturn [];\n}\n\nBacklinksIndexer.prototype.update = function(updateDescriptor) {\n\tif(!this.index) {\n\t\treturn;\n\t}\n\tvar newLinks = [],\n\t    oldLinks = [],\n\t    self = this;\n\tif(updateDescriptor.old.exists) {\n\t\toldLinks = this._getLinks(updateDescriptor.old.tiddler);\n\t}\n\tif(updateDescriptor.new.exists) {\n\t\tnewLinks = this._getLinks(updateDescriptor.new.tiddler);\n\t}\n\n\t$tw.utils.each(oldLinks,function(link) {\n\t\tif(self.index[link]) {\n\t\t\tdelete self.index[link][updateDescriptor.old.tiddler.fields.title];\n\t\t}\n\t});\n\t$tw.utils.each(newLinks,function(link) {\n\t\tif(!self.index[link]) {\n\t\t\tself.index[link] = Object.create(null);\n\t\t}\n\t\tself.index[link][updateDescriptor.new.tiddler.fields.title] = true;\n\t});\n}\n\nBacklinksIndexer.prototype.lookup = function(title) {\n\tif(!this.index) {\n\t\tthis.index = Object.create(null);\n\t\tvar self = this;\n\t\tthis.wiki.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self._getLinks(tiddler);\n\t\t\t$tw.utils.each(links, function(link) {\n\t\t\t\tif(!self.index[link]) {\n\t\t\t\t\tself.index[link] = Object.create(null);\n\t\t\t\t}\n\t\t\t\tself.index[link][title] = true;\n\t\t\t});\n\t\t});\n\t}\n\tif(this.index[title]) {\n\t\treturn Object.keys(this.index[title]);\n\t} else {\n\t\treturn [];\n\t}\n}\n\nexports.BacklinksIndexer = BacklinksIndexer;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "indexer"
        },
        "$:/core/modules/indexers/field-indexer.js": {
            "title": "$:/core/modules/indexers/field-indexer.js",
            "text": "/*\\\ntitle: $:/core/modules/indexers/field-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nvar DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH = 128;\n\nfunction FieldIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nFieldIndexer.prototype.init = function() {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH;\n\tthis.addIndexMethods();\n}\n\n// Provided for testing\nFieldIndexer.prototype.setMaxIndexedValueLength = function(length) {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = length;\n};\n\nFieldIndexer.prototype.addIndexMethods = function() {\n\tvar self = this;\n\tthis.wiki.each.byField = function(name,value) {\n\t\tvar titles = self.wiki.allTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachShadow.byField = function(name,value) {\n\t\tvar titles = self.wiki.allShadowTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachTiddlerPlusShadows.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n\tthis.wiki.eachShadowPlusTiddlers.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n};\n\n/*\nTear down and then rebuild the index as if all tiddlers have changed\n*/\nFieldIndexer.prototype.rebuild = function() {\n\t// Invalidate the index so that it will be rebuilt when it is next used\n\tthis.index = null;\n};\n\n/*\nBuild the index for a particular field\n*/\nFieldIndexer.prototype.buildIndexForField = function(name) {\n\tvar self = this;\n\t// Hashmap by field name of hashmap by field value of array of tiddler titles\n\tthis.index = this.index || Object.create(null);\n\tthis.index[name] = Object.create(null);\n\tvar baseIndex = this.index[name];\n\t// Update the index for each tiddler\n\tthis.wiki.eachTiddlerPlusShadows(function(tiddler,title) {\n\t\tif(name in tiddler.fields) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\t// Skip any values above the maximum length\n\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\tbaseIndex[value] = baseIndex[value] || [];\n\t\t\t\tbaseIndex[value].push(title);\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nUpdate the index in the light of a tiddler value changing; note that the title must be identical. (Renames are handled as a separate delete and create)\nupdateDescriptor: {old: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>},new: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>}}\n*/\nFieldIndexer.prototype.update = function(updateDescriptor) {\n\tvar self = this;\n\t// Don't do anything if the index hasn't been built yet\n\tif(this.index === null) {\n\t\treturn;\n\t}\n\t// Remove the old tiddler from the index\n\tif(updateDescriptor.old.tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor.old.tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor.old.tiddler.getFieldString(name),\n\t\t\t\t\ttiddlerList = indexEntry[value];\n\t\t\t\tif(tiddlerList) {\n\t\t\t\t\tvar index = tiddlerList.indexOf(updateDescriptor.old.tiddler.fields.title);\n\t\t\t\t\tif(index !== -1) {\n\t\t\t\t\t\ttiddlerList.splice(index,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t// Add the new tiddler to the index\n\tif(updateDescriptor[\"new\"].tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor[\"new\"].tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor[\"new\"].tiddler.getFieldString(name);\n\t\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\t\tindexEntry[value] = indexEntry[value] || [];\n\t\t\t\t\tindexEntry[value].push(updateDescriptor[\"new\"].tiddler.fields.title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n// Lookup the given field returning a list of tiddler titles\nFieldIndexer.prototype.lookup = function(name,value) {\n\t// Fail the lookup if the value is too long\n\tif(value.length >= this.maxIndexedValueLength) {\n\t\treturn null;\n\t}\n\t// Update the index if it has yet to be built\n\tif(this.index === null || !this.index[name]) {\n\t\tthis.buildIndexForField(name);\n\t}\n\treturn this.index[name][value] || [];\n};\n\nexports.FieldIndexer = FieldIndexer;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "indexer"
        },
        "$:/core/modules/indexers/tag-indexer.js": {
            "title": "$:/core/modules/indexers/tag-indexer.js",
            "text": "/*\\\ntitle: $:/core/modules/indexers/tag-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nfunction TagIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nTagIndexer.prototype.init = function() {\n\tthis.subIndexers = [\n\t\tnew TagSubIndexer(this,\"each\"),\n\t\tnew TagSubIndexer(this,\"eachShadow\"),\n\t\tnew TagSubIndexer(this,\"eachTiddlerPlusShadows\"),\n\t\tnew TagSubIndexer(this,\"eachShadowPlusTiddlers\")\n\t];\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.addIndexMethod();\n\t});\n};\n\nTagIndexer.prototype.rebuild = function() {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.rebuild();\n\t});\n};\n\nTagIndexer.prototype.update = function(updateDescriptor) {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.update(updateDescriptor);\n\t});\n};\n\nfunction TagSubIndexer(indexer,iteratorMethod) {\n\tthis.indexer = indexer;\n\tthis.iteratorMethod = iteratorMethod;\n\tthis.index = null; // Hashmap of tag title to {isSorted: bool, titles: [array]} or null if not yet initialised\n}\n\nTagSubIndexer.prototype.addIndexMethod = function() {\n\tvar self = this;\n\tthis.indexer.wiki[this.iteratorMethod].byTag = function(tag) {\n\t\treturn self.lookup(tag).slice(0);\n\t};\n};\n\nTagSubIndexer.prototype.rebuild = function() {\n\tvar self = this;\n\t// Hashmap by tag of array of {isSorted:, titles:[]}\n\tthis.index = Object.create(null);\n\t// Add all the tags\n\tthis.indexer.wiki[this.iteratorMethod](function(tiddler,title) {\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\tif(!self.index[tag]) {\n\t\t\t\tself.index[tag] = {isSorted: false, titles: [title]};\n\t\t\t} else {\n\t\t\t\tself.index[tag].titles.push(title);\n\t\t\t}\n\t\t});\t\t\n\t});\n};\n\nTagSubIndexer.prototype.update = function(updateDescriptor) {\n\tthis.index = null;\n};\n\nTagSubIndexer.prototype.lookup = function(tag) {\n\t// Update the index if it has yet to be built\n\tif(this.index === null) {\n\t\tthis.rebuild();\n\t}\n\tvar indexRecord = this.index[tag];\n\tif(indexRecord) {\n\t\tif(!indexRecord.isSorted) {\n\t\t\tif(this.indexer.wiki.sortByList) {\n\t\t\t\tindexRecord.titles = this.indexer.wiki.sortByList(indexRecord.titles,tag);\n\t\t\t}\t\t\t\n\t\t\tindexRecord.isSorted = true;\n\t\t}\n\t\treturn indexRecord.titles;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n\nexports.TagIndexer = TagIndexer;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "indexer"
        },
        "$:/core/modules/info/platform.js": {
            "title": "$:/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(updateInfoTiddlersCallback) {\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\tinfoTiddlerFields.push({title: \"$:/info/startup-timestamp\", text: $tw.utils.stringifyDate(new Date())});\n\tif($tw.browser) {\n\t\t// Document location\n\t\tvar setLocationProperty = function(name,value) {\n\t\t\t\tinfoTiddlerFields.push({title: \"$:/info/url/\" + name, text: value});\t\t\t\n\t\t\t},\n\t\t\tlocation = document.location;\n\t\tsetLocationProperty(\"full\", (location.toString()).split(\"#\")[0]);\n\t\tsetLocationProperty(\"host\", location.host);\n\t\tsetLocationProperty(\"hostname\", location.hostname);\n\t\tsetLocationProperty(\"protocol\", location.protocol);\n\t\tsetLocationProperty(\"port\", location.port);\n\t\tsetLocationProperty(\"pathname\", location.pathname);\n\t\tsetLocationProperty(\"search\", location.search);\n\t\tsetLocationProperty(\"origin\", location.origin);\n\t\t// Screen size\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/width\", text: window.screen.width.toString()});\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/height\", text: window.screen.height.toString()});\n \t\t// Dark mode through event listener on MediaQueryList\n \t\tvar mqList = window.matchMedia(\"(prefers-color-scheme: dark)\"),\n \t\t\tgetDarkModeTiddler = function() {return {title: \"$:/info/darkmode\", text: mqList.matches ? \"yes\" : \"no\"};};\n \t\tinfoTiddlerFields.push(getDarkModeTiddler());\n \t\tmqList.addListener(function(event) {\n \t\t\tupdateInfoTiddlersCallback([getDarkModeTiddler()]);\n \t\t});\n\t\t// Language\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/language\", text: navigator.language || \"\"});\n\t}\n\treturn infoTiddlerFields;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "info"
        },
        "$:/core/modules/keyboard.js": {
            "title": "$:/core/modules/keyboard.js",
            "text": "/*\\\ntitle: $:/core/modules/keyboard.js\ntype: application/javascript\nmodule-type: global\n\nKeyboard handling utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar namedKeys = {\n\t\"cancel\": 3,\n\t\"help\": 6,\n\t\"backspace\": 8,\n\t\"tab\": 9,\n\t\"clear\": 12,\n\t\"return\": 13,\n\t\"enter\": 13,\n\t\"pause\": 19,\n\t\"escape\": 27,\n\t\"space\": 32,\n\t\"page_up\": 33,\n\t\"page_down\": 34,\n\t\"end\": 35,\n\t\"home\": 36,\n\t\"left\": 37,\n\t\"up\": 38,\n\t\"right\": 39,\n\t\"down\": 40,\n\t\"printscreen\": 44,\n\t\"insert\": 45,\n\t\"delete\": 46,\n\t\"0\": 48,\n\t\"1\": 49,\n\t\"2\": 50,\n\t\"3\": 51,\n\t\"4\": 52,\n\t\"5\": 53,\n\t\"6\": 54,\n\t\"7\": 55,\n\t\"8\": 56,\n\t\"9\": 57,\n\t\"firefoxsemicolon\": 59,\n\t\"firefoxequals\": 61,\n\t\"a\": 65,\n\t\"b\": 66,\n\t\"c\": 67,\n\t\"d\": 68,\n\t\"e\": 69,\n\t\"f\": 70,\n\t\"g\": 71,\n\t\"h\": 72,\n\t\"i\": 73,\n\t\"j\": 74,\n\t\"k\": 75,\n\t\"l\": 76,\n\t\"m\": 77,\n\t\"n\": 78,\n\t\"o\": 79,\n\t\"p\": 80,\n\t\"q\": 81,\n\t\"r\": 82,\n\t\"s\": 83,\n\t\"t\": 84,\n\t\"u\": 85,\n\t\"v\": 86,\n\t\"w\": 87,\n\t\"x\": 88,\n\t\"y\": 89,\n\t\"z\": 90,\n\t\"numpad0\": 96,\n\t\"numpad1\": 97,\n\t\"numpad2\": 98,\n\t\"numpad3\": 99,\n\t\"numpad4\": 100,\n\t\"numpad5\": 101,\n\t\"numpad6\": 102,\n\t\"numpad7\": 103,\n\t\"numpad8\": 104,\n\t\"numpad9\": 105,\n\t\"multiply\": 106,\n\t\"add\": 107,\n\t\"separator\": 108,\n\t\"subtract\": 109,\n\t\"decimal\": 110,\n\t\"divide\": 111,\n\t\"f1\": 112,\n\t\"f2\": 113,\n\t\"f3\": 114,\n\t\"f4\": 115,\n\t\"f5\": 116,\n\t\"f6\": 117,\n\t\"f7\": 118,\n\t\"f8\": 119,\n\t\"f9\": 120,\n\t\"f10\": 121,\n\t\"f11\": 122,\n\t\"f12\": 123,\n\t\"f13\": 124,\n\t\"f14\": 125,\n\t\"f15\": 126,\n\t\"f16\": 127,\n\t\"f17\": 128,\n\t\"f18\": 129,\n\t\"f19\": 130,\n\t\"f20\": 131,\n\t\"f21\": 132,\n\t\"f22\": 133,\n\t\"f23\": 134,\n\t\"f24\": 135,\n\t\"firefoxminus\": 173,\n\t\"semicolon\": 186,\n\t\"equals\": 187,\n\t\"comma\": 188,\n\t\"dash\": 189,\n\t\"period\": 190,\n\t\"slash\": 191,\n\t\"backquote\": 192,\n\t\"openbracket\": 219,\n\t\"backslash\": 220,\n\t\"closebracket\": 221,\n\t\"quote\": 222\n};\n\nfunction KeyboardManager(options) {\n\tvar self = this;\n\toptions = options || \"\";\n\t// Save the named key hashmap\n\tthis.namedKeys = namedKeys;\n\t// Create a reverse mapping of code to keyname\n\tthis.keyNames = [];\n\t$tw.utils.each(namedKeys,function(keyCode,name) {\n\t\tself.keyNames[keyCode] = name.substr(0,1).toUpperCase() + name.substr(1);\n\t});\n\t// Save the platform-specific name of the \"meta\" key\n\tthis.metaKeyName = $tw.platform.isMac ? \"cmd-\" : \"win-\";\n\tthis.shortcutKeysList = [], // Stores the shortcut-key descriptors\n\tthis.shortcutActionList = [], // Stores the corresponding action strings\n\tthis.shortcutParsedList = []; // Stores the parsed key descriptors\n\tthis.lookupNames = [\"shortcuts\"];\n\tthis.lookupNames.push($tw.platform.isMac ? \"shortcuts-mac\" : \"shortcuts-not-mac\")\n\tthis.lookupNames.push($tw.platform.isWindows ? \"shortcuts-windows\" : \"shortcuts-not-windows\");\n\tthis.lookupNames.push($tw.platform.isLinux ? \"shortcuts-linux\" : \"shortcuts-not-linux\");\n\tthis.updateShortcutLists(this.getShortcutTiddlerList());\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tself.handleShortcutChanges(changes);\n\t});\n}\n\n/*\nReturn an array of keycodes for the modifier keys ctrl, shift, alt, meta\n*/\nKeyboardManager.prototype.getModifierKeys = function() {\n\treturn [\n\t\t16, // Shift\n\t\t17, // Ctrl\n\t\t18, // Alt\n\t\t20, // CAPS LOCK\n\t\t91, // Meta (left)\n\t\t93, // Meta (right)\n\t\t224 // Meta (Firefox)\n\t]\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\tmetaKey: boolean\n}\nKey descriptors have the following format:\n\tctrl+enter\n\tctrl+shift+alt+A\n*/\nKeyboardManager.prototype.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\tmetaKey: false\n\t\t};\n\tfor(var t=0; t<components.length; t++) {\n\t\tvar s = components[t].toLowerCase(),\n\t\t\tc = s.charCodeAt(0);\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\" || s === \"cmd\" || s === \"win\") {\n\t\t\tinfo.metaKey = true;\n\t\t}\n\t\t// Replace named keys with their code\n\t\tif(this.namedKeys[s]) {\n\t\t\tinfo.keyCode = this.namedKeys[s];\n\t\t}\n\t}\n\tif(info.keyCode) {\n\t\treturn info;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nParse a list of key descriptors into an array of keyInfo objects. The key descriptors can be passed as an array of strings or a space separated string\n*/\nKeyboardManager.prototype.parseKeyDescriptors = function(keyDescriptors,options) {\n\tvar self = this;\n\toptions = options || {};\n\toptions.stack = options.stack || [];\n\tvar wiki = options.wiki || $tw.wiki;\n\tif(typeof keyDescriptors === \"string\" && keyDescriptors === \"\") {\n\t\treturn [];\n\t}\n\tif(!$tw.utils.isArray(keyDescriptors)) {\n\t\tkeyDescriptors = keyDescriptors.split(\" \");\n\t}\n\tvar result = [];\n\t$tw.utils.each(keyDescriptors,function(keyDescriptor) {\n\t\t// Look for a named shortcut\n\t\tif(keyDescriptor.substr(0,2) === \"((\" && keyDescriptor.substr(-2,2) === \"))\") {\n\t\t\tif(options.stack.indexOf(keyDescriptor) === -1) {\n\t\t\t\toptions.stack.push(keyDescriptor);\n\t\t\t\tvar name = keyDescriptor.substring(2,keyDescriptor.length - 2),\n\t\t\t\t\tlookupName = function(configName) {\n\t\t\t\t\t\tvar keyDescriptors = wiki.getTiddlerText(\"$:/config/\" + configName + \"/\" + name);\n\t\t\t\t\t\tif(keyDescriptors) {\n\t\t\t\t\t\t\tresult.push.apply(result,self.parseKeyDescriptors(keyDescriptors,options));\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t$tw.utils.each(self.lookupNames,function(platformDescriptor) {\n\t\t\t\t\tlookupName(platformDescriptor);\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tresult.push(self.parseKeyDescriptor(keyDescriptor));\n\t\t}\n\t});\n\treturn result;\n};\n\nKeyboardManager.prototype.getPrintableShortcuts = function(keyInfoArray) {\n\tvar self = this,\n\t\tresult = [];\n\t$tw.utils.each(keyInfoArray,function(keyInfo) {\n\t\tif(keyInfo) {\n\t\t\tresult.push((keyInfo.ctrlKey ? \"ctrl-\" : \"\") + \n\t\t\t\t   (keyInfo.shiftKey ? \"shift-\" : \"\") + \n\t\t\t\t   (keyInfo.altKey ? \"alt-\" : \"\") + \n\t\t\t\t   (keyInfo.metaKey ? self.metaKeyName : \"\") + \n\t\t\t\t   (self.keyNames[keyInfo.keyCode]));\n\t\t}\n\t});\n\treturn result;\n}\n\nKeyboardManager.prototype.checkKeyDescriptor = function(event,keyInfo) {\n\treturn keyInfo &&\n\t\t\tevent.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 === keyInfo.metaKey;\n};\n\nKeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) {\n\tfor(var t=0; t<keyInfoArray.length; t++) {\n\t\tif(this.checkKeyDescriptor(event,keyInfoArray[t])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.getEventModifierKeyDescriptor = function(event) {\n\treturn event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey ? \"ctrl\" : \n\t\tevent.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey ? \"shift\" : \n\t\tevent.ctrlKey && event.shiftKey && !event.altKey && !event.metaKey ? \"ctrl-shift\" : \n\t\tevent.altKey && !event.shiftKey && !event.ctrlKey && !event.metaKey ? \"alt\" : \n\t\tevent.altKey && event.shiftKey && !event.ctrlKey && !event.metaKey ? \"alt-shift\" : \n\t\tevent.altKey && event.ctrlKey && !event.shiftKey && !event.metaKey ? \"ctrl-alt\" : \n\t\tevent.altKey && event.shiftKey && event.ctrlKey && !event.metaKey ? \"ctrl-alt-shift\" : \n\t\tevent.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey ? \"meta\" : \n\t\tevent.metaKey && event.ctrlKey && !event.shiftKey && !event.altKey ? \"meta-ctrl\" :\n\t\tevent.metaKey && event.ctrlKey && event.shiftKey && !event.altKey ? \"meta-ctrl-shift\" :\n\t\tevent.metaKey && event.ctrlKey & event.shiftKey && event.altKey ? \"meta-ctrl-alt-shift\" : \"normal\";\n};\n\nKeyboardManager.prototype.getShortcutTiddlerList = function() {\n\treturn $tw.wiki.getTiddlersWithTag(\"$:/tags/KeyboardShortcut\");\n};\n\nKeyboardManager.prototype.updateShortcutLists = function(tiddlerList) {\n\tthis.shortcutTiddlers = tiddlerList;\n\tfor(var i=0; i<tiddlerList.length; i++) {\n\t\tvar title = tiddlerList[i],\n\t\t\ttiddlerFields = $tw.wiki.getTiddler(title).fields;\n\t\tthis.shortcutKeysList[i] = tiddlerFields.key !== undefined ? tiddlerFields.key : undefined;\n\t\tthis.shortcutActionList[i] = tiddlerFields.text;\n\t\tthis.shortcutParsedList[i] = this.shortcutKeysList[i] !== undefined ? this.parseKeyDescriptors(this.shortcutKeysList[i]) : undefined;\n\t}\n};\n\nKeyboardManager.prototype.handleKeydownEvent = function(event) {\n\tvar key, action;\n\tfor(var i=0; i<this.shortcutTiddlers.length; i++) {\n\t\tif(this.shortcutParsedList[i] !== undefined && this.checkKeyDescriptors(event,this.shortcutParsedList[i])) {\n\t\t\tkey = this.shortcutParsedList[i];\n\t\t\taction = this.shortcutActionList[i];\n\t\t}\n\t}\n\tif(key !== undefined) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\t$tw.rootWidget.invokeActionString(action,$tw.rootWidget);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.detectNewShortcuts = function(changedTiddlers) {\n\tvar shortcutConfigTiddlers = [],\n\t\thandled = false;\n\t$tw.utils.each(this.lookupNames,function(platformDescriptor) {\n\t\tvar descriptorString = \"$:/config/\" + platformDescriptor + \"/\";\n\t\tObject.keys(changedTiddlers).forEach(function(configTiddler) {\n\t\t\tvar configString = configTiddler.substr(0, configTiddler.lastIndexOf(\"/\") + 1);\n\t\t\tif(configString === descriptorString) {\n\t\t\t\tshortcutConfigTiddlers.push(configTiddler);\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t});\n\t});\n\tif(handled) {\n\t\treturn $tw.utils.hopArray(changedTiddlers,shortcutConfigTiddlers);\n\t} else {\n\t\treturn false;\n\t}\n};\n\nKeyboardManager.prototype.handleShortcutChanges = function(changedTiddlers) {\n\tvar newList = this.getShortcutTiddlerList();\n\tvar hasChanged = $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers) ? true :\n\t\t($tw.utils.hopArray(changedTiddlers,newList) ? true :\n\t\t(this.detectNewShortcuts(changedTiddlers))\n\t);\n\t// Re-cache shortcuts if something changed\n\tif(hasChanged) {\n\t\tthis.updateShortcutLists(newList);\n\t}\n};\n\nexports.KeyboardManager = KeyboardManager;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/language.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/macros/changecount.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/contrastcolour.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/csvtiddlers.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/displayshortcuts.js": {
            "title": "$:/core/modules/macros/displayshortcuts.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/displayshortcuts.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to display a list of keyboard shortcuts in human readable form. Notably, it resolves named shortcuts like `((bold))` to the underlying keystrokes.\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 = \"displayshortcuts\";\n\nexports.params = [\n\t{name: \"shortcuts\"},\n\t{name: \"prefix\"},\n\t{name: \"separator\"},\n\t{name: \"suffix\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(shortcuts,prefix,separator,suffix) {\n\tvar shortcutArray = $tw.keyboardManager.getPrintableShortcuts($tw.keyboardManager.parseKeyDescriptors(shortcuts,{\n\t\twiki: this.wiki\n\t}));\n\tif(shortcutArray.length > 0) {\n\t\tshortcutArray.sort(function(a,b) {\n\t\t    return a.toLowerCase().localeCompare(b.toLowerCase());\n\t\t})\n\t\treturn prefix + shortcutArray.join(separator) + suffix;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/jsontiddler.js": {
            "title": "$:/core/modules/macros/jsontiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/jsontiddler.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output a single tiddler 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 = \"jsontiddler\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\ttitle = title || this.getVariable(\"currentTiddler\");\n\tvar tiddler = !!title && this.wiki.getTiddler(title),\n\t\tfields = new Object();\n\tif(tiddler) {\n\t\tfor(var field in tiddler.fields) {\n\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t}\n\t}\n\treturn JSON.stringify(fields,null,$tw.config.preferences.jsonSpaces);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/jsontiddlers.js": {
            "title": "$:/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\t{name: \"spaces\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,spaces) {\n\treturn this.wiki.getTiddlersAsJson(filter,$tw.utils.parseInt(spaces));\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/makedatauri.js": {
            "title": "$:/core/modules/macros/makedatauri.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/makedatauri.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to convert a string of text 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\t{name: \"_canonical_uri\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(text,type,_canonical_uri) {\n\treturn $tw.utils.makeDataUri(text,type,_canonical_uri);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/now.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/qualify.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/resolvepath.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/unusedtitle.js": {
            "title": "$:/core/modules/macros/unusedtitle.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/unusedtitle.js\ntype: application/javascript\nmodule-type: macro\nMacro to return a new title that is unused in the wiki. It can be given a name as a base.\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 = \"unusedtitle\";\n\nexports.params = [\n\t{name: \"baseName\"},\n\t{name: \"options\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(baseName, options) {\n\tif(!baseName) {\n\t\tbaseName = $tw.language.getString(\"DefaultNewTiddlerTitle\");\n\t}\n\treturn this.wiki.generateNewTitle(baseName, options);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/version.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/parsers/audioparser.js": {
            "title": "$:/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\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\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",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/binaryparser.js": {
            "title": "$:/core/modules/parsers/binaryparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/binaryparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe binary parser parses a binary tiddler into a warning message and download link\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\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar BinaryParser = function(type,text,options) {\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on binary tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!title\"}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to external or internal data URI\n\tif(options._canonical_uri) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: options._canonical_uri\n\t\t};\n\t} else if(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/octet-stream\"] = BinaryParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/csvparser.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/htmlparser.js": {
            "title": "$:/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: \"\"}\n\t\t}\n\t}];\n};\n\nexports[\"text/html\"] = HtmlParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/imageparser.js": {
            "title": "$:/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\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\tif(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[\"image/webp\"] = ImageParser;\nexports[\"image/heic\"] = ImageParser;\nexports[\"image/heif\"] = ImageParser;\nexports[\"image/x-icon\"] = ImageParser;\nexports[\"image/vnd.microsoft.icon\"] = ImageParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/utils/parseutils.js": {
            "title": "$:/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\treFilteredValue = /\\{\\{\\{(.+?)\\}\\}\\}/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 a filtered value\n\t\t\tvar filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue);\n\t\t\tif(filteredValue) {\n\t\t\t\tpos = filteredValue.end;\n\t\t\t\tnode.type = \"filtered\";\n\t\t\t\tnode.filter = filteredValue.match[1];\n\t\t\t} else {\n\t\t\t\t// Look for an indirect value\n\t\t\t\tvar indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);\n\t\t\t\tif(indirectValue) {\n\t\t\t\t\tpos = indirectValue.end;\n\t\t\t\t\tnode.type = \"indirect\";\n\t\t\t\t\tnode.textReference = indirectValue.match[1];\n\t\t\t\t} else {\n\t\t\t\t\t// Look for a unquoted value\n\t\t\t\t\tvar unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);\n\t\t\t\t\tif(unquotedValue) {\n\t\t\t\t\t\tpos = unquotedValue.end;\n\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\tnode.value = unquotedValue.match[1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Look for a macro invocation value\n\t\t\t\t\t\tvar macroInvocation = $tw.utils.parseMacroInvocation(source,pos);\n\t\t\t\t\t\tif(macroInvocation) {\n\t\t\t\t\t\t\tpos = macroInvocation.end;\n\t\t\t\t\t\t\tnode.type = \"macro\";\n\t\t\t\t\t\t\tnode.value = macroInvocation;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\t\tnode.value = \"true\";\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} 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",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/parsers/pdfparser.js": {
            "title": "$:/core/modules/parsers/pdfparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/pdfparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe PDF parser embeds a PDF viewer\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: \"embed\",\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} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:application/pdf;base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/pdf\"] = ImageParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/textparser.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/videoparser.js": {
            "title": "$:/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 VideoParser = 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\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\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/ogg\"] = VideoParser;\nexports[\"video/webm\"] = VideoParser;\nexports[\"video/mp4\"] = VideoParser;\nexports[\"video/quicktime\"] = VideoParser;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/wikiparser/rules/codeblock.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/codeinline.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/commentblock.js": {
            "title": "$:/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 = this.match.index + 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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/commentinline.js": {
            "title": "$:/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 = this.match.index + 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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/dash.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js": {
            "title": "$:/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})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js": {
            "title": "$:/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})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js": {
            "title": "$:/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})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js": {
            "title": "$:/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})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/entity.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/extlink.js": {
            "title": "$:/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: https://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\trel: {type: \"string\", value: \"noopener noreferrer\"}\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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/heading.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/horizrule.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/html.js": {
            "title": "$:/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\tvar reEndString = \"</\" + $tw.utils.escapeRegExp(tag.tag) + \">\";\n\t\tif(hasLineBreak) {\n\t\t\ttag.children = this.parser.parseBlocks(reEndString);\n\t\t} else {\n\t\t\tvar reEnd = new RegExp(\"(\" + reEndString + \")\",\"mg\");\n\t\t\ttag.children = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\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.slice(1).indexOf(\"$\") !== -1) {\n\t\treturn null;\n\t}\n\tif(node.tag.charAt(0) === \"$\") {\n\t\tnode.type = node.tag.substr(1);\n\t}\n\tpos = token.end;\n\t// Check that the tag is terminated by a space, / or >\n\tif(!$tw.utils.parseWhiteSpace(source,pos) && !(source.charAt(pos) === \"/\") && !(source.charAt(pos) === \">\") ) {\n\t\treturn null;\n\t}\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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/image.js": {
            "title": "$:/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[https://tiddlywiki.com/fractalveg.jpg]]\n[img width=23 height=24 [https://tiddlywiki.com/fractalveg.jpg]]\n[img width={{!!width}} height={{!!height}} [https://tiddlywiki.com/fractalveg.jpg]]\n[img[Description of image|https://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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/import.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/import.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/import.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for importing variable definitions\n\n```\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"import\";\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 = /^\\\\import[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the filter terminated by a line break\n\tvar reMatch = /(.*)(\\r?\\n)|$/mg;\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\tthis.parser.pos = reMatch.lastIndex;\n\t// Parse tree nodes to return\n\treturn [{\n\t\ttype: \"importvariables\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: match[1]}\n\t\t},\n\t\tchildren: []\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/list.js": {
            "title": "$:/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: \"div\"}\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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js": {
            "title": "$:/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};\n\nexports.findNextMatch = function(startPos) {\n\tvar nextStart = startPos;\n\t// Try parsing at all possible macrocall openers until we match\n\twhile((nextStart = this.parser.source.indexOf(\"<<\",nextStart)) >= 0) {\n\t\tvar nextCall = $tw.utils.parseMacroInvocation(this.parser.source,nextStart);\n\t\tif(nextCall) {\n\t\t\tvar c = this.parser.source.charAt(nextCall.end);\n\t\t\t// Ensure EOL after parsed macro\n\t\t\t// If we didn't need to support IE, we'd just use /(?:\\r?\\n|$)/ym\n\t\t\tif ((c === \"\") || (c === \"\\n\") || ((c === \"\\r\") && this.parser.source.charAt(nextCall.end+1) === \"\\n\")) {\n\t\t\t\tthis.nextCall = nextCall;\n\t\t\t\treturn nextStart;\n\t\t\t}\n\t\t}\n\t\tnextStart += 2;\n\t}\n\treturn undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar call = this.nextCall;\n\tcall.isBlock = true;\n\tthis.nextCall = null;\n\tthis.parser.pos = call.end;\n\treturn [call];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js": {
            "title": "$:/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};\n\nexports.findNextMatch = function(startPos) {\n\tvar nextStart = startPos;\n\t// Try parsing at all possible macrocall openers until we match\n\twhile((nextStart = this.parser.source.indexOf(\"<<\",nextStart)) >= 0) {\n\t\tthis.nextCall = $tw.utils.parseMacroInvocation(this.parser.source,nextStart);\n\t\tif(this.nextCall) {\n\t\t\treturn nextStart;\n\t\t}\n\t\tnextStart += 2;\n\t}\n\treturn undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar call = this.nextCall;\n\tthis.nextCall = null;\n\tthis.parser.pos = call.end;\n\treturn [call];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/macrodef.js": {
            "title": "$:/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\tisMacroDefinition: true\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js": {
            "title": "$:/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[https://tiddlywiki.com/fractalveg.jpg]]\n[ext[Tooltip|https://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\tnode.attributes.rel = {type: \"string\", value: \"noopener noreferrer\"};\n\t// Update the end position\n\tnode.end = closePos + 2;\n\treturn node;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/prettylink.js": {
            "title": "$:/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\trel: {type: \"string\", value: \"noopener noreferrer\"}\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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/quoteblock.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/rules.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/styleblock.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/styleinline.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/syslink.js": {
            "title": "$:/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 = new RegExp(\n\t\t\"~?\\\\$:\\\\/[\" +\n\t\t$tw.config.textPrimitives.anyLetter.substr(1,$tw.config.textPrimitives.anyLetter.length - 2) +\n\t\t\"\\/._-]+\",\n\t\t\"mg\"\n\t);\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})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/table.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js": {
            "title": "$:/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// 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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/typedblock.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/whitespace.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/whitespace.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/whitespace.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for whitespace specifications\n\n```\n\\whitespace trim\n\\whitespace notrim\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"whitespace\";\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 = /^\\\\whitespace[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\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\t$tw.utils.each(tokens,function(token) {\n\t\tswitch(token) {\n\t\t\tcase \"trim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = true;\n\t\t\t\tbreak;\n\t\t\tcase \"notrim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = false;\n\t\t\t\tbreak;\n\t\t}\n\t});\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/wikilink.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/wikiparser.js": {
            "title": "$:/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\t{type: \"macro\", macro: <TBD>} - indirect through a macro invocation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\ntype: content type of text\ntext: text to be parsed\noptions: see below:\n\tparseAsInline: true to parse text as inline instead of block\n\twiki: reference to wiki to use\n\t_canonical_uri: optional URI of content if text is missing or empty\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// Save the parse text\n\tthis.type = type || \"text/vnd.tiddlywiki\";\n\tthis.source = text || \"\";\n\tthis.sourceLength = this.source.length;\n\t// Flag for ignoring whitespace\n\tthis.configTrimWhiteSpace = false;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Start with empty output\n\tthis.tree = [];\n\t// Assemble the rule classes we're going to use\n\tvar pragmaRuleClasses, blockRuleClasses, inlineRuleClasses;\n\tif(options.rules) {\n\t\tpragmaRuleClasses = options.rules.pragma;\n\t\tblockRuleClasses = options.rules.block;\n\t\tinlineRuleClasses = options.rules.inline;\n\t} else {\n\t\t// Setup the rule classes if we don't have them already\n\t\tif(!this.pragmaRuleClasses) {\n\t\t\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t\t\tthis.setupRules(WikiParser.prototype.pragmaRuleClasses,\"$:/config/WikiParserRules/Pragmas/\");\n\t\t}\n\t\tpragmaRuleClasses = this.pragmaRuleClasses;\n\t\tif(!this.blockRuleClasses) {\n\t\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t\t\tthis.setupRules(WikiParser.prototype.blockRuleClasses,\"$:/config/WikiParserRules/Block/\");\n\t\t}\n\t\tblockRuleClasses = this.blockRuleClasses;\n\t\tif(!this.inlineRuleClasses) {\n\t\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t\t\tthis.setupRules(WikiParser.prototype.inlineRuleClasses,\"$:/config/WikiParserRules/Inline/\");\n\t\t}\n\t\tinlineRuleClasses = this.inlineRuleClasses;\n\t}\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\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\tthis.pushTextWidget(tree,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\tthis.pushTextWidget(tree,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\tthis.pushTextWidget(tree,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\tthis.pushTextWidget(tree,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\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\n/*\nPush a text widget onto an array, respecting the configTrimWhiteSpace setting\n*/\nWikiParser.prototype.pushTextWidget = function(array,text) {\n\tif(this.configTrimWhiteSpace) {\n\t\ttext = $tw.utils.trim(text);\n\t}\n\tif(text) {\n\t\tarray.push({type: \"text\", text: text});\t\t\n\t}\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 target;\n\tif(type === \"only\") {\n\t\ttarget = true;\n\t} else if(type === \"except\") {\n\t\ttarget = false;\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((names.indexOf(ruleArray[t].rule.name) === -1) === target) {\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",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/pluginswitcher.js": {
            "title": "$:/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\nonSwitch: callback when plugin is switched (single parameter is array of plugin titles)\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\tthis.onSwitch = options.onSwitch;\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// Read the plugin info for the incoming plugins\n\tvar changes = $tw.wiki.readPluginInfo(plugins);\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\t// Call the switch handler\n\tif(this.onSwitch) {\n\t\tthis.onSwitch(plugins);\n\t}\n};\n\nexports.PluginSwitcher = PluginSwitcher;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/saver-handler.js": {
            "title": "$:/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.preloadDirty = options.preloadDirty || [];\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\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(self.preloadDirty,function(title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t});\n\t\tthis.numChanges = filteredChanges.length;\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(iterator) {\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\titerator(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// Ignore autosave if disabled\n\tif(method === \"autosave\" && ($tw.config.disableAutoSave || this.wiki.getTiddlerText(this.titleAutoSave,\"yes\") !== \"yes\")) {\n\t\treturn false;\n\t}\n\tvar\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($tw.language.getString(\"Error/WhileSaving\") + \":\\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// 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\tvar self = this;\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t\t$tw.utils.each($tw.windows,function(win) {\n\t\t\t$tw.utils.toggleClass(win.document.body,\"tc-dirty\",self.isDirty());\n\t\t});\n\t}\n};\n\nexports.SaverHandler = SaverHandler;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/savers/andtidwiki.js": {
            "title": "$:/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,options) {\n\tvar filename = options && options.variables ? options.variables.filename : null;\n\tif (method === \"download\") {\n\t\t// Support download\n\t\tif (window.twi.saveDownload) {\n\t\t\ttry {\n\t\t\t\twindow.twi.saveDownload(text,filename);\n\t\t\t} catch(err) {\n\t\t\t\tif (err.message === \"Method not found\") {\n\t\t\t\t\twindow.twi.saveDownload(text);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tvar link = document.createElement(\"a\");\n\t\t\tlink.setAttribute(\"href\",\"data:text/plain,\" + encodeURIComponent(text));\n\t\t\tif (filename) {\n\t\t\t    link.setAttribute(\"download\",filename);\n\t\t\t}\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t}\n\t} else if (window.twi.saveWiki) {\n\t\t// Direct save in Tiddloid\n\t\twindow.twi.saveWiki(text);\n\t} else {\n\t\t// Get the pathname of this document\n\t\tvar pathname = decodeURIComponent(document.location.toString().split(\"#\")[0]);\n\t\t// Strip the file://\n\t\tif(pathname.indexOf(\"file://\") === 0) {\n\t\t\tpathname = pathname.substr(7);\n\t\t}\n\t\t// Strip any query or location part\n\t\tvar p = pathname.indexOf(\"?\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\tp = pathname.indexOf(\"#\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\t// Save the file\n\t\twindow.twi.saveFile(pathname,text);\n\t}\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\", \"download\"]\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",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/beaker.js": {
            "title": "$:/core/modules/savers/beaker.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/beaker.js\ntype: application/javascript\nmodule-type: saver\n\nSaves files using the Beaker browser's (https://beakerbrowser.com) Dat protocol (https://datproject.org/)\nCompatible with beaker >= V0.7.2\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet up the saver\n*/\nvar BeakerSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nBeakerSaver.prototype.save = function(text,method,callback) {\n\tvar dat = new DatArchive(\"\" + window.location),\n\t\tpathname = (\"\" + window.location.pathname).split(\"#\")[0];\n\tdat.stat(pathname).then(function(value) {\n\t\tif(value.isDirectory()) {\n\t\t\tpathname = pathname + \"/index.html\";\n\t\t}\n\t\tdat.writeFile(pathname,text,\"utf8\").then(function(value) {\n\t\t\tcallback(null);\n\t\t},function(reason) {\n\t\t\tcallback(\"Beaker Saver Write Error: \" + reason);\n\t\t});\n\t},function(reason) {\n\t\tcallback(\"Beaker Saver Stat Error: \" + reason);\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nBeakerSaver.prototype.info = {\n\tname: \"beaker\",\n\tpriority: 3000,\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.DatArchive && location.protocol===\"dat:\";\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new BeakerSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/custom.js": {
            "title": "$:/core/modules/savers/custom.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/custom.js\ntype: application/javascript\nmodule-type: saver\n\nLooks for `window.$tw.customSaver` first on the current window, then\non the parent window (of an iframe). If present, the saver must define\n\tsave: function(text,method,callback) { ... }\nand the saver may define\n\tpriority: number\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar findSaver = function(window) {\n\ttry {\n\t\treturn window && window.$tw && window.$tw.customSaver;\n\t} catch (err) {\n\t\t// Catching the exception is the most reliable way to detect cross-origin iframe errors.\n\t\t// For example, instead of saying that `window.parent.$tw` is undefined, Firefox will throw\n\t\t//   Uncaught DOMException: Permission denied to access property \"$tw\" on cross-origin object\n\t\tconsole.log({ msg: \"custom saver is disabled\", reason: err });\n\t\treturn null;\n\t}\n}\nvar saver = findSaver(window) || findSaver(window.parent) || {};\n\nvar CustomSaver = function(wiki) {\n};\n\nCustomSaver.prototype.save = function(text,method,callback) {\n\treturn saver.save(text, method, callback);\n};\n\n/*\nInformation about this saver\n*/\nCustomSaver.prototype.info = {\n\tname: \"custom\",\n\tpriority: saver.priority || 4000,\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 !!(saver.save);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new CustomSaver(wiki);\n};\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/download.js": {
            "title": "$:/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\t// We decode the pathname because document.location is URL encoded by the browser\n\t\t\tfilename = decodeURIComponent(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\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};\n\nObject.defineProperty(DownloadSaver.prototype.info, \"capabilities\", {\n\tget: function() {\n\t\tvar capabilities = [\"save\", \"download\"];\n\t\tif(($tw.wiki.getTextReference(\"$:/config/DownloadSaver/AutoSave\") || \"\").toLowerCase() === \"yes\") {\n\t\t\tcapabilities.push(\"autosave\");\n\t\t}\n\t\treturn capabilities;\n\t}\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",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/fsosaver.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/gitea.js": {
            "title": "$:/core/modules/savers/gitea.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/gitea.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the gitea\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 GiteaSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGiteaSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/Gitea/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"Gitea\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/Gitea/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/Gitea/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/Gitea/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/Gitea/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/Gitea/ServerURL\") || \"https://gitea\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"token \" + password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar use_put = true;\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(sha === \"\"){\n\t\t\t\t\tuse_put = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: endpoint + \"/repos/\" + repo + \"/branches/\" + branch,\n\t\t\t\ttype: \"GET\",\n\t\t\t\theaders: headers,\n\t\t\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\t\t\tif(xhr.status === 404) {\n\t\t\t\t\t\tcallback(\"Please ensure the branch in the Gitea repo exists\");\n\t\t\t\t\t}else{\n\t\t\t\t\t\tdata[\"branch\"] = branch;\n\t\t\t\t\t\tself.upload(uri + filename, use_put?\"PUT\":\"POST\", headers, data, callback);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\nGiteaSaver.prototype.upload = function(uri,method,headers,data,callback) {\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: method,\n\t\theaders: headers,\n\t\tdata: JSON.stringify(data),\n\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\tcallback(null);\n\t\t}\n\t});\n};\n\n/*\nInformation about this saver\n*/\nGiteaSaver.prototype.info = {\n\tname: \"Gitea\",\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 GiteaSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/github.js": {
            "title": "$:/core/modules/savers/github.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/github.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitHub v3 REST API\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 GitHubSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitHubSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitHub/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"github\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitHub/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitHub/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitHub/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitHub/Branch\") || \"main\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitHub/ServerURL\") || \"https://api.github.com\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/vnd.github.v3+json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"Basic \" + window.btoa(username + \":\" + password),\n\t\t\t\"If-None-Match\": \"\"\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a PUT request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + filename,\n\t\t\t\ttype: \"PUT\",\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitHubSaver.prototype.info = {\n\tname: \"github\",\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 GitHubSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/gitlab.js": {
            "title": "$:/core/modules/savers/gitlab.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/gitlab.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitLab REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: true */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitLabSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitLabSaver.prototype.save = function(text,method,callback) {\n\t/* See https://docs.gitlab.com/ee/api/repository_files.html */\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitLab/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"gitlab\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitLab/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitLab/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitLab/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitLab/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitLab/ServerURL\") || \"https://gitlab.com/api/v4\",\n\t\theaders = {\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Private-Token\": password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/projects/\" + encodeURIComponent(repo) + \"/repository/\";\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri + \"tree/?path=\" + encodeURIComponent(path.replace(/^\\/+|\\/$/g, '')) + \"&branch=\" + encodeURIComponent(branch.replace(/^\\/+|\\/$/g, '')),\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar requestType = \"POST\";\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\trequestType = \"PUT\";\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tcommit_message: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: text,\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + \"files/\" + encodeURIComponent(path.replace(/^\\/+/, '') + filename),\n\t\t\t\ttype: requestType,\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitLabSaver.prototype.info = {\n\tname: \"gitlab\",\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 GitLabSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/hyperdrive.js": {
            "title": "$:/core/modules/savers/hyperdrive.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/hyperdrive.js\ntype: application/javascript\nmodule-type: saver\n\nSaves files using the Hyperdrive Protocol (https://hypercore-protocol.org/#hyperdrive) Beaker browser beta-1.0 and later (https://beakerbrowser.com)\nCompatible with beaker >= V1.0.0\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet up the saver\n*/\nvar HyperdriveSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nHyperdriveSaver.prototype.save = function(text,method,callback) {\n\tvar dat = beaker.hyperdrive.drive(\"\" + window.location),\n\t\tpathname = (\"\" + window.location.pathname).split(\"#\")[0];\n\tdat.stat(pathname).then(function(value) {\n\t\tif(value.isDirectory()) {\n\t\t\tpathname = pathname + \"/index.html\";\n\t\t}\n\t\tdat.writeFile(pathname,text,\"utf8\").then(function(value) {\n\t\t\tcallback(null);\n\t\t},function(reason) {\n\t\t\tcallback(\"Hyperdrive Saver Write Error: \" + reason);\n\t\t});\n\t},function(reason) {\n\t\tcallback(\"Hyperdrive Saver Stat Error: \" + reason);\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nHyperdriveSaver.prototype.info = {\n\tname: \"beaker-1.x\",\n\tpriority: 3000,\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.beaker && !!beaker.hyperdrive && location.protocol===\"hyper:\";\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new HyperdriveSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/manualdownload.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/msdownload.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/put.js": {
            "title": "$:/core/modules/savers/put.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/put.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by performing a PUT request to the server\n\nWorks with any server which accepts a PUT request\nto the current URL, such as a WebDAV server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRetrieve ETag if available\n*/\nvar retrieveETag = function(self) {\n\tvar headers = {\n\t\tAccept: \"*/*;charset=UTF-8\"\n\t};\n\t$tw.utils.httpRequest({\n\t\turl: self.uri(),\n\t\ttype: \"HEAD\",\n\t\theaders: headers,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar etag = xhr.getResponseHeader(\"ETag\");\n\t\t\tif(!etag) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tself.etag = etag.replace(/^W\\//,\"\");\n\t\t}\n\t});\n};\n\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar PutSaver = function(wiki) {\n\tthis.wiki = wiki;\n\tvar self = this;\n\tvar uri = this.uri();\n\t// Async server probe. Until probe finishes, save will fail fast\n\t// See also https://github.com/Jermolene/TiddlyWiki5/issues/2276\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"OPTIONS\",\n\t\tcallback: function(err,data,xhr) {\n\t\t\t// Check DAV header http://www.webdav.org/specs/rfc2518.html#rfc.section.9.1\n\t\t\tif(!err) {\n\t\t\t\tself.serverAcceptsPuts = xhr.status === 200 && !!xhr.getResponseHeader(\"dav\");\n\t\t\t}\n\t\t}\n\t});\n\tretrieveETag(this);\n};\n\nPutSaver.prototype.uri = function() {\n\treturn document.location.toString().split(\"#\")[0];\n};\n\n// TODO: in case of edit conflict\n// Prompt: Do you want to save over this? Y/N\n// Merging would be ideal, and may be possible using future generic merge flow\nPutSaver.prototype.save = function(text,method,callback) {\n\tif(!this.serverAcceptsPuts) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tvar headers = {\n\t\t\"Content-Type\": \"text/html;charset=UTF-8\"\n\t};\n\tif(this.etag) {\n\t\theaders[\"If-Match\"] = this.etag;\n\t}\n\t$tw.utils.httpRequest({\n\t\turl: this.uri(),\n\t\ttype: \"PUT\",\n\t\theaders: headers,\n\t\tdata: text,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\t// response is textual: \"XMLHttpRequest error code: 412\"\n\t\t\t\tvar status = Number(err.substring(err.indexOf(':') + 2, err.length))\n\t\t\t\tif(status === 412) { // edit conflict\n\t\t\t\t\tvar message = $tw.language.getString(\"Error/EditConflict\");\n\t\t\t\t\tcallback(message);\n\t\t\t\t} else {\n\t\t\t\t\tcallback(err); // fail\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.etag = xhr.getResponseHeader(\"ETag\");\n\t\t\t\tif(self.etag == null) {\n\t\t\t\t\tretrieveETag(self);\n\t\t\t\t}\n\t\t\t\tcallback(null); // success\n\t\t\t}\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nPutSaver.prototype.info = {\n\tname: \"put\",\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 /^https?:/.test(location.protocol);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new PutSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/tiddlyfox.js": {
            "title": "$:/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 true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyFoxSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/tiddlyie.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/twedit.js": {
            "title": "$:/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($tw.language.getString(\"Error/SavingToTWEdit\") + \": \" + 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",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/upload.js": {
            "title": "$:/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\tuploadWithUrlOnly = this.wiki.getTextReference(\"$:/UploadWithUrlOnly\") || \"no\",\n\t\turl = this.wiki.getTextReference(\"$:/UploadURL\");\n\t// Bail out if we don't have the bits we need\n\tif (uploadWithUrlOnly === \"yes\") {\n\t\t// The url is good enough. No need for a username and password.\n\t\t// Assume the server uses some other kind of auth mechanism.\n\t\tif(!url || url.toString().trim() === \"\") {\n\t\t\treturn false;\n\t\t}\n\t}\n\telse {\n\t\t// Require username and password to be present.\n\t\t// Assume the server uses the standard UploadPlugin username/password.\n\t\tif(!username || username.toString().trim() === \"\" || !password || password.toString().trim() === \"\") {\n\t\t\treturn false;\n\t\t}\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($tw.language.getString(\"Error/Caption\") + \":\" + 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",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/server/authenticators/basic.js": {
            "title": "$:/core/modules/server/authenticators/basic.js",
            "text": "/*\\\ntitle: $:/core/modules/server/authenticators/basic.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for WWW basic authentication\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}\n\nfunction BasicAuthenticator(server) {\n\tthis.server = server;\n\tthis.credentialsData = [];\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nBasicAuthenticator.prototype.init = function() {\n\t// Read the credentials data\n\tthis.credentialsFilepath = this.server.get(\"credentials\");\n\tif(this.credentialsFilepath) {\n\t\tvar resolveCredentialsFilepath = path.resolve(this.server.boot.wikiPath,this.credentialsFilepath);\n\t\tif(fs.existsSync(resolveCredentialsFilepath) && !fs.statSync(resolveCredentialsFilepath).isDirectory()) {\n\t\t\tvar credentialsText = fs.readFileSync(resolveCredentialsFilepath,\"utf8\"),\n\t\t\t\tcredentialsData = $tw.utils.parseCsvStringWithHeader(credentialsText);\n\t\t\tif(typeof credentialsData === \"string\") {\n\t\t\t\treturn \"Error: \" + credentialsData + \" reading credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t\t} else {\n\t\t\t\tthis.credentialsData = credentialsData;\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"Error: Unable to load user credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t}\n\t}\n\t// Add the hardcoded username and password if specified\n\tif(this.server.get(\"username\") && this.server.get(\"password\")) {\n\t\tthis.credentialsData = this.credentialsData || [];\n\t\tthis.credentialsData.push({\n\t\t\tusername: this.server.get(\"username\"),\n\t\t\tpassword: this.server.get(\"password\")\n\t\t});\n\t}\n\treturn this.credentialsData.length > 0;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nBasicAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Extract the incoming username and password from the request\n\tvar header = request.headers.authorization || \"\";\n\tif(!header && state.allowAnon) {\n\t\t// If there's no header and anonymous access is allowed then we don't set authenticatedUsername\n\t\treturn true;\n\t}\n\tvar token = header.split(/\\s+/).pop() || \"\",\n\t\tauth = $tw.utils.base64Decode(token),\n\t\tparts = auth.split(/:/),\n\t\tincomingUsername = parts[0],\n\t\tincomingPassword = parts[1];\n\t// Check that at least one of the credentials matches\n\tvar matchingCredentials = this.credentialsData.find(function(credential) {\n\t\treturn credential.username === incomingUsername && credential.password === incomingPassword;\n\t});\n\tif(matchingCredentials) {\n\t\t// If so, add the authenticated username to the request state\n\t\tstate.authenticatedUsername = incomingUsername;\n\t\treturn true;\n\t} else {\n\t\t// If not, return an authentication challenge\n\t\tresponse.writeHead(401,\"Authentication required\",{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\n\t\treturn false;\n\t}\n};\n\nexports.AuthenticatorClass = BasicAuthenticator;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "authenticator"
        },
        "$:/core/modules/server/authenticators/header.js": {
            "title": "$:/core/modules/server/authenticators/header.js",
            "text": "/*\\\ntitle: $:/core/modules/server/authenticators/header.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for trusted header authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction HeaderAuthenticator(server) {\n\tthis.server = server;\n\tthis.header = server.get(\"authenticated-user-header\") ? server.get(\"authenticated-user-header\").toLowerCase() : undefined;\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nHeaderAuthenticator.prototype.init = function() {\n\treturn !!this.header;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nHeaderAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Otherwise, authenticate as the username in the specified header\n\tvar username = request.headers[this.header];\n\tif(!username && !state.allowAnon) {\n\t\tresponse.writeHead(401,\"Authorization header required to login to '\" + state.server.servername + \"'\");\n\t\tresponse.end();\n\t\treturn false;\n\t} else {\n\t\t// authenticatedUsername will be undefined for anonymous users\n\t\tstate.authenticatedUsername = username;\n\t\treturn true;\n\t}\n};\n\nexports.AuthenticatorClass = HeaderAuthenticator;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "authenticator"
        },
        "$:/core/modules/server/routes/delete-tiddler.js": {
            "title": "$:/core/modules/server/routes/delete-tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/delete-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nDELETE /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"DELETE\";\n\nexports.path = /^\\/bags\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]);\n\tstate.wiki.deleteTiddler(title);\n\tresponse.writeHead(204, \"OK\", {\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-favicon.js": {
            "title": "$:/core/modules/server/routes/get-favicon.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-favicon.js\ntype: application/javascript\nmodule-type: route\n\nGET /favicon.ico\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/favicon.ico$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"image/x-icon\"});\n\tvar buffer = state.wiki.getTiddlerText(\"$:/favicon.ico\",\"\");\n\tresponse.end(buffer,\"base64\");\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-file.js": {
            "title": "$:/core/modules/server/routes/get-file.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-file.js\ntype: application/javascript\nmodule-type: route\n\nGET /files/:filepath\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/files\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar path = require(\"path\"),\n\t\tfs = require(\"fs\"),\n\t\tutil = require(\"util\"),\n\t\tsuppliedFilename = decodeURIComponent(state.params[0]),\n\t\tfilename = path.resolve(state.boot.wikiPath,\"files\",suppliedFilename),\n\t\textension = path.extname(filename);\n\tfs.readFile(filename,function(err,content) {\n\t\tvar status,content,type = \"text/plain\";\n\t\tif(err) {\n\t\t\tconsole.log(\"Error accessing file \" + filename + \": \" + err.toString());\n\t\t\tstatus = 404;\n\t\t\tcontent = \"File '\" + suppliedFilename + \"' not found\";\n\t\t} else {\n\t\t\tstatus = 200;\n\t\t\tcontent = content;\n\t\t\ttype = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : \"application/octet-stream\");\n\t\t}\n\t\tresponse.writeHead(status,{\n\t\t\t\"Content-Type\": type\n\t\t});\n\t\tresponse.end(content);\n\t});\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-index.js": {
            "title": "$:/core/modules/server/routes/get-index.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-index.js\ntype: application/javascript\nmodule-type: route\n\nGET /\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar zlib = require(\"zlib\");\n\nexports.method = \"GET\";\n\nexports.path = /^\\/$/;\n\nexports.handler = function(request,response,state) {\n\tvar acceptEncoding = request.headers[\"accept-encoding\"];\n\tif(!acceptEncoding) {\n\t\tacceptEncoding = \"\";\n\t}\n\tvar text = state.wiki.renderTiddler(state.server.get(\"root-render-type\"),state.server.get(\"root-tiddler\")),\n\t\tresponseHeaders = {\n\t\t\"Content-Type\": state.server.get(\"root-serve-type\")\n\t};\n\t/*\n\tIf the gzip=yes flag for `listen` is set, check if the user agent permits\n\tcompression. If so, compress our response. Note that we use the synchronous\n\tfunctions from zlib to stay in the imperative style. The current `Server`\n\tdoesn't depend on this, and we may just as well use the async versions.\n\t*/\n\tif(state.server.enableGzip) {\n\t\tif (/\\bdeflate\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"deflate\";\n\t\t\ttext = zlib.deflateSync(text);\n\t\t} else if (/\\bgzip\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"gzip\";\n\t\t\ttext = zlib.gzipSync(text);\n\t\t}\n\t}\n\tresponse.writeHead(200,responseHeaders);\n\tresponse.end(text);\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-login-basic.js": {
            "title": "$:/core/modules/server/routes/get-login-basic.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-login-basic.js\ntype: application/javascript\nmodule-type: route\n\nGET /login-basic -- force a Basic Authentication challenge\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/login-basic$/;\n\nexports.handler = function(request,response,state) {\n\tif(!state.authenticatedUsername) {\n\t\t// Challenge if there's no username\n\t\tresponse.writeHead(401,{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\t\t\n\t} else {\n\t\t// Redirect to the root wiki if login worked\n\t\tresponse.writeHead(302,{\n\t\t\tLocation: \"/\"\n\t\t});\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-status.js": {
            "title": "$:/core/modules/server/routes/get-status.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-status.js\ntype: application/javascript\nmodule-type: route\n\nGET /status\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/status$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar text = JSON.stringify({\n\t\tusername: state.authenticatedUsername || state.server.get(\"anon-username\") || \"\",\n\t\tanonymous: !state.authenticatedUsername,\n\t\tread_only: !state.server.isAuthorized(\"writers\",state.authenticatedUsername),\n\t\tsse_enabled: state.server.get(\"sse-enabled\") === \"yes\",\n\t\tspace: {\n\t\t\trecipe: \"default\"\n\t\t},\n\t\ttiddlywiki_version: $tw.version\n\t});\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-tiddler-html.js": {
            "title": "$:/core/modules/server/routes/get-tiddler-html.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler-html.js\ntype: application/javascript\nmodule-type: route\n\nGET /:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/([^\\/]+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar renderType = tiddler.getFieldString(\"_render_type\"),\n\t\t\trenderTemplate = tiddler.getFieldString(\"_render_template\");\n\t\t// Tiddler fields '_render_type' and '_render_template' overwrite\n\t\t// system wide settings for render type and template\n\t\tif(state.wiki.isSystemTiddler(title)) {\n\t\t\trenderType = renderType || state.server.get(\"system-tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"system-tiddler-render-template\");\n\t\t} else {\n\t\t\trenderType = renderType || state.server.get(\"tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"tiddler-render-template\");\n\t\t}\n\t\tvar text = state.wiki.renderTiddler(renderType,renderTemplate,{parseAsInline: true, variables: {currentTiddler: title}});\n\t\t// Naughty not to set a content-type, but it's the easiest way to ensure the browser will see HTML pages as HTML, and accept plain text tiddlers as CSS or JS\n\t\tresponse.writeHead(200);\n\t\tresponse.end(text,\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-tiddler.js": {
            "title": "$:/core/modules/server/routes/get-tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title),\n\t\ttiddlerFields = {},\n\t\tknownFields = [\n\t\t\t\"bag\", \"created\", \"creator\", \"modified\", \"modifier\", \"permissions\", \"recipe\", \"revision\", \"tags\", \"text\", \"title\", \"type\", \"uri\"\n\t\t];\n\tif(tiddler) {\n\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\tif(knownFields.indexOf(name) !== -1) {\n\t\t\t\ttiddlerFields[name] = value;\n\t\t\t} else {\n\t\t\t\ttiddlerFields.fields = tiddlerFields.fields || {};\n\t\t\t\ttiddlerFields.fields[name] = value;\n\t\t\t}\n\t\t});\n\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\ttiddlerFields.bag = \"default\";\n\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\tresponse.end(JSON.stringify(tiddlerFields),\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-tiddlers-json.js": {
            "title": "$:/core/modules/server/routes/get-tiddlers-json.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddlers-json.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers.json?filter=<filter>\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_FILTER = \"[all[tiddlers]!is[system]sort[title]]\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers.json$/;\n\nexports.handler = function(request,response,state) {\n\tvar filter = state.queryParameters.filter || DEFAULT_FILTER;\n\tif(state.wiki.getTiddlerText(\"$:/config/Server/AllowAllExternalFilters\") !== \"yes\") {\n\t\tif(state.wiki.getTiddlerText(\"$:/config/Server/ExternalFilters/\" + filter) !== \"yes\") {\n\t\t\tconsole.log(\"Blocked attempt to GET /recipes/default/tiddlers.json with filter: \" + filter);\n\t\t\tresponse.writeHead(403);\n\t\t\tresponse.end();\n\t\t\treturn;\n\t\t}\n\t}\n\tif(state.wiki.getTiddlerText(\"$:/config/SyncSystemTiddlersFromServer\") === \"no\") {\n\t\tfilter += \"+[!is[system]]\";\n\t}\n\tvar excludeFields = (state.queryParameters.exclude || \"text\").split(\",\"),\n\t\ttitles = state.wiki.filterTiddlers(filter);\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar tiddlers = [];\n\t$tw.utils.each(titles,function(title) {\n\t\tvar tiddler = state.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tvar tiddlerFields = tiddler.getFieldStrings({exclude: excludeFields});\n\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\ttiddlers.push(tiddlerFields);\n\t\t}\n\t});\n\tvar text = JSON.stringify(tiddlers);\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/put-tiddler.js": {
            "title": "$:/core/modules/server/routes/put-tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/put-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nPUT /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"PUT\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\tfields = JSON.parse(state.data);\n\t// Pull up any subfields in the `fields` object\n\tif(fields.fields) {\n\t\t$tw.utils.each(fields.fields,function(field,name) {\n\t\t\tfields[name] = field;\n\t\t});\n\t\tdelete fields.fields;\n\t}\n\t// Remove any revision field\n\tif(fields.revision) {\n\t\tdelete fields.revision;\n\t}\n\tstate.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title},state.wiki.getModificationFields()));\n\tvar changeCount = state.wiki.getChangeCount(title).toString();\n\tresponse.writeHead(204, \"OK\",{\n\t\tEtag: \"\\\"default/\" + encodeURIComponent(title) + \"/\" + changeCount + \":\\\"\",\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/server-sent-events.js": {
            "title": "$:/core/modules/server/server-sent-events.js",
            "text": "/*\\\ntitle: $:/core/modules/server/server-sent-events.js\ntype: application/javascript\nmodule-type: library\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nparameters:\n\t\tprefix - usually the plugin path, such as `plugins/tiddlywiki/tiddlyweb`. The\n\t\t\troute will match `/events/${prefix}` exactly.\n\n\t\thandler - a function that will be called each time a request comes in with the\n\t\t\trequest and state from the route and an emit function to call.\n*/\n\nvar ServerSentEvents = function ServerSentEvents(prefix, handler) {\n\tthis.handler = handler;\n\tthis.prefix = prefix;\n};\n\nServerSentEvents.prototype.getExports = function() {\n\treturn {\n\t\tbodyFormat: \"stream\",\n\t\tmethod: \"GET\",\n\t\tpath: new RegExp(\"^/events/\" + this.prefix + \"$\"),\n\t\thandler: this.handleEventRequest.bind(this)\n\t};\n};\n\nServerSentEvents.prototype.handleEventRequest = function(request,response,state) {\n\tif(ServerSentEvents.prototype.isEventStreamRequest(request)) {\n\t\tresponse.writeHead(200, {\n\t\t\t\"Content-Type\": \"text/event-stream\",\n\t\t\t\"Cache-Control\": \"no-cache\",\n\t\t\t\"Connection\": \"keep-alive\"\n\t\t});\n\t\tthis.handler(request,state,this.emit.bind(this,response),this.end.bind(this,response));\n\t} else {\n\t\tresponse.writeHead(406,\"Not Acceptable\",{});\n\t\tresponse.end();\n\t}\n};\n\nServerSentEvents.prototype.isEventStreamRequest = function(request) {\n\treturn request.headers.accept &&\n\t\trequest.headers.accept.match(/^text\\/event-stream/);\n};\n\nServerSentEvents.prototype.emit = function(response,event,data) {\n\tif(typeof event !== \"string\" || event.indexOf(\"\\n\") !== -1) {\n\t\tthrow new Error(\"Type must be a single-line string\");\n\t}\n\tif(typeof data !== \"string\" || data.indexOf(\"\\n\") !== -1) {\n\t\tthrow new Error(\"Data must be a single-line string\");\n\t}\n\tresponse.write(\"event: \" + event + \"\\ndata: \" + data + \"\\n\\n\", \"utf8\");\n};\n\nServerSentEvents.prototype.end = function(response) {\n\tresponse.end();\n};\n\nexports.ServerSentEvents = ServerSentEvents;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/core/modules/server/server.js": {
            "title": "$:/core/modules/server/server.js",
            "text": "/*\\\ntitle: $:/core/modules/server/server.js\ntype: application/javascript\nmodule-type: library\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\tquerystring = require(\"querystring\");\n}\n\n/*\nA simple HTTP server with regexp-based routes\noptions: variables - optional hashmap of variables to set (a misnomer - they are really constant parameters)\n\t\t routes - optional array of routes to use\n\t\t wiki - reference to wiki object\n*/\nfunction Server(options) {\n\tvar self = this;\n\tthis.routes = options.routes || [];\n\tthis.authenticators = options.authenticators || [];\n\tthis.wiki = options.wiki;\n\tthis.boot = options.boot || $tw.boot;\n\tthis.servername = $tw.utils.transliterateToSafeASCII(this.wiki.getTiddlerText(\"$:/SiteTitle\") || \"TiddlyWiki5\");\n\t// Initialise the variables\n\tthis.variables = $tw.utils.extend({},this.defaultVariables);\n\tif(options.variables) {\n\t\tfor(var variable in options.variables) {\n\t\t\tif(options.variables[variable]) {\n\t\t\t\tthis.variables[variable] = options.variables[variable];\n\t\t\t}\n\t\t}\t\t\n\t}\n\t$tw.utils.extend({},this.defaultVariables,options.variables);\n\t// Initialise CSRF\n\tthis.csrfDisable = this.get(\"csrf-disable\") === \"yes\";\n\t// Initialize Gzip compression\n\tthis.enableGzip = this.get(\"gzip\") === \"yes\";\n\t// Initialise authorization\n\tvar authorizedUserName = (this.get(\"username\") && this.get(\"password\")) ? this.get(\"username\") : \"(anon)\";\n\tthis.authorizationPrincipals = {\n\t\treaders: (this.get(\"readers\") || authorizedUserName).split(\",\").map($tw.utils.trim),\n\t\twriters: (this.get(\"writers\") || authorizedUserName).split(\",\").map($tw.utils.trim)\n\t}\n\t// Load and initialise authenticators\n\t$tw.modules.forEachModuleOfType(\"authenticator\", function(title,authenticatorDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addAuthenticator(authenticatorDefinition.AuthenticatorClass);\n\t});\n\t// Load route handlers\n\t$tw.modules.forEachModuleOfType(\"route\", function(title,routeDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addRoute(routeDefinition);\n\t});\n\t// Initialise the http vs https\n\tthis.listenOptions = null;\n\tthis.protocol = \"http\";\n\tvar tlsKeyFilepath = this.get(\"tls-key\"),\n\t\ttlsCertFilepath = this.get(\"tls-cert\");\n\tif(tlsCertFilepath && tlsKeyFilepath) {\n\t\tthis.listenOptions = {\n\t\t\tkey: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsKeyFilepath),\"utf8\"),\n\t\t\tcert: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsCertFilepath),\"utf8\")\n\t\t};\n\t\tthis.protocol = \"https\";\n\t}\n\tthis.transport = require(this.protocol);\n}\n\nServer.prototype.defaultVariables = {\n\tport: \"8080\",\n\thost: \"127.0.0.1\",\n\t\"root-tiddler\": \"$:/core/save/all\",\n\t\"root-render-type\": \"text/plain\",\n\t\"root-serve-type\": \"text/html\",\n\t\"tiddler-render-type\": \"text/html\",\n\t\"tiddler-render-template\": \"$:/core/templates/server/static.tiddler.html\",\n\t\"system-tiddler-render-type\": \"text/plain\",\n\t\"system-tiddler-render-template\": \"$:/core/templates/wikified-tiddler\",\n\t\"debug-level\": \"none\",\n\t\"gzip\": \"no\"\n};\n\nServer.prototype.get = function(name) {\n\treturn this.variables[name];\n};\n\nServer.prototype.addRoute = function(route) {\n\tthis.routes.push(route);\n};\n\nServer.prototype.addAuthenticator = function(AuthenticatorClass) {\n\t// Instantiate and initialise the authenticator\n\tvar authenticator = new AuthenticatorClass(this),\n\t\tresult = authenticator.init();\n\tif(typeof result === \"string\") {\n\t\t$tw.utils.error(\"Error: \" + result);\n\t} else if(result) {\n\t\t// Only use the authenticator if it initialised successfully\n\t\tthis.authenticators.push(authenticator);\n\t}\n};\n\nServer.prototype.findMatchingRoute = function(request,state) {\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(state.pathPrefix) {\n\t\t\tif(pathname.substr(0,state.pathPrefix.length) === state.pathPrefix) {\n\t\t\t\tpathname = pathname.substr(state.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\nServer.prototype.methodMappings = {\n\t\"GET\": \"readers\",\n\t\"OPTIONS\": \"readers\",\n\t\"HEAD\": \"readers\",\n\t\"PUT\": \"writers\",\n\t\"POST\": \"writers\",\n\t\"DELETE\": \"writers\"\n};\n\n/*\nCheck whether a given user is authorized for the specified authorizationType (\"readers\" or \"writers\"). Pass null or undefined as the username to check for anonymous access\n*/\nServer.prototype.isAuthorized = function(authorizationType,username) {\n\tvar principals = this.authorizationPrincipals[authorizationType] || [];\n\treturn principals.indexOf(\"(anon)\") !== -1 || (username && (principals.indexOf(\"(authenticated)\") !== -1 || principals.indexOf(username) !== -1));\n}\n\nServer.prototype.requestHandler = function(request,response,options) {\n\toptions = options || {};\n\t// Compose the state object\n\tvar self = this;\n\tvar state = {};\n\tstate.wiki = options.wiki || self.wiki;\n\tstate.boot = options.boot || self.boot;\n\tstate.server = self;\n\tstate.urlInfo = url.parse(request.url);\n\tstate.queryParameters = querystring.parse(state.urlInfo.query);\n\tstate.pathPrefix = options.pathPrefix || this.get(\"path-prefix\") || \"\";\n\t// Get the principals authorized to access this resource\n\tvar authorizationType = this.methodMappings[request.method] || \"readers\";\n\t// Check for the CSRF header if this is a write\n\tif(!this.csrfDisable && authorizationType === \"writers\" && request.headers[\"x-requested-with\"] !== \"TiddlyWiki\") {\n\t\tresponse.writeHead(403,\"'X-Requested-With' header required to login to '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\t\t\n\t}\n\t// Check whether anonymous access is granted\n\tstate.allowAnon = this.isAuthorized(authorizationType,null);\n\t// Authenticate with the first active authenticator\n\tif(this.authenticators.length > 0) {\n\t\tif(!this.authenticators[0].authenticateRequest(request,response,state)) {\n\t\t\t// Bail if we failed (the authenticator will have sent the response)\n\t\t\treturn;\n\t\t}\t\t\n\t}\n\t// Authorize with the authenticated username\n\tif(!this.isAuthorized(authorizationType,state.authenticatedUsername)) {\n\t\tresponse.writeHead(401,\"'\" + state.authenticatedUsername + \"' is not authorized to access '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Find the route that matches this path\n\tvar route = self.findMatchingRoute(request,state);\n\t// Optionally output debug info\n\tif(self.get(\"debug-level\") !== \"none\") {\n\t\tconsole.log(\"Request path:\",JSON.stringify(state.urlInfo));\n\t\tconsole.log(\"Request headers:\",JSON.stringify(request.headers));\n\t\tconsole.log(\"authenticatedUsername:\",state.authenticatedUsername);\n\t}\n\t// Return a 404 if we didn't find a route\n\tif(!route) {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Receive the request body if necessary and hand off to the route handler\n\tif(route.bodyFormat === \"stream\" || request.method === \"GET\" || request.method === \"HEAD\") {\n\t\t// Let the route handle the request stream itself\n\t\troute.handler(request,response,state);\n\t} else if(route.bodyFormat === \"string\" || !route.bodyFormat) {\n\t\t// Set the encoding for the incoming request\n\t\trequest.setEncoding(\"utf8\");\n\t\tvar data = \"\";\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata += chunk.toString();\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = data;\n\t\t\troute.handler(request,response,state);\n\t\t});\n\t} else if(route.bodyFormat === \"buffer\") {\n\t\tvar data = [];\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata.push(chunk);\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = Buffer.concat(data);\n\t\t\troute.handler(request,response,state);\n\t\t})\n\t} else {\n\t\tresponse.writeHead(400,\"Invalid bodyFormat \" + route.bodyFormat + \" in route \" + route.method + \" \" + route.path.source);\n\t\tresponse.end();\n\t}\n};\n\n/*\nListen for requests\nport: optional port number (falls back to value of \"port\" variable)\nhost: optional host address (falls back to value of \"host\" variable)\nprefix: optional prefix (falls back to value of \"path-prefix\" variable)\n*/\nServer.prototype.listen = function(port,host,prefix) {\n\tvar self = this;\n\t// Handle defaults for port and host\n\tport = port || this.get(\"port\");\n\thost = host || this.get(\"host\");\n\tprefix = prefix || this.get(\"path-prefix\") || \"\";\n\t// Check for the port being a string and look it up as an environment variable\n\tif(parseInt(port,10).toString() !== port) {\n\t\tport = process.env[port] || 8080;\n\t}\n\t// Warn if required plugins are missing\n\tif(!this.wiki.getTiddler(\"$:/plugins/tiddlywiki/tiddlyweb\") || !this.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\t// Create the server\n\tvar server;\n\tif(this.listenOptions) {\n\t\tserver = this.transport.createServer(this.listenOptions,this.requestHandler.bind(this));\n\t} else {\n\t\tserver = this.transport.createServer(this.requestHandler.bind(this));\n\t}\n\t// Display the port number after we've started listening (the port number might have been specified as zero, in which case we will get an assigned port)\n\tserver.on(\"listening\",function() {\n\t\tvar address = server.address();\n\t\t$tw.utils.log(\"Serving on \" + self.protocol + \"://\" + address.address + \":\" + address.port + prefix,\"brown/orange\");\n\t\t$tw.utils.log(\"(press ctrl-C to exit)\",\"red\");\n\t});\n\t// Listen\n\treturn server.listen(port,host);\n};\n\nexports.Server = Server;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/core/modules/browser-messaging.js": {
            "title": "$:/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\tiframeInfo = {\n\t\t\turl: url,\n\t\t\tstatus: \"loading\",\n\t\t\tdomNode: iframe\n\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\tiframe.setAttribute(\"library\",\"true\");\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\n/*\nUnload library iframe for given url\n*/\nfunction unloadIFrame(url){\n\t$tw.utils.each(document.getElementsByTagName('iframe'), function(iframe) {\n\t\tif(iframe.getAttribute(\"library\") === \"true\" &&\n\t\t  iframe.getAttribute(\"src\") === url) {\n\t\t\tiframe.parentNode.removeChild(iframe);\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($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + 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// Listen for widget messages to control unloading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-unload-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\t$tw.browserMessaging.iframeInfoMap[url] = undefined;\n\t\tif(url) {\n\t\t\tunloadIFrame(url);\n\t\t\t$tw.utils.each(\n\t\t\t\t$tw.wiki.filterTiddlers(\"[[$:/temp/ServerConnection/\" + url + \"]] [prefix[$:/temp/RemoteAssetInfo/\" + url + \"/]]\"),\n\t\t\t\tfunction(title) {\n\t\t\t\t\t$tw.wiki.deleteTiddler(title);\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($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + 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\t// console.log(\"browser-messaging: \",document.location.toString())\n\t\t// console.log(\"browser-messaging: Received message from\",event.origin);\n\t\t// console.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",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/commands.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/CSSescape.js": {
            "title": "$:/core/modules/startup/CSSescape.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/CSSescape.js\ntype: application/javascript\nmodule-type: startup\n\nPolyfill for CSS.escape()\n\n\\*/\n(function(root,factory){\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"css-escape\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\n// https://github.com/umdjs/umd/blob/master/returnExports.js\nexports.startup = function() {factory(root);}; \n}(typeof global != 'undefined' ? global : this, function(root) {\n\n\tif (root.CSS && root.CSS.escape) {\n\t\treturn;\n\t}\n\n\t// https://drafts.csswg.org/cssom/#serialize-an-identifier\n\tvar cssEscape = function(value) {\n\t\tif (arguments.length == 0) {\n\t\t\tthrow new TypeError('`CSS.escape` requires an argument.');\n\t\t}\n\t\tvar string = String(value);\n\t\tvar length = string.length;\n\t\tvar index = -1;\n\t\tvar codeUnit;\n\t\tvar result = '';\n\t\tvar firstCodeUnit = string.charCodeAt(0);\n\t\twhile (++index < length) {\n\t\t\tcodeUnit = string.charCodeAt(index);\n\t\t\t// Note: there’s no need to special-case astral symbols, surrogate\n\t\t\t// pairs, or lone surrogates.\n\n\t\t\t// If the character is NULL (U+0000), then the REPLACEMENT CHARACTER\n\t\t\t// (U+FFFD).\n\t\t\tif (codeUnit == 0x0000) {\n\t\t\t\tresult += '\\uFFFD';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is in the range [\\1-\\1F] (U+0001 to U+001F) or is\n\t\t\t\t// U+007F, […]\n\t\t\t\t(codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||\n\t\t\t\t// If the character is the first character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039), […]\n\t\t\t\t(index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n\t\t\t\t// If the character is the second character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\n\t\t\t\t(\n\t\t\t\t\tindex == 1 &&\n\t\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 &&\n\t\t\t\t\tfirstCodeUnit == 0x002D\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point\n\t\t\t\tresult += '\\\\' + codeUnit.toString(16) + ' ';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is the first character and is a `-` (U+002D), and\n\t\t\t\t// there is no second character, […]\n\t\t\t\tindex == 0 &&\n\t\t\t\tlength == 1 &&\n\t\t\t\tcodeUnit == 0x002D\n\t\t\t) {\n\t\t\t\tresult += '\\\\' + string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If the character is not handled by one of the above rules and is\n\t\t\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\n\t\t\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\n\t\t\t// U+005A), or [a-z] (U+0061 to U+007A), […]\n\t\t\tif (\n\t\t\t\tcodeUnit >= 0x0080 ||\n\t\t\t\tcodeUnit == 0x002D ||\n\t\t\t\tcodeUnit == 0x005F ||\n\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 ||\n\t\t\t\tcodeUnit >= 0x0041 && codeUnit <= 0x005A ||\n\t\t\t\tcodeUnit >= 0x0061 && codeUnit <= 0x007A\n\t\t\t) {\n\t\t\t\t// the character itself\n\t\t\t\tresult += string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Otherwise, the escaped character.\n\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character\n\t\t\tresult += '\\\\' + string.charAt(index);\n\n\t\t}\n\t\treturn result;\n\t};\n\n\tif (!root.CSS) {\n\t\troot.CSS = {};\n\t}\n\n\tObject.getPrototypeOf(root.CSS).escape = cssEscape;\n\n}));\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/favicon.js": {
            "title": "$:/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\",$tw.utils.makeDataUri(tiddler.fields.text,tiddler.fields.type,tiddler.fields._canonical_uri));\n\t}\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/info.js": {
            "title": "$:/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\nvar TITLE_INFO_PLUGIN = \"$:/temp/info-plugin\";\n\nexports.startup = function() {\n\t// Function to bake the info plugin with new tiddlers\n\tvar updateInfoPlugin = function(tiddlerFieldsArray) {\n\t\t// Get the existing tiddlers\n\t\tvar json = $tw.wiki.getTiddlerData(TITLE_INFO_PLUGIN,{tiddlers: {}});\n\t\t// Add the new ones\n\t\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\n\t\t\tif(fields && fields.title) {\n\t\t\t\tjson.tiddlers[fields.title] = fields;\n\t\t\t}\n\t\t});\n\t\t// Bake the info tiddlers into a plugin. We use the non-standard plugin-type \"info\" because ordinary plugins are only registered asynchronously after being loaded dynamically\n\t\tvar fields = {\n\t\t\ttitle: TITLE_INFO_PLUGIN,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"info\",\n\t\t\ttext: JSON.stringify(json,null,$tw.config.preferences.jsonSpaces)\n\t\t};\n\t\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\n\n\t};\n\t// Collect up the info tiddlers\n\tvar tiddlerFieldsArray = [];\n\t// Give each info module a chance to provide as many info tiddlers as they want as an array, and give them a callback for dynamically updating them\n\t$tw.modules.forEachModuleOfType(\"info\",function(title,moduleExports) {\n\t\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\n\t\t\tArray.prototype.push.apply(tiddlerFieldsArray,moduleExports.getInfoTiddlerFields(updateInfoPlugin));\n\t\t}\n\t});\n\tupdateInfoPlugin(tiddlerFieldsArray);\n\tvar changes = $tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]);\n\t$tw.wiki.registerPluginTiddlers(\"info\",[TITLE_INFO_PLUGIN]);\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/load-modules.js": {
            "title": "$:/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\tif($tw.browser) {\n\t\t$tw.modules.applyMethods(\"utils-browser\",$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.wiki.addIndexersToWiki();\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",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/password.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/plugins.js": {
            "title": "$:/core/modules/startup/plugins.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/plugins.js\ntype: application/javascript\nmodule-type: startup\n\nStartup logic concerned with managing plugins\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 = \"plugins\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE = \"$:/status/RequireReloadDueToPluginChange\";\n\nvar PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = \"$:/config/RegisterPluginType/\";\n\nexports.startup = function() {\n\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"no\"});\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t// Work out which of the changed tiddlers are plugins that we need to reregister\n\t\tvar changesToProcess = [],\n\t\t\trequireReloadDueToPluginChange = false;\n\t\t$tw.utils.each(Object.keys(changes),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\t\trequiresReload = $tw.wiki.doesPluginRequireReload(title);\n\t\t\tif(requiresReload) {\n\t\t\t\trequireReloadDueToPluginChange = true;\n\t\t\t} else if(tiddler) {\n\t\t\t\tvar pluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif($tw.wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields[\"plugin-type\"] || \"\"),\"no\") === \"yes\") {\n\t\t\t\t\tchangesToProcess.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t// Issue warning if any of the tiddlers require a reload\n\t\tif(requireReloadDueToPluginChange) {\n\t\t\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"yes\"});\n\t\t}\n\t\t// Read or delete the plugin info of the changed tiddlers\n\t\tif(changesToProcess.length > 0) {\n\t\t\tvar changes = $tw.wiki.readPluginInfo(changesToProcess);\n\t\t\tif(changes.modifiedPlugins.length > 0 || changes.deletedPlugins.length > 0) {\n\t\t\t\tvar changedShadowTiddlers = {};\n\t\t\t\t// Collect the shadow tiddlers of any deleted plugins\n\t\t\t\t$tw.utils.each(changes.deletedPlugins,function(pluginTitle) {\n\t\t\t\t\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);\n\t\t\t\t\tif(pluginInfo) {\n\t\t\t\t\t\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\n\t\t\t\t\t\t\tchangedShadowTiddlers[title] = true;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// Collect the shadow tiddlers of any modified plugins\n\t\t\t\t$tw.utils.each(changes.modifiedPlugins,function(pluginTitle) {\n\t\t\t\t\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);\n\t\t\t\t\tif(pluginInfo) {\n\t\t\t\t\t\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\n\t\t\t\t\t\t\tchangedShadowTiddlers[title] = false;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// (Re-)register any modified plugins\n\t\t\t\t$tw.wiki.registerPluginTiddlers(null,changes.modifiedPlugins);\n\t\t\t\t// Unregister any deleted plugins\n\t\t\t\t$tw.wiki.unregisterPluginTiddlers(null,changes.deletedPlugins);\n\t\t\t\t// Unpack the shadow tiddlers\n\t\t\t\t$tw.wiki.unpackPluginTiddlers();\n\t\t\t\t// Queue change events for the changed shadow tiddlers\n\t\t\t\t$tw.utils.each(Object.keys(changedShadowTiddlers),function(title) {\n\t\t\t\t\t$tw.wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title]);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/render.js": {
            "title": "$:/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/RootTemplate\";\n\n// Time (in ms) that we defer refreshing changes to draft tiddlers\nvar DRAFT_TIDDLER_TIMEOUT_TITLE = \"$:/config/Drafts/TypingTimeout\";\nvar THROTTLE_REFRESH_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, recursionMarker: \"no\"});\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\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t})();\n\t// Remove any splash screen elements\n\tvar removeList = document.querySelectorAll(\".tc-remove-when-wiki-loaded\");\n\t$tw.utils.each(removeList,function(removeItem) {\n\t\tif(removeItem.parentNode) {\n\t\t\tremoveItem.parentNode.removeChild(removeItem);\n\t\t}\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.hooks.invokeHook(\"th-page-refreshing\");\n\t\t$tw.pageWidgetNode.refresh(deferredChanges);\n\t\tdeferredChanges = Object.create(null);\n\t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\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 tiddlers that are throttled have changed\n\t\tvar onlyThrottledTiddlersHaveChanged = 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\") || tiddler.hasField(\"throttle.refresh\"))) {\n\t\t\t\tonlyThrottledTiddlersHaveChanged = 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(onlyThrottledTiddlersHaveChanged) {\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 = THROTTLE_REFRESH_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\t// Run any post-render startup actions\n\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/PostRender\");\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/rootwidget.js": {
            "title": "$:/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, event: event});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-show-switcher\",function(event) {\n\t\t$tw.modal.display(\"$:/core/ui/SwitcherModal\",{variables: event.paramObject, event: event});\n\t});\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,{variables: event.paramObject});\n\t});\n\t// Install the copy-to-clipboard  mechanism\n\t$tw.rootWidget.addEventListener(\"tm-copy-to-clipboard\",function(event) {\n\t\t$tw.utils.copyToClipboard(event.param);\n\t});\n\t// Install the tm-focus-selector message\n\t$tw.rootWidget.addEventListener(\"tm-focus-selector\",function(event) {\n\t\tvar selector = event.param || \"\",\n\t\t\telement;\n\t\ttry {\n\t\t\telement = document.querySelector(selector);\n\t\t} catch(e) {\n\t\t\tconsole.log(\"Error in selector: \",selector)\n\t\t}\n\t\tif(element && element.focus) {\n\t\t\telement.focus(event.paramObject);\n\t\t}\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\tvar fullScreenDocument = event.event ? event.event.target.ownerDocument : document;\n\t\t\tif(event.param === \"enter\") {\n\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t} else if(event.param === \"exit\") {\n\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t} else {\n\t\t\t\tif(fullScreenDocument[fullscreen._fullscreenElement]) {\n\t\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t\t} else {\n\t\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t\t}\t\t\t\t\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",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup.js": {
            "title": "$:/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\t// Minimal browser detection\n\tif($tw.browser) {\n\t\t$tw.browser.isIE = (/msie|trident/i.test(navigator.userAgent));\n\t\t$tw.browser.isFirefox = !!document.mozFullScreenEnabled;\n\t}\n\t// Platform detection\n\t$tw.platform = {};\n\tif($tw.browser) {\n\t\t$tw.platform.isMac = /Mac/.test(navigator.platform);\n\t\t$tw.platform.isWindows = /win/i.test(navigator.platform);\n\t\t$tw.platform.isLinux = /Linux/i.test(navigator.platform);\n\t} else {\n\t\tswitch(require(\"os\").platform()) {\n\t\t\tcase \"darwin\":\n\t\t\t\t$tw.platform.isMac = true;\n\t\t\t\tbreak;\n\t\t\tcase \"win32\":\n\t\t\t\t$tw.platform.isWindows = true;\n\t\t\t\tbreak;\n\t\t\tcase \"freebsd\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t\tcase \"linux\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t// Initialise version\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// 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\t$tw.rootWidget = new widget.widget({\n\t\ttype: \"widget\",\n\t\tchildren: []\n\t},{\n\t\twiki: $tw.wiki,\n\t\tdocument: $tw.browser ? document : $tw.fakeDocument\n\t});\n\t// Execute any startup actions\n\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction\");\n\tif($tw.browser) {\n\t\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/Browser\");\n\t}\n\tif($tw.node) {\n\t\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/Node\");\n\t}\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-GB\"\n\t\t],\n\t\tonSwitch: function(plugins) {\n\t\t\tif($tw.browser) {\n\t\t\t\tvar pluginTiddler = $tw.wiki.getTiddler(plugins[0]);\n\t\t\t\tif(pluginTiddler) {\n\t\t\t\t\tdocument.documentElement.setAttribute(\"dir\",pluginTiddler.getFieldString(\"text-direction\") || \"auto\");\n\t\t\t\t} else {\n\t\t\t\t\tdocument.documentElement.removeAttribute(\"dir\");\n\t\t\t\t}\n\t\t\t}\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// Kick off the keyboard manager\n\t$tw.keyboardManager = new $tw.KeyboardManager();\n\t// Listen for shortcuts\n\tif($tw.browser) {\n\t\t$tw.utils.addEventListeners(document,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\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// 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({\n\t\twiki: $tw.wiki,\n\t\tdirtyTracking: !$tw.syncadaptor,\n\t\tpreloadDirty: $tw.boot.preloadDirty || []\n\t});\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",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/story.js": {
            "title": "$:/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\"\nvar CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD = \"$:/config/Navigation/Permalinkview/CopyToClipboard\"; // Can be \"yes\" (default) or \"no\"\nvar CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/Permalinkview/UpdateAddressBar\"; // Can be \"yes\" (default) or \"no\"\n\n\n// Links to help, if there is no param\nvar HELP_OPEN_EXTERNAL_WINDOW = \"http://tiddlywiki.com/#WidgetMessage%3A%20tm-open-external-window\";\n\nexports.startup = function() {\n\t// Open startup tiddlers\n\topenStartupTiddlers({\n\t\tdisableHistory: $tw.boot.disableStartupNavigation\n\t});\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 tm-open-external-window message\n\t\t$tw.rootWidget.addEventListener(\"tm-open-external-window\",function(event) {\n\t\t\tvar paramObject = event.paramObject || {},\n\t\t\t\tstrUrl = event.param || HELP_OPEN_EXTERNAL_WINDOW,\n\t\t\t\tstrWindowName = paramObject.windowName,\n\t\t\t\tstrWindowFeatures = paramObject.windowFeatures;\n\t\t\twindow.open(strUrl, strWindowName, strWindowFeatures);\n\t\t});\n\t\t// Listen for the tm-print message\n\t\t$tw.rootWidget.addEventListener(\"tm-print\",function(event) {\n\t\t\t(event.event.view || window).print();\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]);\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: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\",\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\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\"\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: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\",\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\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\"\n\t\t\t});\t\t\t\t\n\t\t});\n\t}\n};\n\n/*\nProcess the location hash to open the specified tiddlers. Options:\ndisableHistory: if true $:/History is NOT updated\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// Update history\n\tvar story = new $tw.Story({\n\t\twiki: $tw.wiki,\n\t\tstoryTitle: DEFAULT_STORY_TITLE,\n\t\thistoryTitle: DEFAULT_HISTORY_TITLE\n\t});\n\tif(!options.disableHistory) {\n\t\t// If a target tiddler was specified add it to the history stack\n\t\tif(target && target !== \"\") {\n\t\t\t// The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present\n\t\t\tif(target.indexOf(\"[[\") === 0 && target.substr(-2) === \"]]\") {\n\t\t\t\ttarget = target.substr(2,target.length - 4);\n\t\t\t}\n\t\t\tstory.addToHistory(target);\n\t\t} else if(storyList.length > 0) {\n\t\t\tstory.addToHistory(storyList[0]);\n\t\t}\t\t\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.copyToClipboard: \"permalink\", \"permaview\" or \"no\" (defaults to \"no\")\noptions.targetTiddler: optional title of target tiddler for permalink\n*/\nfunction updateLocationHash(options) {\n\t// Get the story and the history stack\n\tvar storyList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE),\n\t\thistoryList = $tw.wiki.getTiddlerData(DEFAULT_HISTORY_TITLE,[]),\n\t\ttargetTiddler = \"\";\n\tif(options.targetTiddler) {\n\t\ttargetTiddler = options.targetTiddler;\n\t} else {\n\t\t// The target tiddler is the one at the top of the stack\n\t\tif(historyList.length > 0) {\n\t\t\ttargetTiddler = historyList[historyList.length-1].title;\n\t\t}\n\t\t// Blank the target tiddler if it isn't present in the story\n\t\tif(storyList.indexOf(targetTiddler) === -1) {\n\t\t\ttargetTiddler = \"\";\n\t\t}\n\t}\n\t// Assemble the location hash\n\tswitch(options.updateAddressBar) {\n\t\tcase \"permalink\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler);\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t\tbreak;\n\t}\n\t// Copy URL to the clipboard\n\tswitch(options.copyToClipboard) {\n\t\tcase \"permalink\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler));\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList)));\n\t\t\tbreak;\n\t}\n\t// Only change the location hash if we must, thus avoiding unnecessary onhashchange events\n\tif($tw.utils.getLocationHash() !== $tw.locationHash) {\n\t\tif(options.updateHistory === \"yes\") {\n\t\t\t// Assign the location hash so that history is updated\n\t\t\twindow.location.hash = $tw.locationHash;\n\t\t} else {\n\t\t\t// We use replace so that browser history isn't affected\n\t\t\twindow.location.replace(window.location.toString().split(\"#\")[0] + $tw.locationHash);\n\t\t}\n\t}\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/windows.js": {
            "title": "$:/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)\n$tw.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\twindowTitle = paramObject.windowTitle || title,\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,\n\t\t    srcDocument;\n\t\t// In case that popup blockers deny opening a new window\n\t\ttry {\n\t\t\tsrcWindow = window.open(\"\",\"external-\" + title,\"scrollbars,width=\" + width + \",height=\" + height),\n\t\t\tsrcDocument = srcWindow.document;\n\t\t}\n\t\tcatch(e) {\n\t\t\treturn;\n\t\t}\n\t\t$tw.windows[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 = windowTitle;\n\t\tsrcWindow.addEventListener(\"beforeunload\",function(event) {\n\t\t\tdelete $tw.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\",{\n\t\t\t\tdocument: $tw.fakeDocument,\n\t\t\t\tvariables: variables,\n\t\t\t\timportPageMacros: true}),\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\t// Listen for keyboard shortcuts\n\t\t$tw.utils.addEventListeners(srcDocument,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t}]);\n\t\tsrcWindow.document.documentElement.addEventListener(\"click\",$tw.popup,true);\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($tw.windows,function(win) {\n\t\t\twin.close();\n\t\t});\n\t});\n\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/story.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/storyviews/classic.js": {
            "title": "$:/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 duration = $tw.utils.getAnimationDuration()\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\tif(duration) {\n\t\t// Scroll the node into view\n\t\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\t\n\t} else {\n\t\ttargetElement.scrollIntoView();\n\t}\n};\n\nClassicStoryView.prototype.insert = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar computedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Reset the margin once the transition is over\n\t\tsetTimeout(function() {\n\t\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t\t{transition: \"none\"},\n\t\t\t\t{marginBottom: \"\"}\n\t\t\t]);\n\t\t},duration);\n\t\t// Set up the initial position of the element\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t// Transition to the final position\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t]);\n\t}\n};\n\nClassicStoryView.prototype.remove = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode(),\n\t\t\tremoveElement = function() {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t};\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\tremoveElement();\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar currWidth = targetElement.offsetWidth,\n\t\t\tcomputedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Remove the dom nodes of the widget at the end of the transition\n\t\tsetTimeout(removeElement,duration);\n\t\t// Animate the closure\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"translateX(0px)\"},\n\t\t\t{marginBottom:  currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{transform: \"translateX(-\" + currWidth + \"px)\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n};\n\nexports.classic = ClassicStoryView;\n\n})();",
            "type": "application/javascript",
            "module-type": "storyview"
        },
        "$:/core/modules/storyviews/pop.js": {
            "title": "$:/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\t$tw.utils.setStyle(widget.document.body,[\n\t\t\t{\"overflow-x\": \"\"}\n\t\t]);\n\t},duration);\n\t// Prevent the page from overscrolling due to the zoom factor\n\t$tw.utils.setStyle(widget.document.body,[\n\t\t{\"overflow-x\": \"hidden\"}\n\t]);\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 && 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",
            "type": "application/javascript",
            "module-type": "storyview"
        },
        "$:/core/modules/storyviews/zoomin.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "storyview"
        },
        "$:/core/modules/syncer.js": {
            "title": "$:/core/modules/syncer.js",
            "text": "/*\\\ntitle: $:/core/modules/syncer.js\ntype: application/javascript\nmodule-type: global\n\nThe syncer tracks changes to the store and synchronises them to a remote data store represented as a \"sync adaptor\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDefaults\n*/\nSyncer.prototype.titleIsLoggedIn = \"$:/status/IsLoggedIn\";\nSyncer.prototype.titleIsAnonymous = \"$:/status/IsAnonymous\";\nSyncer.prototype.titleIsReadOnly = \"$:/status/IsReadOnly\";\nSyncer.prototype.titleUserName = \"$:/status/UserName\";\nSyncer.prototype.titleSyncFilter = \"$:/config/SyncFilter\";\nSyncer.prototype.titleSyncDisablePolling = \"$:/config/SyncDisablePolling\";\nSyncer.prototype.titleSyncPollingInterval = \"$:/config/SyncPollingInterval\";\nSyncer.prototype.titleSyncDisableLazyLoading = \"$:/config/SyncDisableLazyLoading\";\nSyncer.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\nSyncer.prototype.titleSyncThrottleInterval = \"$:/config/SyncThrottleInterval\";\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.errorRetryInterval = 5 * 1000; // Interval to retry after an error\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/*\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\t// Save parameters\n\tthis.syncadaptor = options.syncadaptor;\n\tthis.disableUI = !!options.disableUI;\n\tthis.titleIsLoggedIn = options.titleIsLoggedIn || this.titleIsLoggedIn;\n\tthis.titleUserName = options.titleUserName || this.titleUserName;\n\tthis.titleSyncFilter = options.titleSyncFilter || this.titleSyncFilter;\n\tthis.titleSavedNotification = options.titleSavedNotification || this.titleSavedNotification;\n\tthis.taskTimerInterval = options.taskTimerInterval || this.taskTimerInterval;\n\tthis.throttleInterval = options.throttleInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncThrottleInterval,\"\"),10) || this.throttleInterval;\n\tthis.errorRetryInterval = options.errorRetryInterval || this.errorRetryInterval;\n\tthis.fallbackInterval = options.fallbackInterval || this.fallbackInterval;\n\tthis.pollTimerInterval = options.pollTimerInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncPollingInterval,\"\"),10) || this.pollTimerInterval;\n\tthis.logging = \"logging\" in options ? options.logging : true;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\")  + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\"),{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging,\n\t\tsaveHistory: true\n\t});\n\t// Make another logger for connection errors\n\tthis.loggerConnection = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\")  + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\") + \"-connection\",{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging\n\t});\n\t// Ask the syncadaptor to use the main logger\n\tif(this.syncadaptor.setLoggerSaveBuffer) {\n\t\tthis.syncadaptor.setLoggerSaveBuffer(this.logger);\n\t}\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\tthis.titlesToBeLoaded = {}; // Hashmap of titles of tiddlers that need loading from the server\n\tthis.titlesHaveBeenLazyLoaded = {}; // Hashmap of titles of tiddlers that have already been lazily loaded from the server\n\t// Timers\n\tthis.taskTimerId = null; // Timer for task dispatch\n\tthis.pollTimerId = null; // Timer for polling server\n\t// Number of outstanding requests\n\tthis.numTasksInProgress = 0;\n\t// Listen out for changes to tiddlers\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t// Filter the changes to just include ones that are being synced\n\t\tvar filteredChanges = self.getSyncedTiddlers(function(callback) {\n\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\tvar tiddler = self.wiki.tiddlerExists(title) && self.wiki.getTiddler(title);\n\t\t\t\tcallback(tiddler,title);\n\t\t\t});\n\t\t});\n\t\tif(filteredChanges.length > 0) {\n\t\t\tself.processTaskQueue();\n\t\t} else {\n\t\t\t// Look for deletions of tiddlers we're already syncing\n\t\t\tvar outstandingDeletion = false\n\t\t\t$tw.utils.each(changes,function(change,title,object) {\n\t\t\t\tif(change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) {\n\t\t\t\t\toutstandingDeletion = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(outstandingDeletion) {\n\t\t\t\tself.processTaskQueue();\n\t\t\t}\n\t\t}\n\t});\n\t// Browser event handlers\n\tif($tw.browser && !this.disableUI) {\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(event) {\n\t\t\tvar username = event && event.paramObject && event.paramObject.username,\n\t\t\t\tpassword = event && event.paramObject && event.paramObject.password;\n\t\t\tif(username && password) {\n\t\t\t\t// Login with username and password\n\t\t\t\tself.login(username,password,function() {});\n\t\t\t} else {\n\t\t\t\t// No username and password, so we display a prompt\n\t\t\t\tself.handleLoginEvent();\n\t\t\t}\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\t$tw.rootWidget.addEventListener(\"tm-copy-syncer-logs-to-clipboard\",function() {\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getSystemInfo() + \"\\n\\nLog:\\n\" + self.logger.getBuffer());\n\t\t});\n\t}\n\t// Listen out for lazyLoad events\n\tif(!this.disableUI && this.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== \"yes\") {\n\t\tthis.wiki.addEventListener(\"lazyLoad\",function(title) {\n\t\t\tself.handleLazyLoadEvent(title);\n\t\t});\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/*\nShow a generic network error alert\n*/\nSyncer.prototype.displayError = function(msg,err) {\n\tif(err === ($tw.language.getString(\"Error/XMLHttpRequest\") + \": 0\")) {\n\t\tthis.loggerConnection.alert($tw.language.getString(\"Error/NetworkErrorAlert\"));\n\t\tthis.logger.log(msg + \":\",err);\n\t} else {\n\t\tthis.logger.alert(msg + \":\",err);\n\t}\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getSyncedTiddlers = function(source) {\n\treturn this.filterFn.call(this.wiki,source);\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getTiddlerRevision = function(title) {\n\tif(this.syncadaptor && this.syncadaptor.getTiddlerRevision) {\n\t\treturn this.syncadaptor.getTiddlerRevision(title);\n\t} else {\n\t\treturn this.wiki.getTiddler(title).fields.revision;\n\t}\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\t// \"revision\" is the revision of the tiddler last seen on the server, and \"changecount\" is the corresponding local changecount\n\tthis.tiddlerInfo = {};\n\t// Record information for known tiddlers\n\tvar self = this,\n\t\ttiddlers = this.getSyncedTiddlers();\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tself.tiddlerInfo[title] = {\n\t\t\t\trevision: self.getTiddlerRevision(title),\n\t\t\t\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\n\t\t\t\tchangeCount: self.wiki.getChangeCount(title)\n\t\t\t};\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\tthis.logger.log(\"Checking dirty status\");\n\t// Check tiddlers that are in the store and included in the filter function\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(this.wiki.tiddlerExists(title)) {\n\t\t\tif(tiddlerInfo) {\n\t\t\t\t// If the tiddler is known on the server and has been modified locally then it needs to be saved to the server\n\t\t\t\tif(this.wiki.getChangeCount(title) > tiddlerInfo.changeCount) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If the tiddler isn't known on the server then it needs to be saved to the server\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\t// Check tiddlers that are known from the server but not currently in the store\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\tif(!this.wiki.tiddlerExists(titles[index])) {\n\t\t\t// There must be a pending delete\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\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 && !this.disableUI) {\n\t\tvar dirty = this.isDirty();\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",dirty);\n\t\tif(!dirty) {\n\t\t\tthis.loggerConnection.clearAlerts();\n\t\t}\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(tiddlerFields);\n\tthis.wiki.addTiddler(tiddler);\n\t// Save the tiddler revision and changeCount details\n\tthis.tiddlerInfo[tiddlerFields.title] = {\n\t\trevision: this.getTiddlerRevision(tiddlerFields.title),\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,isReadOnly,isAnonymous,isPollingDisabled) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\t// Set the various status tiddlers\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsReadOnly,text: isReadOnly ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsAnonymous,text: isAnonymous ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? \"yes\" : \"no\"});\n\t\t\t\tif(isLoggedIn) {\n\t\t\t\t\tself.wiki.addTiddler({title: self.titleUserName,text: username || \"\"});\n\t\t\t\t}\n\t\t\t\tif(isPollingDisabled) {\n\t\t\t\t\tself.wiki.addTiddler({title: self.titleSyncDisablePolling, text: \"yes\"});\n\t\t\t\t}\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\tvar self = this,\n\t\tcancelNextSync = function() {\n\t\t\tif(self.pollTimerId) {\n\t\t\t\tclearTimeout(self.pollTimerId);\n\t\t\t\tself.pollTimerId = null;\n\t\t\t}\n\t\t},\n\t\ttriggerNextSync = function() {\n\t\t\tif(pollingEnabled) {\n\t\t\t\tself.pollTimerId = setTimeout(function() {\n\t\t\t\t\tself.pollTimerId = null;\n\t\t\t\t\tself.syncFromServer.call(self);\n\t\t\t\t},self.pollTimerInterval);\n\t\t\t}\n\t\t},\n\t\tsyncSystemFromServer = (self.wiki.getTiddlerText(\"$:/config/SyncSystemTiddlersFromServer\") === \"yes\"),\n\t\tpollingEnabled = (self.wiki.getTiddlerText(self.titleSyncDisablePolling) !== \"yes\");\n\tif(this.syncadaptor && this.syncadaptor.getUpdatedTiddlers) {\n\t\tthis.logger.log(\"Retrieving updated tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getUpdatedTiddlers(self,function(err,updates) {\n\t\t\ttriggerNextSync();\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(updates) {\n\t\t\t\t$tw.utils.each(updates.modifications,function(title) {\n\t\t\t\t\tself.titlesToBeLoaded[title] = true;\n\t\t\t\t});\n\t\t\t\t$tw.utils.each(updates.deletions,function(title) {\n\t\t\t\t\tif(syncSystemFromServer || !self.wiki.isSystemTiddler(title)) {\n\t\t\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(updates.modifications.length > 0 || updates.deletions.length > 0) {\n\t\t\t\t\tself.processTaskQueue();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else if(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) {\n\t\tthis.logger.log(\"Retrieving skinny tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) {\n\t\t\ttriggerNextSync();\n\t\t\t// Check for errors\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Keep track of which tiddlers we already know about have been reported this time\n\t\t\tvar previousTitles = Object.keys(self.tiddlerInfo);\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.tiddlerExists(tiddlerFields.title) && 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\tindexInPreviousTitles = previousTitles.indexOf(tiddlerFields.title);\n\t\t\t\tif(indexInPreviousTitles !== -1) {\n\t\t\t\t\tpreviousTitles.splice(indexInPreviousTitles,1);\n\t\t\t\t}\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// Only load the skinny version if we don't already have a fat version of the tiddler\n\t\t\t\t\tif(!tiddler || tiddler.fields.text === undefined) {\n\t\t\t\t\t\tself.storeTiddler(tiddlerFields);\n\t\t\t\t\t}\n\t\t\t\t\t// Do a full load of this tiddler\n\t\t\t\t\tself.titlesToBeLoaded[tiddlerFields.title] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Delete any tiddlers that were previously reported but missing this time\n\t\t\t$tw.utils.each(previousTitles,function(title) {\n\t\t\t\tif(syncSystemFromServer || !self.wiki.isSystemTiddler(title)) {\n\t\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t});\n\t\t\tself.processTaskQueue();\n\t\t});\n\t}\n};\n\n/*\nForce load a tiddler from the server\n*/\nSyncer.prototype.enqueueLoadTiddler = function(title) {\n\tthis.titlesToBeLoaded[title] = true;\n\tthis.processTaskQueue();\n};\n\n/*\nLazily load a skinny tiddler if we can\n*/\nSyncer.prototype.handleLazyLoadEvent = function(title) {\n\t// Ignore if the syncadaptor doesn't handle it\n\tif(!this.syncadaptor.supportsLazyLoading) {\n\t\treturn;\n\t}\n\t// Don't lazy load the same tiddler twice\n\tif(!this.titlesHaveBeenLazyLoaded[title]) {\n\t\t// Don't lazy load if the tiddler isn't included in the sync filter\n\t\tif(this.getSyncedTiddlers().indexOf(title) !== -1) {\n\t\t\t// Mark the tiddler as needing loading, and having already been lazily loaded\n\t\t\tthis.titlesToBeLoaded[title] = true;\n\t\t\tthis.titlesHaveBeenLazyLoaded[title] = true;\n\t\t}\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(!err && !isLoggedIn) {\n\t\t\tif(self.syncadaptor && self.syncadaptor.displayLoginPrompt) {\n\t\t\t\tself.syncadaptor.displayLoginPrompt(self);\n\t\t\t} else {\n\t\t\t\tself.displayLoginPrompt();\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nDispay a password prompt\n*/\nSyncer.prototype.displayLoginPrompt = function() {\n\tvar self = this;\n\tvar promptInfo = $tw.passwordPrompt.createPrompt({\n\t\tserviceName: $tw.language.getString(\"LoginToTiddlySpace\"),\n\t\tcallback: function(data) {\n\t\t\tself.login(data.username,data.password,function(err,isLoggedIn) {\n\t\t\t\tself.syncFromServer();\n\t\t\t});\n\t\t\treturn true; // Get rid of the password prompt\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(err,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/*\nProcess the next task\n*/\nSyncer.prototype.processTaskQueue = function() {\n\tvar self = this;\n\t// Only process a task if the sync adaptor is fully initialised and we're not already performing\n\t// a task. If we are already performing a task then we'll dispatch the next one when it completes\n\tif((!this.syncadaptor.isReady || this.syncadaptor.isReady()) && 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(typeof task === \"object\" && task !== null) {\n\t\t\tthis.numTasksInProgress += 1;\n\t\t\ttask.run(function(err) {\n\t\t\t\tself.numTasksInProgress -= 1;\n\t\t\t\tif(err) {\n\t\t\t\t\tself.displayError(\"Sync error while processing \" + task.type + \" of '\" + task.title + \"'\",err);\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\tself.triggerTimeout(self.errorRetryInterval);\n\t\t\t\t} else {\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\t// Process the next task\n\t\t\t\t\tself.processTaskQueue.call(self);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// No task is ready so update the status\n\t\t\tthis.updateDirtyStatus();\n\t\t\t// And trigger a timeout if there is a pending task\n\t\t\tif(task === true) {\n\t\t\t\tthis.triggerTimeout();\n\t\t\t}\n\t\t}\n\t} else {\n\t\tthis.updateDirtyStatus();\n\t}\n};\n\nSyncer.prototype.triggerTimeout = function(interval) {\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},interval || self.taskTimerInterval);\n\t}\n};\n\n/*\nChoose the next sync task. We prioritise saves, then deletes, then loads from the server\n\nReturns either a task object, null if there's no upcoming tasks, or the boolean true if there are pending tasks that aren't yet due\n*/\nSyncer.prototype.chooseNextTask = function() {\n\tvar thresholdLastSaved = (new Date()) - this.throttleInterval,\n\t\thavePending = null;\n\t// First we look for tiddlers that have been modified locally and need saving back to the server\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title),\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(tiddler) {\n\t\t\t// If the tiddler is not known on the server, or has been modified locally no more recently than the threshold then it needs to be saved to the server\n\t\t\tvar hasChanged = !tiddlerInfo || this.wiki.getChangeCount(title) > tiddlerInfo.changeCount,\n\t\t\t\tisReadyToSave = !tiddlerInfo || !tiddlerInfo.timestampLastSaved || tiddlerInfo.timestampLastSaved < thresholdLastSaved;\n\t\t\tif(hasChanged) {\n\t\t\t\tif(isReadyToSave) {\n\t\t\t\t\treturn new SaveTiddlerTask(this,title);\n\t\t\t\t} else {\n\t\t\t\t\thavePending = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Second, we check tiddlers that are known from the server but not currently in the store, and so need deleting on the server\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\ttitle = titles[index];\n\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\treturn new DeleteTiddlerTask(this,title);\n\t\t}\n\t}\n\t// Check for tiddlers that need loading\n\ttitle = Object.keys(this.titlesToBeLoaded)[0];\n\tif(title) {\n\t\tdelete this.titlesToBeLoaded[title];\n\t\treturn new LoadTiddlerTask(this,title);\n\t}\n\t// No tasks are ready\n\treturn havePending;\n};\n\nfunction SaveTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"save\";\n}\n\nSaveTiddlerTask.prototype.run = function(callback) {\n\tvar self = this,\n\t\tchangeCount = this.syncer.wiki.getChangeCount(this.title),\n\t\ttiddler = this.syncer.wiki.tiddlerExists(this.title) && this.syncer.wiki.getTiddler(this.title);\n\tthis.syncer.logger.log(\"Dispatching 'save' task:\",this.title);\n\tif(tiddler) {\n\t\tthis.syncer.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) {\n\t\t\t// If there's an error, exit without changing any internal state\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Adjust the info stored about this tiddler\n\t\t\tself.syncer.tiddlerInfo[self.title] = {\n\t\t\t\tchangeCount: changeCount,\n\t\t\t\tadaptorInfo: adaptorInfo,\n\t\t\t\trevision: revision,\n\t\t\t\ttimestampLastSaved: new Date()\n\t\t\t};\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t},{\n\t\t\ttiddlerInfo: self.syncer.tiddlerInfo[self.title]\n\t\t});\n\t} else {\n\t\tthis.syncer.logger.log(\" Not Dispatching 'save' task:\",this.title,\"tiddler does not exist\");\n\t\t$tw.utils.nextTick(callback(null));\n\t}\n};\n\nfunction DeleteTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"delete\";\n}\n\nDeleteTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'delete' task:\",this.title);\n\tthis.syncer.syncadaptor.deleteTiddler(this.title,function(err) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Remove the info stored about this tiddler\n\t\tdelete self.syncer.tiddlerInfo[self.title];\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t},{\n\t\ttiddlerInfo: self.syncer.tiddlerInfo[this.title]\n\t});\n};\n\nfunction LoadTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"load\";\n}\n\nLoadTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'load' task:\",this.title);\n\tthis.syncer.syncadaptor.loadTiddler(this.title,function(err,tiddlerFields) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Update the info stored about this tiddler\n\t\tif(tiddlerFields) {\n\t\t\tself.syncer.storeTiddler(tiddlerFields);\n\t\t}\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t});\n};\n\nexports.Syncer = Syncer;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/tiddler.js": {
            "title": "$:/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 the value of a field as a list\n*/\nexports.getFieldList = 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\treturn $tw.utils.parseStringArray(value);\n};\n\n/*\nGet all the fields as a hashmap of strings. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStrings = 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[field] = this.getFieldString(field);\n\t\t\t}\n\t\t}\n\t}\n\treturn fields;\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\t\tfields = Object.keys(this.fields).sort(),\n\t\tresult = [];\n\tfor(var t=0; t<fields.length; t++) {\n\t\tvar field = fields[t];\n\t\tif(exclude.indexOf(field) === -1) {\n\t\t\tresult.push(field + \": \" + this.getFieldString(field));\n\t\t}\n\t}\n\treturn result.join(\"\\n\");\n};\n\nexports.getFieldDay = function(field) {\n\tif(this.cache && this.cache.day && $tw.utils.hop(this.cache.day,field) ) {\n\t\treturn this.cache.day[field];\n\t}\n\tvar day = \"\";\n\tif(this.fields[field]) {\n\t\tday = (new Date($tw.utils.parseDate(this.fields[field]))).setHours(0,0,0,0);\n\t}\n\tthis.cache.day = this.cache.day || {};\n\tthis.cache.day[field] = day;\n\treturn day;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "tiddlermethod"
        },
        "$:/core/modules/upgraders/plugins.js": {
            "title": "$:/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\"]) {\n\t\t\t// Check whether the plugin contains JS modules\n\t\t\tvar requiresReload = wiki.doesPluginInfoRequireReload(JSON.parse(incomingTiddler.text)) ? (wiki.getTiddlerText(\"$:/language/ControlPanel/Plugins/PluginWillRequireReload\") + \" \") : \"\";\n\t\t\tmessages[title] = requiresReload;\n\t\t\tif(incomingTiddler.version) {\n\t\t\t\t// Upgrade the incoming plugin if it is in the upgrade library\n\t\t\t\tvar libraryTiddler = getLibraryTiddler(title);\n\t\t\t\tif(libraryTiddler && libraryTiddler[\"plugin-type\"] && libraryTiddler.version) {\n\t\t\t\t\ttiddlers[title] = libraryTiddler;\n\t\t\t\t\tmessages[title] = requiresReload + $tw.language.getString(\"Import/Upgrader/Plugins/Upgraded\",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Suppress the incoming plugin if it is older than the currently installed one\n\t\t\t\tvar existingTiddler = wiki.getTiddler(title);\n\t\t\t\tif(existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t\t\t\t// Reject the incoming plugin by blanking all its fields\n\t\t\t\t\tif($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) {\n\t\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\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\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\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",
            "type": "application/javascript",
            "module-type": "upgrader"
        },
        "$:/core/modules/upgraders/system.js": {
            "title": "$:/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/\",\"$:/Import\"],\n\tWARN_IMPORT_PREFIX_LIST = [\"$:/core/modules/\"];\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tshowAlert = false;\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\tfor(var t=0; t<WARN_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = WARN_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix && wiki.isShadowTiddler(title)) {\n\t\t\t\t\tshowAlert = true;\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Warning\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tif(showAlert) {\n\t\tvar logger = new $tw.utils.Logger(\"import\");\n\t\tlogger.alert($tw.language.getString(\"Import/Upgrader/System/Alert\"));\n\t}\n\treturn messages;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "upgrader"
        },
        "$:/core/modules/upgraders/themetweaks.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "upgrader"
        },
        "$:/core/modules/utils/base64-utf8/base64-utf8.module.js": {
            "text": "(function(){// From https://gist.github.com/Nijikokun/5192472\n//\n// UTF8 Module\n//\n// Cleaner and modularized utf-8 encoding and decoding library for javascript.\n//\n// copyright: MIT\n// author: Nijiko Yonskai, @nijikokun, nijikokun@gmail.com\n!function(r,e,o,t){void 0!==o.module&&o.module.exports?o.module.exports=e.apply(o):void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"utf8\",[],e):o.utf8=e.apply(o)}(0,function(){return{encode:function(r){if(\"string\"!=typeof r)return r;r=r.replace(/\\r\\n/g,\"\\n\");for(var e,o=\"\",t=0;t<r.length;t++)if((e=r.charCodeAt(t))<128)o+=String.fromCharCode(e);else if(e>127&&e<2048)o+=String.fromCharCode(e>>6|192),o+=String.fromCharCode(63&e|128);else if(e>55295&&e<57344&&r.length>t+1){var i=e,n=r.charCodeAt(t+1);t++;var d=65536+(i-55296<<10|n-56320);o+=String.fromCharCode(d>>18|240),o+=String.fromCharCode(d>>12&63|128),o+=String.fromCharCode(d>>6&63|128),o+=String.fromCharCode(63&d|128)}else o+=String.fromCharCode(e>>12|224),o+=String.fromCharCode(e>>6&63|128),o+=String.fromCharCode(63&e|128);return o},decode:function(r){if(\"string\"!=typeof r)return r;for(var e=\"\",o=0,t=0;o<r.length;)if((t=r.charCodeAt(o))<128)e+=String.fromCharCode(t),o++;else if(t>191&&t<224)e+=String.fromCharCode((31&t)<<6|63&r.charCodeAt(o+1)),o+=2;else if(t>223&&t<240)e+=String.fromCharCode((15&t)<<12|(63&r.charCodeAt(o+1))<<6|63&r.charCodeAt(o+2)),o+=3;else{var i=(7&t)<<18|(63&r.charCodeAt(o+1))<<12|(63&r.charCodeAt(o+2))<<6|63&r.charCodeAt(o+3);e+=String.fromCharCode(55296+(i-65536>>10))+String.fromCharCode(56320+(i-65536&1023)),o+=4}return e}}},this),function(r,e,o,t){if(void 0!==o.module&&o.module.exports){if(t&&o.require)for(var i=0;i<t.length;i++)o[t[i]]=o.require(t[i]);o.module.exports=e.apply(o)}else void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"base64\",t||[],e):o.base64=e.apply(o)}(0,function(r){var e=r||this.utf8,o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";return{encode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=e.encode(r);for(var t,i,n,d,f,a,h,C=\"\",c=0;c<r.length;)d=(t=r.charCodeAt(c++))>>2,f=(3&t)<<4|(i=r.charCodeAt(c++))>>4,a=(15&i)<<2|(n=r.charCodeAt(c++))>>6,h=63&n,isNaN(i)?a=h=64:isNaN(n)&&(h=64),C+=o.charAt(d)+o.charAt(f)+o.charAt(a)+o.charAt(h);return C},decode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=r.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");for(var t,i,n,d,f,a,h=\"\",C=0;C<r.length;)t=o.indexOf(r.charAt(C++))<<2|(d=o.indexOf(r.charAt(C++)))>>4,i=(15&d)<<4|(f=o.indexOf(r.charAt(C++)))>>2,n=(3&f)<<6|(a=o.indexOf(r.charAt(C++))),h+=String.fromCharCode(t),64!=f&&(h+=String.fromCharCode(i)),64!=a&&(h+=String.fromCharCode(n));return e.decode(h)}}},this,[\"utf8\"]);}).call(exports);",
            "type": "application/javascript",
            "title": "$:/core/modules/utils/base64-utf8/base64-utf8.module.js",
            "module-type": "library"
        },
        "$:/core/modules/utils/crypto.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/csv.js": {
            "title": "$:/core/modules/utils/csv.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/csv.js\ntype: application/javascript\nmodule-type: utils\n\nA barebones CSV parser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a CSV string with a header row and return an array of hashmaps.\n*/\nexports.parseCsvStringWithHeader = function(text,options) {\n\toptions = options || {};\n\tvar separator = options.separator || \",\",\n\t\trows = text.split(/\\r?\\n/mg).map(function(row) {\n\t\t\treturn $tw.utils.trim(row);\n\t\t}).filter(function(row) {\n\t\t\treturn row !== \"\";\n\t\t});\n\tif(rows.length < 1) {\n\t\treturn \"Missing header row\";\n\t}\n\tvar headings = rows[0].split(separator),\n\t\tresults = [];\n\tfor(var row=1; row<rows.length; row++) {\n\t\tvar columns = rows[row].split(separator),\n\t\t\tcolumnResult = Object.create(null);\n\t\tif(columns.length !== headings.length) {\n\t\t\treturn \"Malformed CSV row '\" + rows[row] + \"'\";\n\t\t}\n\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\tvar columnName = headings[column];\n\t\t\tcolumnResult[columnName] = $tw.utils.trim(columns[column] || \"\");\n\t\t}\n\t\tresults.push(columnResult);\t\t\t\n\t}\n\treturn results;\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/diff-match-patch/diff_match_patch.js": {
            "text": "(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=.5;this.Patch_Margin=4;this.Match_MaxBits=32}var DIFF_DELETE=-1,DIFF_INSERT=1,DIFF_EQUAL=0;\ndiff_match_patch.prototype.diff_main=function(a,b,c,d){\"undefined\"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error(\"Null input. (diff_main)\");if(a==b)return a?[[DIFF_EQUAL,a]]:[];\"undefined\"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);f=this.diff_commonSuffix(a,b);var g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,\nb,e,d);c&&a.unshift([DIFF_EQUAL,c]);g&&a.push([DIFF_EQUAL,g]);this.diff_cleanupMerge(a);return a};\ndiff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[DIFF_INSERT,b]];if(!b)return[[DIFF_DELETE,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[DIFF_INSERT,e.substring(0,g)],[DIFF_EQUAL,f],[DIFF_INSERT,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=DIFF_DELETE),c):1==f.length?[[DIFF_DELETE,a],[DIFF_INSERT,b]]:(e=this.diff_halfMatch_(a,b))?(b=e[1],f=e[3],a=e[4],e=this.diff_main(e[0],e[2],c,d),c=this.diff_main(b,f,c,d),e.concat([[DIFF_EQUAL,\na]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a,b,d):this.diff_bisect_(a,b,d)};\ndiff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b);a=d.chars1;b=d.chars2;d=d.lineArray;a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([DIFF_EQUAL,\"\"]);for(var e=d=b=0,f=\"\",g=\"\";b<a.length;){switch(a[b][0]){case DIFF_INSERT:e++;g+=a[b][1];break;case DIFF_DELETE:d++;f+=a[b][1];break;case DIFF_EQUAL:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=\nd.length}d=e=0;g=f=\"\"}b++}a.pop();return a};\ndiff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=2*f,h=Array(g),l=Array(g),k=0;k<g;k++)h[k]=-1,l[k]=-1;h[f+1]=0;l[f+1]=0;k=d-e;for(var m=0!=k%2,p=0,x=0,w=0,q=0,t=0;t<f&&!((new Date).getTime()>c);t++){for(var v=-t+p;v<=t-x;v+=2){var n=f+v;var r=v==-t||v!=t&&h[n-1]<h[n+1]?h[n+1]:h[n-1]+1;for(var y=r-v;r<d&&y<e&&a.charAt(r)==b.charAt(y);)r++,y++;h[n]=r;if(r>d)x+=2;else if(y>e)p+=2;else if(m&&(n=f+k-v,0<=n&&n<g&&-1!=l[n])){var u=d-l[n];if(r>=\nu)return this.diff_bisectSplit_(a,b,r,y,c)}}for(v=-t+w;v<=t-q;v+=2){n=f+v;u=v==-t||v!=t&&l[n-1]<l[n+1]?l[n+1]:l[n-1]+1;for(r=u-v;u<d&&r<e&&a.charAt(d-u-1)==b.charAt(e-r-1);)u++,r++;l[n]=u;if(u>d)q+=2;else if(r>e)w+=2;else if(!m&&(n=f+k-v,0<=n&&n<g&&-1!=h[n]&&(r=h[n],y=f+r-n,u=d-u,r>=u)))return this.diff_bisectSplit_(a,b,r,y,c)}}return[[DIFF_DELETE,a],[DIFF_INSERT,b]]};\ndiff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};\ndiff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b=\"\",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf(\"\\n\",c);-1==f&&(f=a.length-1);var h=a.substring(c,f+1);c=f+1;(e.hasOwnProperty?e.hasOwnProperty(h):void 0!==e[h])?b+=String.fromCharCode(e[h]):(b+=String.fromCharCode(g),e[h]=g,d[g++]=h)}return b}var d=[],e={};d[0]=\"\";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}};\ndiff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join(\"\")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;d=0;for(var e=1;;){var f=a.substring(c-e);f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}};\ndiff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g=\"\",h,k,l,m;-1!=(e=b.indexOf(d,e+1));){var p=f.diff_commonPrefix(a.substring(c),b.substring(e)),u=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<u+p&&(g=b.substring(e-u,e)+b.substring(e,e+p),h=a.substring(0,c-u),k=a.substring(c+p),l=b.substring(0,e-u),m=b.substring(e+p))}return 2*g.length>=a.length?[h,k,l,m,g]:null}if(0>=this.Diff_Timeout)return null;\nvar d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4));d=c(d,e,Math.ceil(d.length/2));if(g||d)g=d?g?g[4].length>d[4].length?g:d:d:g;else return null;if(a.length>b.length){d=g[0];e=g[1];var h=g[2];var l=g[3]}else h=g[0],l=g[1],d=g[2],e=g[3];return[d,e,h,l,g[4]]};\ndiff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,l=0,k=0;f<a.length;)a[f][0]==DIFF_EQUAL?(c[d++]=f,g=l,h=k,k=l=0,e=a[f][1]):(a[f][0]==DIFF_INSERT?l+=a[f][1].length:k+=a[f][1].length,e&&e.length<=Math.max(g,h)&&e.length<=Math.max(l,k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,d--,f=0<d?c[d-1]:-1,k=l=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(a[f-1][0]==\nDIFF_DELETE&&a[f][0]==DIFF_INSERT){b=a[f-1][1];c=a[f][1];d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[DIFF_EQUAL,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[DIFF_EQUAL,b.substring(0,e)]),a[f-1][0]=DIFF_INSERT,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=DIFF_DELETE,a[f+1][1]=b.substring(e),f++;f++}f++}};\ndiff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_);c=g&&c.match(diff_match_patch.linebreakRegex_);d=h&&d.match(diff_match_patch.linebreakRegex_);var k=c&&a.match(diff_match_patch.blanklineEndRegex_),l=d&&b.match(diff_match_patch.blanklineStartRegex_);\nreturn k||l?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(a[c-1][0]==DIFF_EQUAL&&a[c+1][0]==DIFF_EQUAL){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g){var h=e.substring(e.length-g);d=d.substring(0,d.length-g);e=h+e.substring(0,e.length-g);f=h+f}g=d;h=e;for(var l=f,k=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){d+=e.charAt(0);e=e.substring(1)+f.charAt(0);f=f.substring(1);var m=b(d,e)+b(e,f);m>=k&&(k=m,g=d,h=e,l=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-\n1,1),c--),a[c][1]=h,l?a[c+1][1]=l:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\\s/;diff_match_patch.linebreakRegex_=/[\\r\\n]/;diff_match_patch.blanklineEndRegex_=/\\n\\r?\\n$/;diff_match_patch.blanklineStartRegex_=/^\\r?\\n\\r?\\n/;\ndiff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,l=!1,k=!1;f<a.length;)a[f][0]==DIFF_EQUAL?(a[f][1].length<this.Diff_EditCost&&(l||k)?(c[d++]=f,g=l,h=k,e=a[f][1]):(d=0,e=null),l=k=!1):(a[f][0]==DIFF_DELETE?k=!0:l=!0,e&&(g&&h&&l&&k||e.length<this.Diff_EditCost/2&&3==g+h+l+k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,e=null,g&&h?(l=k=!0,d=0):(d--,f=0<d?c[d-1]:-1,l=k=!1),b=!0)),f++;b&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([DIFF_EQUAL,\"\"]);for(var b=0,c=0,d=0,e=\"\",f=\"\",g;b<a.length;)switch(a[b][0]){case DIFF_INSERT:d++;f+=a[b][1];b++;break;case DIFF_DELETE:c++;e+=a[b][1];b++;break;case DIFF_EQUAL:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&a[b-c-d-1][0]==DIFF_EQUAL?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[DIFF_EQUAL,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-\ng)+a[b][1],f=f.substring(0,f.length-g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[DIFF_INSERT,f]):0===d?a.splice(b-c,c+d,[DIFF_DELETE,e]):a.splice(b-c-d,c+d,[DIFF_DELETE,e],[DIFF_INSERT,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&a[b-1][0]==DIFF_EQUAL?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=\"\"}\"\"===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)a[b-1][0]==DIFF_EQUAL&&a[b+1][0]==DIFF_EQUAL&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,\na[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0,a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){a[g][0]!==DIFF_INSERT&&(c+=a[g][1].length);a[g][0]!==DIFF_DELETE&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&a[g][0]===DIFF_DELETE?f:f+(b-e)};\ndiff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\\n/g,g=0;g<a.length;g++){var h=a[g][0],l=a[g][1].replace(c,\"&amp;\").replace(d,\"&lt;\").replace(e,\"&gt;\").replace(f,\"&para;<br>\");switch(h){case DIFF_INSERT:b[g]='<ins style=\"background:#e6ffe6;\">'+l+\"</ins>\";break;case DIFF_DELETE:b[g]='<del style=\"background:#ffe6e6;\">'+l+\"</del>\";break;case DIFF_EQUAL:b[g]=\"<span>\"+l+\"</span>\"}}return b.join(\"\")};\ndiff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_INSERT&&(b[c]=a[c][1]);return b.join(\"\")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_DELETE&&(b[c]=a[c][1]);return b.join(\"\")};\ndiff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][1];switch(a[e][0]){case DIFF_INSERT:c+=f.length;break;case DIFF_DELETE:d+=f.length;break;case DIFF_EQUAL:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)};\ndiff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case DIFF_INSERT:b[c]=\"+\"+encodeURI(a[c][1]);break;case DIFF_DELETE:b[c]=\"-\"+a[c][1].length;break;case DIFF_EQUAL:b[c]=\"=\"+a[c][1].length}return b.join(\"\\t\").replace(/%20/g,\" \")};\ndiff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case \"+\":try{c[d++]=[DIFF_INSERT,decodeURI(h)]}catch(k){throw Error(\"Illegal escape in diff_fromDelta: \"+h);}break;case \"-\":case \"=\":var l=parseInt(h,10);if(isNaN(l)||0>l)throw Error(\"Invalid number in diff_fromDelta: \"+h);h=a.substring(e,e+=l);\"=\"==f[g].charAt(0)?c[d++]=[DIFF_EQUAL,h]:c[d++]=[DIFF_DELETE,h];break;default:if(f[g])throw Error(\"Invalid diff operation in diff_fromDelta: \"+\nf[g]);}}if(e!=a.length)throw Error(\"Delta length (\"+e+\") does not equal source text length (\"+a.length+\").\");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error(\"Null input. (match_main)\");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};\ndiff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return f.Match_Distance?e+g/f.Match_Distance:g?1:e}if(b.length>this.Match_MaxBits)throw Error(\"Pattern too long for this browser.\");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));var l=1<<b.length-1;h=-1;for(var k,m,p=b.length+a.length,x,w=0;w<b.length;w++){k=0;for(m=p;k<m;)d(w,\nc+m)<=g?k=m:p=m,m=Math.floor((p-k)/2+k);p=m;k=Math.max(1,c-m+1);var q=Math.min(c+m,a.length)+b.length;m=Array(q+2);for(m[q+1]=(1<<w)-1;q>=k;q--){var t=e[a.charAt(q-1)];m[q]=0===w?(m[q+1]<<1|1)&t:(m[q+1]<<1|1)&t|(x[q+1]|x[q])<<1|1|x[q+1];if(m[q]&l&&(t=d(w,q-1),t<=g))if(g=t,h=q-1,h>c)k=Math.max(1,2*c-h);else break}if(d(w+1,c)>g)break;x=m}return h};\ndiff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b};\ndiff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([DIFF_EQUAL,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([DIFF_EQUAL,d]);a.start1-=c.length;a.start2-=\nc.length;a.length1+=c.length+d.length;a.length2+=c.length+d.length}};\ndiff_match_patch.prototype.patch_make=function(a,b,c){if(\"string\"==typeof a&&\"string\"==typeof b&&\"undefined\"==typeof c){var d=a;b=this.diff_main(d,b,!0);2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b))}else if(a&&\"object\"==typeof a&&\"undefined\"==typeof b&&\"undefined\"==typeof c)b=a,d=this.diff_text1(b);else if(\"string\"==typeof a&&b&&\"object\"==typeof b&&\"undefined\"==typeof c)d=a;else if(\"string\"==typeof a&&\"string\"==typeof b&&c&&\"object\"==typeof c)d=a,b=c;else throw Error(\"Unknown call format to patch_make.\");\nif(0===b.length)return[];c=[];a=new diff_match_patch.patch_obj;for(var e=0,f=0,g=0,h=d,l=0;l<b.length;l++){var k=b[l][0],m=b[l][1];e||k===DIFF_EQUAL||(a.start1=f,a.start2=g);switch(k){case DIFF_INSERT:a.diffs[e++]=b[l];a.length2+=m.length;d=d.substring(0,g)+m+d.substring(g);break;case DIFF_DELETE:a.length1+=m.length;a.diffs[e++]=b[l];d=d.substring(0,g)+d.substring(g+m.length);break;case DIFF_EQUAL:m.length<=2*this.Patch_Margin&&e&&b.length!=l+1?(a.diffs[e++]=b[l],a.length1+=m.length,a.length2+=m.length):\nm.length>=2*this.Patch_Margin&&e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}k!==DIFF_INSERT&&(f+=m.length);k!==DIFF_DELETE&&(g+=m.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};\ndiff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b};\ndiff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];a=this.patch_deepCopy(a);var c=this.patch_addPadding(a);b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),l=-1;if(h.length>this.Match_MaxBits){var k=this.match_main(b,h.substring(0,this.Match_MaxBits),g);-1!=k&&(l=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==l||k>=l)&&(k=-1)}else k=this.match_main(b,h,\ng);if(-1==k)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=k-g,g=-1==l?b.substring(k,k+h.length):b.substring(k,l+this.Match_MaxBits),h==g)b=b.substring(0,k)+this.diff_text2(a[f].diffs)+b.substring(k+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);h=0;var m;for(l=0;l<a[f].diffs.length;l++){var p=a[f].diffs[l];p[0]!==DIFF_EQUAL&&(m=this.diff_xIndex(g,h));p[0]===\nDIFF_INSERT?b=b.substring(0,k+m)+p[1]+b.substring(k+m):p[0]===DIFF_DELETE&&(b=b.substring(0,k+m)+b.substring(k+this.diff_xIndex(g,h+p[1].length)));p[0]!==DIFF_DELETE&&(h+=p[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]};\ndiff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c=\"\",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;d=a[0];var e=d.diffs;if(0==e.length||e[0][0]!=DIFF_EQUAL)e.unshift([DIFF_EQUAL,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||e[e.length-\n1][0]!=DIFF_EQUAL?(e.push([DIFF_EQUAL,c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};\ndiff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g=\"\";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,l=!0;h.start1=e-g.length;h.start2=f-g.length;\"\"!==g&&(h.length1=h.length2=g.length,h.diffs.push([DIFF_EQUAL,g]));for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){g=d.diffs[0][0];var k=d.diffs[0][1];g===DIFF_INSERT?(h.length2+=k.length,f+=k.length,h.diffs.push(d.diffs.shift()),\nl=!1):g===DIFF_DELETE&&1==h.diffs.length&&h.diffs[0][0]==DIFF_EQUAL&&k.length>2*b?(h.length1+=k.length,e+=k.length,l=!1,h.diffs.push([g,k]),d.diffs.shift()):(k=k.substring(0,b-h.length1-this.Patch_Margin),h.length1+=k.length,e+=k.length,g===DIFF_EQUAL?(h.length2+=k.length,f+=k.length):l=!1,h.diffs.push([g,k]),k==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(k.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);k=this.diff_text1(d.diffs).substring(0,\nthis.Patch_Margin);\"\"!==k&&(h.length1+=k.length,h.length2+=k.length,0!==h.diffs.length&&h.diffs[h.diffs.length-1][0]===DIFF_EQUAL?h.diffs[h.diffs.length-1][1]+=k:h.diffs.push([DIFF_EQUAL,k]));l||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join(\"\")};\ndiff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;a=a.split(\"\\n\");for(var c=0,d=/^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error(\"Invalid patch string: \"+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);\"\"===e[2]?(f.start1--,f.length1=1):\"0\"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);\"\"===e[4]?(f.start2--,f.length2=1):\"0\"==e[4]?f.length2=0:(f.start2--,f.length2=\nparseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error(\"Illegal escape in patch_fromText: \"+g);}if(\"-\"==e)f.diffs.push([DIFF_DELETE,g]);else if(\"+\"==e)f.diffs.push([DIFF_INSERT,g]);else if(\" \"==e)f.diffs.push([DIFF_EQUAL,g]);else if(\"@\"==e)break;else if(\"\"!==e)throw Error('Invalid patch mode \"'+e+'\" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0};\ndiff_match_patch.patch_obj.prototype.toString=function(){for(var a=[\"@@ -\"+(0===this.length1?this.start1+\",0\":1==this.length1?this.start1+1:this.start1+1+\",\"+this.length1)+\" +\"+(0===this.length2?this.start2+\",0\":1==this.length2?this.start2+1:this.start2+1+\",\"+this.length2)+\" @@\\n\"],b,c=0;c<this.diffs.length;c++){switch(this.diffs[c][0]){case DIFF_INSERT:b=\"+\";break;case DIFF_DELETE:b=\"-\";break;case DIFF_EQUAL:b=\" \"}a[c+1]=b+encodeURI(this.diffs[c][1])+\"\\n\"}return a.join(\"\").replace(/%20/g,\" \")};\nthis.diff_match_patch=diff_match_patch;this.DIFF_DELETE=DIFF_DELETE;this.DIFF_INSERT=DIFF_INSERT;this.DIFF_EQUAL=DIFF_EQUAL;\n}).call(exports);",
            "type": "application/javascript",
            "title": "$:/core/modules/utils/diff-match-patch/diff_match_patch.js",
            "module-type": "library"
        },
        "$:/core/modules/utils/dom/animations/slide.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "animation"
        },
        "$:/core/modules/utils/dom/animator.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/browser.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/csscolorparser.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom.js": {
            "title": "$:/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.hasAttribute && el.hasAttribute(\"class\") && el.getAttribute(\"class\").split(\" \").indexOf(className) !== -1;\n};\n\nexports.addClass = function(el,className) {\n\tvar c = (el.getAttribute(\"class\") || \"\").split(\" \");\n\tif(c.indexOf(className) === -1) {\n\t\tc.push(className);\n\t\tel.setAttribute(\"class\",c.join(\" \"));\n\t}\n};\n\nexports.removeClass = function(el,className) {\n\tvar c = (el.getAttribute(\"class\") || \"\").split(\" \"),\n\t\tp = c.indexOf(className);\n\tif(p !== -1) {\n\t\tc.splice(p,1);\n\t\tel.setAttribute(\"class\",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 first parent element that has scrollbars or use the body as fallback.\n*/\nexports.getScrollContainer = function(el) {\n\tvar doc = el.ownerDocument;\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 doc.body;\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(srcWindow) {\n\tvar scrollWindow = srcWindow || window;\n\tif(\"scrollX\" in scrollWindow) {\n\t\treturn {x: scrollWindow.scrollX, y: scrollWindow.scrollY};\n\t} else {\n\t\treturn {x: scrollWindow.document.documentElement.scrollLeft, y: scrollWindow.document.documentElement.scrollTop};\n\t}\n};\n\n/*\nAdjust the height of a textarea to fit its content, preserving scroll position, and return the height\n*/\nexports.resizeTextAreaToFit = function(domNode,minHeight) {\n\t// Get the scroll container and register the current scroll position\n\tvar container = $tw.utils.getScrollContainer(domNode),\n\t\tscrollTop = container.scrollTop;\n    // Measure the specified minimum height\n\tdomNode.style.height = minHeight;\n\tvar measuredHeight = domNode.offsetHeight || parseInt(minHeight,10);\n\t// Set its height to auto so that it snaps to the correct height\n\tdomNode.style.height = \"auto\";\n\t// Calculate the revised height\n\tvar newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,measuredHeight);\n\t// Only try to change the height if it has changed\n\tif(newHeight !== domNode.offsetHeight) {\n\t\tdomNode.style.height = newHeight + \"px\";\n\t\t// Make sure that the dimensions of the textarea are recalculated\n\t\t$tw.utils.forceLayout(domNode);\n\t\t// Set the container to the position we registered at the beginning\n\t\tcontainer.scrollTop = scrollTop;\n\t}\n\treturn newHeight;\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(element.ownerDocument.defaultView),\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\tvar done = false;\n\ttry {\n\t\twindow.localStorage.setItem(\"tw5-password-\" + name,password);\n\t\tdone = true;\n\t} catch(e) {\n\t}\n\tif(!done) {\n\t\t$tw.savedPasswords = $tw.savedPasswords || Object.create(null);\n\t\t$tw.savedPasswords[name] = password;\n\t}\n};\n\n/*\nRetrieve a named password from the browser\n*/\nexports.getPassword = function(name) {\n\tvar value;\n\ttry {\n\t\tvalue = window.localStorage.getItem(\"tw5-password-\" + name);\n\t} catch(e) {\n\t}\n\tif(value !== undefined) {\n\t\treturn value;\n\t} else {\n\t\treturn ($tw.savedPasswords || Object.create(null))[name] || \"\";\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/*\nGet the computed styles applied to an element as an array of strings of individual CSS properties\n*/\nexports.getComputedStyles = function(domNode) {\n\tvar textAreaStyles = window.getComputedStyle(domNode,null),\n\t\tstyleDefs = [],\n\t\tname;\n\tfor(var t=0; t<textAreaStyles.length; t++) {\n\t\tname = textAreaStyles[t];\n\t\tstyleDefs.push(name + \": \" + textAreaStyles.getPropertyValue(name) + \";\");\n\t}\n\treturn styleDefs;\n};\n\n/*\nApply a set of styles passed as an array of strings of individual CSS properties\n*/\nexports.setStyles = function(domNode,styleDefs) {\n\tdomNode.style.cssText = styleDefs.join(\"\");\n};\n\n/*\nCopy the computed styles from a source element to a destination element\n*/\nexports.copyStyles = function(srcDomNode,dstDomNode) {\n\t$tw.utils.setStyles(dstDomNode,$tw.utils.getComputedStyles(srcDomNode));\n};\n\n/*\nCopy plain text to the clipboard on browsers that support it\n*/\nexports.copyToClipboard = function(text,options) {\n\toptions = options || {};\n\tvar textArea = document.createElement(\"textarea\");\n\ttextArea.style.position = \"fixed\";\n\ttextArea.style.top = 0;\n\ttextArea.style.left = 0;\n\ttextArea.style.fontSize = \"12pt\";\n\ttextArea.style.width = \"2em\";\n\ttextArea.style.height = \"2em\";\n\ttextArea.style.padding = 0;\n\ttextArea.style.border = \"none\";\n\ttextArea.style.outline = \"none\";\n\ttextArea.style.boxShadow = \"none\";\n\ttextArea.style.background = \"transparent\";\n\ttextArea.value = text;\n\tdocument.body.appendChild(textArea);\n\ttextArea.select();\n\ttextArea.setSelectionRange(0,text.length);\n\tvar succeeded = false;\n\ttry {\n\t\tsucceeded = document.execCommand(\"copy\");\n\t} catch (err) {\n\t}\n\tif(!options.doNotNotify) {\n\t\t$tw.notifier.display(succeeded ? \"$:/language/Notifications/CopiedToClipboard/Succeeded\" : \"$:/language/Notifications/CopiedToClipboard/Failed\");\n\t}\n\tdocument.body.removeChild(textArea);\n};\n\nexports.getLocationPath = function() {\n\treturn window.location.toString().split(\"#\")[0];\n};\n\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/dragndrop.js": {
            "title": "$:/core/modules/utils/dom/dragndrop.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/dragndrop.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser data transfer utilities, used with the clipboard and drag and drop\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOptions:\n\ndomNode: dom node to make draggable\ndragImageType: \"pill\" or \"dom\"\ndragTiddlerFn: optional function to retrieve the title of tiddler to drag\ndragFilterFn: optional function to retreive the filter defining a list of tiddlers to drag\nwidget: widget to use as the contect for the filter\n*/\nexports.makeDraggable = function(options) {\n\tvar dragImageType = options.dragImageType || \"dom\",\n\t\tdragImage,\n\t\tdomNode = options.domNode;\n\t// Make the dom node draggable (not necessary for anchor tags)\n\tif((domNode.tagName || \"\").toLowerCase() !== \"a\") {\n\t\tdomNode.setAttribute(\"draggable\",\"true\");\t\t\n\t}\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragstart\", handlerFunction: function(event) {\n\t\t\tif(event.dataTransfer === undefined) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Collect the tiddlers being dragged\n\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t    \tstartActions = options.startActions;\n\t\t\tif(dragFilter) {\n\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t}\n\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t// Check that we've something to drag\n\t\t\tif(titles.length > 0 && event.target === domNode) {\n\t\t\t\t// Mark the drag in progress\n\t\t\t\t$tw.dragInProgress = domNode;\n\t\t\t\t// Set the dragging class on the element being dragged\n\t\t\t\t$tw.utils.addClass(event.target,\"tc-dragging\");\n\t\t\t\t// Invoke drag-start actions if given\n\t\t\t\tif(startActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(startActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Create the drag image elements\n\t\t\t\tdragImage = options.widget.document.createElement(\"div\");\n\t\t\t\tdragImage.className = \"tc-tiddler-dragger\";\n\t\t\t\tvar inner = options.widget.document.createElement(\"div\");\n\t\t\t\tinner.className = \"tc-tiddler-dragger-inner\";\n\t\t\t\tinner.appendChild(options.widget.document.createTextNode(\n\t\t\t\t\ttitles.length === 1 ? \n\t\t\t\t\t\ttitles[0] :\n\t\t\t\t\t\ttitles.length + \" tiddlers\"\n\t\t\t\t));\n\t\t\t\tdragImage.appendChild(inner);\n\t\t\t\toptions.widget.document.body.appendChild(dragImage);\n\t\t\t\t// Set the data transfer properties\n\t\t\t\tvar dataTransfer = event.dataTransfer;\n\t\t\t\t// Set up the image\n\t\t\t\tdataTransfer.effectAllowed = \"all\";\n\t\t\t\tif(dataTransfer.setDragImage) {\n\t\t\t\t\tif(dragImageType === \"pill\") {\n\t\t\t\t\t\tdataTransfer.setDragImage(dragImage.firstChild,-16,-16);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar r = domNode.getBoundingClientRect();\n\t\t\t\t\t\tdataTransfer.setDragImage(domNode,event.clientX-r.left,event.clientY-r.top);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Set up the data transfer\n\t\t\t\tif(dataTransfer.clearData) {\n\t\t\t\t\tdataTransfer.clearData();\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tvar jsonData = [];\n\t\t\t\tif(titles.length > 1) {\n\t\t\t\t\ttitles.forEach(function(title) {\n\t\t\t\t\t\tjsonData.push(options.widget.wiki.getTiddlerAsJson(title));\n\t\t\t\t\t});\n\t\t\t\t\tjsonData = \"[\" + jsonData.join(\",\") + \"]\";\n\t\t\t\t} else {\n\t\t\t\t\tjsonData = options.widget.wiki.getTiddlerAsJson(titles[0]);\n\t\t\t\t}\n\t\t\t\t// IE doesn't like these content types\n\t\t\t\tif(!$tw.browser.isIE) {\n\t\t\t\t\tdataTransfer.setData(\"text/vnd.tiddler\",jsonData);\n\t\t\t\t\tdataTransfer.setData(\"text/plain\",titleString);\n\t\t\t\t\tdataTransfer.setData(\"text/x-moz-url\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\t}\n\t\t\t\tdataTransfer.setData(\"URL\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\tdataTransfer.setData(\"Text\",titleString);\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t\treturn false;\n\t\t}},\n\t\t{name: \"dragend\", handlerFunction: function(event) {\n\t\t\tif(event.target === domNode) {\n\t\t\t\t// Collect the tiddlers being dragged\n\t\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t    \t\tendActions = options.endActions;\n\t\t\t\tif(dragFilter) {\n\t\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t\t}\n\t\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t\t$tw.dragInProgress = null;\n\t\t\t\t// Invoke drag-end actions if given\n\t\t\t\tif(endActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(endActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Remove the dragging class on the element being dragged\n\t\t\t\t$tw.utils.removeClass(event.target,\"tc-dragging\");\n\t\t\t\t// Delete the drag image element\n\t\t\t\tif(dragImage) {\n\t\t\t\t\tdragImage.parentNode.removeChild(dragImage);\n\t\t\t\t\tdragImage = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}}\n\t]);\n};\n\nexports.importDataTransfer = function(dataTransfer,fallbackTitle,callback) {\n\t// Try each provided data type in turn\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Available data types:\");\n\t\tfor(var type=0; type<dataTransfer.types.length; type++) {\n\t\t\tconsole.log(\"type\",dataTransfer.types[type],dataTransfer.getData(dataTransfer.types[type]))\n\t\t}\n\t}\n\tfor(var t=0; t<importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || importDataTypes[t].IECompatible) {\n\t\t\t// Get the data\n\t\t\tvar dataType = 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.toTiddlerFieldsArray(data,fallbackTitle);\n\t\t\t\tcallback(tiddlerFields);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar importDataTypes = [\n\t{type: \"text/vnd.tiddler\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn parseJSONTiddlers(data,fallbackTitle);\n\t}},\n\t{type: \"URL\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\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 parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/x-moz-url\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\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 parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/html\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/plain\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"Text\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/uri-list\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}}\n];\n\nfunction parseJSONTiddlers(json,fallbackTitle) {\n\tvar data = JSON.parse(json);\n\tif(!$tw.utils.isArray(data)) {\n\t\tdata = [data];\n\t}\n\tdata.forEach(function(fields) {\n\t\tfields.title = fields.title || fallbackTitle;\n\t});\n\treturn data;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/http.js": {
            "title": "$:/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\theaders: hashmap of headers to send\n\ttype: GET, PUT, POST etc\n\tcallback: function invoked with (err,data,xhr)\n\treturnProp: string name of the property to return as first argument of callback\n*/\nexports.httpRequest = function(options) {\n\tvar type = options.type || \"GET\",\n\t\turl = options.url,\n\t\theaders = options.headers || {accept: \"application/json\"},\n\t\thasHeader = function(targetHeader) {\n\t\t\ttargetHeader = targetHeader.toLowerCase();\n\t\t\tvar result = false;\n\t\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\t\tif(headerTitle.toLowerCase() === targetHeader) {\n\t\t\t\t\tresult = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\treturnProp = options.returnProp || \"responseText\",\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\tif(type === \"GET\" || type === \"HEAD\") {\n\t\t\t\turl += \"?\" + results.join(\"&\");\n\t\t\t} else {\n\t\t\t\tdata = results.join(\"&\");\n\t\t\t}\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[returnProp],this);\n\t\t\t\treturn;\n\t\t\t}\n\t\t// Something went wrong\n\t\toptions.callback($tw.language.getString(\"Error/XMLHttpRequest\") + \": \" + this.status,null,this);\n\t\t}\n\t};\n\t// Make the request\n\trequest.open(type,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 && !hasHeader(\"Content-Type\")) {\n\t\trequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=UTF-8\");\n\t}\n\tif(!hasHeader(\"X-Requested-With\")) {\n\t\trequest.setRequestHeader(\"X-Requested-With\",\"TiddlyWiki\");\n\t}\n\ttry {\n\t\trequest.send(data);\n\t} catch(e) {\n\t\toptions.callback(e,null,this);\n\t}\n\treturn request;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/keyboard.js": {
            "title": "$:/core/modules/utils/dom/keyboard.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/keyboard.js\ntype: application/javascript\nmodule-type: utils\n\nKeyboard utilities; now deprecated. Instead, use $tw.keyboardManager\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n[\"parseKeyDescriptor\",\"checkKeyDescriptor\"].forEach(function(method) {\n\texports[method] = function() {\n\t\tif($tw.keyboardManager) {\n\t\t\treturn $tw.keyboardManager[method].apply($tw.keyboardManager,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\treturn null\n\t\t}\n\t};\n});\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/modal.js": {
            "title": "$:/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\");\nvar navigator = require(\"$:/core/modules/widgets/navigator.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\tthis.srcDocument = options.variables && (options.variables.rootwindow === \"true\" ||\n\t\t\t\toptions.variables.rootwindow === \"yes\") ? document :\n\t\t\t\t(options.event && options.event.event && options.event.event.target ? options.event.event.target.ownerDocument : document);\n\tthis.srcWindow = this.srcDocument.defaultView;\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({\n\t\t\tcurrentTiddler: title,\n\t\t\t\"tv-story-list\": (options.event && options.event.widget ? options.event.widget.getVariable(\"tv-story-list\") : \"\"),\n\t\t\t\"tv-history-list\": (options.event && options.event.widget ? options.event.widget.getVariable(\"tv-history-list\") : \"\")\n\t\t},options.variables);\n\n\t// Create the wrapper divs\n\tvar wrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalBackdrop = this.srcDocument.createElement(\"div\"),\n\t\tmodalWrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalHeader = this.srcDocument.createElement(\"div\"),\n\t\theaderTitle = this.srcDocument.createElement(\"h3\"),\n\t\tmodalBody = this.srcDocument.createElement(\"div\"),\n\t\tmodalLink = this.srcDocument.createElement(\"a\"),\n\t\tmodalFooter = this.srcDocument.createElement(\"div\"),\n\t\tmodalFooterHelp = this.srcDocument.createElement(\"span\"),\n\t\tmodalFooterButtons = this.srcDocument.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\tif(tiddler.fields && tiddler.fields.class) {\n\t\t$tw.utils.addClass(wrapper,tiddler.fields.class);\n\t}\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\tvar navigatorTree = {\n\t\t\"type\": \"navigator\",\n\t\t\"attributes\": {\n\t\t\t\"story\": {\n\t\t\t\t\"name\": \"story\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"value\": variables[\"tv-story-list\"]\n\t\t\t},\n\t\t\t\"history\": {\n\t\t\t\t\"name\": \"history\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"value\": variables[\"tv-history-list\"]\n\t\t\t}\n\t\t},\n\t\t\"tag\": \"$navigator\",\n\t\t\"isBlock\": true,\n\t\t\"children\": []\n\t};\n\tvar navigatorWidgetNode = new navigator.navigator(navigatorTree, {\n\t\twiki: this.wiki,\n\t\tdocument : this.srcDocument,\n\t\tparentWidget: $tw.rootWidget\n\t});\n\tnavigatorWidgetNode.render(modalBody,null);\n\t\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: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\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: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\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(this.srcDocument.createTextNode(\"Right-click to save changes\"));\n\t\tmodalBody.appendChild(modalLink);\n\t}\n\t// Render the footer of the message\n\tif(tiddler.fields && tiddler.fields.help) {\n\t\tvar link = this.srcDocument.createElement(\"a\");\n\t\tlink.setAttribute(\"href\",tiddler.fields.help);\n\t\tlink.setAttribute(\"target\",\"_blank\");\n\t\tlink.setAttribute(\"rel\",\"noopener noreferrer\");\n\t\tlink.appendChild(this.srcDocument.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: $tw.language.getString(\"Buttons/Close/Caption\")\n\t\t\t}}}\n\t\t]}],\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\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(\" + self.srcWindow.innerHeight + \"px)\"}\n\t\t]);\n\t\t// Set up an event for the transition end\n\t\tself.srcWindow.setTimeout(function() {\n\t\t\tif(wrapper.parentNode) {\n\t\t\t\t// Remove the modal message from the DOM\n\t\t\t\tself.srcDocument.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(\" + (-this.srcWindow.innerHeight) + \"px)\"}\n\t]);\n\t// Put the message into the document\n\tthis.srcDocument.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\tvar windowContainer = $tw.pageContainer ? ($tw.pageContainer === this.srcDocument.body.firstChild ? $tw.pageContainer : this.srcDocument.body.firstChild) : null;\n\tif(windowContainer) {\n\t\t$tw.utils.toggleClass(windowContainer,\"tc-modal-displayed\",this.modalCount > 0);\n\t}\n};\n\nexports.Modal = Modal;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/notifier.js": {
            "title": "$:/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,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables,\n\t\timportPageMacros: true});\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",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/popup.js": {
            "title": "$:/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 (one of domNode or domNodeRect is required)\n\tdomNodeRect: rectangle 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\tfloating: if true, skips registering the popup, meaning that it will need manually clearing\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\n\t// Store the popup details if not already there\n\tif(!options.floating && 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\tnoStateReference: options.noStateReference\n\t\t});\n\t}\n\t// Set the state tiddler\n\tvar rect;\n\tif(options.domNodeRect) {\n\t\trect = options.domNodeRect;\n\t} else {\n\t\trect = {\n\t\t\tleft: options.domNode.offsetLeft,\n\t\t\ttop: options.domNode.offsetTop,\n\t\t\twidth: options.domNode.offsetWidth,\n\t\t\theight: options.domNode.offsetHeight\n\t\t};\n\t}\n\tvar popupRect = \"(\" + rect.left + \",\" + rect.top + \",\" + \n\t\t\t\trect.width + \",\" + rect.height + \")\";\n\tif(options.noStateReference) {\n\t\toptions.wiki.setText(options.title,\"text\",undefined,popupRect);\n\t} else {\n\t\toptions.wiki.setTextReference(options.title,popupRect);\n\t}\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\tif(popup.noStateReference) {\n\t\t\t\tpopup.wiki.deleteTiddler(popup.title);\n\t\t\t} else {\n\t\t\t\tpopup.wiki.deleteTiddler($tw.utils.parseTextReference(popup.title).title);\n        \t\t}\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",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/scroller.js": {
            "title": "$:/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.isScrolling = function() {\n\treturn this.idRequestFrame !== null;\n}\n\nPageScroller.prototype.cancelScroll = function(srcWindow) {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(srcWindow,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\tif(event.paramObject && event.paramObject.selector) {\n\t\t\tthis.scrollSelectorIntoView(null,event.paramObject.selector);\n\t\t} else {\n\t\t\tthis.scrollIntoView(event.target);\t\t\t\n\t\t}\n\t\treturn false; // Event was handled\n\t}\n\treturn true;\n};\n\n/*\nHandle a scroll event hitting the page document\n*/\nPageScroller.prototype.scrollIntoView = function(element,callback) {\n\tvar self = this,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t    srcWindow = element ? element.ownerDocument.defaultView : window;\n\t// Now get ready to scroll the body\n\tthis.cancelScroll(srcWindow);\n\tthis.startTime = Date.now();\n\t// Get the height of any position:fixed toolbars\n\tvar toolbar = srcWindow.document.querySelector(\".tc-adjust-top-of-scroll\"),\n\t\toffset = 0;\n\tif(toolbar) {\n\t\toffset = toolbar.offsetHeight;\n\t}\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar getBounds = function() {\n\t\t\tvar clientBounds = typeof callback === 'function' ? callback() : element.getBoundingClientRect(),\n\t\t\t\tscrollPosition = $tw.utils.getScrollPosition(srcWindow);\n\t\t\treturn {\n\t\t\t\tleft: clientBounds.left + scrollPosition.x,\n\t\t\t\ttop: clientBounds.top + scrollPosition.y - offset,\n\t\t\t\twidth: clientBounds.width,\n\t\t\t\theight: clientBounds.height\n\t\t\t};\n\t\t},\n\t\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\t\t// targetPos/targetSize - position and size of the target element\n\t\t// currentPos/currentSize - position and size of the current scroll viewport\n\t\t// returns: new position of the scroll viewport\n\t\tgetEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\tvar newPos = targetPos;\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\tdrawFrame = function drawFrame() {\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(srcWindow);\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tvar scrollPosition = $tw.utils.getScrollPosition(srcWindow),\n\t\t\t\tbounds = getBounds(),\n\t\t\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,srcWindow.innerWidth),\n\t\t\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,srcWindow.innerHeight);\n\t\t\tsrcWindow.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(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\tdrawFrame();\n};\n\nPageScroller.prototype.scrollSelectorIntoView = function(baseElement,selector,callback) {\n\tbaseElement = baseElement || document.body;\n\tvar element = baseElement.querySelector(selector);\n\tif(element) {\n\t\tthis.scrollIntoView(element,callback);\t\t\n\t}\n};\n\nexports.PageScroller = PageScroller;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/edition-info.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "utils-node"
        },
        "$:/core/modules/utils/fakedom.js": {
            "title": "$:/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_Node = function (){\n\tthrow TypeError(\"Illegal constructor\");\n};\n\nObject.defineProperty(TW_Node.prototype, 'ELEMENT_NODE', {\n\tget: function() {\n\t\treturn 1;\n\t}\n});\n\nObject.defineProperty(TW_Node.prototype, 'TEXT_NODE', {\n\tget: function() {\n\t\treturn 3;\n\t}\n});\n\nvar TW_TextNode = function(text) {\n\tbumpSequenceNumber(this);\n\tthis.textContent = text + \"\";\n};\n\nTW_TextNode.prototype = Object.create(TW_Node.prototype);\n\nObject.defineProperty(TW_TextNode.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn this.TEXT_NODE;\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\nTW_Element.prototype = Object.create(TW_Node.prototype);\n\nObject.defineProperty(TW_Element.prototype, \"style\", {\n\tget: function() {\n\t\treturn this._style;\n\t},\n\tset: function(str) {\n\t\tvar self = this;\n\t\tstr = str || \"\";\n\t\t$tw.utils.each(str.split(\";\"),function(declaration) {\n\t\t\tvar parts = declaration.split(\":\"),\n\t\t\t\tname = $tw.utils.trim(parts[0]),\n\t\t\t\tvalue = $tw.utils.trim(parts[1]);\n\t\t\tif(name && value) {\n\t\t\t\tself._style[$tw.utils.convertStyleNameToPropertyName(name)] = value;\n\t\t\t}\n\t\t});\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn this.ELEMENT_NODE;\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($tw.utils.convertPropertyNameToStyleName(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\tthis.rawTextContent = null;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textInnerHTML\", {\n\tset: function(value) {\n\t\tif(this.isRaw) {\n\t\t\tthis.rawTextContent = value;\n\t\t} else {\n\t\t\tthrow \"Cannot set textInnerHTML of a non-raw TW_Element\";\n\t\t}\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tif(this.rawTextContent === null) {\n\t\t\t\treturn \"\";\n\t\t\t} else {\n\t\t\t\treturn this.rawTextContent;\n\t\t\t}\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\treturn \"\";\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",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/utils/filesystem.js": {
            "title": "$:/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/*\nReturn the subdirectories of a path\n*/\nexports.getSubdirectories = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn null;\n\t}\n\tvar subdirs = [];\n\t$tw.utils.each(fs.readdirSync(dirPath),function(item) {\n\t\tif($tw.utils.isDirectory(path.resolve(dirPath,item))) {\n\t\t\tsubdirs.push(item);\n\t\t}\n\t});\n\treturn subdirs;\n}\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 = path.resolve($tw.utils.removeTrailingSeparator(srcPath));\n\tdstPath = path.resolve($tw.utils.removeTrailingSeparator(dstPath));\n\t// Check that neither director is within the other\n\tif(srcPath.substring(0,dstPath.length) === dstPath || dstPath.substring(0,srcPath.length) === srcPath) {\n\t\treturn \"Cannot copy nested directories\";\n\t}\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 = Buffer.alloc(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/*\nRecursively delete a tree of empty directories\n*/\nexports.deleteEmptyDirs = function(dirpath,callback) {\n\tvar self = this;\n\tfs.readdir(dirpath,function(err,files) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\tif(files.length > 0) {\n\t\t\treturn callback(null);\n\t\t}\n\t\tfs.rmdir(dirpath,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.deleteEmptyDirs(path.dirname(dirpath),callback);\n\t\t});\n\t});\n};\n\n/*\nCreate a fileInfo object for saving a tiddler:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file on disk (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n\tisEditableFile: true if the tiddler was loaded via non-standard options & marked editable\nOptions include:\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\textFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters,\n\tfileInfo: an existing fileInfo to check against\n\toriginalpath: a preferred filepath if no pathFilters match\n*/\nexports.generateTiddlerFileInfo = function(tiddler,options) {\n\tvar fileInfo = {}, metaExt;\n\t// Propagate the isEditableFile flag\n\tif(options.fileInfo) {\n\t\tfileInfo.isEditableFile = options.fileInfo.isEditableFile || false;\n\t}\n\t// Check if the tiddler has any unsafe fields that can't be expressed in a .tid or .meta file: containing control characters, or leading/trailing whitespace\n\tvar hasUnsafeFields = false;\n\t$tw.utils.each(tiddler.getFieldStrings(),function(value,fieldName) {\n\t\tif(fieldName !== \"text\") {\n\t\t\thasUnsafeFields = hasUnsafeFields || /[\\x00-\\x1F]/mg.test(value);\n\t\t\thasUnsafeFields = hasUnsafeFields || ($tw.utils.trim(value) !== value);\n\t\t}\n\t});\n\t// Check for field values \n\tif(hasUnsafeFields) {\n\t\t// Save as a JSON file\n\t\tfileInfo.type = \"application/json\";\n\t\tfileInfo.hasMetaFile = false;\n\t} else {\n\t\t// Save as a .tid or a text/binary file plus a .meta file\n\t\tvar tiddlerType = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\tif(tiddlerType === \"text/vnd.tiddlywiki\") {\n\t\t\t// Save as a .tid file\n\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\tfileInfo.hasMetaFile = false;\n\t\t} else {\n\t\t\t// Save as a text/binary file and a .meta file\n\t\t\tfileInfo.type = tiddlerType;\n\t\t\tfileInfo.hasMetaFile = true;\n\t\t}\n\t\tif(options.extFilters) {\n\t\t\t// Check for extension override\n\t\t\tmetaExt = $tw.utils.generateTiddlerExtension(tiddler.fields.title,{\n\t\t\t\textFilters: options.extFilters,\n\t\t\t\twiki: options.wiki\n\t\t\t});\n\t\t\tif(metaExt) {\n\t\t\t\tif(metaExt === \".tid\") {\n\t\t\t\t\t// Overriding to the .tid extension needs special handling\n\t\t\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\t\t\tfileInfo.hasMetaFile = false;\n\t\t\t\t} else if (metaExt === \".json\") {\n\t\t\t\t\t// Overriding to the .json extension needs special handling\n\t\t\t\t\tfileInfo.type = \"application/json\";\n\t\t\t\t\tfileInfo.hasMetaFile = false;\n\t\t\t\t} else {\n\t\t\t\t\t//If the new type matches a known extention, use that MIME type's encoding\n\t\t\t\t\tvar extInfo = $tw.utils.getFileExtensionInfo(metaExt);\n\t\t\t\t\tfileInfo.type = extInfo ? extInfo.type : null;\n\t\t\t\t\tfileInfo.encoding = $tw.utils.getTypeEncoding(metaExt);\n\t\t\t\t\tfileInfo.hasMetaFile = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Take the file extension from the tiddler content type or metaExt\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[fileInfo.type] || {extension: \"\"};\n\t// Generate the filepath\n\tfileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler.fields.title,{\n\t\textension: metaExt || contentTypeInfo.extension,\n\t\tdirectory: options.directory,\n\t\tpathFilters: options.pathFilters,\n\t\twiki: options.wiki,\n\t\tfileInfo: options.fileInfo,\n\t\toriginalpath: options.originalpath\n\t});\n\treturn fileInfo;\n};\n\n/*\nGenerate the file extension for saving a tiddler\nOptions include:\n\textFilters: optional array of filters to be used to generate the extention\n\twiki: optional wiki for evaluating the extFilters\n*/\nexports.generateTiddlerExtension = function(title,options) {\n\tvar self = this,\n\t\textension;\n\t// Check if any of the extFilters applies\n\tif(options.extFilters && options.wiki) { \n\t\t$tw.utils.each(options.extFilters,function(filter) {\n\t\t\tif(!extension) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\textension = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn extension;\n};\n\n/*\nGenerate the filepath for saving a tiddler\nOptions include:\n\textension: file extension to be added the finished filepath\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters\n\tfileInfo: an existing fileInfo object to check against\n*/\nexports.generateTiddlerFilepath = function(title,options) {\n\tvar self = this,\n\t\tdirectory = options.directory || \"\",\n\t\textension = options.extension || \"\",\n\t\toriginalpath = options.originalpath || \"\",\n\t\tfilepath;\t\n\t// Check if any of the pathFilters applies\n\tif(options.pathFilters && options.wiki) {\n\t\t$tw.utils.each(options.pathFilters,function(filter) {\n\t\t\tif(!filepath) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\tfilepath = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tif(!filepath && originalpath !== \"\") {\n\t\t//Use the originalpath without the extension\n\t\tvar ext = path.extname(originalpath);\n\t\tfilepath = originalpath.substring(0,originalpath.length - ext.length);\n\t} else if(!filepath) {\n\t\tfilepath = title;\n\t\t// Remove any forward or backward slashes so we don't create directories\n\t\tfilepath = filepath.replace(/\\/|\\\\/g,\"_\");\n\t}\n\t//If the path does not start with \".\" or \"..\" and a path seperator, then\n\tif(!/^\\.{1,2}[/\\\\]/g.test(filepath)) {\n\t\t// Don't let the filename start with any dots because such files are invisible on *nix\n\t\tfilepath = filepath.replace(/^\\.+/g,\"_\");\n\t}\n\t// If the filepath already ends in the extension then remove it\n\tif(filepath.substring(filepath.length - extension.length) === extension) {\n\t\tfilepath = filepath.substring(0,filepath.length - extension.length);\n\t}\n\t// Remove any characters that can't be used in cross-platform filenames\n\tfilepath = $tw.utils.transliterate(filepath.replace(/<|>|~|\\:|\\\"|\\||\\?|\\*|\\^/g,\"_\"));\n\t// Truncate the filename if it is too long\n\tif(filepath.length > 200) {\n\t\tfilepath = filepath.substr(0,200);\n\t}\n\t// Truncate the extension if it is too long\n\tif(extension.length > 32) {\n\t\textension = extension.substr(0,32);\n\t}\n\t// If the resulting filename is blank (eg because the title is just punctuation characters)\n\tif(!filepath) {\n\t\t// ...then just use the character codes of the title\n\t\tfilepath = \"\";\t\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tif(filepath) {\n\t\t\t\tfilepath += \"-\";\n\t\t\t}\n\t\t\tfilepath += char.charCodeAt(0).toString();\n\t\t});\n\t}\n\t// Add a uniquifier if the file already exists\n\tvar fullPath, oldPath = (options.fileInfo) ? options.fileInfo.filepath : undefined,\n\t\tcount = 0;\n\tdo {\n\t\tfullPath = path.resolve(directory,filepath + (count ? \"_\" + count : \"\") + extension);\n\t\tif(oldPath && oldPath == fullPath) {\n\t\t\tbreak;\n\t\t}\n\t\tcount++;\n\t} while(fs.existsSync(fullPath));\n\t// If the last write failed with an error, or if path does not start with:\n\t//\tthe resolved options.directory, the resolved wikiPath directory, or the wikiTiddlersPath directory, \n\t//\tthen encodeURIComponent() and resolve to tiddler directory\n\tvar writePath = $tw.hooks.invokeHook(\"th-make-tiddler-path\",fullPath),\n\t\tencode = (options.fileInfo || {writeError: false}).writeError == true;\n\tif(!encode) {\n\t\tencode = !(fullPath.indexOf(path.resolve(directory)) == 0 ||\n\t\t\tfullPath.indexOf(path.resolve($tw.boot.wikiPath)) == 0 ||\n\t\t\tfullPath.indexOf($tw.boot.wikiTiddlersPath) == 0);\n\t\t}\n\tif(encode) {\n\t\twritePath = path.resolve(directory,encodeURIComponent(fullPath));\n\t}\n\t// Return the full path to the file\n\treturn writePath;\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFile = function(tiddler,fileInfo,callback) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFile(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tfs.writeFile(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\",function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn callback(null,fileInfo);\n\t\t\t});\n\t\t});\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\",function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn callback(null,fileInfo);\n\t\t\t});\n\t\t} else {\n\t\t\tfs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\",function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn callback(null,fileInfo);\n\t\t\t});\n\t\t}\n\t}\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFileSync = function(tiddler,fileInfo) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFileSync(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding);\n\t\tfs.writeFileSync(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\");\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFileSync(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\");\n\t\t} else {\n\t\t\tfs.writeFileSync(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\");\n\t\t}\n\t}\n};\n\n/*\nDelete a file described by the fileInfo if it exits\n*/\nexports.deleteTiddlerFile = function(fileInfo,callback) {\n\t//Only attempt to delete files that exist on disk\n\tif(!fileInfo.filepath || !fs.existsSync(fileInfo.filepath)) {\n\t\t//For some reason, the tiddler is only in memory or we can't modify the file at this path\n\t\t$tw.syncer.displayError(\"Server deleteTiddlerFile task failed for filepath: \"+fileInfo.filepath);\n\t\treturn callback(null,fileInfo);\n\t}\n\t// Delete the file\n\tfs.unlink(fileInfo.filepath,function(err) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\t\n\t\t// Delete the metafile if present\n\t\tif(fileInfo.hasMetaFile && fs.existsSync(fileInfo.filepath + \".meta\")) {\n\t\t\tfs.unlink(fileInfo.filepath + \".meta\",function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),function(err) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\treturn callback(null,fileInfo);\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn callback(null,fileInfo);\n\t\t\t});\n\t\t}\n\t});\n};\n\n/*\nCleanup old files on disk, by comparing the options values:\n\tadaptorInfo from $tw.syncer.tiddlerInfo\n\tbootInfo from $tw.boot.files\n*/\nexports.cleanupTiddlerFiles = function(options,callback) {\n\tvar adaptorInfo = options.adaptorInfo || {},\n\tbootInfo = options.bootInfo || {},\n\ttitle = options.title || \"undefined\";\n\tif(adaptorInfo.filepath && bootInfo.filepath && adaptorInfo.filepath !== bootInfo.filepath) {\n\t\t$tw.utils.deleteTiddlerFile(adaptorInfo,function(err) {\n\t\t\tif(err) {\n\t\t\t\tif ((err.code == \"EPERM\" || err.code == \"EACCES\") && err.syscall == \"unlink\") {\n\t\t\t\t\t// Error deleting the previous file on disk, should fail gracefully\n\t\t\t\t\t$tw.syncer.displayError(\"Server desynchronized. Error cleaning up previous file for tiddler: \\\"\"+title+\"\\\"\",err);\n\t\t\t\t\treturn callback(null,bootInfo);\n\t\t\t\t} else {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn callback(null,bootInfo);\n\t\t});\n\t} else {\n\t\treturn callback(null,bootInfo);\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils-node"
        },
        "$:/core/modules/utils/linkedlist.js": {
            "title": "$:/core/modules/utils/linkedlist.js",
            "text": "/*\\\nmodule-type: utils\ntitle: $:/core/modules/utils/linkedlist.js\ntype: application/javascript\n\nThis is a doubly-linked indexed list intended for manipulation, particularly\npushTop, which it does with significantly better performance than an array.\n\n\\*/\n(function(){\n\nfunction LinkedList() {\n\tthis.clear();\n};\n\nLinkedList.prototype.clear = function() {\n\t// LinkedList performs the duty of both the head and tail node\n\tthis.next = Object.create(null);\n\tthis.prev = Object.create(null);\n\tthis.first = undefined;\n\tthis.last = undefined;\n\tthis.length = 0;\n};\n\nLinkedList.prototype.remove = function(value) {\n\tif($tw.utils.isArray(value)) {\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_assertString(value[t]);\n\t\t}\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_removeOne(this,value[t]);\n\t\t}\n\t} else {\n\t\t_assertString(value);\n\t\t_removeOne(this,value);\n\t}\n};\n\n/*\nPush behaves like array.push and accepts multiple string arguments. But it also\naccepts a single array argument too, to be consistent with its other methods.\n*/\nLinkedList.prototype.push = function(/* values */) {\n\tvar values = arguments;\n\tif($tw.utils.isArray(values[0])) {\n\t\tvalues = values[0];\n\t}\n\tfor(var i = 0; i < values.length; i++) {\n\t\t_assertString(values[i]);\n\t}\n\tfor(var i = 0; i < values.length; i++) {\n\t\t_linkToEnd(this,values[i]);\n\t}\n\treturn this.length;\n};\n\nLinkedList.prototype.pushTop = function(value) {\n\tif($tw.utils.isArray(value)) {\n\t\tfor (var t=0; t<value.length; t++) {\n\t\t\t_assertString(value[t]);\n\t\t}\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_removeOne(this,value[t]);\n\t\t}\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_linkToEnd(this,value[t]);\n\t\t}\n\t} else {\n\t\t_assertString(value);\n\t\t_removeOne(this,value);\n\t\t_linkToEnd(this,value);\n\t}\n};\n\nLinkedList.prototype.each = function(callback) {\n\tvar visits = Object.create(null),\n\t\tvalue = this.first;\n\twhile(value !== undefined) {\n\t\tcallback(value);\n\t\tvar next = this.next[value];\n\t\tif(typeof next === \"object\") {\n\t\t\tvar i = visits[value] || 0;\n\t\t\tvisits[value] = i+1;\n\t\t\tvalue = next[i];\n\t\t} else {\n\t\t\tvalue = next;\n\t\t}\n\t}\n};\n\nLinkedList.prototype.toArray = function() {\n\tvar output = new Array(this.length),\n\t\tindex = 0;\n\tthis.each(function(value) { output[index++] = value; });\n\treturn output;\n};\n\nfunction _removeOne(list,value) {\n\tvar prevEntry = list.prev[value],\n\t\tnextEntry = list.next[value],\n\t\tprev = prevEntry,\n\t\tnext = nextEntry;\n\tif(typeof nextEntry === \"object\") {\n\t\tnext = nextEntry[0];\n\t\tprev = prevEntry[0];\n\t}\n\t// Relink preceding element.\n\tif(list.first === value) {\n\t\tlist.first = next\n\t} else if(prev !== undefined) {\n\t\tif(typeof list.next[prev] === \"object\") {\n\t\t\tif(next === undefined) {\n\t\t\t\t// Must have been last, and 'i' would be last element.\n\t\t\t\tlist.next[prev].pop();\n\t\t\t} else {\n\t\t\t\tvar i = list.next[prev].indexOf(value);\n\t\t\t\tlist.next[prev][i] = next;\n\t\t\t}\n\t\t} else {\n\t\t\tlist.next[prev] = next;\n\t\t}\n\t} else {\n\t\treturn;\n\t}\n\t// Now relink following element\n\t// Check \"next !== undefined\" rather than \"list.last === value\" because\n\t// we need to know if the FIRST value is the last in the list, not the last.\n\tif(next !== undefined) {\n\t\tif(typeof list.prev[next] === \"object\") {\n\t\t\tif(prev === undefined) {\n\t\t\t\t// Must have been first, and 'i' would be 0.\n\t\t\t\tlist.prev[next].shift();\n\t\t\t} else {\n\t\t\t\tvar i = list.prev[next].indexOf(value);\n\t\t\t\tlist.prev[next][i] = prev;\n\t\t\t}\n\t\t} else {\n\t\t\tlist.prev[next] = prev;\n\t\t}\n\t} else {\n\t\tlist.last = prev;\n\t}\n\t// Delink actual value. If it uses arrays, just remove first entries.\n\tif(typeof nextEntry === \"object\") {\n\t\tnextEntry.shift();\n\t\tprevEntry.shift();\n\t} else {\n\t\tlist.next[value] = undefined;\n\t\tlist.prev[value] = undefined;\n\t}\n\tlist.length -= 1;\n};\n\n// Sticks the given node onto the end of the list.\nfunction _linkToEnd(list,value) {\n\tif(list.first === undefined) {\n\t\tlist.first = value;\n\t} else {\n\t\t// Does it already exists?\n\t\tif(list.first === value || list.prev[value] !== undefined) {\n\t\t\tif(typeof list.next[value] === \"string\") {\n\t\t\t\tlist.next[value] = [list.next[value]];\n\t\t\t\tlist.prev[value] = [list.prev[value]];\n\t\t\t} else if(typeof list.next[value] === \"undefined\") {\n\t\t\t\t// list.next[value] must be undefined.\n\t\t\t\t// Special case. List already has 1 value. It's at the end.\n\t\t\t\tlist.next[value] = [];\n\t\t\t\tlist.prev[value] = [list.prev[value]];\n\t\t\t}\n\t\t\tlist.prev[value].push(list.last);\n\t\t\t// We do NOT append a new value onto \"next\" list. Iteration will\n\t\t\t// figure out it must point to End-of-List on its own.\n\t\t} else {\n\t\t\tlist.prev[value] = list.last;\n\t\t}\n\t\t// Make the old last point to this new one.\n\t\tif(typeof list.next[list.last] === \"object\") {\n\t\t\tlist.next[list.last].push(value);\n\t\t} else {\n\t\t\tlist.next[list.last] = value;\n\t\t}\n\t}\n\tlist.last = value;\n\tlist.length += 1;\n};\n\nfunction _assertString(value) {\n\tif(typeof value !== \"string\") {\n\t\tthrow \"Linked List only accepts string values, not \" + value;\n\t}\n};\n\nexports.LinkedList = LinkedList;\n\n})();\n",
            "module-type": "utils",
            "type": "application/javascript"
        },
        "$:/core/modules/utils/logger.js": {
            "title": "$:/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,options) {\n\toptions = options || {};\n\tthis.componentName = componentName || \"\";\n\tthis.colour = options.colour || \"white\";\n\tthis.enable = \"enable\" in options ? options.enable : true;\n\tthis.save = \"save\" in options ? options.save : true;\n\tthis.saveLimit = options.saveLimit || 100 * 1024;\n\tthis.saveBufferLogger = this;\n\tthis.buffer = \"\";\n\tthis.alertCount = 0;\n}\n\nLogger.prototype.setSaveBuffer = function(logger) {\n\tthis.saveBufferLogger = logger;\n};\n\n/*\nLog a message\n*/\nLogger.prototype.log = function(/* args */) {\n\tvar self = this;\n\tif(this.enable) {\n\t\tif(this.saveBufferLogger.save) {\n\t\t\tthis.saveBufferLogger.buffer += $tw.utils.formatDateString(new Date(),\"YYYY MM DD 0hh:0mm:0ss.0XXX\") + \":\";\n\t\t\t$tw.utils.each(Array.prototype.slice.call(arguments,0),function(arg,index) {\n\t\t\t\tself.saveBufferLogger.buffer += \" \" + arg;\n\t\t\t});\n\t\t\tthis.saveBufferLogger.buffer += \"\\n\";\n\t\t\tthis.saveBufferLogger.buffer = this.saveBufferLogger.buffer.slice(-this.saveBufferLogger.saveLimit);\t\t\t\n\t\t}\n\t\tif(console !== undefined && console.log !== undefined) {\n\t\t\treturn Function.apply.call(console.log, console, [$tw.utils.terminalColour(this.colour),this.componentName + \":\"].concat(Array.prototype.slice.call(arguments,0)).concat($tw.utils.terminalColour()));\n\t\t}\n\t} \n};\n\n/*\nRead the message buffer\n*/\nLogger.prototype.getBuffer = function() {\n\treturn this.saveBufferLogger.buffer;\n};\n\n/*\nLog a structure as a table\n*/\nLogger.prototype.table = function(value) {\n\t(console.table || console.log)(value);\n};\n\n/*\nAlert a message\n*/\nLogger.prototype.alert = function(/* args */) {\n\tif(this.enable) {\n\t\t// Prepare the text of the alert\n\t\tvar text = Array.prototype.join.call(arguments,\" \");\n\t\t// Create alert tiddlers in the browser\n\t\tif($tw.browser) {\n\t\t\t// Check if there is an existing alert with the same text and the same component\n\t\t\tvar existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG),\n\t\t\t\talertFields,\n\t\t\t\texistingCount,\n\t\t\t\tself = this;\n\t\t\t$tw.utils.each(existingAlerts,function(title) {\n\t\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\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\t\talertFields = $tw.utils.extend({},tiddler.fields);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(alertFields) {\n\t\t\t\texistingCount = alertFields.count || 1;\n\t\t\t} else {\n\t\t\t\talertFields = {\n\t\t\t\t\ttitle: $tw.wiki.generateNewTitle(\"$:/temp/alerts/alert\",{prefix: \"\"}),\n\t\t\t\t\ttext: text,\n\t\t\t\t\ttags: [ALERT_TAG],\n\t\t\t\t\tcomponent: this.componentName\n\t\t\t\t};\n\t\t\t\texistingCount = 0;\n\t\t\t\tthis.alertCount += 1;\n\t\t\t}\n\t\t\talertFields.modified = new Date();\n\t\t\tif(++existingCount > 1) {\n\t\t\t\talertFields.count = existingCount;\n\t\t\t} else {\n\t\t\t\talertFields.count = undefined;\n\t\t\t}\n\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(alertFields));\n\t\t\t// Log the alert as well\n\t\t\tthis.log.apply(this,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\t// Print an orange message to the console if not in the browser\n\t\t\tconsole.error(\"\\x1b[1;33m\" + text + \"\\x1b[0m\");\n\t\t}\t\t\n\t}\n};\n\n/*\nClear outstanding alerts\n*/\nLogger.prototype.clearAlerts = function() {\n\tvar self = this;\n\tif($tw.browser && this.alertCount > 0) {\n\t\t$tw.utils.each($tw.wiki.getTiddlersWithTag(ALERT_TAG),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(tiddler.fields.component === self.componentName) {\n\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t}\n\t\t});\n\t\tthis.alertCount = 0;\n\t}\n};\n\nexports.Logger = Logger;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/parsetree.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/performance.js": {
            "title": "$:/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 by measurement name of {time:, invocations:}\n\tthis.logger = new $tw.utils.Logger(\"performance\");\n\tthis.showGreeting();\n}\n\nPerformance.prototype.showGreeting = function() {\n\tif($tw.browser) {\n\t\tthis.logger.log(\"Execute $tw.perf.log(); to see filter execution timings\");\t\t\n\t}\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\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\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nPerformance.prototype.log = function() {\n\tvar self = this,\n\t\ttotalTime = 0,\n\t\torderedMeasures = Object.keys(this.measures).sort(function(a,b) {\n\t\t\tif(self.measures[a].time > self.measures[b].time) {\n\t\t\t\treturn -1;\n\t\t\t} else if (self.measures[a].time < self.measures[b].time) {\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$tw.utils.each(orderedMeasures,function(name) {\n\t\ttotalTime += self.measures[name].time;\n\t});\n\tvar results = []\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\tvar measure = self.measures[name];\n\t\tresults.push({name: name,invocations: measure.invocations, avgTime: measure.time / measure.invocations, totalTime: measure.time, percentTime: (measure.time / totalTime) * 100})\n\t});\n\tself.logger.table(results);\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\tif(!(name in self.measures)) {\n\t\t\t\tself.measures[name] = {time: 0, invocations: 0};\n\t\t\t}\n\t\t\tself.measures[name].time += $tw.utils.timer(startTime);\n\t\t\tself.measures[name].invocations++;\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",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/utils/pluginmaker.js": {
            "title": "$:/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 + \"\\n\" + $tw.language.getString(\"Error/Caption\") + \": \" + 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",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/transliterate.js": {
            "title": "$:/core/modules/utils/transliterate.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/transliterate.js\ntype: application/javascript\nmodule-type: utils\n\nTransliteration static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nTransliterate string to ASCII\n\n(Some pairs taken from http://semplicewebsites.com/removing-accents-javascript)\n*/\nexports.transliterationPairs = {\n\t\"Á\":\"A\",\n\t\"Ă\":\"A\",\n\t\"Ắ\":\"A\",\n\t\"Ặ\":\"A\",\n\t\"Ằ\":\"A\",\n\t\"Ẳ\":\"A\",\n\t\"Ẵ\":\"A\",\n\t\"Ǎ\":\"A\",\n\t\"Â\":\"A\",\n\t\"Ấ\":\"A\",\n\t\"Ậ\":\"A\",\n\t\"Ầ\":\"A\",\n\t\"Ẩ\":\"A\",\n\t\"Ẫ\":\"A\",\n\t\"Ä\":\"A\",\n\t\"Ǟ\":\"A\",\n\t\"Ȧ\":\"A\",\n\t\"Ǡ\":\"A\",\n\t\"Ạ\":\"A\",\n\t\"Ȁ\":\"A\",\n\t\"À\":\"A\",\n\t\"Ả\":\"A\",\n\t\"Ȃ\":\"A\",\n\t\"Ā\":\"A\",\n\t\"Ą\":\"A\",\n\t\"Å\":\"A\",\n\t\"Ǻ\":\"A\",\n\t\"Ḁ\":\"A\",\n\t\"Ⱥ\":\"A\",\n\t\"Ã\":\"A\",\n\t\"Ꜳ\":\"AA\",\n\t\"Æ\":\"AE\",\n\t\"Ǽ\":\"AE\",\n\t\"Ǣ\":\"AE\",\n\t\"Ꜵ\":\"AO\",\n\t\"Ꜷ\":\"AU\",\n\t\"Ꜹ\":\"AV\",\n\t\"Ꜻ\":\"AV\",\n\t\"Ꜽ\":\"AY\",\n\t\"Ḃ\":\"B\",\n\t\"Ḅ\":\"B\",\n\t\"Ɓ\":\"B\",\n\t\"Ḇ\":\"B\",\n\t\"Ƀ\":\"B\",\n\t\"Ƃ\":\"B\",\n\t\"Ć\":\"C\",\n\t\"Č\":\"C\",\n\t\"Ç\":\"C\",\n\t\"Ḉ\":\"C\",\n\t\"Ĉ\":\"C\",\n\t\"Ċ\":\"C\",\n\t\"Ƈ\":\"C\",\n\t\"Ȼ\":\"C\",\n\t\"Ď\":\"D\",\n\t\"Ḑ\":\"D\",\n\t\"Ḓ\":\"D\",\n\t\"Ḋ\":\"D\",\n\t\"Ḍ\":\"D\",\n\t\"Ɗ\":\"D\",\n\t\"Ḏ\":\"D\",\n\t\"Dz\":\"D\",\n\t\"Dž\":\"D\",\n\t\"Đ\":\"D\",\n\t\"Ƌ\":\"D\",\n\t\"DZ\":\"DZ\",\n\t\"DŽ\":\"DZ\",\n\t\"É\":\"E\",\n\t\"Ĕ\":\"E\",\n\t\"Ě\":\"E\",\n\t\"Ȩ\":\"E\",\n\t\"Ḝ\":\"E\",\n\t\"Ê\":\"E\",\n\t\"Ế\":\"E\",\n\t\"Ệ\":\"E\",\n\t\"Ề\":\"E\",\n\t\"Ể\":\"E\",\n\t\"Ễ\":\"E\",\n\t\"Ḙ\":\"E\",\n\t\"Ë\":\"E\",\n\t\"Ė\":\"E\",\n\t\"Ẹ\":\"E\",\n\t\"Ȅ\":\"E\",\n\t\"È\":\"E\",\n\t\"Ẻ\":\"E\",\n\t\"Ȇ\":\"E\",\n\t\"Ē\":\"E\",\n\t\"Ḗ\":\"E\",\n\t\"Ḕ\":\"E\",\n\t\"Ę\":\"E\",\n\t\"Ɇ\":\"E\",\n\t\"Ẽ\":\"E\",\n\t\"Ḛ\":\"E\",\n\t\"Ꝫ\":\"ET\",\n\t\"Ḟ\":\"F\",\n\t\"Ƒ\":\"F\",\n\t\"Ǵ\":\"G\",\n\t\"Ğ\":\"G\",\n\t\"Ǧ\":\"G\",\n\t\"Ģ\":\"G\",\n\t\"Ĝ\":\"G\",\n\t\"Ġ\":\"G\",\n\t\"Ɠ\":\"G\",\n\t\"Ḡ\":\"G\",\n\t\"Ǥ\":\"G\",\n\t\"Ḫ\":\"H\",\n\t\"Ȟ\":\"H\",\n\t\"Ḩ\":\"H\",\n\t\"Ĥ\":\"H\",\n\t\"Ⱨ\":\"H\",\n\t\"Ḧ\":\"H\",\n\t\"Ḣ\":\"H\",\n\t\"Ḥ\":\"H\",\n\t\"Ħ\":\"H\",\n\t\"Í\":\"I\",\n\t\"Ĭ\":\"I\",\n\t\"Ǐ\":\"I\",\n\t\"Î\":\"I\",\n\t\"Ï\":\"I\",\n\t\"Ḯ\":\"I\",\n\t\"İ\":\"I\",\n\t\"Ị\":\"I\",\n\t\"Ȉ\":\"I\",\n\t\"Ì\":\"I\",\n\t\"Ỉ\":\"I\",\n\t\"Ȋ\":\"I\",\n\t\"Ī\":\"I\",\n\t\"Į\":\"I\",\n\t\"Ɨ\":\"I\",\n\t\"Ĩ\":\"I\",\n\t\"Ḭ\":\"I\",\n\t\"Ꝺ\":\"D\",\n\t\"Ꝼ\":\"F\",\n\t\"Ᵹ\":\"G\",\n\t\"Ꞃ\":\"R\",\n\t\"Ꞅ\":\"S\",\n\t\"Ꞇ\":\"T\",\n\t\"Ꝭ\":\"IS\",\n\t\"Ĵ\":\"J\",\n\t\"Ɉ\":\"J\",\n\t\"Ḱ\":\"K\",\n\t\"Ǩ\":\"K\",\n\t\"Ķ\":\"K\",\n\t\"Ⱪ\":\"K\",\n\t\"Ꝃ\":\"K\",\n\t\"Ḳ\":\"K\",\n\t\"Ƙ\":\"K\",\n\t\"Ḵ\":\"K\",\n\t\"Ꝁ\":\"K\",\n\t\"Ꝅ\":\"K\",\n\t\"Ĺ\":\"L\",\n\t\"Ƚ\":\"L\",\n\t\"Ľ\":\"L\",\n\t\"Ļ\":\"L\",\n\t\"Ḽ\":\"L\",\n\t\"Ḷ\":\"L\",\n\t\"Ḹ\":\"L\",\n\t\"Ⱡ\":\"L\",\n\t\"Ꝉ\":\"L\",\n\t\"Ḻ\":\"L\",\n\t\"Ŀ\":\"L\",\n\t\"Ɫ\":\"L\",\n\t\"Lj\":\"L\",\n\t\"Ł\":\"L\",\n\t\"LJ\":\"LJ\",\n\t\"Ḿ\":\"M\",\n\t\"Ṁ\":\"M\",\n\t\"Ṃ\":\"M\",\n\t\"Ɱ\":\"M\",\n\t\"Ń\":\"N\",\n\t\"Ň\":\"N\",\n\t\"Ņ\":\"N\",\n\t\"Ṋ\":\"N\",\n\t\"Ṅ\":\"N\",\n\t\"Ṇ\":\"N\",\n\t\"Ǹ\":\"N\",\n\t\"Ɲ\":\"N\",\n\t\"Ṉ\":\"N\",\n\t\"Ƞ\":\"N\",\n\t\"Nj\":\"N\",\n\t\"Ñ\":\"N\",\n\t\"NJ\":\"NJ\",\n\t\"Ó\":\"O\",\n\t\"Ŏ\":\"O\",\n\t\"Ǒ\":\"O\",\n\t\"Ô\":\"O\",\n\t\"Ố\":\"O\",\n\t\"Ộ\":\"O\",\n\t\"Ồ\":\"O\",\n\t\"Ổ\":\"O\",\n\t\"Ỗ\":\"O\",\n\t\"Ö\":\"O\",\n\t\"Ȫ\":\"O\",\n\t\"Ȯ\":\"O\",\n\t\"Ȱ\":\"O\",\n\t\"Ọ\":\"O\",\n\t\"Ő\":\"O\",\n\t\"Ȍ\":\"O\",\n\t\"Ò\":\"O\",\n\t\"Ỏ\":\"O\",\n\t\"Ơ\":\"O\",\n\t\"Ớ\":\"O\",\n\t\"Ợ\":\"O\",\n\t\"Ờ\":\"O\",\n\t\"Ở\":\"O\",\n\t\"Ỡ\":\"O\",\n\t\"Ȏ\":\"O\",\n\t\"Ꝋ\":\"O\",\n\t\"Ꝍ\":\"O\",\n\t\"Ō\":\"O\",\n\t\"Ṓ\":\"O\",\n\t\"Ṑ\":\"O\",\n\t\"Ɵ\":\"O\",\n\t\"Ǫ\":\"O\",\n\t\"Ǭ\":\"O\",\n\t\"Ø\":\"O\",\n\t\"Ǿ\":\"O\",\n\t\"Õ\":\"O\",\n\t\"Ṍ\":\"O\",\n\t\"Ṏ\":\"O\",\n\t\"Ȭ\":\"O\",\n\t\"Ƣ\":\"OI\",\n\t\"Ꝏ\":\"OO\",\n\t\"Ɛ\":\"E\",\n\t\"Ɔ\":\"O\",\n\t\"Ȣ\":\"OU\",\n\t\"Ṕ\":\"P\",\n\t\"Ṗ\":\"P\",\n\t\"Ꝓ\":\"P\",\n\t\"Ƥ\":\"P\",\n\t\"Ꝕ\":\"P\",\n\t\"Ᵽ\":\"P\",\n\t\"Ꝑ\":\"P\",\n\t\"Ꝙ\":\"Q\",\n\t\"Ꝗ\":\"Q\",\n\t\"Ŕ\":\"R\",\n\t\"Ř\":\"R\",\n\t\"Ŗ\":\"R\",\n\t\"Ṙ\":\"R\",\n\t\"Ṛ\":\"R\",\n\t\"Ṝ\":\"R\",\n\t\"Ȑ\":\"R\",\n\t\"Ȓ\":\"R\",\n\t\"Ṟ\":\"R\",\n\t\"Ɍ\":\"R\",\n\t\"Ɽ\":\"R\",\n\t\"Ꜿ\":\"C\",\n\t\"Ǝ\":\"E\",\n\t\"Ś\":\"S\",\n\t\"Ṥ\":\"S\",\n\t\"Š\":\"S\",\n\t\"Ṧ\":\"S\",\n\t\"Ş\":\"S\",\n\t\"Ŝ\":\"S\",\n\t\"Ș\":\"S\",\n\t\"Ṡ\":\"S\",\n\t\"Ṣ\":\"S\",\n\t\"Ṩ\":\"S\",\n\t\"Ť\":\"T\",\n\t\"Ţ\":\"T\",\n\t\"Ṱ\":\"T\",\n\t\"Ț\":\"T\",\n\t\"Ⱦ\":\"T\",\n\t\"Ṫ\":\"T\",\n\t\"Ṭ\":\"T\",\n\t\"Ƭ\":\"T\",\n\t\"Ṯ\":\"T\",\n\t\"Ʈ\":\"T\",\n\t\"Ŧ\":\"T\",\n\t\"Ɐ\":\"A\",\n\t\"Ꞁ\":\"L\",\n\t\"Ɯ\":\"M\",\n\t\"Ʌ\":\"V\",\n\t\"Ꜩ\":\"TZ\",\n\t\"Ú\":\"U\",\n\t\"Ŭ\":\"U\",\n\t\"Ǔ\":\"U\",\n\t\"Û\":\"U\",\n\t\"Ṷ\":\"U\",\n\t\"Ü\":\"U\",\n\t\"Ǘ\":\"U\",\n\t\"Ǚ\":\"U\",\n\t\"Ǜ\":\"U\",\n\t\"Ǖ\":\"U\",\n\t\"Ṳ\":\"U\",\n\t\"Ụ\":\"U\",\n\t\"Ű\":\"U\",\n\t\"Ȕ\":\"U\",\n\t\"Ù\":\"U\",\n\t\"Ủ\":\"U\",\n\t\"Ư\":\"U\",\n\t\"Ứ\":\"U\",\n\t\"Ự\":\"U\",\n\t\"Ừ\":\"U\",\n\t\"Ử\":\"U\",\n\t\"Ữ\":\"U\",\n\t\"Ȗ\":\"U\",\n\t\"Ū\":\"U\",\n\t\"Ṻ\":\"U\",\n\t\"Ų\":\"U\",\n\t\"Ů\":\"U\",\n\t\"Ũ\":\"U\",\n\t\"Ṹ\":\"U\",\n\t\"Ṵ\":\"U\",\n\t\"Ꝟ\":\"V\",\n\t\"Ṿ\":\"V\",\n\t\"Ʋ\":\"V\",\n\t\"Ṽ\":\"V\",\n\t\"Ꝡ\":\"VY\",\n\t\"Ẃ\":\"W\",\n\t\"Ŵ\":\"W\",\n\t\"Ẅ\":\"W\",\n\t\"Ẇ\":\"W\",\n\t\"Ẉ\":\"W\",\n\t\"Ẁ\":\"W\",\n\t\"Ⱳ\":\"W\",\n\t\"Ẍ\":\"X\",\n\t\"Ẋ\":\"X\",\n\t\"Ý\":\"Y\",\n\t\"Ŷ\":\"Y\",\n\t\"Ÿ\":\"Y\",\n\t\"Ẏ\":\"Y\",\n\t\"Ỵ\":\"Y\",\n\t\"Ỳ\":\"Y\",\n\t\"Ƴ\":\"Y\",\n\t\"Ỷ\":\"Y\",\n\t\"Ỿ\":\"Y\",\n\t\"Ȳ\":\"Y\",\n\t\"Ɏ\":\"Y\",\n\t\"Ỹ\":\"Y\",\n\t\"Ź\":\"Z\",\n\t\"Ž\":\"Z\",\n\t\"Ẑ\":\"Z\",\n\t\"Ⱬ\":\"Z\",\n\t\"Ż\":\"Z\",\n\t\"Ẓ\":\"Z\",\n\t\"Ȥ\":\"Z\",\n\t\"Ẕ\":\"Z\",\n\t\"Ƶ\":\"Z\",\n\t\"IJ\":\"IJ\",\n\t\"Œ\":\"OE\",\n\t\"ᴀ\":\"A\",\n\t\"ᴁ\":\"AE\",\n\t\"ʙ\":\"B\",\n\t\"ᴃ\":\"B\",\n\t\"ᴄ\":\"C\",\n\t\"ᴅ\":\"D\",\n\t\"ᴇ\":\"E\",\n\t\"ꜰ\":\"F\",\n\t\"ɢ\":\"G\",\n\t\"ʛ\":\"G\",\n\t\"ʜ\":\"H\",\n\t\"ɪ\":\"I\",\n\t\"ʁ\":\"R\",\n\t\"ᴊ\":\"J\",\n\t\"ᴋ\":\"K\",\n\t\"ʟ\":\"L\",\n\t\"ᴌ\":\"L\",\n\t\"ᴍ\":\"M\",\n\t\"ɴ\":\"N\",\n\t\"ᴏ\":\"O\",\n\t\"ɶ\":\"OE\",\n\t\"ᴐ\":\"O\",\n\t\"ᴕ\":\"OU\",\n\t\"ᴘ\":\"P\",\n\t\"ʀ\":\"R\",\n\t\"ᴎ\":\"N\",\n\t\"ᴙ\":\"R\",\n\t\"ꜱ\":\"S\",\n\t\"ᴛ\":\"T\",\n\t\"ⱻ\":\"E\",\n\t\"ᴚ\":\"R\",\n\t\"ᴜ\":\"U\",\n\t\"ᴠ\":\"V\",\n\t\"ᴡ\":\"W\",\n\t\"ʏ\":\"Y\",\n\t\"ᴢ\":\"Z\",\n\t\"á\":\"a\",\n\t\"ă\":\"a\",\n\t\"ắ\":\"a\",\n\t\"ặ\":\"a\",\n\t\"ằ\":\"a\",\n\t\"ẳ\":\"a\",\n\t\"ẵ\":\"a\",\n\t\"ǎ\":\"a\",\n\t\"â\":\"a\",\n\t\"ấ\":\"a\",\n\t\"ậ\":\"a\",\n\t\"ầ\":\"a\",\n\t\"ẩ\":\"a\",\n\t\"ẫ\":\"a\",\n\t\"ä\":\"a\",\n\t\"ǟ\":\"a\",\n\t\"ȧ\":\"a\",\n\t\"ǡ\":\"a\",\n\t\"ạ\":\"a\",\n\t\"ȁ\":\"a\",\n\t\"à\":\"a\",\n\t\"ả\":\"a\",\n\t\"ȃ\":\"a\",\n\t\"ā\":\"a\",\n\t\"ą\":\"a\",\n\t\"ᶏ\":\"a\",\n\t\"ẚ\":\"a\",\n\t\"å\":\"a\",\n\t\"ǻ\":\"a\",\n\t\"ḁ\":\"a\",\n\t\"ⱥ\":\"a\",\n\t\"ã\":\"a\",\n\t\"ꜳ\":\"aa\",\n\t\"æ\":\"ae\",\n\t\"ǽ\":\"ae\",\n\t\"ǣ\":\"ae\",\n\t\"ꜵ\":\"ao\",\n\t\"ꜷ\":\"au\",\n\t\"ꜹ\":\"av\",\n\t\"ꜻ\":\"av\",\n\t\"ꜽ\":\"ay\",\n\t\"ḃ\":\"b\",\n\t\"ḅ\":\"b\",\n\t\"ɓ\":\"b\",\n\t\"ḇ\":\"b\",\n\t\"ᵬ\":\"b\",\n\t\"ᶀ\":\"b\",\n\t\"ƀ\":\"b\",\n\t\"ƃ\":\"b\",\n\t\"ɵ\":\"o\",\n\t\"ć\":\"c\",\n\t\"č\":\"c\",\n\t\"ç\":\"c\",\n\t\"ḉ\":\"c\",\n\t\"ĉ\":\"c\",\n\t\"ɕ\":\"c\",\n\t\"ċ\":\"c\",\n\t\"ƈ\":\"c\",\n\t\"ȼ\":\"c\",\n\t\"ď\":\"d\",\n\t\"ḑ\":\"d\",\n\t\"ḓ\":\"d\",\n\t\"ȡ\":\"d\",\n\t\"ḋ\":\"d\",\n\t\"ḍ\":\"d\",\n\t\"ɗ\":\"d\",\n\t\"ᶑ\":\"d\",\n\t\"ḏ\":\"d\",\n\t\"ᵭ\":\"d\",\n\t\"ᶁ\":\"d\",\n\t\"đ\":\"d\",\n\t\"ɖ\":\"d\",\n\t\"ƌ\":\"d\",\n\t\"ı\":\"i\",\n\t\"ȷ\":\"j\",\n\t\"ɟ\":\"j\",\n\t\"ʄ\":\"j\",\n\t\"dz\":\"dz\",\n\t\"dž\":\"dz\",\n\t\"é\":\"e\",\n\t\"ĕ\":\"e\",\n\t\"ě\":\"e\",\n\t\"ȩ\":\"e\",\n\t\"ḝ\":\"e\",\n\t\"ê\":\"e\",\n\t\"ế\":\"e\",\n\t\"ệ\":\"e\",\n\t\"ề\":\"e\",\n\t\"ể\":\"e\",\n\t\"ễ\":\"e\",\n\t\"ḙ\":\"e\",\n\t\"ë\":\"e\",\n\t\"ė\":\"e\",\n\t\"ẹ\":\"e\",\n\t\"ȅ\":\"e\",\n\t\"è\":\"e\",\n\t\"ẻ\":\"e\",\n\t\"ȇ\":\"e\",\n\t\"ē\":\"e\",\n\t\"ḗ\":\"e\",\n\t\"ḕ\":\"e\",\n\t\"ⱸ\":\"e\",\n\t\"ę\":\"e\",\n\t\"ᶒ\":\"e\",\n\t\"ɇ\":\"e\",\n\t\"ẽ\":\"e\",\n\t\"ḛ\":\"e\",\n\t\"ꝫ\":\"et\",\n\t\"ḟ\":\"f\",\n\t\"ƒ\":\"f\",\n\t\"ᵮ\":\"f\",\n\t\"ᶂ\":\"f\",\n\t\"ǵ\":\"g\",\n\t\"ğ\":\"g\",\n\t\"ǧ\":\"g\",\n\t\"ģ\":\"g\",\n\t\"ĝ\":\"g\",\n\t\"ġ\":\"g\",\n\t\"ɠ\":\"g\",\n\t\"ḡ\":\"g\",\n\t\"ᶃ\":\"g\",\n\t\"ǥ\":\"g\",\n\t\"ḫ\":\"h\",\n\t\"ȟ\":\"h\",\n\t\"ḩ\":\"h\",\n\t\"ĥ\":\"h\",\n\t\"ⱨ\":\"h\",\n\t\"ḧ\":\"h\",\n\t\"ḣ\":\"h\",\n\t\"ḥ\":\"h\",\n\t\"ɦ\":\"h\",\n\t\"ẖ\":\"h\",\n\t\"ħ\":\"h\",\n\t\"ƕ\":\"hv\",\n\t\"í\":\"i\",\n\t\"ĭ\":\"i\",\n\t\"ǐ\":\"i\",\n\t\"î\":\"i\",\n\t\"ï\":\"i\",\n\t\"ḯ\":\"i\",\n\t\"ị\":\"i\",\n\t\"ȉ\":\"i\",\n\t\"ì\":\"i\",\n\t\"ỉ\":\"i\",\n\t\"ȋ\":\"i\",\n\t\"ī\":\"i\",\n\t\"į\":\"i\",\n\t\"ᶖ\":\"i\",\n\t\"ɨ\":\"i\",\n\t\"ĩ\":\"i\",\n\t\"ḭ\":\"i\",\n\t\"ꝺ\":\"d\",\n\t\"ꝼ\":\"f\",\n\t\"ᵹ\":\"g\",\n\t\"ꞃ\":\"r\",\n\t\"ꞅ\":\"s\",\n\t\"ꞇ\":\"t\",\n\t\"ꝭ\":\"is\",\n\t\"ǰ\":\"j\",\n\t\"ĵ\":\"j\",\n\t\"ʝ\":\"j\",\n\t\"ɉ\":\"j\",\n\t\"ḱ\":\"k\",\n\t\"ǩ\":\"k\",\n\t\"ķ\":\"k\",\n\t\"ⱪ\":\"k\",\n\t\"ꝃ\":\"k\",\n\t\"ḳ\":\"k\",\n\t\"ƙ\":\"k\",\n\t\"ḵ\":\"k\",\n\t\"ᶄ\":\"k\",\n\t\"ꝁ\":\"k\",\n\t\"ꝅ\":\"k\",\n\t\"ĺ\":\"l\",\n\t\"ƚ\":\"l\",\n\t\"ɬ\":\"l\",\n\t\"ľ\":\"l\",\n\t\"ļ\":\"l\",\n\t\"ḽ\":\"l\",\n\t\"ȴ\":\"l\",\n\t\"ḷ\":\"l\",\n\t\"ḹ\":\"l\",\n\t\"ⱡ\":\"l\",\n\t\"ꝉ\":\"l\",\n\t\"ḻ\":\"l\",\n\t\"ŀ\":\"l\",\n\t\"ɫ\":\"l\",\n\t\"ᶅ\":\"l\",\n\t\"ɭ\":\"l\",\n\t\"ł\":\"l\",\n\t\"lj\":\"lj\",\n\t\"ſ\":\"s\",\n\t\"ẜ\":\"s\",\n\t\"ẛ\":\"s\",\n\t\"ẝ\":\"s\",\n\t\"ḿ\":\"m\",\n\t\"ṁ\":\"m\",\n\t\"ṃ\":\"m\",\n\t\"ɱ\":\"m\",\n\t\"ᵯ\":\"m\",\n\t\"ᶆ\":\"m\",\n\t\"ń\":\"n\",\n\t\"ň\":\"n\",\n\t\"ņ\":\"n\",\n\t\"ṋ\":\"n\",\n\t\"ȵ\":\"n\",\n\t\"ṅ\":\"n\",\n\t\"ṇ\":\"n\",\n\t\"ǹ\":\"n\",\n\t\"ɲ\":\"n\",\n\t\"ṉ\":\"n\",\n\t\"ƞ\":\"n\",\n\t\"ᵰ\":\"n\",\n\t\"ᶇ\":\"n\",\n\t\"ɳ\":\"n\",\n\t\"ñ\":\"n\",\n\t\"nj\":\"nj\",\n\t\"ó\":\"o\",\n\t\"ŏ\":\"o\",\n\t\"ǒ\":\"o\",\n\t\"ô\":\"o\",\n\t\"ố\":\"o\",\n\t\"ộ\":\"o\",\n\t\"ồ\":\"o\",\n\t\"ổ\":\"o\",\n\t\"ỗ\":\"o\",\n\t\"ö\":\"o\",\n\t\"ȫ\":\"o\",\n\t\"ȯ\":\"o\",\n\t\"ȱ\":\"o\",\n\t\"ọ\":\"o\",\n\t\"ő\":\"o\",\n\t\"ȍ\":\"o\",\n\t\"ò\":\"o\",\n\t\"ỏ\":\"o\",\n\t\"ơ\":\"o\",\n\t\"ớ\":\"o\",\n\t\"ợ\":\"o\",\n\t\"ờ\":\"o\",\n\t\"ở\":\"o\",\n\t\"ỡ\":\"o\",\n\t\"ȏ\":\"o\",\n\t\"ꝋ\":\"o\",\n\t\"ꝍ\":\"o\",\n\t\"ⱺ\":\"o\",\n\t\"ō\":\"o\",\n\t\"ṓ\":\"o\",\n\t\"ṑ\":\"o\",\n\t\"ǫ\":\"o\",\n\t\"ǭ\":\"o\",\n\t\"ø\":\"o\",\n\t\"ǿ\":\"o\",\n\t\"õ\":\"o\",\n\t\"ṍ\":\"o\",\n\t\"ṏ\":\"o\",\n\t\"ȭ\":\"o\",\n\t\"ƣ\":\"oi\",\n\t\"ꝏ\":\"oo\",\n\t\"ɛ\":\"e\",\n\t\"ᶓ\":\"e\",\n\t\"ɔ\":\"o\",\n\t\"ᶗ\":\"o\",\n\t\"ȣ\":\"ou\",\n\t\"ṕ\":\"p\",\n\t\"ṗ\":\"p\",\n\t\"ꝓ\":\"p\",\n\t\"ƥ\":\"p\",\n\t\"ᵱ\":\"p\",\n\t\"ᶈ\":\"p\",\n\t\"ꝕ\":\"p\",\n\t\"ᵽ\":\"p\",\n\t\"ꝑ\":\"p\",\n\t\"ꝙ\":\"q\",\n\t\"ʠ\":\"q\",\n\t\"ɋ\":\"q\",\n\t\"ꝗ\":\"q\",\n\t\"ŕ\":\"r\",\n\t\"ř\":\"r\",\n\t\"ŗ\":\"r\",\n\t\"ṙ\":\"r\",\n\t\"ṛ\":\"r\",\n\t\"ṝ\":\"r\",\n\t\"ȑ\":\"r\",\n\t\"ɾ\":\"r\",\n\t\"ᵳ\":\"r\",\n\t\"ȓ\":\"r\",\n\t\"ṟ\":\"r\",\n\t\"ɼ\":\"r\",\n\t\"ᵲ\":\"r\",\n\t\"ᶉ\":\"r\",\n\t\"ɍ\":\"r\",\n\t\"ɽ\":\"r\",\n\t\"ↄ\":\"c\",\n\t\"ꜿ\":\"c\",\n\t\"ɘ\":\"e\",\n\t\"ɿ\":\"r\",\n\t\"ś\":\"s\",\n\t\"ṥ\":\"s\",\n\t\"š\":\"s\",\n\t\"ṧ\":\"s\",\n\t\"ş\":\"s\",\n\t\"ŝ\":\"s\",\n\t\"ș\":\"s\",\n\t\"ṡ\":\"s\",\n\t\"ṣ\":\"s\",\n\t\"ṩ\":\"s\",\n\t\"ʂ\":\"s\",\n\t\"ᵴ\":\"s\",\n\t\"ᶊ\":\"s\",\n\t\"ȿ\":\"s\",\n\t\"ɡ\":\"g\",\n\t\"ᴑ\":\"o\",\n\t\"ᴓ\":\"o\",\n\t\"ᴝ\":\"u\",\n\t\"ť\":\"t\",\n\t\"ţ\":\"t\",\n\t\"ṱ\":\"t\",\n\t\"ț\":\"t\",\n\t\"ȶ\":\"t\",\n\t\"ẗ\":\"t\",\n\t\"ⱦ\":\"t\",\n\t\"ṫ\":\"t\",\n\t\"ṭ\":\"t\",\n\t\"ƭ\":\"t\",\n\t\"ṯ\":\"t\",\n\t\"ᵵ\":\"t\",\n\t\"ƫ\":\"t\",\n\t\"ʈ\":\"t\",\n\t\"ŧ\":\"t\",\n\t\"ᵺ\":\"th\",\n\t\"ɐ\":\"a\",\n\t\"ᴂ\":\"ae\",\n\t\"ǝ\":\"e\",\n\t\"ᵷ\":\"g\",\n\t\"ɥ\":\"h\",\n\t\"ʮ\":\"h\",\n\t\"ʯ\":\"h\",\n\t\"ᴉ\":\"i\",\n\t\"ʞ\":\"k\",\n\t\"ꞁ\":\"l\",\n\t\"ɯ\":\"m\",\n\t\"ɰ\":\"m\",\n\t\"ᴔ\":\"oe\",\n\t\"ɹ\":\"r\",\n\t\"ɻ\":\"r\",\n\t\"ɺ\":\"r\",\n\t\"ⱹ\":\"r\",\n\t\"ʇ\":\"t\",\n\t\"ʌ\":\"v\",\n\t\"ʍ\":\"w\",\n\t\"ʎ\":\"y\",\n\t\"ꜩ\":\"tz\",\n\t\"ú\":\"u\",\n\t\"ŭ\":\"u\",\n\t\"ǔ\":\"u\",\n\t\"û\":\"u\",\n\t\"ṷ\":\"u\",\n\t\"ü\":\"u\",\n\t\"ǘ\":\"u\",\n\t\"ǚ\":\"u\",\n\t\"ǜ\":\"u\",\n\t\"ǖ\":\"u\",\n\t\"ṳ\":\"u\",\n\t\"ụ\":\"u\",\n\t\"ű\":\"u\",\n\t\"ȕ\":\"u\",\n\t\"ù\":\"u\",\n\t\"ủ\":\"u\",\n\t\"ư\":\"u\",\n\t\"ứ\":\"u\",\n\t\"ự\":\"u\",\n\t\"ừ\":\"u\",\n\t\"ử\":\"u\",\n\t\"ữ\":\"u\",\n\t\"ȗ\":\"u\",\n\t\"ū\":\"u\",\n\t\"ṻ\":\"u\",\n\t\"ų\":\"u\",\n\t\"ᶙ\":\"u\",\n\t\"ů\":\"u\",\n\t\"ũ\":\"u\",\n\t\"ṹ\":\"u\",\n\t\"ṵ\":\"u\",\n\t\"ᵫ\":\"ue\",\n\t\"ꝸ\":\"um\",\n\t\"ⱴ\":\"v\",\n\t\"ꝟ\":\"v\",\n\t\"ṿ\":\"v\",\n\t\"ʋ\":\"v\",\n\t\"ᶌ\":\"v\",\n\t\"ⱱ\":\"v\",\n\t\"ṽ\":\"v\",\n\t\"ꝡ\":\"vy\",\n\t\"ẃ\":\"w\",\n\t\"ŵ\":\"w\",\n\t\"ẅ\":\"w\",\n\t\"ẇ\":\"w\",\n\t\"ẉ\":\"w\",\n\t\"ẁ\":\"w\",\n\t\"ⱳ\":\"w\",\n\t\"ẘ\":\"w\",\n\t\"ẍ\":\"x\",\n\t\"ẋ\":\"x\",\n\t\"ᶍ\":\"x\",\n\t\"ý\":\"y\",\n\t\"ŷ\":\"y\",\n\t\"ÿ\":\"y\",\n\t\"ẏ\":\"y\",\n\t\"ỵ\":\"y\",\n\t\"ỳ\":\"y\",\n\t\"ƴ\":\"y\",\n\t\"ỷ\":\"y\",\n\t\"ỿ\":\"y\",\n\t\"ȳ\":\"y\",\n\t\"ẙ\":\"y\",\n\t\"ɏ\":\"y\",\n\t\"ỹ\":\"y\",\n\t\"ź\":\"z\",\n\t\"ž\":\"z\",\n\t\"ẑ\":\"z\",\n\t\"ʑ\":\"z\",\n\t\"ⱬ\":\"z\",\n\t\"ż\":\"z\",\n\t\"ẓ\":\"z\",\n\t\"ȥ\":\"z\",\n\t\"ẕ\":\"z\",\n\t\"ᵶ\":\"z\",\n\t\"ᶎ\":\"z\",\n\t\"ʐ\":\"z\",\n\t\"ƶ\":\"z\",\n\t\"ɀ\":\"z\",\n\t\"ff\":\"ff\",\n\t\"ffi\":\"ffi\",\n\t\"ffl\":\"ffl\",\n\t\"fi\":\"fi\",\n\t\"fl\":\"fl\",\n\t\"ij\":\"ij\",\n\t\"œ\":\"oe\",\n\t\"st\":\"st\",\n\t\"ₐ\":\"a\",\n\t\"ₑ\":\"e\",\n\t\"ᵢ\":\"i\",\n\t\"ⱼ\":\"j\",\n\t\"ₒ\":\"o\",\n\t\"ᵣ\":\"r\",\n\t\"ᵤ\":\"u\",\n\t\"ᵥ\":\"v\",\n\t\"ₓ\":\"x\",\n\t\"Ё\":\"YO\",\n\t\"Й\":\"I\",\n\t\"Ц\":\"TS\",\n\t\"У\":\"U\",\n\t\"К\":\"K\",\n\t\"Е\":\"E\",\n\t\"Н\":\"N\",\n\t\"Г\":\"G\",\n\t\"Ш\":\"SH\",\n\t\"Щ\":\"SCH\",\n\t\"З\":\"Z\",\n\t\"Х\":\"H\",\n\t\"Ъ\":\"'\",\n\t\"ё\":\"yo\",\n\t\"й\":\"i\",\n\t\"ц\":\"ts\",\n\t\"у\":\"u\",\n\t\"к\":\"k\",\n\t\"е\":\"e\",\n\t\"н\":\"n\",\n\t\"г\":\"g\",\n\t\"ш\":\"sh\",\n\t\"щ\":\"sch\",\n\t\"з\":\"z\",\n\t\"х\":\"h\",\n\t\"ъ\":\"'\",\n\t\"Ф\":\"F\",\n\t\"Ы\":\"I\",\n\t\"В\":\"V\",\n\t\"А\":\"a\",\n\t\"П\":\"P\",\n\t\"Р\":\"R\",\n\t\"О\":\"O\",\n\t\"Л\":\"L\",\n\t\"Д\":\"D\",\n\t\"Ж\":\"ZH\",\n\t\"Э\":\"E\",\n\t\"ф\":\"f\",\n\t\"ы\":\"i\",\n\t\"в\":\"v\",\n\t\"а\":\"a\",\n\t\"п\":\"p\",\n\t\"р\":\"r\",\n\t\"о\":\"o\",\n\t\"л\":\"l\",\n\t\"д\":\"d\",\n\t\"ж\":\"zh\",\n\t\"э\":\"e\",\n\t\"Я\":\"Ya\",\n\t\"Ч\":\"CH\",\n\t\"С\":\"S\",\n\t\"М\":\"M\",\n\t\"И\":\"I\",\n\t\"Т\":\"T\",\n\t\"Ь\":\"'\",\n\t\"Б\":\"B\",\n\t\"Ю\":\"YU\",\n\t\"я\":\"ya\",\n\t\"ч\":\"ch\",\n\t\"с\":\"s\",\n\t\"м\":\"m\",\n\t\"и\":\"i\",\n\t\"т\":\"t\",\n\t\"ь\":\"'\",\n\t\"б\":\"b\",\n\t\"ю\":\"yu\"\n};\n\nexports.transliterate = function(str) {\n\treturn str.replace(/[^A-Za-z0-9\\[\\] ]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || ch\n\t});\n};\n\nexports.transliterateToSafeASCII = function(str) {\n\treturn str.replace(/[^\\x00-\\x7F]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || \"\"\n\t});\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/utils.js": {
            "title": "$:/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\nvar base64utf8 = require(\"$:/core/modules/utils/base64-utf8/base64-utf8.module.js\");\n\n/*\nDisplay a message, in colour if we're on a terminal\n*/\nexports.log = function(text,colour) {\n\tconsole.log($tw.node ? exports.terminalColour(colour) + text + exports.terminalColour() : text);\n};\n\nexports.terminalColour = function(colour) {\n\tif(!$tw.browser && $tw.node && process.stdout.isTTY) {\n\t\tif(colour) {\n\t\t\tvar code = exports.terminalColourLookup[colour];\n\t\t\tif(code) {\n\t\t\t\treturn \"\\x1b[\" + code + \"m\";\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"\\x1b[0m\"; // Cancel colour\n\t\t}\n\t}\n\treturn \"\";\n};\n\nexports.terminalColourLookup = {\n\t\"black\": \"0;30\",\n\t\"red\": \"0;31\",\n\t\"green\": \"0;32\",\n\t\"brown/orange\": \"0;33\",\n\t\"blue\": \"0;34\",\n\t\"purple\": \"0;35\",\n\t\"cyan\": \"0;36\",\n\t\"light gray\": \"0;37\"\n};\n\n/*\nDisplay a warning, in colour if we're on a terminal\n*/\nexports.warning = function(text) {\n\texports.log(text,\"brown/orange\");\n};\n\n/*\nLog a table of name: value pairs\n*/\nexports.logTable = function(data) {\n\tif(console.table) {\n\t\tconsole.table(data);\n\t} else {\n\t\t$tw.utils.each(data,function(value,name) {\n\t\t\tconsole.log(name + \": \" + value);\n\t\t});\n\t}\n}\n\n/*\nReturn the integer represented by the str (string).\nReturn the dflt (default) parameter if str is not a base-10 number.\n*/\nexports.getInt = function(str,deflt) {\n\tvar i = parseInt(str,10);\n\treturn isNaN(i) ? deflt : i;\n}\n\n/*\nRepeatedly replaces a substring within a string. Like String.prototype.replace, but without any of the default special handling of $ sequences in the replace string\n*/\nexports.replaceString = function(text,search,replace) {\n\treturn text.replace(search,function() {\n\t\treturn replace;\n\t});\n};\n\n/*\nRepeats a string\n*/\nexports.repeat = function(str,count) {\n\tvar result = \"\";\n\tfor(var t=0;t<count;t++) {\n\t\tresult += str;\n\t}\n\treturn result;\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\nexports.trimPrefix = function(str,unwanted) {\n\tif(typeof str === \"string\" && typeof unwanted === \"string\") {\n\t\tif(unwanted === \"\") {\n\t\t\treturn str.replace(/^\\s\\s*/, '');\n\t\t} else {\n\t\t\t// Safely regexp-escape the unwanted text\n\t\t\tunwanted = unwanted.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\tvar regex = new RegExp('^(' + unwanted + ')+');\n\t\t\treturn str.replace(regex, '');\n\t\t}\n\t} else {\n\t\treturn str;\n\t}\n};\n\nexports.trimSuffix = function(str,unwanted) {\n\tif(typeof str === \"string\" && typeof unwanted === \"string\") {\n\t\tif(unwanted === \"\") {\n\t\t\treturn str.replace(/\\s\\s*$/, '');\n\t\t} else {\n\t\t\t// Safely regexp-escape the unwanted text\n\t\t\tunwanted = unwanted.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\tvar regex = new RegExp('(' + unwanted + ')+$');\n\t\t\treturn str.replace(regex, '');\n\t\t}\n\t} else {\n\t\treturn str;\n\t}\n};\n\n/*\nConvert a string to sentence case (ie capitalise first letter)\n*/\nexports.toSentenceCase = function(str) {\n\treturn (str || \"\").replace(/^\\S/, function(c) {return c.toUpperCase();});\n}\n\n/*\nConvert a string to title case (ie capitalise each initial letter)\n*/\nexports.toTitleCase = function(str) {\n\treturn (str || \"\").replace(/(^|\\s)\\S/g, function(c) {return c.toUpperCase();});\n}\n\t\n/*\nFind the line break preceding a given position in a string\nReturns position immediately after that line break, or the start of the string\n*/\nexports.findPrecedingLineBreak = function(text,pos) {\n\tvar result = text.lastIndexOf(\"\\n\",pos - 1);\n\tif(result === -1) {\n\t\tresult = 0;\n\t} else {\n\t\tresult++;\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nFind the line break following a given position in a string\n*/\nexports.findFollowingLineBreak = function(text,pos) {\n\t// Cut to just past the following line break, or to the end of the text\n\tvar result = text.indexOf(\"\\n\",pos);\n\tif(result === -1) {\n\t\tresult = text.length;\n\t} else {\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\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/*\nDetermine whether an array-item is an object-property\n*/\nexports.hopArray = function(object,array) {\n\tfor(var i=0; i<array.length; i++) {\n\t\tif($tw.utils.hop(object,array[i])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\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\tif(object) {\n\t\tObject.freeze(object);\n\t\tfor(key in object) {\n\t\t\tproperty = object[key];\n\t\t\tif($tw.utils.hop(object,key) && (typeof property === \"object\") && !Object.isFrozen(property)) {\n\t\t\t\tdeepFreeze(property);\n\t\t\t}\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.pad($tw.utils.getYearForWeekNo(date),4);\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 $tw.utils.pad(date.getFullYear(),4);\n\t\t\t}],\n\t\t\t[/^aYYYY/, function() {\n\t\t\t\treturn $tw.utils.pad(Math.abs(date.getFullYear()),4);\n\t\t\t}],\n\t\t\t[/^\\{era:([^,\\|}]*)\\|([^}\\|]*)\\|([^}]*)\\}/, function(match) {\n\t\t\t\tvar year = date.getFullYear();\n\t\t\t\treturn year === 0 ? match[2] : (year < 0 ? match[1] : match[3]);\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[/^0XXX/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMilliseconds(),3);\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[/^XXX/, function() {\n\t\t\t\treturn date.getMilliseconds();\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\t// If the user wants everything in UTC, shift the datestamp\n\t// Optimize for format string that essentially means\n\t// 'return raw UTC (tiddlywiki style) date string.'\n\tif(t.indexOf(\"[UTC]\") == 0 ) {\n\t\tif(t == \"[UTC]YYYY0MM0DD0hh0mm0ssXXX\")\n\t\t\treturn $tw.utils.stringifyDate(new Date());\n\t\tvar offset = date.getTimezoneOffset() ; // in minutes\n\t\tdate = new Date(date.getTime()+offset*60*1000) ;\n\t\tt = t.substr(5) ;\n\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(null,match);\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 x = new Date(dt.getFullYear(),0,1);\n\tvar n = Math.floor((dt.getTime() - x.getTime()) / 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 converter = String.fromCodePoint || String.fromCharCode,\n\t\te = s.substr(1,s.length-2), // Strip the & and the ;\n\t\tc;\n\tif(e.charAt(0) === \"#\") {\n\t\tif(e.charAt(1) === \"x\" || e.charAt(1) === \"X\") {\n\t\t\tc = parseInt(e.substr(2),16);\n\t\t} else {\n\t\t\tc = parseInt(e.substr(1),10);\n\t\t}\n\t\tif(isNaN(c)) {\n\t\t\treturn s;\n\t\t} else {\n\t\t\treturn converter(c);\n\t\t}\n\t} else {\n\t\tc = $tw.config.htmlEntities[e];\n\t\tif(c) {\n\t\t\treturn converter(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, rawUnicode) {\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\tvar regex = rawUnicode ? /[\\x00-\\x1f]/g : /[\\x00-\\x1f\\x80-\\uFFFF]/g;\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(regex, exports.escape);   // non-ASCII characters\n};\n\n// Turns a string into a legal JSON string\n// Derived from peg.js, thanks to David Majda\nexports.jsonStringify = function(s, rawUnicode) {\n\t// See http://www.json.org/\n\tvar regex = rawUnicode ? /[\\x00-\\x1f]/g : /[\\x00-\\x1f\\x80-\\uFFFF]/g;\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\')            // backslash\n\t\t.replace(/\"/g, '\\\\\"')              // double quote character\n\t\t.replace(/\\r/g, '\\\\r')             // carriage return\n\t\t.replace(/\\n/g, '\\\\n')             // line feed\n\t\t.replace(/\\x08/g, '\\\\b')           // backspace\n\t\t.replace(/\\x0c/g, '\\\\f')           // formfeed\n\t\t.replace(/\\t/g, '\\\\t')             // tab\n\t\t.replace(regex,function(s) {\n\t\t\treturn '\\\\u' + $tw.utils.pad(s.charCodeAt(0).toString(16).toUpperCase(),4);\n\t\t}); // 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,0);\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) || 0;\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\treturn base64utf8.base64.decode.call(base64utf8,string64);\n};\n\n/*\nEncode a string to base64\n*/\nexports.base64Encode = function(string64) {\n\treturn base64utf8.base64.encode.call(base64utf8,string64);\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();\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,_canonical_uri) {\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\tif(_canonical_uri) {\n\t\tparts.push(_canonical_uri);\n\t} else {\n\t\tparts.push(\"data:\");\n\t\tparts.push(type);\n\t\tparts.push(isBase64 ? \";base64\" : \"\");\n\t\tparts.push(\",\");\n\t\tparts.push(isBase64 ? text : encodeURIComponent(text));\t\t\n\t}\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/*\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/*\nIE does not have an endsWith function\n*/\nexports.strEndsWith = function(str,ending,position) {\n\tif(str.endsWith) {\n\t\treturn str.endsWith(ending,position);\n\t} else {\n\t\tif (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > str.length) {\n\t\t\tposition = str.length;\n\t\t}\n\t\tposition -= ending.length;\n\t\tvar lastIndex = str.indexOf(ending, position);\n\t\treturn lastIndex !== -1 && lastIndex === position;\n\t}\n};\n\n/*\nReturn system information useful for debugging\n*/\nexports.getSystemInfo = function(str,ending,position) {\n\tvar results = [],\n\t\tsave = function(desc,value) {\n\t\t\tresults.push(desc + \": \" + value);\n\t\t};\n\tif($tw.browser) {\n\t\tsave(\"User Agent\",navigator.userAgent);\n\t\tsave(\"Online Status\",window.navigator.onLine);\n\t}\n\tif($tw.node) {\n\t\tsave(\"Node Version\",process.version);\n\t}\n\treturn results.join(\"\\n\");\n};\n\nexports.parseNumber = function(str) {\n\treturn parseFloat(str) || 0;\n};\n\nexports.parseInt = function(str) {\n\treturn parseInt(str,10) || 0;\n};\n\nexports.stringifyNumber = function(num) {\n\treturn num + \"\";\n};\n\nexports.makeCompareFunction = function(type,options) {\n\toptions = options || {};\n\tvar gt = options.invert ? -1 : +1,\n\t\tlt = options.invert ? +1 : -1,\n\t\tcompare = function(a,b) {\n\t\t\tif(a > b) {\n\t\t\t\treturn gt ;\n\t\t\t} else if(a < b) {\n\t\t\t\treturn lt;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t},\n\t\ttypes = {\n\t\t\t\"number\": function(a,b) {\n\t\t\t\treturn compare($tw.utils.parseNumber(a),$tw.utils.parseNumber(b));\n\t\t\t},\n\t\t\t\"integer\": function(a,b) {\n\t\t\t\treturn compare($tw.utils.parseInt(a),$tw.utils.parseInt(b));\n\t\t\t},\n\t\t\t\"string\": function(a,b) {\n\t\t\t\treturn compare(\"\" + a,\"\" +b);\n\t\t\t},\n\t\t\t\"date\": function(a,b) {\n\t\t\t\tvar dateA = $tw.utils.parseDate(a),\n\t\t\t\t\tdateB = $tw.utils.parseDate(b);\n\t\t\t\tif(!isFinite(dateA)) {\n\t\t\t\t\tdateA = new Date(0);\n\t\t\t\t}\n\t\t\t\tif(!isFinite(dateB)) {\n\t\t\t\t\tdateB = new Date(0);\n\t\t\t\t}\n\t\t\t\treturn compare(dateA,dateB);\n\t\t\t},\n\t\t\t\"version\": function(a,b) {\n\t\t\t\treturn $tw.utils.compareVersions(a,b);\n\t\t\t}\n\t\t};\n\treturn (types[type] || types[options.defaultType] || types.number);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/widgets/action-confirm.js": {
            "title": "$:/core/modules/widgets/action-confirm.js",
            "text": "/*\\\n\ntitle: $:/core/modules/widgets/action-confirm.js\ntype: application/javascript\nmodule-type: 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 ConfirmWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nConfirmWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nConfirmWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.parentDomNode = parent;\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nConfirmWidget.prototype.execute = function() {\n\tthis.message = this.getAttribute(\"$message\",$tw.language.getString(\"ConfirmAction\"));\n\tthis.prompt = (this.getAttribute(\"$prompt\",\"yes\") == \"no\" ? false : true);\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nConfirmWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$message\"] || changedAttributes[\"$prompt\"]) {\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*/\nConfirmWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar invokeActions = true,\n\t\thandled = true;\n\tif(this.prompt) {\n\t\tinvokeActions = confirm(this.message);\n\t}\n\tif(invokeActions) {\n\t\thandled = this.invokeActions(triggeringWidget,event);\n\t}\n\treturn handled;\n};\n\nConfirmWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nexports[\"action-confirm\"] = ConfirmWidget;\n\n})();",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-createtiddler.js": {
            "title": "$:/core/modules/widgets/action-createtiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-createtiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to create a new tiddler with a unique name and specified fields.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw:false, require:false, exports:false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CreateTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCreateTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCreateTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nCreateTiddlerWidget.prototype.execute = function() {\n\tthis.actionBaseTitle = this.getAttribute(\"$basetitle\");\n\tthis.hasBase = !!this.actionBaseTitle;\n\tthis.actionSaveTitle = this.getAttribute(\"$savetitle\");\n\tthis.actionSaveDraftTitle = this.getAttribute(\"$savedrafttitle\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n\t//Following params are new since 5.1.22\n\tthis.actionTemplate = this.getAttribute(\"$template\");\n\tthis.useTemplate = !!this.actionTemplate;\n\tthis.actionOverwrite = this.getAttribute(\"$overwrite\",\"no\");\n\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nCreateTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\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*/\nCreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar title = this.wiki.getTiddlerText(\"$:/language/DefaultNewTiddlerTitle\"), // Get the initial new-tiddler title\n\t\tfields = {},\n\t\tcreationFields,\n\t\tmodificationFields;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tfields[name] = attribute;\n\t\t}\n\t});\n\tif(this.actionTimestamp) {\n\t\tcreationFields = this.wiki.getCreationFields();\n\t\tmodificationFields = this.wiki.getModificationFields();\n\t}\n\tif(this.hasBase && this.actionOverwrite === \"no\") {\n\t\ttitle = this.wiki.generateNewTitle(this.actionBaseTitle);\n\t} else if (this.hasBase && this.actionOverwrite === \"yes\") {\n\t\ttitle = this.actionBaseTitle\n\t}\n\t// NO $basetitle BUT $template parameter is available\n\t// the title MUST be unique, otherwise the template would be overwritten\n\tif (!this.hasBase && this.useTemplate) {\n\t\ttitle = this.wiki.generateNewTitle(this.actionTemplate);\n\t} else if (!this.hasBase && !this.useTemplate) {\n\t\t// If NO $basetitle AND NO $template use initial title\n\t\t// DON'T overwrite any stuff\n\t\ttitle = this.wiki.generateNewTitle(title);\n\t}\n\tvar templateTiddler = this.wiki.getTiddler(this.actionTemplate) || {};\n\tvar tiddler = this.wiki.addTiddler(new $tw.Tiddler(templateTiddler.fields,creationFields,fields,modificationFields,{title: title}));\n\tif(this.actionSaveTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveTitle,title,this.getVariable(\"currentTiddler\"));\n\t}\n\tif(this.actionSaveDraftTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveDraftTitle,this.wiki.generateDraftTitle(title),this.getVariable(\"currentTiddler\"));\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-createtiddler\"] = CreateTiddlerWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-deletefield.js": {
            "title": "$:/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\t\thasChanged = false;\n\tif(this.actionField && tiddler) {\n\t\tremoveFields[this.actionField] = undefined;\n\t\tif(this.actionField in tiddler.fields) {\n\t\t\thasChanged = true;\n\t\t}\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\thasChanged = true;\n\t\t\t}\n\t\t});\n\t\tif(hasChanged) {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,removeFields,this.wiki.getModificationFields()));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletefield\"] = DeleteFieldWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-deletetiddler.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-listops.js": {
            "title": "$:/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 tiddler = this.wiki.getTiddler(this.target),\n\t\t\toldtags = tiddler ? (tiddler.fields.tags || []).slice(0) : [],\n\t\t\ttagfilter = \"[list[\" + this.target + \"!!tags]] \" + this.filtertags,\n\t\t\tnewtags = this.wiki.filterTiddlers(tagfilter,this);\n\t\tif($tw.utils.stringifyList(oldtags.sort()) !== $tw.utils.stringifyList(newtags.sort())) {\n\t\t\tthis.wiki.setText(this.target,\"tags\",undefined,$tw.utils.stringifyList(newtags));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-listops\"] = ActionListopsWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-log.js": {
            "title": "$:/core/modules/widgets/action-log.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-log.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to log debug messages\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 LogWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLogWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLogWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\nLogWidget.prototype.execute = function(){\n\tthis.message = this.getAttribute(\"$$message\",\"debug\");\n\tthis.logAll = this.getAttribute(\"$$all\",\"no\") === \"yes\" ? true : false;\n\tthis.filter = this.getAttribute(\"$$filter\");\n}\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nLogWidget.prototype.refresh = function(changedTiddlers) {\n\tthis.refreshSelf();\n\treturn true;\n};\n\n/*\nInvoke the action associated with this widget\n*/\nLogWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tthis.log();\n\treturn true; // Action was invoked\n};\n\nLogWidget.prototype.log = function() {\n\tvar data = {},\n\t\tdataCount,\n\t\tallVars = {},\n\t\tfilteredVars;\n\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.substring(0,2) !== \"$$\") {\n\t\t\tdata[name] = attribute;\n\t\t}\t\t\n\t});\n\n\tfor(var v in this.variables) {\n\t\tallVars[v] = this.getVariable(v,{defaultValue:\"\"});\n\t}\t\n\tif(this.filter) {\n\t\tfilteredVars = this.wiki.compileFilter(this.filter).call(this.wiki,this.wiki.makeTiddlerIterator(allVars));\n\t\t$tw.utils.each(filteredVars,function(name) {\n\t\t\tdata[name] = allVars[name];\n\t\t});\t\t\n\t}\n\tdataCount = $tw.utils.count(data);\n\n\tconsole.group(this.message);\n\tif(dataCount > 0) {\n\t\t$tw.utils.logTable(data);\n\t}\n\tif(this.logAll || !dataCount) {\n\t\tconsole.groupCollapsed(\"All variables\");\n\t\t$tw.utils.logTable(allVars);\n\t\tconsole.groupEnd();\n\t}\n\tconsole.groupEnd();\n}\n\nexports[\"action-log\"] = LogWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-navigate.js": {
            "title": "$:/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\tevent = 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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-popup.js": {
            "title": "$:/core/modules/widgets/action-popup.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-popup.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to trigger a popup.\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 ActionPopupWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nActionPopupWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nActionPopupWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nActionPopupWidget.prototype.execute = function() {\n\tthis.actionState = this.getAttribute(\"$state\");\n\tthis.actionCoords = this.getAttribute(\"$coords\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nActionPopupWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$state\"] || changedAttributes[\"$coords\"]) {\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*/\nActionPopupWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Trigger the popup\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(this.actionCoords || \"\");\n\tif(match) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: null,\n\t\t\tdomNodeRect: {\n\t\t\t\tleft: parseFloat(match[1]),\n\t\t\t\ttop: parseFloat(match[2]),\n\t\t\t\twidth: parseFloat(match[3]),\n\t\t\t\theight: parseFloat(match[4])\n\t\t\t},\n\t\t\ttitle: this.actionState,\n\t\t\twiki: this.wiki\n\t\t});\n\t} else {\n\t\t$tw.popup.cancel(0);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-popup\"] = ActionPopupWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-sendmessage.js": {
            "title": "$:/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\tevent: event\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-sendmessage\"] = SendMessageWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-setfield.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/browse.js": {
            "title": "$:/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\tif(this.accept) {\n\t\tdomNode.setAttribute(\"accept\",this.accept);\n\t}\n\t// Nw.js supports \"webkitdirectory\" and \"nwdirectory\" to allow a directory to be selected\n\tif(this.webkitdirectory) {\n\t\tdomNode.setAttribute(\"webkitdirectory\",this.webkitdirectory);\n\t}\n\tif(this.nwdirectory) {\n\t\tdomNode.setAttribute(\"nwdirectory\",this.nwdirectory);\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,{\n\t\t\t\tcallback: 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\tdeserializer: self.deserializer\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.deserializer = this.getAttribute(\"deserializer\");\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.accept = this.getAttribute(\"accept\");\n\tthis.webkitdirectory = this.getAttribute(\"webkitdirectory\");\n\tthis.nwdirectory = this.getAttribute(\"nwdirectory\");\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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/button.js": {
            "title": "$:/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\ttag = \"button\",\n\t\tdomNode;\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\tif(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\n\t\ttag = this.buttonTag;\n\t}\n\tdomNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\t// Assign classes\n\tvar classes = this[\"class\"].split(\" \") || [],\n\t\tisPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp();\n\tif(this.selectedClass) {\n\t\tif((this.set || this.setTitle) && 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\tif(this.popup || this.popupTitle) {\n\t\tdomNode.setAttribute(\"aria-expanded\",isPoppedUp ? \"true\" : \"false\");\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tdomNode.setAttribute(\"disabled\",true);\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(self,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 || self.popupTitle) {\n\t\t\tself.triggerPopup(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.set || self.setTitle) {\n\t\t\tself.setTiddler();\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.actions) {\n\t\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\tself.invokeActionString(self.actions,self,event,{modifier: modifierKey});\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// Make it draggable if required\n\tif(this.dragTiddler || this.dragFilter) {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.dragTiddler;},\n\t\t\tdragFilterFn: function() {return self.dragFilter;},\n\t\t\twidget: this\n\t\t});\n\t}\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.setTitle ? (this.setField ? this.wiki.getTiddler(this.setTitle).getFieldString(this.setField) === this.setTo :\n\t\t(this.setIndex ? this.wiki.extractTiddlerDataItem(this.setTitle,this.setIndex) === this.setTo :\n\t\t\tthis.wiki.getTiddlerText(this.setTitle))) || this.defaultSetValue || this.getVariable(\"currentTiddler\") :\n\t\tthis.wiki.getTextReference(this.set,this.defaultSetValue,this.getVariable(\"currentTiddler\")) === this.setTo;\n};\n\nButtonWidget.prototype.isPoppedUp = function() {\n\tvar tiddler = this.popupTitle ? this.wiki.getTiddler(this.popupTitle) : 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\tevent: event\n\t});\n};\n\nButtonWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\"), event: event});\n};\n\nButtonWidget.prototype.triggerPopup = function(event) {\n\tif(this.popupTitle) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popupTitle,\n\t\t\twiki: this.wiki,\n\t\t\tnoStateReference: true\n\t\t});\n\t} else {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popup,\n\t\t\twiki: this.wiki\n\t\t});\n\t}\n};\n\nButtonWidget.prototype.setTiddler = function() {\n\tif(this.setTitle) {\n\t\tthis.setField ? this.wiki.setText(this.setTitle,this.setField,undefined,this.setTo) :\n\t\t\t\t(this.setIndex ? this.wiki.setText(this.setTitle,undefined,this.setIndex,this.setTo) :\n\t\t\t\tthis.wiki.setText(this.setTitle,\"text\",undefined,this.setTo));\n\t} else {\n\t\tthis.wiki.setTextReference(this.set,this.setTo,this.getVariable(\"currentTiddler\"));\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nButtonWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\");\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[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis.selectedClass = this.getAttribute(\"selectedClass\");\n\tthis.defaultSetValue = this.getAttribute(\"default\",\"\");\n\tthis.buttonTag = this.getAttribute(\"tag\");\n\tthis.dragTiddler = this.getAttribute(\"dragTiddler\");\n\tthis.dragFilter = this.getAttribute(\"dragFilter\");\n\tthis.setTitle = this.getAttribute(\"setTitle\");\n\tthis.setField = this.getAttribute(\"setField\");\n\tthis.setIndex = this.getAttribute(\"setIndex\");\n\tthis.popupTitle = this.getAttribute(\"popupTitle\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nButtonWidget.prototype.updateDomNodeClasses = function() {\n\tvar domNodeClasses = this.domNode.className.split(\" \"),\n\t\toldClasses = this.class.split(\" \"),\n\t\tnewClasses;\t\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tnewClasses = this.class.split(\" \");\n\t//Remove classes assigned from the old value of class attribute\n\t$tw.utils.each(oldClasses,function(oldClass){\n\t\tvar i = domNodeClasses.indexOf(oldClass);\n\t\tif(i !== -1) {\n\t\t\tdomNodeClasses.splice(i,1);\n\t\t}\n\t});\n\t//Add new classes from updated class attribute.\n\t$tw.utils.pushTop(domNodeClasses,newClasses);\n\tthis.domNode.className = domNodeClasses.join(\" \");\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.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle || changedAttributes.disabled) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.updateDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.button = ButtonWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/checkbox.js": {
            "title": "$:/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\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",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;\n\t\t\tif($tw.utils.hop(tiddler.fields,this.checkboxField)) {\n\t\t\t\tvalue = tiddler.fields[this.checkboxField] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.checkboxDefault || \"\";\n\t\t\t}\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\tif(this.checkboxIndex) {\n\t\t\tvar value = this.wiki.extractTiddlerDataItem(tiddler,this.checkboxIndex,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\t\tvalue = checked ? this.checkboxChecked : this.checkboxUnchecked;\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\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\t// Set the index if specified\n\tif(this.checkboxIndex) {\n\t\tvar indexValue = this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxIndex);\n\t\tif(!tiddler || indexValue !== value) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(hasChanged) {\n\t\tif(this.checkboxIndex) {\n\t\t\tthis.wiki.setText(this.checkboxTitle,\"\",this.checkboxIndex,value);\n\t\t} else {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),fallbackFields,tiddler,newFields,this.wiki.getModificationFields()));\n\t\t}\n\t}\n\t// Trigger actions\n\tif(this.checkboxActions) {\n\t\tthis.invokeActionString(this.checkboxActions,this,event);\n\t}\n\tif(this.checkboxCheckActions && checked) {\n\t\tthis.invokeActionString(this.checkboxCheckActions,this,event);\n\t}\n\tif(this.checkboxUncheckActions && !checked) {\n\t\tthis.invokeActionString(this.checkboxUncheckActions,this,event);\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.checkboxActions = this.getAttribute(\"actions\");\n\tthis.checkboxCheckActions = this.getAttribute(\"checkactions\");\n\tthis.checkboxUncheckActions = this.getAttribute(\"uncheckactions\");\n\tthis.checkboxTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.checkboxTag = this.getAttribute(\"tag\");\n\tthis.checkboxField = this.getAttribute(\"field\");\n\tthis.checkboxIndex = this.getAttribute(\"index\");\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\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\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.index || changedAttributes.checked || changedAttributes.unchecked || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.disabled) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.checkboxTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue();\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.checkbox = CheckboxWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/codeblock.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/count.js": {
            "title": "$:/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 = \"0\";\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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/diff-text.js": {
            "title": "$:/core/modules/widgets/diff-text.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/diff-text.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display a diff between two texts\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\tdmp = require(\"$:/core/modules/utils/diff-match-patch/diff_match_patch.js\");\n\nvar DiffTextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDiffTextWidget.prototype = new Widget();\n\nDiffTextWidget.prototype.invisibleCharacters = {\n\t\"\\n\": \"↩︎\\n\",\n\t\"\\r\": \"⇠\",\n\t\"\\t\": \"⇥\\t\"\n};\n\n/*\nRender this widget into the DOM\n*/\nDiffTextWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create the diff\n\tvar dmpObject = new dmp.diff_match_patch(),\n\t\tdiffs = dmpObject.diff_main(this.getAttribute(\"source\"),this.getAttribute(\"dest\"));\n\t// Apply required cleanup\n\tswitch(this.getAttribute(\"cleanup\",\"semantic\")) {\n\t\tcase \"none\":\n\t\t\t// No cleanup\n\t\t\tbreak;\n\t\tcase \"efficiency\":\n\t\t\tdmpObject.diff_cleanupEfficiency(diffs);\n\t\t\tbreak;\n\t\tdefault: // case \"semantic\"\n\t\t\tdmpObject.diff_cleanupSemantic(diffs);\n\t\t\tbreak;\n\t}\n\t// Create the elements\n\tvar domContainer = this.document.createElement(\"div\"), \n\t\tdomDiff = this.createDiffDom(diffs);\n\tparent.insertBefore(domContainer,nextSibling);\n\t// Set variables\n\tthis.setVariable(\"diff-count\",diffs.reduce(function(acc,diff) {\n\t\tif(diff[0] !== dmp.DIFF_EQUAL) {\n\t\t\tacc++;\n\t\t}\n\t\treturn acc;\n\t},0).toString());\n\t// Render child widgets\n\tthis.renderChildren(domContainer,null);\n\t// Render the diff\n\tdomContainer.appendChild(domDiff);\n\t// Save our container\n\tthis.domNodes.push(domContainer);\n};\n\n/*\nCreate DOM elements representing a list of diffs\n*/\nDiffTextWidget.prototype.createDiffDom = function(diffs) {\n\tvar self = this;\n\t// Create the element and assign the attributes\n\tvar domPre = this.document.createElement(\"pre\"),\n\t\tdomCode = this.document.createElement(\"code\");\n\t$tw.utils.each(diffs,function(diff) {\n\t\tvar tag = diff[0] === dmp.DIFF_INSERT ? \"ins\" : (diff[0] === dmp.DIFF_DELETE ? \"del\" : \"span\"),\n\t\t\tclassName = diff[0] === dmp.DIFF_INSERT ? \"tc-diff-insert\" : (diff[0] === dmp.DIFF_DELETE ? \"tc-diff-delete\" : \"tc-diff-equal\"),\n\t\t\tdom = self.document.createElement(tag),\n\t\t\ttext = diff[1],\n\t\t\tcurrPos = 0,\n\t\t\tre = /([\\x00-\\x1F])/mg,\n\t\t\tmatch = re.exec(text),\n\t\t\tspan,\n\t\t\tprintable;\n\t\tdom.className = className;\n\t\twhile(match) {\n\t\t\tif(currPos < match.index) {\n\t\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos,match.index)));\n\t\t\t}\n\t\t\tspan = self.document.createElement(\"span\");\n\t\t\tspan.className = \"tc-diff-invisible\";\n\t\t\tprintable = self.invisibleCharacters[match[0]] || (\"[0x\" + match[0].charCodeAt(0).toString(16) + \"]\");\n\t\t\tspan.appendChild(self.document.createTextNode(printable));\n\t\t\tdom.appendChild(span);\n\t\t\tcurrPos = match.index + match[0].length;\n\t\t\tmatch = re.exec(text);\n\t\t}\n\t\tif(currPos < text.length) {\n\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos)));\n\t\t}\n\t\tdomCode.appendChild(dom);\n\t});\n\tdomPre.appendChild(domCode);\n\treturn domPre;\n};\n\n/*\nCompute the internal state of the widget\n*/\nDiffTextWidget.prototype.execute = function() {\n\t// Make child widgets\n\tvar parseTreeNodes;\n\tif(this.parseTreeNode && this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\tparseTreeNodes = this.parseTreeNode.children;\n\t} else {\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: \"$:/language/Diffs/CountMessage\"}\n\t\t\t}\n\t\t}];\n\t}\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*/\nDiffTextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.dest || changedAttributes.cleanup) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports[\"diff-text\"] = DiffTextWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/draggable.js": {
            "title": "$:/core/modules/widgets/draggable.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/draggable.js\ntype: application/javascript\nmodule-type: widget\n\nDraggable 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 DraggableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDraggableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDraggableWidget.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// Sanitise the specified tag\n\tvar tag = this.draggableTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"div\";\n\t}\n\t// Create our element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = [\"tc-draggable\"];\n\tif(this.draggableClasses) {\n\t\tclasses.push(this.draggableClasses);\n\t}\n\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t// Add event handlers\n\t$tw.utils.makeDraggable({\n\t\tdomNode: domNode,\n\t\tdragTiddlerFn: function() {return self.getAttribute(\"tiddler\");},\n\t\tdragFilterFn: function() {return self.getAttribute(\"filter\");},\n\t\tstartActions: self.startActions,\n\t\tendActions: self.endActions,\n\t\twidget: this\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\n/*\nCompute the internal state of the widget\n*/\nDraggableWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.draggableTag = this.getAttribute(\"tag\",\"div\");\n\tthis.draggableClasses = this.getAttribute(\"class\");\n\tthis.startActions = this.getAttribute(\"startactions\");\n\tthis.endActions = this.getAttribute(\"endactions\");\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*/\nDraggableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tag || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.draggable = DraggableWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/droppable.js": {
            "title": "$:/core/modules/widgets/droppable.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/droppable.js\ntype: application/javascript\nmodule-type: widget\n\nDroppable 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 DroppableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDroppableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDroppableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this,\n\t\ttag = this.parseTreeNode.isBlock ? \"div\" : \"span\",\n\t\tdomNode;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.droppableTag && $tw.config.htmlUnsafeElements.indexOf(this.droppableTag) === -1) {\n\t\ttag = this.droppableTag;\n\t}\n\t// Create element and assign classes\n\tdomNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\n\t// Add event handlers\n\tif(this.droppableEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"}\n\t\t]);\t\t\n\t} else {\n\t\t$tw.utils.addClass(this.domNode,this.disabledClass);\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDroppableWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDroppableWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally. The hacky second condition is to resolve a problem with Firefox whereby there is an erroneous dragenter event if the node being dragged is within the dropzone\n\tif(this.currentlyEntered.length === 0 || (this.currentlyEntered.length === 1 && this.currentlyEntered[0] === $tw.dragInProgress)) {\n\t\tthis.currentlyEntered = [];\n\t\tif(this.domNodes[0]) {\n\t\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t\t}\n\t}\n};\n\nDroppableWidget.prototype.handleDragEnterEvent  = function(event) {\n\tthis.enterDrag(event);\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\treturn false;\n};\n\nDroppableWidget.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// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\t// Set the drop effect\n\tevent.dataTransfer.dropEffect = this.droppableEffect;\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragLeaveEvent  = function(event) {\n\tthis.leaveDrag(event);\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDropEvent  = function(event) {\n\tvar self = this;\n\tthis.leaveDrag(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\tvar dataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Try to import the various data types we understand\n\t$tw.utils.importDataTransfer(dataTransfer,null,function(fieldsArray) {\n\t\tfieldsArray.forEach(function(fields) {\n\t\t\tself.performActions(fields.title || fields.text,event);\n\t\t});\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\treturn false;\n};\n\nDroppableWidget.prototype.performActions = function(title,event) {\n\tif(this.droppableActions) {\n\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\tthis.invokeActionString(this.droppableActions,this,event,{actionTiddler: title, modifier: modifierKey});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDroppableWidget.prototype.execute = function() {\n\tthis.droppableActions = this.getAttribute(\"actions\");\n\tthis.droppableEffect = this.getAttribute(\"effect\",\"copy\");\n\tthis.droppableTag = this.getAttribute(\"tag\");\n\tthis.droppableEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\tthis.disabledClass = this.getAttribute(\"disabledClass\",\"\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nDroppableWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-droppable\");\n\tthis.domNode.className = classes.join(\" \");\t\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDroppableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tag || changedAttributes.enable || changedAttributes.disabledClass || changedAttributes.actions || changedAttributes.effect) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.assignDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.droppable = DroppableWidget;\n\n})();",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/dropzone.js": {
            "title": "$:/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 = this.dropzoneClass || \"tc-dropzone\";\n\t// Add event handlers\n\tif(this.dropzoneEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"},\n\t\t\t{name: \"paste\", handlerObject: this, handlerMethod: \"handlePasteEvent\"},\n\t\t\t{name: \"dragend\", handlerObject: this, handlerMethod: \"handleDragEndEvent\"}\n\t\t]);\t\t\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\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDropZoneWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally\n\tif(this.currentlyEntered.length === 0) {\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.handleDragEnterEvent  = function(event) {\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tthis.enterDrag(event);\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(event);\n};\n\nDropZoneWidget.prototype.handleDragEndEvent = function(event) {\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.handleDropEvent  = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\n\t\t};\n\tthis.leaveDrag(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\tvar self = this,\n\t\tdataTransfer = event.dataTransfer;\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 = 0;\n\tif(dataTransfer.files) {\n\t\tnumFiles = this.wiki.readFiles(dataTransfer.files,{\n\t\t\tcallback: readFileCallback,\n\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t});\n\t}\n\t// Try to import the various data types we understand\n\tif(numFiles === 0) {\n\t\t$tw.utils.importDataTransfer(dataTransfer,this.wiki.generateNewTitle(\"Untitled\"),readFileCallback);\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.handlePasteEvent  = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\n\t\t};\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 && !event.target.isContentEditable) {\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(),{\n\t\t\t\t\tcallback: readFileCallback,\n\t\t\t\t\tdeserializer: this.dropzoneDeserializer\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]), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\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\tthis.dropzoneClass = this.getAttribute(\"class\");\n\tthis.dropzoneDeserializer = this.getAttribute(\"deserializer\");\n\tthis.dropzoneEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\tthis.autoOpenOnImport = this.getAttribute(\"autoOpenOnImport\");\n\tthis.importTitle = this.getAttribute(\"importTitle\");\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\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.enable || changedAttributes.autoOpenOnImport || changedAttributes.importTitle || changedAttributes.deserializer || changedAttributes.class) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.dropzone = DropZoneWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit-binary.js": {
            "title": "$:/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\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\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// Get our parameters\n\tvar editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tvar tiddler = this.wiki.getTiddler(editTitle);\n\tvar type = tiddler.fields.type;\n\tvar text = tiddler.fields.text;\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on draft tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!draft.title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!draft.title\"}\n\t\t},\n\t\tchildren: [{\n\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to internal data URI (no external)\n\tif(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets([element]);\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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit-bitmap.js": {
            "title": "$:/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 = 600,\n\tDEFAULT_IMAGE_HEIGHT = 370,\n\tDEFAULT_IMAGE_TYPE = \"image/png\";\n\n// Configuration tiddlers\nvar LINE_WIDTH_TITLE = \"$:/config/BitmapEditor/LineWidth\",\n\tLINE_COLOUR_TITLE = \"$:/config/BitmapEditor/Colour\",\n\tLINE_OPACITY_TITLE = \"$:/config/BitmapEditor/Opacity\";\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// Initialise the editor operations if they've not been done already\n\tif(!this.editorOperations) {\n\t\tEditBitmapWidget.prototype.editorOperations = {};\n\t\t$tw.modules.applyMethods(\"bitmapeditoroperation\",this.editorOperations);\n\t}\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 the wrapper for the toolbar and render its content\n\tthis.toolbarNode = this.document.createElement(\"div\");\n\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\tparent.insertBefore(this.toolbarNode,nextSibling);\n\tthis.domNodes.push(this.toolbarNode);\n\t// Create the on-screen canvas\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\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Render toolbar child widgets\n\tthis.renderChildren(this.toolbarNode,null);\n\t// // Insert the elements into the DOM\n\tparent.insertBefore(this.canvasDomNode,nextSibling);\n\tthis.domNodes.push(this.canvasDomNode);\n\t// Load the image into the canvas\n\tif($tw.browser) {\n\t\tthis.loadCanvas();\n\t}\n\t// Add widget message listeners\n\tthis.addEventListeners([\n\t\t{type: \"tm-edit-bitmap-operation\", handler: \"handleEditBitmapOperationMessage\"}\n\t]);\n};\n\n/*\nHandle an edit bitmap operation message from the toolbar\n*/\nEditBitmapWidget.prototype.handleEditBitmapOperationMessage = function(event) {\n\t// Invoke the handler\n\tvar handler = this.editorOperations[event.param];\n\tif(handler) {\n\t\thandler.call(this,event);\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\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nJust refresh the toolbar\n*/\nEditBitmapWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nSet the bitmap size variables and refresh the toolbar\n*/\nEditBitmapWidget.prototype.refreshToolbar = function() {\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Refresh each of our child widgets\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\tchildWidget.refreshSelf();\n\t});\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.refreshToolbar();\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.refreshToolbar();\n\t};\n\t// Get the current bitmap into an image object\n\tif(tiddler && tiddler.fields.type && tiddler.fields.text) {\n\t\tcurrImage.src = \"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text;\t\t\n\t} else {\n\t\tcurrImage.width = DEFAULT_IMAGE_WIDTH;\n\t\tcurrImage.height = DEFAULT_IMAGE_HEIGHT;\n\t\tcurrImage.onerror();\n\t}\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** 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\n/*\n** Rotate the canvas left by 90 degrees\n*/\nEditBitmapWidget.prototype.rotateCanvasLeft = function() {\n\t// Get the current size of the image\n\tvar origWidth = this.currCanvas.width,\n\t\torigHeight = this.currCanvas.height;\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\"),\n\t\tnewWidth = origHeight,\n\t\tnewHeight = origWidth;\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.save();\n\tctx.translate(newWidth / 2,newHeight / 2);\n\tctx.rotate(-Math.PI / 2);\n\tctx.drawImage(this.currCanvas,-origWidth / 2,-origHeight / 2);\n\tctx.restore();\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.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.globalAlpha = parseFloat(this.wiki.getTiddlerText(LINE_OPACITY_TITLE,\"1.0\"));\n\tctx.strokeStyle = this.wiki.getTiddlerText(LINE_COLOUR_TITLE,\"#ff0\");\n\tctx.lineWidth = parseFloat(this.wiki.getTiddlerText(LINE_WIDTH_TITLE,\"3\"));\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) || new $tw.Tiddler({title: this.editTitle,type: DEFAULT_IMAGE_TYPE});\n\t// data URIs look like \"data:<type>;base64,<text>\"\n\tvar dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type),\n\t\tposColon = dataURL.indexOf(\":\"),\n\t\tposSemiColon = dataURL.indexOf(\";\"),\n\t\tposComma = dataURL.indexOf(\",\"),\n\t\ttype = dataURL.substring(posColon+1,posSemiColon),\n\t\ttext = dataURL.substring(posComma+1);\n\tvar update = {type: type, text: text};\n\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getModificationFields(),tiddler,update,this.wiki.getCreationFields()));\n};\n\nexports[\"edit-bitmap\"] = EditBitmapWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit-shortcut.js": {
            "title": "$:/core/modules/widgets/edit-shortcut.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/edit-shortcut.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display an editable keyboard shortcut\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 EditShortcutWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditShortcutWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditShortcutWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.inputNode = this.document.createElement(\"input\");\n\t// Assign classes\n\tif(this.shortcutClass) {\n\t\tthis.inputNode.className = this.shortcutClass;\t\t\n\t}\n\t// Assign other attributes\n\tif(this.shortcutStyle) {\n\t\tthis.inputNode.setAttribute(\"style\",this.shortcutStyle);\n\t}\n\tif(this.shortcutTooltip) {\n\t\tthis.inputNode.setAttribute(\"title\",this.shortcutTooltip);\n\t}\n\tif(this.shortcutPlaceholder) {\n\t\tthis.inputNode.setAttribute(\"placeholder\",this.shortcutPlaceholder);\n\t}\n\tif(this.shortcutAriaLabel) {\n\t\tthis.inputNode.setAttribute(\"aria-label\",this.shortcutAriaLabel);\n\t}\n\t// Assign the current shortcut\n\tthis.updateInputNode();\n\t// Add event handlers\n\t$tw.utils.addEventListeners(this.inputNode,[\n\t\t{name: \"keydown\", handlerObject: this, handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Link into the DOM\n\tparent.insertBefore(this.inputNode,nextSibling);\n\tthis.domNodes.push(this.inputNode);\n\t// Focus the input Node if focus === \"yes\" or focus === \"true\"\n\tif(this.shortcutFocus === \"yes\" || this.shortcutFocus === \"true\") {\n\t\tthis.focus();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditShortcutWidget.prototype.execute = function() {\n\tthis.shortcutTiddler = this.getAttribute(\"tiddler\");\n\tthis.shortcutField = this.getAttribute(\"field\");\n\tthis.shortcutIndex = this.getAttribute(\"index\");\n\tthis.shortcutPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.shortcutDefault = this.getAttribute(\"default\",\"\");\n\tthis.shortcutClass = this.getAttribute(\"class\");\n\tthis.shortcutStyle = this.getAttribute(\"style\");\n\tthis.shortcutTooltip = this.getAttribute(\"tooltip\");\n\tthis.shortcutAriaLabel = this.getAttribute(\"aria-label\");\n\tthis.shortcutFocus = this.getAttribute(\"focus\");\n};\n\n/*\nUpdate the value of the input node\n*/\nEditShortcutWidget.prototype.updateInputNode = function() {\n\tif(this.shortcutField) {\n\t\tvar tiddler = this.wiki.getTiddler(this.shortcutTiddler);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,this.shortcutField)) {\n\t\t\tthis.inputNode.value = tiddler.getFieldString(this.shortcutField);\n\t\t} else {\n\t\t\tthis.inputNode.value = this.shortcutDefault;\n\t\t}\n\t} else if(this.shortcutIndex) {\n\t\tthis.inputNode.value = this.wiki.extractTiddlerDataItem(this.shortcutTiddler,this.shortcutIndex,this.shortcutDefault);\n\t} else {\n\t\tthis.inputNode.value = this.wiki.getTiddlerText(this.shortcutTiddler,this.shortcutDefault);\n\t}\n};\n\n/*\nHandle a dom \"keydown\" event\n*/\nEditShortcutWidget.prototype.handleKeydownEvent = function(event) {\n\t// Ignore shift, ctrl, meta, alt\n\tif(event.keyCode && $tw.keyboardManager.getModifierKeys().indexOf(event.keyCode) === -1) {\n\t\t// Get the shortcut text representation\n\t\tvar value = $tw.keyboardManager.getPrintableShortcuts([{\n\t\t\tctrlKey: event.ctrlKey,\n\t\t\tshiftKey: event.shiftKey,\n\t\t\taltKey: event.altKey,\n\t\t\tmetaKey: event.metaKey,\n\t\t\tkeyCode: event.keyCode\n\t\t}]);\n\t\tif(value.length > 0) {\n\t\t\tthis.wiki.setText(this.shortcutTiddler,this.shortcutField,this.shortcutIndex,value[0]);\n\t\t}\n\t\t// Ignore the keydown if it was already handled\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn true;\t\t\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nfocus the input node\n*/\nEditShortcutWidget.prototype.focus = function() {\n\tif(this.inputNode.focus && this.inputNode.select) {\n\t\tthis.inputNode.focus();\n\t\tthis.inputNode.select();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget needed re-rendering\n*/\nEditShortcutWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.placeholder || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.style || changedAttributes.tooltip || changedAttributes[\"aria-label\"] || changedAttributes.focus) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.shortcutTiddler]) {\n\t\tthis.updateInputNode();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports[\"edit-shortcut\"] = EditShortcutWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit-text.js": {
            "title": "$:/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 editTextWidgetFactory = require(\"$:/core/modules/editor/factory.js\").editTextWidgetFactory,\n\tFramedEngine = require(\"$:/core/modules/editor/engines/framed.js\").FramedEngine,\n\tSimpleEngine = require(\"$:/core/modules/editor/engines/simple.js\").SimpleEngine;\n\nexports[\"edit-text\"] = editTextWidgetFactory(FramedEngine,SimpleEngine);\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit.js": {
            "title": "$:/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\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\tthis.editFocus = this.getAttribute(\"focus\",\"\");\n\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"\");\n\tthis.editInputActions = this.getAttribute(\"inputActions\");\n\tthis.editRefreshTitle = this.getAttribute(\"refreshTitle\");\n\tthis.editAutoComplete = this.getAttribute(\"autocomplete\");\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: this.parseTreeNode.attributes,\n\t\tchildren: this.parseTreeNode.children\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 || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.edit = EditWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/element.js": {
            "title": "$:/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\t// Neuter blacklisted elements\n\tthis.tag = this.parseTreeNode.tag;\n\tif($tw.config.htmlUnsafeElements.indexOf(this.tag) !== -1) {\n\t\tthis.tag = \"safe-\" + this.tag;\n\t}\n\t// Adjust headings by the current base level\n\tvar headingLevel = [\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"].indexOf(this.tag);\n\tif(headingLevel !== -1) {\n\t\tvar baseLevel = parseInt(this.getVariable(\"tv-adjust-heading-level\",\"0\"),10) || 0;\n\t\theadingLevel = Math.min(Math.max(headingLevel + 1 + baseLevel,1),6);\n\t\tthis.tag = \"h\" + headingLevel;\n\t}\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.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// Invoke the th-rendering-element hook\n\tvar parseTreeNodes = $tw.hooks.invokeHook(\"th-rendering-element\",null,this);\n\tthis.isReplaced = !!parseTreeNodes;\n\tif(parseTreeNodes) {\n\t\t// Use the parse tree nodes provided by the hook\n\t\tthis.makeChildWidgets(parseTreeNodes);\n\t\tthis.renderChildren(this.parentDomNode,null);\n\t\treturn;\n\t}\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n\t// Create the DOM node and render children\n\tvar domNode = this.document.createElementNS(this.namespace,this.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/*\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\tif(!this.isReplaced) {\n\t\t\t// Update our attributes\n\t\t\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\t\t\t\n\t\t} else {\n\t\t\t// If we were replaced then completely refresh ourselves\n\t\t\treturn this.refreshSelf();\n\t\t}\n\t}\n\treturn this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\nexports.element = ElementWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/encrypt.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/entity.js": {
            "title": "$:/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.computeAttributes();\n\tthis.execute();\n\tvar entityString = this.getAttribute(\"entity\",this.parseTreeNode.entity || \"\"),\n\t\ttextNode = this.document.createTextNode($tw.utils.entityDecode(entityString));\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\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.entity) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.entity = EntityWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/eventcatcher.js": {
            "title": "$:/core/modules/widgets/eventcatcher.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/eventcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nEvent handler 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 EventWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEventWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEventWidget.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 = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.elementTag && $tw.config.htmlUnsafeElements.indexOf(this.elementTag) === -1) {\n\t\ttag = this.elementTag;\n\t}\t\n\tvar domNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\t// Assign classes\n\tthis.assignDomNodeClasses();\t\n\t// Add our event handler\n\t$tw.utils.each(this.types,function(type) {\n\t\tdomNode.addEventListener(type,function(event) {\n\t\t\tvar selector = self.getAttribute(\"selector\"),\n\t\t\t\tactions = self.getAttribute(\"actions-\"+type),\n\t\t\t\tselectedNode = event.target,\n\t\t\t\tselectedNodeRect,\n\t\t\t\tcatcherNodeRect,\n\t\t\t\tvariables = {};\n\t\t\tif(selector) {\n\t\t\t\t// Search ancestors for a node that matches the selector\n\t\t\t\twhile(!selectedNode.matches(selector) && selectedNode !== domNode) {\n\t\t\t\t\tselectedNode = selectedNode.parentNode;\n\t\t\t\t}\n\t\t\t\t// If we found one, copy the attributes as variables, otherwise exit\n\t\t\t\tif(selectedNode.matches(selector)) {\n\t\t\t\t\t$tw.utils.each(selectedNode.attributes,function(attribute) {\n\t\t\t\t\t\tvariables[\"dom-\" + attribute.name] = attribute.value.toString();\n\t\t\t\t\t});\n\t\t\t\t\t//Add a variable with a popup coordinate string for the selected node\n\t\t\t\t\tvariables[\"tv-popup-coords\"] = \"(\" + selectedNode.offsetLeft + \",\" + selectedNode.offsetTop +\",\" + selectedNode.offsetWidth + \",\" + selectedNode.offsetHeight + \")\";\n\t\t\t\t\t\n\t\t\t\t\t//Add variables for offset of selected node\n\t\t\t\t\tvariables[\"tv-selectednode-posx\"] = selectedNode.offsetLeft.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-posy\"] = selectedNode.offsetTop.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-width\"] = selectedNode.offsetWidth.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-height\"] = selectedNode.offsetHeight.toString();\n\n\t\t\t\t\t//Add variables for event X and Y position relative to selected node\n\t\t\t\t\tselectedNodeRect = selectedNode.getBoundingClientRect();\t\t\t\t\n\t\t\t\t\tvariables[\"event-fromselected-posx\"] = (event.clientX - selectedNodeRect.left).toString();\n\t\t\t\t\tvariables[\"event-fromselected-posy\"] = (event.clientY - selectedNodeRect.top).toString();\n\n\t\t\t\t\t//Add variables for event X and Y position relative to event catcher node\n\t\t\t\t\tcatcherNodeRect = self.domNode.getBoundingClientRect();\n\t\t\t\t\tvariables[\"event-fromcatcher-posx\"] = (event.clientX - catcherNodeRect.left).toString();\n\t\t\t\t\tvariables[\"event-fromcatcher-posy\"] = (event.clientY - catcherNodeRect.top).toString();\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Execute our actions with the variables\n\t\t\tif(actions) {\n\t\t\t\t// Add a variable for the modifier key\n\t\t\t\tvariables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\t\t// Add a variable for the mouse button\n\t\t\t\tif(\"button\" in event) {\n\t\t\t\t\tif(event.button === 0) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"left\";\n\t\t\t\t\t} else if(event.button === 1) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"middle\";\n\t\t\t\t\t} else if(event.button === 2) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"right\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvariables[\"event-type\"] = event.type.toString();\n\t\t\t\tif(typeof event.detail === \"object\" && !!event.detail) {\n\t\t\t\t\t$tw.utils.each(event.detail,function(detailValue,detail) {\n\t\t\t\t\t\tvariables[\"event-detail-\" + detail] = detailValue.toString();\n\t\t\t\t\t});\n\t\t\t\t} else if(!!event.detail) {\n\t\t\t\t\tvariables[\"event-detail\"] = event.detail.toString();\n\t\t\t\t}\n\t\t\t\tself.invokeActionString(actions,self,event,variables);\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},false);\n\t});\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*/\nEventWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes that require a refresh on change\n\tthis.types = this.getAttribute(\"events\",\"\").split(\" \");\n\tthis.elementTag = this.getAttribute(\"tag\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nEventWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-eventcatcher\");\n\tthis.domNode.className = classes.join(\" \");\t\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEventWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"events\"] || changedAttributes[\"tag\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.assignDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.eventcatcher = EventWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/fieldmangler.js": {
            "title": "$:/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};\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.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\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\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && tiddler.fields.tags) {\n\t\tvar p = tiddler.fields.tags.indexOf(event.param);\n\t\tif(p !== -1) {\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\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\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && typeof event.param === \"string\") {\n\t\tvar tag = event.param.trim();\n\t\tif(tag !== \"\") {\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(new $tw.Tiddler({title: this.mangleTitle, tags: tag},modification));\n\t}\n\treturn true;\n};\n\nexports.fieldmangler = FieldManglerWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/fields.js": {
            "title": "$:/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.sort = this.getAttribute(\"sort\",\"yes\") === \"yes\";\n\tthis.sortReverse = this.getAttribute(\"sortReverse\",\"no\") === \"yes\";\n\tthis.exclude = this.getAttribute(\"exclude\");\n\tthis.include = this.getAttribute(\"include\",null);\n\tthis.stripTitlePrefix = this.getAttribute(\"stripTitlePrefix\",\"no\") === \"yes\";\n\t// Get the value to display\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\n\t// Get the inclusion and exclusion list\n\tvar excludeArr = (this.exclude) ? this.exclude.split(\" \") : [\"text\"];\n\t// Include takes precedence\n\tvar includeArr = (this.include) ? this.include.split(\" \") : null;\n\n\t// Compose the template\n\tvar text = [];\n\tif(this.template && tiddler) {\n\t\tvar fields = [];\n\t\tif (includeArr) { // Include takes precedence\n\t\t\tfor(var i=0; i<includeArr.length; i++) {\n\t\t\t\tif(tiddler.fields[includeArr[i]]) {\n\t\t\t\t\tfields.push(includeArr[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor(var fieldName in tiddler.fields) {\n\t\t\t\tif(excludeArr.indexOf(fieldName) === -1) {\n\t\t\t\t\tfields.push(fieldName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.sort) fields.sort();\n\t\tif (this.sortReverse) fields.reverse();\n\t\tfor(var f=0, fmax=fields.length; f<fmax; f++) {\n\t\t\tfieldName = fields[f];\n\t\t\tvar row = this.template,\n\t\t\t\tvalue = tiddler.getFieldString(fieldName);\n\t\t\tif(this.stripTitlePrefix && fieldName === \"title\") {\n\t\t\t\tvar reStrip = /^\\{[^\\}]+\\}(.+)/mg,\n\t\t\t\t\treMatch = reStrip.exec(value);\n\t\t\t\tif(reMatch) {\n\t\t\t\t\tvalue = reMatch[1];\n\t\t\t\t}\n\t\t\t}\n\t\t\trow = $tw.utils.replaceString(row,\"$name$\",fieldName);\n\t\t\trow = $tw.utils.replaceString(row,\"$value$\",value);\n\t\t\trow = $tw.utils.replaceString(row,\"$encoded_value$\",$tw.utils.htmlEncode(value));\n\t\t\ttext.push(row);\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 ||\n\t\tchangedAttributes.include || changedAttributes.sort || changedAttributes.sortReverse ||\n\t\tchangedTiddlers[this.tiddlerTitle] || changedAttributes.stripTitlePrefix) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports.fields = FieldsWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/image.js": {
            "title": "$:/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} else {\n\t\t\t\t// Just trigger loading of the tiddler\n\t\t\t\tthis.wiki.getTiddlerText(this.imageSource);\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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/importvariables.js": {
            "title": "$:/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 widgetPointer = this;\n\t// Got to flush all the accumulated variables\n\tthis.variables = new this.variablesConstructor();\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\t$tw.utils.each(this.tiddlerList,function(title) {\n\t\tvar parser = widgetPointer.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\tvar node = {\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\tisMacroDefinition: parseTreeNode.isMacroDefinition\n\t\t\t\t};\n\t\t\t\tif (parseTreeNode.isMacroDefinition) {\n\t\t\t\t\t// Macro definitions can be folded into\n\t\t\t\t\t// current widget instead of adding\n\t\t\t\t\t// another link to the chain.\n\t\t\t\t\tvar widget = widgetPointer.makeChildWidget(node);\n\t\t\t\t\twidget.computeAttributes();\n\t\t\t\t\twidget.execute();\n\t\t\t\t\t// We SHALLOW copy over all variables\n\t\t\t\t\t// in widget. We can't use\n\t\t\t\t\t// $tw.utils.assign, because that copies\n\t\t\t\t\t// up the prototype chain, which we\n\t\t\t\t\t// don't want.\n\t\t\t\t\t$tw.utils.each(Object.keys(widget.variables), function(key) {\n\t\t\t\t\t\twidgetPointer.variables[key] = widget.variables[key];\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\twidgetPointer.children = [widgetPointer.makeChildWidget(node)];\n\t\t\t\t\t// No more regenerating children for\n\t\t\t\t\t// this widget. If it needs to refresh,\n\t\t\t\t\t// it'll do so along with the the whole\n\t\t\t\t\t// importvariable tree.\n\t\t\t\t\tif (widgetPointer != this) {\n\t\t\t\t\t\twidgetPointer.makeChildWidgets = function(){};\n\t\t\t\t\t}\n\t\t\t\t\twidgetPointer = widgetPointer.children[0];\n\t\t\t\t}\n\t\t\t\tparseTreeNode = parseTreeNode.children && parseTreeNode.children[0];\n\t\t\t}\n\t\t} \n\t});\n\n\tif (widgetPointer != this) {\n\t\twidgetPointer.parseTreeNode.children = this.parseTreeNode.children;\n\t} else {\n\t\twidgetPointer.makeChildWidgets();\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*/\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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/keyboard.js": {
            "title": "$:/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\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.tag && $tw.config.htmlUnsafeElements.indexOf(this.tag) === -1) {\n\t\ttag = this.tag;\n\t}\n\t// Create element\n\tvar domNode = this.document.createElement(tag);\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.keyboardManager.checkKeyDescriptors(event,self.keyInfoArray)) {\n\t\t\tvar handled = self.invokeActions(self,event);\n\t\t\tif(self.actions) {\n\t\t\t\tself.invokeActionString(self.actions,self,event);\n\t\t\t}\n\t\t\tself.dispatchMessage(event);\n\t\t\tif(handled || self.actions || self.message) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\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\tvar self = this;\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\",\"\");\n\tthis.message = this.getAttribute(\"message\",\"\");\n\tthis.param = this.getAttribute(\"param\",\"\");\n\tthis.key = this.getAttribute(\"key\",\"\");\n\tthis.tag = this.getAttribute(\"tag\",\"\");\n\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tif(this.key.substr(0,2) === \"((\" && this.key.substr(-2,2) === \"))\") {\n\t\tthis.shortcutTiddlers = [];\n\t\tvar name = this.key.substring(2,this.key.length -2);\n\t\t$tw.utils.each($tw.keyboardManager.lookupNames,function(platformDescriptor) {\n\t\t\tself.shortcutTiddlers.push(\"$:/config/\" + platformDescriptor + \"/\" + name);\n\t\t});\n\t}\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\"] || changedAttributes.tag) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\t// Update the keyInfoArray if one of its shortcut-config-tiddlers has changed\n\tif(this.shortcutTiddlers && $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers)) {\n\t\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.keyboard = KeyboardWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/link.js": {
            "title": "$:/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\tmissingLinksEnabled = !(this.hideMissingLinks && this.isMissing && !this.isShadow);\n\t// Render the link if required\n\tif(useWikiLinks && missingLinksEnabled) {\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 namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"}),\n\t\tdomNode = this.document.createElementNS(namespace,tag);\n\t// Assign classes\n\tvar classes = [];\n\tif(this.overrideClasses === undefined) {\n\t\tclasses.push(\"tc-tiddlylink\");\n\t\tif(this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-shadow\");\n\t\t}\n\t\tif(this.isMissing && !this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-missing\");\n\t\t} else {\n\t\t\tif(!this.isMissing) {\n\t\t\t\tclasses.push(\"tc-tiddlylink-resolves\");\n\t\t\t}\n\t\t}\n\t\tif(this.linkClasses) {\n\t\t\tclasses.push(this.linkClasses);\t\t\t\n\t\t}\n\t} else if(this.overrideClasses !== \"\") {\n\t\tclasses.push(this.overrideClasses)\n\t}\n\tif(classes.length > 0) {\n\t\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t}\n\t// Set an href\n\tvar wikilinkTransformFilter = this.getVariable(\"tv-filter-export-link\"),\n\t\twikiLinkText;\n\tif(wikilinkTransformFilter) {\n\t\t// Use the filter to construct the href\n\t\twikiLinkText = this.wiki.filterTiddlers(wikilinkTransformFilter,this,function(iterator) {\n\t\t\titerator(self.wiki.getTiddler(self.to),self.to)\n\t\t})[0];\n\t} else {\n\t\t// Expand the tv-wikilink-template variable to construct the href\n\t\tvar wikiLinkTemplateMacro = this.getVariable(\"tv-wikilink-template\"),\n\t\t\twikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : \"#$uri_encoded$\";\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkTemplate,\"$uri_encoded$\",encodeURIComponent(this.to));\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkText,\"$uri_doubleencoded$\",encodeURIComponent(encodeURIComponent(this.to)));\n\t}\n\t// Override with the value of tv-get-export-link if defined\n\twikiLinkText = this.getVariable(\"tv-get-export-link\",{params: [{name: \"to\",value: this.to}],defaultValue: wikiLinkText});\n\tif(tag === \"a\") {\n\t\tvar namespaceHref = (namespace === \"http://www.w3.org/2000/svg\") ? \"http://www.w3.org/1999/xlink\" : undefined;\n\t\tdomNode.setAttributeNS(namespaceHref,\"href\",wikiLinkText);\n\t}\n\t// Set the tabindex\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\t// Make the link draggable if required\n\tif(this.draggable === \"yes\") {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.to;},\n\t\t\twidget: this\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\tmetaKey: event.metaKey,\n\t\tctrlKey: event.ctrlKey,\n\t\taltKey: event.altKey,\n\t\tshiftKey: event.shiftKey,\n\t\tevent: event\n\t});\n\tif(this.domNodes[0].hasAttribute(\"href\")) {\n\t\tevent.preventDefault();\n\t}\n\tevent.stopPropagation();\n\treturn false;\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.overrideClasses = this.getAttribute(\"overrideClass\");\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\tthis.hideMissingLinks = (this.getVariable(\"tv-show-missing-links\") || \"yes\") === \"no\";\n\t// Make the child widgets\n\tvar templateTree;\n\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\ttemplateTree = this.parseTreeNode.children;\n\t} else {\n\t\t// Default template is a link to the title\n\t\ttemplateTree = [{type: \"text\", text: this.to}];\n\t}\n\tthis.makeChildWidgets(templateTree);\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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/linkcatcher.js": {
            "title": "$:/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};\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.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"}\n\t]);\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\tthis.catchActions = this.getAttribute(\"actions\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n\t// When executing actions we avoid trapping navigate events, so that we don't trigger ourselves recursively\n\tthis.executingActions = false;\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.executingActions) {\n\t\t// Execute the actions\n\t\tif(this.catchTo) {\n\t\t\tthis.wiki.setTextReference(this.catchTo,event.navigateTo,this.getVariable(\"currentTiddler\"));\n\t\t}\n\t\tif(this.catchMessage && this.parentWidget) {\n\t\t\tthis.parentWidget.dispatchEvent({\n\t\t\t\ttype: this.catchMessage,\n\t\t\t\tparam: event.navigateTo,\n\t\t\t\tnavigateTo: event.navigateTo\n\t\t\t});\n\t\t}\n\t\tif(this.catchSet) {\n\t\t\tvar tiddler = this.wiki.getTiddler(this.catchSet);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.catchSet, text: this.catchSetTo}));\n\t\t}\n\t\tif(this.catchActions) {\n\t\t\tthis.executingActions = true;\n\t\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\tthis.invokeActionString(this.catchActions,this,event,{navigateTo: event.navigateTo, modifier: modifierKey});\n\t\t\tthis.executingActions = false;\n\t\t}\n\t} else {\n\t\t// This is a navigate event generated by the actions of this linkcatcher, so we don't trap it again, but just pass it to the parent\n\t\tthis.parentWidget.dispatchEvent({\n\t\t\ttype: \"tm-navigate\",\n\t\t\tparam: event.navigateTo,\n\t\t\tnavigateTo: event.navigateTo\n\t\t});\n\t}\n\treturn false;\n};\n\nexports.linkcatcher = LinkCatcherWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/list.js": {
            "title": "$:/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// 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\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\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(this.storyViewName && !StoryView) {\n\t\tStoryView = this.storyViews[\"classic\"];\n\t}\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 parser,\n\t\temptyMessage = this.getAttribute(\"emptyMessage\",\"\");\n\t// this.wiki.parseText() calls \n\t// new Parser(..), which should only be done, if needed, because it's heavy!\n\tif (emptyMessage === \"\") {\n\t\treturn [];\n\t}\n\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})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/log.js": {
            "title": "$:/core/modules/widgets/log.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/log.js\ntype: application/javascript\nmodule-type: widget-subclass\n\nWidget to log debug messages\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.baseClass = \"action-log\";\n\nexports.name = \"log\";\n\nexports.constructor = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n}\n\nexports.prototype = {};\n\nexports.prototype.render = function(event) {\n\tObject.getPrototypeOf(Object.getPrototypeOf(this)).render.call(this,event);\t\n\tObject.getPrototypeOf(Object.getPrototypeOf(this)).log.call(this);\n}\n\n})();",
            "type": "application/javascript",
            "module-type": "widget-subclass"
        },
        "$:/core/modules/widgets/macrocall.js": {
            "title": "$:/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 macroName = this.parseTreeNode.name || this.getAttribute(\"$name\"),\n\t\tvariableInfo = this.getVariableInfo(macroName,{params: params}),\n\t\ttext = variableInfo.text,\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\t// Check if we've already cached parsing this macro\n\t\tvar mode = this.parseTreeNode.isBlock ? \"blockParser\" : \"inlineParser\",\n\t\t\tparser;\n\t\tif(variableInfo.srcVariable && variableInfo.srcVariable[mode]) {\n\t\t\tparser = variableInfo.srcVariable[mode];\n\t\t} else {\n\t\t\tparser = this.wiki.parseText(this.parseType,text,\n\t\t\t\t\t\t\t\t{parseAsInline: !this.parseTreeNode.isBlock});\n\t\t\tif(variableInfo.isCacheable && variableInfo.srcVariable) {\n\t\t\t\tvariableInfo.srcVariable[mode] = parser;\n\t\t\t}\n\t\t}\n\t\tvar parseTreeNodes = parser ? parser.tree : [];\n\t\t// Wrap the parse tree in a vars widget assigning the parameters to variables named \"__paramname__\"\n\t\tvar attributes = {};\n\t\t$tw.utils.each(variableInfo.params,function(param) {\n\t\t\tvar name = \"__\" + param.name + \"__\";\n\t\t\tattributes[name] = {\n\t\t\t\tname: name,\n\t\t\t\ttype: \"string\",\n\t\t\t\tvalue: param.value\n\t\t\t};\n\t\t});\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"vars\",\n\t\t\tattributes: attributes,\n\t\t\tchildren: parseTreeNodes\n\t\t}];\n\t} else if(this.renderOutput === \"text/raw\") {\n\t\tparseTreeNodes = [{type: \"text\", text: text}];\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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/messagecatcher.js": {
            "title": "$:/core/modules/widgets/messagecatcher.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/messagecatcher.js\ntype: application/javascript\nmodule-type: widget\n\nMessage catcher 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 MessageCatcherWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nMessageCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMessageCatcherWidget.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// Add our message handler\n\tif(this.messageType) {\n\t\tthis.addEventListeners([\n\t\t\t{type: this.messageType, handler: \"handleEvent\"}\n\t\t]);\n\t}\n\t// Render children\n\tthis.renderChildren(parent,null);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMessageCatcherWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes that require a refresh on change\n\tthis.messageType = this.getAttribute(\"type\");\n\tthis.messageActions = this.getAttribute(\"actions\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nHandle an event\n*/\nMessageCatcherWidget.prototype.handleEvent = function(event) {\n\tif(this.messageActions) {\n\t\t// Collect all the event properties into variables\n\t\tvar collectProps = function(obj,prefix) {\n\t\t\t\tprefix = prefix || \"\";\n\t\t\t\tvar props = {};\n\t\t\t\t$tw.utils.each(obj,function(value,name) {\n\t\t\t\t\tif([\"string\",\"boolean\",\"number\"].indexOf(typeof value) !== -1) {\n\t\t\t\t\t\tprops[prefix + name] = value.toString();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn props;\n\t\t\t};\n\t\tvar variables = $tw.utils.extend(\n\t\t\t{},\n\t\t\tcollectProps(event.paramObject,\"event-paramObject-\"),\n\t\t\tcollectProps(event,\"event-\"),\n\t\t\t{\n\t\t\t\tmodifier: $tw.keyboardManager.getEventModifierKeyDescriptor(event)\n\t\t\t});\n\t\tthis.invokeActionString(this.messageActions,this,event,variables);\n\t}\n\treturn false;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMessageCatcherWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"type\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.messagecatcher = MessageCatcherWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/navigator.js": {
            "title": "$:/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};\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.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\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\tthis.setVariable(\"tv-story-list\",this.storyTitle);\n\tthis.setVariable(\"tv-history-list\",this.historyTitle);\n\tthis.story = new $tw.Story({\n\t\twiki: this.wiki,\n\t\tstoryTitle: this.storyTitle,\n\t\thistoryTitle: this.historyTitle\n\t});\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);\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\tif(this.storyTitle) {\n\t\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\t\t{title: this.storyTitle},\n\t\t\tstoryTiddler,\n\t\t\t{list: storyList}\n\t\t));\t\t\n\t}\n};\n\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\n\tif(storyList) {\n\t\tvar p = storyList.indexOf(title);\n\t\twhile(p !== -1) {\n\t\t\tstoryList.splice(p,1);\n\t\t\tp = storyList.indexOf(title);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\n\tif(storyList) {\n\t\tvar pos = storyList.indexOf(oldTitle);\n\t\tif(pos !== -1) {\n\t\t\tstoryList[pos] = newTitle;\n\t\t\tdo {\n\t\t\t\tpos = storyList.indexOf(oldTitle,pos + 1);\n\t\t\t\tif(pos !== -1) {\n\t\t\t\t\tstoryList.splice(pos,1);\n\t\t\t\t}\n\t\t\t} while(pos !== -1);\n\t\t} else {\n\t\t\tstoryList.splice(0,0,newTitle);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tif(this.storyTitle) {\n\t\tthis.story.addToStory(title,fromTitle,{\n\t\t\topenLinkFromInsideRiver: this.getAttribute(\"openLinkFromInsideRiver\",\"top\"),\n\t\t\topenLinkFromOutsideRiver: this.getAttribute(\"openLinkFromOutsideRiver\",\"top\")\n\t\t});\n\t}\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\n*/\nNavigatorWidget.prototype.addToHistory = function(title,fromPageRect) {\n\tthis.story.addToHistory(title,fromPageRect,this.historyTitle);\n};\n\n/*\nHandle a tm-navigate event\n*/\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-navigating\",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 editTiddler = $tw.hooks.invokeHook(\"th-editing-tiddler\",event);\n\tif(!editTiddler) {\n\t\treturn false;\n\t}\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\toriginalTiddler = originalTitle ? this.wiki.getTiddler(originalTitle) : undefined,\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\tif(originalTiddler) {\n\t\t\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",originalTiddler);\n\t\t}\n\t\tthis.wiki.deleteTiddler(originalTitle);\n\t\tthis.removeTitleFromStory(storyList,originalTitle);\n\t}\n\t// Invoke the hook function and delete this tiddler\n\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",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\t\ttext: \"\",\n\t\t\t},\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\treturn this.wiki.generateDraftTitle(title);\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,tiddler);\n\t\t\t\tthis.wiki.addTiddler(newTiddler);\n\t\t\t\t// If enabled, relink references to renamed tiddler\n\t\t\t\tvar shouldRelink = this.getAttribute(\"relinkOnRename\",\"no\").toLowerCase().trim() === \"yes\";\n\t\t\t\tif(isRename && shouldRelink && this.wiki.tiddlerExists(draftOf)) {\n\t\t\t\t\tthis.wiki.relinkTiddler(draftOf,draftTitle);\n\t\t\t\t}\n\t\t\t\t// Remove the draft tiddler\n\t\t\t\tthis.wiki.deleteTiddler(title);\n\t\t\t\t// Remove the original tiddler if we're renaming it\n\t\t\t\tif(isRename) {\n\t\t\t\t\tthis.wiki.deleteTiddler(draftOf);\n\t\t\t\t}\n\t\t\t\t// #2381 always remove new title & old\n\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\tthis.removeTitleFromStory(storyList,draftOf);\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\tevent = $tw.hooks.invokeHook(\"th-cancelling-tiddler\", 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\tevent = $tw.hooks.invokeHook(\"th-new-tiddler\", 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// Make a copy of the additional fields excluding any blank ones\n\tvar filteredAdditionalFields = $tw.utils.extend({},additionalFields);\n\tObject.keys(filteredAdditionalFields).forEach(function(fieldName) {\n\t\tif(filteredAdditionalFields[fieldName] === \"\") {\n\t\t\tdelete filteredAdditionalFields[fieldName];\n\t\t}\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\tadditionalFields,\n\t\tthis.wiki.getCreationFields(),\n\t\texistingTiddler,\n\t\tfilteredAdditionalFields,\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 && storyList.indexOf(draftTitle) === -1) {\n\t\tvar slot = storyList.indexOf(event.navigateFromTitle);\n\t\tif(slot === -1) {\n\t\t\tslot = this.getAttribute(\"openLinkFromOutsideRiver\",\"top\") === \"bottom\" ? storyList.length - 1 : slot;\n\t\t}\n\t\tstoryList.splice(slot + 1,0,draftTitle);\n\t}\n\tif(storyList && storyList.indexOf(title) !== -1) {\n\t\tstoryList.splice(storyList.indexOf(title),1);\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\t// Get the tiddlers\n\tvar tiddlers = [];\n\ttry {\n\t\ttiddlers = JSON.parse(event.param);\n\t} catch(e) {\n\t}\n\t// Get the current $:/Import tiddler\n\tvar importTitle = event.importTitle ? event.importTitle : IMPORT_TITLE,\n\t\timportTiddler = this.wiki.getTiddler(importTitle),\n\t\timportData = this.wiki.getTiddlerData(importTitle,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: importTitle,\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\ttiddlerFields.title = $tw.utils.trim(tiddlerFields.title);\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\tnewFields[\"suppressed-\" + title] = \"yes\";\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\tvar autoOpenOnImport = event.autoOpenOnImport ? event.autoOpenOnImport : this.getVariable(\"tv-auto-open-on-import\");  \n\tif(autoOpenOnImport !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList && storyList.indexOf(importTitle) === -1) {\n\t\t\tstoryList.unshift(importTitle);\n\t\t}\n\t\t// And to history\n\t\thistory.push(importTitle);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\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/Hint\") + \"\\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\tif($tw.utils.hop(importTiddler.fields,[\"rename-\" + title])) {\n\t\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields,{title : importTiddler.fields[\"rename-\" + title]});\n\t\t\t} else {\n\t\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\t\t\t}\n\t\t\ttiddler = $tw.hooks.invokeHook(\"th-importing-tiddler\",tiddler);\n\t\t\tself.wiki.addTiddler(tiddler);\n\t\t\timportReport.push(\"# [[\" + tiddler.fields.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 paramObject = 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 || \"$:/state/folded/\";\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 options = {},\n\t\tparamObject = event.paramObject || {},\n\t\tfrom = paramObject.from || event.tiddlerTitle,\n\t\tto = paramObject.to;\n\toptions.dontRenameInTags = (paramObject.renameInTags === \"false\" || paramObject.renameInTags === \"no\") ? true : false;\n\toptions.dontRenameInLists = (paramObject.renameInLists === \"false\" || paramObject.renameInLists === \"no\") ? true : false;\n\tthis.wiki.renameTiddler(from,to,options);\n};\n\nexports.navigator = NavigatorWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/password.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/qualify.js": {
            "title": "$:/core/modules/widgets/qualify.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/qualify.js\ntype: application/javascript\nmodule-type: widget\n\nQualify text to a variable \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 QualifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nQualifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nQualifyWidget.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*/\nQualifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.qualifyName = this.getAttribute(\"name\");\n\tthis.qualifyTitle = this.getAttribute(\"title\");\n\t// Set context variable\n\tif(this.qualifyName) {\n\t\tthis.setVariable(this.qualifyName,this.qualifyTitle + \"-\" + this.getStateQualifier());\n\t}\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*/\nQualifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.title) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.qualify = QualifyWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/radio.js": {
            "title": "$:/core/modules/widgets/radio.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/radio.js\ntype: application/javascript\nmodule-type: widget\n\nSet a field or index at a given tiddler via radio buttons\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar 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\tvar isChecked = this.getValue() === this.radioValue;\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",\n\t\t\"tc-radio \" + this.radioClass + (isChecked ? \" tc-radio-selected\" : \"\")\n\t);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"radio\");\n\tif(isChecked) {\n\t\tthis.inputDomNode.checked = true;\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",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 value,\n\t\ttiddler = this.wiki.getTiddler(this.radioTitle);\n\tif(tiddler) {\n\t\tif(this.radioIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex);\n\t\t} else {\n\t\t\tvalue = tiddler.getFieldString(this.radioField);\n\t\t}\n\t} else {\n\t\tvalue = this.radioDefault;\n\t}\n\treturn value;\n};\n\nRadioWidget.prototype.setValue = function() {\n\tif(this.radioIndex) {\n\t\tthis.wiki.setText(this.radioTitle,\"\",this.radioIndex,this.radioValue);\n\t} else {\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\t// Trigger actions\n\tif(this.radioActions) {\n\t\tthis.invokeActionString(this.radioActions,this,event,{\"actionValue\": this.radioValue});\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.radioIndex = this.getAttribute(\"index\");\n\tthis.radioValue = this.getAttribute(\"value\");\n\tthis.radioClass = this.getAttribute(\"class\",\"\");\n\tthis.radioDefault = this.getAttribute(\"default\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\tthis.radioActions = this.getAttribute(\"actions\",\"\");\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(($tw.utils.count(changedAttributes) > 0)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.radioTitle]) {\n\t\tthis.inputDomNode.checked = this.getValue() === this.radioValue;\n\t\treturn this.refreshChildren(changedTiddlers);\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.radio = RadioWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/range.js": {
            "title": "$:/core/modules/widgets/range.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/range.js\ntype: application/javascript\nmodule-type: widget\n\nRange 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 RangeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRangeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRangeWidget.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.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"range\");\n\tthis.inputDomNode.setAttribute(\"class\",this.elementClass);\n\tif(this.minValue){\n\t\tthis.inputDomNode.setAttribute(\"min\", this.minValue);\n\t}\n\tif(this.maxValue){\n\t\tthis.inputDomNode.setAttribute(\"max\", this.maxValue);\n\t}\n\tif(this.increment){\n\t\tthis.inputDomNode.setAttribute(\"step\", this.increment);\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.inputDomNode.value = this.getValue();\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name:\"mousedown\", handlerObject:this, handlerMethod:\"handleMouseDownEvent\"},\n\t\t{name:\"mouseup\",   handlerObject:this, handlerMethod:\"handleMouseUpEvent\"},\n\t\t{name:\"change\",    handlerObject:this, handlerMethod:\"handleChangeEvent\"},\n\t\t{name:\"input\",     handlerObject:this, handlerMethod:\"handleInputEvent\"},\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.inputDomNode,nextSibling);\n\tthis.domNodes.push(this.inputDomNode);\n};\n\nRangeWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle),\n\t\tfieldName = this.tiddlerField,\n\t\tvalue = this.defaultValue;\n\tif(tiddler) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(tiddler,this.tiddlerIndex,this.defaultValue);\n\t\t} else {\n\t\t\tif($tw.utils.hop(tiddler.fields,fieldName)) {\n\t\t\t\tvalue = tiddler.fields[fieldName] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.defaultValue;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nRangeWidget.prototype.getActionVariables = function(options) {\n\toptions = options || {};\n\tvar hasChanged = (this.startValue !== this.inputDomNode.value) ? \"yes\" : \"no\";\n\t// Trigger actions. Use variables = {key:value, key:value ...}\n\t// the \"value\" is needed.\n\treturn $tw.utils.extend({\"actionValue\": this.inputDomNode.value, \"actionValueHasChanged\": hasChanged}, options);\n}\n\n// actionsStart\nRangeWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.mouseDown = true; // TODO remove once IE is gone.\n\tthis.startValue = this.inputDomNode.value; // TODO remove this line once IE is gone!\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsMouseDown) {\n\t\tvar variables = this.getActionVariables() // TODO this line will go into the function call below.\n\t\tthis.invokeActionString(this.actionsMouseDown,this,event,variables);\n\t}\n}\n\n// actionsStop\nRangeWidget.prototype.handleMouseUpEvent = function(event) {\n\tthis.mouseDown = false; // TODO remove once IE is gone.\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsMouseUp) {\n\t\tvar variables = this.getActionVariables()\n\t\tthis.invokeActionString(this.actionsMouseUp,this,event,variables);\n\t}\n\t// TODO remove the following if() once IE is gone!\n\tif ($tw.browser.isIE) {\n\t\tif (this.startValue !== this.inputDomNode.value) {\n\t\t\tthis.handleChangeEvent(event);\n\t\t\tthis.startValue = this.inputDomNode.value;\n\t\t}\n\t}\n}\n\nRangeWidget.prototype.handleChangeEvent = function(event) {\n\tif (this.mouseDown) {  // TODO refactor this function once IE is gone.\n\t\tthis.handleInputEvent(event);\n\t}\n};\n\nRangeWidget.prototype.handleInputEvent = function(event) {\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsInput) {\n\t\t// \"tiddler\" parameter may be missing. See .execute() below\n\t\tvar variables = this.getActionVariables({\"actionValueHasChanged\": \"yes\"}) // TODO this line will go into the function call below.\n\t\tthis.invokeActionString(this.actionsInput,this,event,variables);\n\t}\n};\n\nRangeWidget.prototype.handleEvent = function(event) {\n\tif(this.getValue() !== this.inputDomNode.value) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,\"\",this.tiddlerIndex,this.inputDomNode.value);\n\t\t} else {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,this.tiddlerField,null,this.inputDomNode.value);\n\t\t}\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRangeWidget.prototype.execute = function() {\n\t// TODO remove the next 1 lines once IE is gone!\n\tthis.mouseUp = true; // Needed for IE10\n\t// Get the parameters from the attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.tiddlerField = this.getAttribute(\"field\",\"text\");\n\tthis.tiddlerIndex = this.getAttribute(\"index\");\n\tthis.minValue = this.getAttribute(\"min\");\n\tthis.maxValue = this.getAttribute(\"max\");\n\tthis.increment = this.getAttribute(\"increment\");\n\tthis.defaultValue = this.getAttribute(\"default\",\"\");\n\tthis.elementClass = this.getAttribute(\"class\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Actions since 5.1.23\n\t// Next 2 only fire once!\n\tthis.actionsMouseDown = this.getAttribute(\"actionsStart\",\"\");\n\tthis.actionsMouseUp = this.getAttribute(\"actionsStop\",\"\");\n\t// Input fires very often!\n\tthis.actionsInput = this.getAttribute(\"actions\",\"\");\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*/\nRangeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.tiddlerTitle]) {\n\t\t\tvar value = this.getValue();\n\t\t\tif(this.inputDomNode.value !== value) {\n\t\t\t\tthis.inputDomNode.value = value;\n\t\t\t}\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.range = RangeWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/raw.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/reveal.js": {
            "title": "$:/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\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\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\tvar left,top;\n\tswitch(this.position) {\n\t\tcase \"left\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"above\":\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"aboveright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"belowright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\t\t\t\n\t\tcase \"right\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"belowleft\":\n\t\t\tleft = this.popup.left + this.popup.width - domNode.offsetWidth;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t\tcase \"aboveleft\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\t\t\t\n\t\tdefault: // Below\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t}\n\tif(!this.positionAllowNegative) {\n\t\tleft = Math.max(0,left);\n\t\ttop = Math.max(0,top);\n\t}\n\tdomNode.style.left = left + \"px\";\n\tdomNode.style.top = top + \"px\";\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.positionAllowNegative = this.getAttribute(\"positionAllowNegative\") === \"yes\";\n\t// class attribute handled in assignDomNodeClasses()\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\tthis.updatePopupPosition = this.getAttribute(\"updatePopupPosition\",\"no\") === \"yes\";\n\t// Compute the title of the state tiddler and read it\n\tthis.stateTiddlerTitle = this.state;\n\tthis.stateTitle = this.getAttribute(\"stateTitle\");\n\tthis.stateField = this.getAttribute(\"stateField\");\n\tthis.stateIndex = this.getAttribute(\"stateIndex\");\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,\n\t    defaultState = this[\"default\"];\n\tif(this.stateTitle) {\n\t\tvar stateTitleTiddler = this.wiki.getTiddler(this.stateTitle);\n\t\tif(this.stateField) {\n\t\t\tstate = stateTitleTiddler ? stateTitleTiddler.getFieldString(this.stateField) || defaultState : defaultState;\n\t\t} else if(this.stateIndex) {\n\t\t\tstate = stateTitleTiddler ? this.wiki.extractTiddlerDataItem(this.stateTitle,this.stateIndex) || defaultState : defaultState;\n\t\t} else if(stateTitleTiddler) {\n\t\t\tstate = this.wiki.getTiddlerText(this.stateTitle) || defaultState;\n\t\t} else {\n\t\t\tstate = defaultState;\n\t\t}\n\t} else {\n\t\tstate = this.stateTiddlerTitle ? this.wiki.getTextReference(this.state,this[\"default\"],this.getVariable(\"currentTiddler\")) : this[\"default\"];\n\t}\n\tif(state === null) {\n\t\tstate = this[\"default\"];\n\t}\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.isOpen = this.text === state;\n\t\t\tbreak;\n\t\tcase \"nomatch\":\n\t\t\tthis.isOpen = this.text !== state;\n\t\t\tbreak;\n\t\tcase \"lt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t\tcase \"gt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"lteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"gteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t}\n};\n\nRevealWidget.prototype.compareStateText = function(state) {\n\treturn state.localeCompare(this.text,undefined,{numeric: true,sensitivity: \"case\"});\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\nRevealWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-reveal\");\n\tthis.domNode.className = classes.join(\" \");\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.positionAllowNegative || changedAttributes[\"default\"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar currentlyOpen = 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\treturn true;\n\t\t\t}\n\t\t} else if(this.type === \"popup\" && this.updatePopupPosition && (changedTiddlers[this.state] || changedTiddlers[this.stateTitle])) {\n\t\t\tthis.positionPopup(this.domNode);\n\t\t}\n\t\tif(changedAttributes.style) {\n\t\t\tthis.domNode.style = this.getAttribute(\"style\",\"\");\n\t\t}\n\t\tif(changedAttributes[\"class\"]) {\n\t\t\tthis.assignDomNodeClasses();\n\t\t}\t\t\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\n/*\nCalled by refresh() to dynamically show or hide the content\n*/\nRevealWidget.prototype.updateState = function() {\n\tvar self = this;\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\t//make sure that the state hasn't changed during the close animation\n\t\t\tself.readState()\n\t\t\tif(!self.isOpen) {\n\t\t\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t\t\t}\n\t\t}});\n\t}\n};\n\nexports.reveal = RevealWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/scrollable.js": {
            "title": "$:/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};\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\tif(event.paramObject && event.paramObject.selector) {\n\t\tthis.scrollSelectorIntoView(null,event.paramObject.selector);\n\t} else {\n\t\tthis.scrollIntoView(event.target);\t\t\t\n\t}\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\tsrcWindow = element ? element.ownerDocument.defaultView : window;\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(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\nScrollableWidget.prototype.scrollSelectorIntoView = function(baseElement,selector,callback) {\n\tbaseElement = baseElement || document.body;\n\tvar element = baseElement.querySelector(selector);\n\tif(element) {\n\t\tthis.scrollIntoView(element,callback);\t\t\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nScrollableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\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\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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/select.js": {
            "title": "$:/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\t// Get the new value and assign it to the tiddler\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\t// Trigger actions\n\tif(this.selectActions) {\n\t\tthis.invokeActionString(this.selectActions,this,event);\n\t}\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,value);\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\tselect.children[i].selected = values.indexOf(select.children[i].value) !== -1\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.selectActions = this.getAttribute(\"actions\");\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\tthis.selectTooltip = this.getAttribute(\"tooltip\");\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\tif(this.selectTooltip) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"title\",this.selectTooltip);\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 || changedAttributes.selectTooltip) {\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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/set.js": {
            "title": "$:/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.setSelect = this.getAttribute(\"select\");\n\tthis.setTiddler = this.getAttribute(\"tiddler\");\n\tthis.setSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.setField = this.getAttribute(\"field\");\n\tthis.setIndex = this.getAttribute(\"index\");\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,!!this.parseTreeNode.isMacroDefinition);\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.setTiddler) {\n\t\tvar tiddler;\n\t\tif(this.setSubTiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.setTiddler,this.setSubTiddler);\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.setTiddler);\t\t\t\n\t\t}\n\t\tif(!tiddler) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t} else if(this.setField) {\n\t\t\tvalue = tiddler.getFieldString(this.setField) || this.setEmptyValue;\n\t\t} else if(this.setIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.setTiddler,this.setIndex,this.setEmptyValue);\n\t\t} else {\n\t\t\tvalue = tiddler.fields.text || this.setEmptyValue ;\n\t\t}\n\t} else if(this.setFilter) {\n\t\tvar results = this.wiki.filterTiddlers(this.setFilter,this);\n\t\tif(this.setValue == null) {\n\t\t\tvar select;\n\t\t\tif(this.setSelect) {\n\t\t\t\tselect = parseInt(this.setSelect,10);\n\t\t\t}\n\t\t\tif(select !== undefined) {\n\t\t\t\tvalue = results[select] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = $tw.utils.stringifyList(results);\t\t\t\n\t\t\t}\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.select || changedAttributes.tiddler || (this.setTiddler && changedTiddlers[this.setTiddler]) || changedAttributes.field || changedAttributes.index || 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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/text.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/tiddler.js": {
            "title": "$:/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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/transclude.js": {
            "title": "$:/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\tthis.recursionMarker = this.getAttribute(\"recursionMarker\",\"yes\");\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\tif(this.recursionMarker === \"yes\") {\n\t\tthis.setVariable(\"transclusion\",recursionMarker);\n\t}\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: $tw.language.getString(\"Error/RecursiveTransclusion\")}\n\t\t\t]}];\n\t\t}\n\t}\n\t// Assign any variables set via attributes starting with $\n\tvar variables = Object.create(null);\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) === \"$\") {\n\t\t\tvariables[name.substr(1)] = attribute;\n\t\t}\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes,{\n\t\tvariables: variables\n\t});\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($tw.utils.count(changedAttributes) || 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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/vars.js": {
            "title": "$:/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// 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\t// Call the constructor\n\tWidget.call(this);\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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/view.js": {
            "title": "$:/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\tthis.viewMode = this.getAttribute(\"mode\",\"block\");\n\tswitch(this.viewFormat) {\n\t\tcase \"htmlwikified\":\n\t\t\tthis.text = this.getValueAsHtmlWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"plainwikified\":\n\t\t\tthis.text = this.getValueAsPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencodedplainwikified\":\n\t\t\tthis.text = this.getValueAsHtmlEncodedPlainWikified(this.viewMode);\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(mode) {\n\treturn this.wiki.renderText(\"text/html\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsPlainWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsHtmlEncodedPlainWikified = function(mode) {\n\treturn $tw.utils.htmlEncode(this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t}));\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",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/widget.js": {
            "title": "$:/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\tthis.initialise(parseTreeNode,options);\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\t// Bail if parseTreeNode is undefined, meaning  that the widget constructor was called without any arguments so that it can be subclassed\n\tif(parseTreeNode === undefined) {\n\t\treturn;\n\t}\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\t// Get widget classes\n\t\tWidget.prototype.widgetClasses = $tw.modules.applyMethods(\"widget\");\n\t\t// Process any subclasses\n\t\t$tw.modules.forEachModuleOfType(\"widget-subclass\",function(title,module) {\n\t\t\tif(module.baseClass) {\n\t\t\t\tvar baseClass = Widget.prototype.widgetClasses[module.baseClass];\n\t\t\t\tif(!baseClass) {\n\t\t\t\t\tthrow \"Module '\" + title + \"' is attemping to extend a non-existent base class '\" + module.baseClass + \"'\";\n\t\t\t\t}\n\t\t\t\tvar subClass = module.constructor;\n\t\t\t\tsubClass.prototype = new baseClass();\n\t\t\t\t$tw.utils.extend(subClass.prototype,module.prototype);\n\t\t\t\tWidget.prototype.widgetClasses[module.name || module.baseClass] = subClass;\n\t\t\t}\n\t\t});\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\nisMacroDefinition: true if the variable is set via a \\define macro pragma (and hence should have variable substitution performed)\n*/\nWidget.prototype.setVariable = function(name,value,params,isMacroDefinition) {\n\tthis.variables[name] = {value: value, params: params, isMacroDefinition: !!isMacroDefinition};\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\nReturns an object with the following fields:\n\nparams: array of {name:,value:} of parameters passed to wikitext variables\ntext: text of variable, with parameters properly substituted\n*/\nWidget.prototype.getVariableInfo = 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\toriginalValue = variable.value,\n\t\t\tvalue = originalValue,\n\t\t\tparams = this.resolveVariableParameters(variable.params,actualParams);\n\t\t// Substitute any parameters specified in the definition\n\t\t$tw.utils.each(params,function(param) {\n\t\t\tvalue = $tw.utils.replaceString(value,new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(param.name) + \"\\\\$\",\"mg\"),param.value);\n\t\t});\n\t\t// Only substitute variable references if this variable was defined with the \\define pragma\n\t\tif(variable.isMacroDefinition) {\n\t\t\tvalue = this.substituteVariableReferences(value);\t\t\t\n\t\t}\n\t\treturn {\n\t\t\ttext: value,\n\t\t\tparams: params,\n\t\t\tsrcVariable: variable,\n\t\t\tisCacheable: originalValue === value\n\t\t};\n\t}\n\t// If the variable doesn't exist in the parent widget then look for a macro module\n\treturn {\n\t\ttext: this.evaluateMacroModule(name,actualParams,options.defaultValue)\n\t};\n};\n\n/*\nSimplified version of getVariableInfo() that just returns the text\n*/\nWidget.prototype.getVariable = function(name,options) {\n\treturn this.getVariableInfo(name,options).text;\n};\n\nWidget.prototype.resolveVariableParameters = function(formalParams,actualParams) {\n\tformalParams = formalParams || [];\n\tactualParams = actualParams || [];\n\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\tparamInfo, paramValue,\n\t\tresults = [];\n\t// Step through each of the parameters in the macro definition\n\tfor(var p=0; p<formalParams.length; p++) {\n\t\t// Check if we've got a macro call parameter with the same name\n\t\tparamInfo = formalParams[p];\n\t\tparamValue = undefined;\n\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t}\n\t\t}\n\t\t// If not, use the next available anonymous macro call parameter\n\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\tnextAnonParameter++;\n\t\t}\n\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t}\n\t\t// If we've still not got a value, use the default, if any\n\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t// Store the parameter name and value\n\t\tresults.push({name: paramInfo.name, value: paramValue});\n\t}\n\treturn results;\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 === \"filtered\") {\n\t\t\tvalue = self.wiki.filterTiddlers(attribute.filter,self)[0] || \"\";\n\t\t} else if(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,options) {\n\toptions = options || {};\n\tthis.children = [];\n\tvar self = this;\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: parseTreeNodes\n\t\t};\n\t\tparseTreeNodes = [setVariableWidget];\n\t});\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\noptions include:\n\tvariables: optional hashmap of variables to wrap around the widget\n*/\nWidget.prototype.makeChildWidget = function(parseTreeNode,options) {\n\toptions = options || {};\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\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\t\tparseTreeNode\n\t\t\t]\n\t\t};\n\t\tparseTreeNode = setVariableWidget;\n\t});\n\treturn new WidgetClass(parseTreeNode,{\n\t\twiki: this.wiki,\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\tvar children = this.children;\n\tfor(var i = 0; i < children.length; i++) {\n\t\tchildren[i].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\tevent.widget = event.widget || this;\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 children = this.children,\n\t\trefreshed = false;\n\tfor (var i = 0; i < children.length; i++) {\n\t\trefreshed = children[i].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) {\n\t\t\tchild.refreshSelf();\n\t\t\tif(child.invokeAction(triggeringWidget,event)) {\n\t\t\t\thandled = true;\n\t\t\t}\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/*\nInvoke the action widgets defined in a string\n*/\nWidget.prototype.invokeActionString = function(actions,triggeringWidget,event,variables) {\n\tactions = actions || \"\";\n\tvar parser = this.wiki.parseText(\"text/vnd.tiddlywiki\",actions,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document\n\t\t}),\n\t\twidgetNode = this.wiki.makeWidget(parser,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document,\n\t\t\tvariables: variables\n\t\t});\n\tvar container = this.document.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn widgetNode.invokeActions(this,event);\n};\n\n/*\nExecute action tiddlers by tag\n*/\nWidget.prototype.invokeActionsByTag = function(tag,event,variables) {\n\tvar self = this;\n\t$tw.utils.each(self.wiki.filterTiddlers(\"[all[shadows+tiddlers]tag[\" + tag + \"]!has[draft.of]]\"),function(title) {\n\t\tself.invokeActionString(self.wiki.getTiddlerText(title),self,event,variables);\n\t});\n};\n\nWidget.prototype.allowActionPropagation = function() {\n\treturn true;\n};\n\nexports.widget = Widget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/wikify.js": {
            "title": "$:/core/modules/widgets/wikify.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/wikify.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to wikify text into a variable\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 WikifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nWikifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nWikifyWidget.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*/\nWikifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.wikifyName = this.getAttribute(\"name\");\n\tthis.wikifyText = this.getAttribute(\"text\");\n\tthis.wikifyType = this.getAttribute(\"type\");\n\tthis.wikifyMode = this.getAttribute(\"mode\",\"block\");\n\tthis.wikifyOutput = this.getAttribute(\"output\",\"text\");\n\t// Create the parse tree\n\tthis.wikifyParser = this.wiki.parseText(this.wikifyType,this.wikifyText,{\n\t\t\tparseAsInline: this.wikifyMode === \"inline\"\n\t\t});\n\t// Create the widget tree \n\tthis.wikifyWidgetNode = this.wiki.makeWidget(this.wikifyParser,{\n\t\t\tdocument: $tw.fakeDocument,\n\t\t\tparentWidget: this\n\t\t});\n\t// Render the widget tree to the container\n\tthis.wikifyContainer = $tw.fakeDocument.createElement(\"div\");\n\tthis.wikifyWidgetNode.render(this.wikifyContainer,null);\n\tthis.wikifyResult = this.getResult();\n\t// Set context variable\n\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nReturn the result string\n*/\nWikifyWidget.prototype.getResult = function() {\n\tvar result;\n\tswitch(this.wikifyOutput) {\n\t\tcase \"text\":\n\t\t\tresult = this.wikifyContainer.textContent;\n\t\t\tbreak;\n\t\tcase \"formattedtext\":\n\t\t\tresult = this.wikifyContainer.formattedTextContent;\n\t\t\tbreak;\n\t\tcase \"html\":\n\t\t\tresult = this.wikifyContainer.innerHTML;\n\t\t\tbreak;\n\t\tcase \"parsetree\":\n\t\t\tresult = JSON.stringify(this.wikifyParser.tree,0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t\tcase \"widgettree\":\n\t\t\tresult = JSON.stringify(this.getWidgetTree(),0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t}\n\treturn result;\n};\n\n/*\nReturn a string of the widget tree\n*/\nWikifyWidget.prototype.getWidgetTree = function() {\n\tvar copyNode = function(widgetNode,resultNode) {\n\t\t\tvar type = widgetNode.parseTreeNode.type;\n\t\t\tresultNode.type = type;\n\t\t\tswitch(type) {\n\t\t\t\tcase \"element\":\n\t\t\t\t\tresultNode.tag = widgetNode.parseTreeNode.tag;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"text\":\n\t\t\t\t\tresultNode.text = widgetNode.parseTreeNode.text;\n\t\t\t\t\tbreak;\t\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.attributes || {}).length > 0) {\n\t\t\t\tresultNode.attributes = {};\n\t\t\t\t$tw.utils.each(widgetNode.attributes,function(attr,attrName) {\n\t\t\t\t\tresultNode.attributes[attrName] = widgetNode.getAttribute(attrName);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.children || {}).length > 0) {\n\t\t\t\tresultNode.children = [];\n\t\t\t\t$tw.utils.each(widgetNode.children,function(widgetChildNode) {\n\t\t\t\t\tvar node = {};\n\t\t\t\t\tresultNode.children.push(node);\n\t\t\t\t\tcopyNode(widgetChildNode,node);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tresults = {};\n\tcopyNode(this.wikifyWidgetNode,results);\n\treturn results;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWikifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh ourselves entirely if any of our attributes have changed\n\tif(changedAttributes.name || changedAttributes.text || changedAttributes.type || changedAttributes.mode || changedAttributes.output) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\t// Refresh the widget tree\n\t\tif(this.wikifyWidgetNode.refresh(changedTiddlers)) {\n\t\t\t// Check if there was any change\n\t\t\tvar result = this.getResult();\n\t\t\tif(result !== this.wikifyResult) {\n\t\t\t\t// If so, save the change\n\t\t\t\tthis.wikifyResult = result;\n\t\t\t\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t\t\t\t// Refresh each of our child widgets\n\t\t\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\t\t\tchildWidget.refreshSelf();\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t// Just refresh the children\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.wikify = WikifyWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/wiki-bulkops.js": {
            "title": "$:/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*/\nfunction renameTiddler(fromTitle,toTitle,options) {\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\t// Rename the tiddler itself\n\t\tvar oldTiddler = this.getTiddler(fromTitle),\n\t\t\tnewTiddler = new $tw.Tiddler(oldTiddler,{title: toTitle},this.getModificationFields());\n\t\tnewTiddler = $tw.hooks.invokeHook(\"th-renaming-tiddler\",newTiddler,oldTiddler);\n\t\tthis.addTiddler(newTiddler);\n\t\tthis.deleteTiddler(fromTitle);\n\t\t// Rename any tags or lists that reference it\n\t\tthis.relinkTiddler(fromTitle,toTitle,options)\n\t}\n}\n\n/*\nRelink any tags or lists that reference a given tiddler\n*/\nfunction relinkTiddler(fromTitle,toTitle,options) {\n\tvar self = this;\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\tthis.each(function(tiddler,title) {\n\t\t\tvar type = tiddler.fields.type || \"\";\n\t\t\t// Don't touch plugins or JavaScript modules\n\t\t\tif(!tiddler.fields[\"plugin-type\"] && type !== \"application/javascript\") {\n\t\t\t\tvar tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined,\n\t\t\t\t\tlist = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined,\n\t\t\t\t\tisModified = false;\n\t\t\t\tif(!options.dontRenameInTags) {\n\t\t\t\t\t// Rename tags\n\t\t\t\t\t$tw.utils.each(tags,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming tag '\" + tags[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\ttags[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(!options.dontRenameInLists) {\n\t\t\t\t\t// Rename lists\n\t\t\t\t\t$tw.utils.each(list,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming list item '\" + list[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\tlist[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(isModified) {\n\t\t\t\t\tvar newTiddler = new $tw.Tiddler(tiddler,{tags: tags, list: list},self.getModificationFields())\n\t\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-relinking-tiddler\",newTiddler,tiddler);\n\t\t\t\t\tself.addTiddler(newTiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\nexports.renameTiddler = renameTiddler;\nexports.relinkTiddler = relinkTiddler;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikimethod"
        },
        "$:/core/modules/wiki.js": {
            "title": "$:/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\tTIMESTAMP_DISABLE_TITLE = \"$:/config/TimestampDisable\";\n\n/*\nAdd available indexers to this wiki\n*/\nexports.addIndexersToWiki = function() {\n\tvar self = this;\n\t$tw.utils.each($tw.modules.applyMethods(\"indexer\"),function(Indexer,name) {\n\t\tself.addIndexer(new Indexer(self),name);\n\t});\n};\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\nexports.isBinaryTiddler = 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.encoding === \"base64\";\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\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = {\n\t\t\t\tcreated: new Date()\n\t\t\t},\n\t\t\tcreator = this.getTiddlerText(USER_NAME_TITLE);\n\t\tif(creator) {\n\t\t\tfields.creator = creator;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is modified\n*/\nexports.getModificationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = Object.create(null),\n\t\t\tmodifier = this.getTiddlerText(USER_NAME_TITLE);\n\t\tfields.modified = new Date();\n\t\tif(modifier) {\n\t\t\tfields.modifier = modifier;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\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,isAlphaNumeric) {\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\t\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 if(isAlphaNumeric) {\n\t\t\treturn isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \"base\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \"base\"});\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 within the given parse tree\n */\nexports.extractLinks = function(parseTreeRoot) {\n\t// Count up the links\n\tvar links = [],\n\t\tcheckParseTree = function(parseTree) {\n\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\tif(parseTreeNode.type === \"link\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \"string\") {\n\t\t\t\t\tvar value = parseTreeNode.attributes.to.value;\n\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcheckParseTree(parseTreeRoot);\n\treturn links;\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\tif(parser) {\n\t\t\treturn self.extractLinks(parser.tree);\n\t\t}\n\t\treturn [];\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\tbacklinksIndexer = this.getIndexer(\"BacklinksIndexer\"),\n\t\tbacklinks = backlinksIndexer && backlinksIndexer.lookup(targetTitle);\n\n\tif(!backlinks) {\n\t\tbacklinks = [];\n\t\tthis.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self.getTiddlerLinks(title);\n\t\t\tif(links.indexOf(targetTitle) !== -1) {\n\t\t\t\tbacklinks.push(title);\n\t\t\t}\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\t// Try to use the indexer\n\tvar self = this,\n\t\ttagIndexer = this.getIndexer(\"TagIndexer\"),\n\t\tresults = tagIndexer && tagIndexer.subIndexers[3].lookup(tag);\n\tif(!results) {\n\t\t// If not available, perform a manual scan\n\t\tresults = this.getGlobalCache(\"taglist-\" + tag,function() {\n\t\t\tvar tagmap = self.getTagMap();\n\t\t\treturn self.sortByList(tagmap[tag],tag);\n\t\t});\n\t}\n\treturn results;\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 self = this,\n\t\treplacedTitles = Object.create(null);\n\t// Given a title, this function will place it in the correct location\n\t// within titles.\n\tfunction moveItemInList(title) {\n\t\tif(!$tw.utils.hop(replacedTitles, title)) {\n\t\t\treplacedTitles[title] = true;\n\t\t\tvar newPos = -1,\n\t\t\t\ttiddler = self.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(afterTitle === \"\") {\n\t\t\t\t\tnewPos = titles.length;\n\t\t\t\t} else if(beforeTitle) {\n\t\t\t\t\t// if this title is placed relative\n\t\t\t\t\t// to another title, make sure that\n\t\t\t\t\t// title is placed before we place\n\t\t\t\t\t// this one.\n\t\t\t\t\tmoveItemInList(beforeTitle);\n\t\t\t\t\tnewPos = titles.indexOf(beforeTitle);\n\t\t\t\t} else if(afterTitle) {\n\t\t\t\t\t// Same deal\n\t\t\t\t\tmoveItemInList(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\t// If a new position is specified, let's move it\n\t\t\t\tif (newPos !== -1) {\n\t\t\t\t\t// get its current Pos, and make sure\n\t\t\t\t\t// sure that it's _actually_ in the list\n\t\t\t\t\t// and that it would _actually_ move\n\t\t\t\t\t// (#4275) We don't bother calling\n\t\t\t\t\t//         indexOf unless we have a new\n\t\t\t\t\t//         position to work with\n\t\t\t\t\tvar currPos = titles.indexOf(title);\n\t\t\t\t\tif(currPos >= 0 && newPos !== currPos) {\n\t\t\t\t\t\t// move it!\n\t\t\t\t\t\ttitles.splice(currPos,1);\n\t\t\t\t\t\tif(newPos >= currPos) {\n\t\t\t\t\t\t\tnewPos--;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttitles.splice(newPos,0,title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\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\tmoveItemInList(title);\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\nexports.getTiddlersAsJson = function(filter,spaces) {\n\tvar tiddlers = this.filterTiddlers(filter),\n\t\tspaces = (spaces === undefined) ? $tw.config.preferences.jsonSpaces : spaces,\n\t\tdata = [];\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\tvar tiddler = this.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,spaces);\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,undefined);\n\t\t\t$tw.utils.deepFreeze(value);\n\t\t\treturn value;\n\t\t}) || defaultData;\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.getTiddlerDataCached(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\t// Use the generic binary parser for any binary types not registered so far\n\tif($tw.Wiki.parsers[\"application/octet-stream\"]) {\n\t\tObject.keys($tw.config.contentTypeInfo).forEach(function(type) {\n\t\t\tif(!$tw.utils.hop($tw.Wiki.parsers,type) && $tw.config.contentTypeInfo[type].encoding === \"base64\") {\n\t\t\t\t$tw.Wiki.parsers[type] = $tw.Wiki.parsers[\"application/octet-stream\"];\n\t\t\t}\n\t\t});\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\ttext = text || \"\";\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,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.recursionMarker : optional flag to set a recursion marker, defaults to \"yes\"\noptions.children: optional array of children for the transclude widget\noptions.importVariables: optional importvariables filter string for macros to be included\noptions.importPageMacros: optional boolean; if true, equivalent to passing \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\" to options.importVariables\n*/\nexports.makeTranscludeWidget = function(title,options) {\n\toptions = options || {};\n\tvar parseTreeDiv = {tree: [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"div\",\n\t\t\tchildren: []}]},\n\t\tparseTreeImportVariables = {\n\t\t\ttype: \"importvariables\",\n\t\t\tattributes: {\n\t\t\t\tfilter: {\n\t\t\t\t\tname: \"filter\",\n\t\t\t\t\ttype: \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: false,\n\t\t\tchildren: []},\n\t\tparseTreeTransclude = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\trecursionMarker: {\n\t\t\t\t\tname: \"recursionMarker\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: options.recursionMarker || \"yes\"\n\t\t\t\t\t},\n\t\t\t\ttiddler: {\n\t\t\t\t\tname: \"tiddler\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: !options.parseAsInline};\n\tif(options.importVariables || options.importPageMacros) {\n\t\tif(options.importVariables) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = options.importVariables;\n\t\t} else if(options.importPageMacros) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\";\n\t\t}\n\t\tparseTreeDiv.tree[0].children.push(parseTreeImportVariables);\n\t\tparseTreeImportVariables.children.push(parseTreeTransclude);\n\t} else {\n\t\tparseTreeDiv.tree[0].children.push(parseTreeTransclude);\n\t}\n\tif(options.field) {\n\t\tparseTreeTransclude.attributes.field = {type: \"string\", value: options.field};\n\t}\n\tif(options.mode) {\n\t\tparseTreeTransclude.attributes.mode = {type: \"string\", value: options.mode};\n\t}\n\tif(options.children) {\n\t\tparseTreeTransclude.children = options.children;\n\t}\n\treturn this.makeWidget(parseTreeDiv,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\tfield: If specified, restricts the search to the specified field, or an array of field names\n\tanchored: If true, forces all but regexp searches to be anchored to the start of text\n\texcludeField: If true, the field options are inverted to specify the fields that are not to be searched\n\tThe search mode is determined by the first of these boolean flags to be true\n\t\tliteral: searches for literal string\n\t\twhitespace: same as literal except runs of whitespace are treated as a single space\n\t\tregexp: treats the search term as a regular expression\n\t\twords: (default) treats search string as a list of tokens, and matches if all tokens are found, regardless of adjacency or ordering\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\t\tanchor = options.anchored ? \"^\" : \"\";\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(\"(\" + anchor + $tw.utils.escapeRegExp(text) + \")\",flags)];\n\t\t}\n\t} else if(options.whitespace) {\n\t\tterms = [];\n\t\t$tw.utils.each(text.split(/\\s+/g),function(term) {\n\t\t\tif(term) {\n\t\t\t\tterms.push($tw.utils.escapeRegExp(term));\n\t\t\t}\n\t\t});\n\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + terms.join(\"\\\\s+\") + \")\",flags)];\n\t} else if(options.regexp) {\n\t\ttry {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + text + \")\",flags)];\t\t\t\n\t\t} catch(e) {\n\t\t\tsearchTermsRegExps = null;\n\t\t\tconsole.log(\"Regexp error parsing /(\" + text + \")/\" + flags + \": \",e);\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(\"(\" + anchor + $tw.utils.escapeRegExp(terms[t]) + \")\",flags));\n\t\t\t}\n\t\t}\n\t}\n\t// Accumulate the array of fields to be searched or excluded from the search\n\tvar fields = [];\n\tif(options.field) {\n\t\tif($tw.utils.isArray(options.field)) {\n\t\t\t$tw.utils.each(options.field,function(fieldName) {\n\t\t\t\tif(fieldName) {\n\t\t\t\t\tfields.push(fieldName);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tfields.push(options.field);\n\t\t}\n\t}\n\t// Use default fields if none specified and we're not excluding fields (excluding fields with an empty field array is the same as searching all fields)\n\tif(fields.length === 0 && !options.excludeField) {\n\t\tfields.push(\"title\");\n\t\tfields.push(\"tags\");\n\t\tfields.push(\"text\");\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 notYetFound = searchTermsRegExps.slice();\n\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\tsearchFields;\n\t\t// Get the list of fields we're searching\n\t\tif(options.excludeField) {\n\t\t\tsearchFields = Object.keys(tiddler.fields);\n\t\t\t$tw.utils.each(fields,function(fieldName) {\n\t\t\t\tvar p = searchFields.indexOf(fieldName);\n\t\t\t\tif(p !== -1) {\n\t\t\t\t\tsearchFields.splice(p,1);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsearchFields = fields;\n\t\t}\n\t\tfor(var fieldIndex=0; notYetFound.length>0 && fieldIndex<searchFields.length; fieldIndex++) {\n\t\t\t// Don't search the text field if the content type is binary\n\t\t\tvar fieldName = searchFields[fieldIndex];\n\t\t\tif(fieldName === \"text\" && contentTypeInfo.encoding !== \"utf8\") {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvar str = tiddler.fields[fieldName],\n\t\t\t\tt;\n\t\t\tif(str) {\n\t\t\t\tif($tw.utils.isArray(str)) {\n\t\t\t\t\t// If the field value is an array, test each regexp against each field array entry and fail if each regexp doesn't match at least one field array entry\n\t\t\t\t\tfor(var s=0; s<str.length; s++) {\n\t\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\t\tif(notYetFound[t].test(str[s])) {\n\t\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tt++;\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} else {\n\t\t\t\t\t// If the field isn't an array, force it to a string and test each regexp against it and fail if any do not match\n\t\t\t\t\tstr = tiddler.getFieldString(fieldName);\n\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\tif(notYetFound[t].test(str)) {\n\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tt++;\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\treturn notYetFound.length == 0;\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) !== 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.hasField(\"_is_skinny\")) {\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/*\nCheck whether the text of a tiddler matches a given value. By default, the comparison is case insensitive, and any spaces at either end of the tiddler text is trimmed\n*/\nexports.checkTiddlerText = function(title,targetText,options) {\n\toptions = options || {};\n\tvar text = this.getTiddlerText(title,\"\");\n\tif(!options.noTrim) {\n\t\ttext = text.trim();\n\t}\n\tif(!options.caseSensitive) {\n\t\ttext = text.toLowerCase();\n\t\ttargetText = targetText.toLowerCase();\n\t}\n\treturn text === targetText;\n}\n\n/*\nRead an array of browser File objects, invoking callback(tiddlerFieldsArray) once they're all read\n*/\nexports.readFiles = function(files,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\tvar result = [],\n\t\toutstanding = files.length,\n\t\treadFileCallback = 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\tfor(var f=0; f<files.length; f++) {\n\t\tthis.readFile(files[f],$tw.utils.extend({},options,{callback: readFileCallback}));\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,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\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// Give the hook a chance to process the drag\n\tif($tw.hooks.invokeHook(\"th-importing-file\",{\n\t\tfile: file,\n\t\ttype: type,\n\t\tisBinary: isBinary,\n\t\tcallback: callback\n\t}) !== true) {\n\t\tthis.readFileContent(file,type,isBinary,options.deserializer,callback);\n\t}\n};\n\n/*\nLower level utility to read the content of a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFileContent = function(file,type,isBinary,deserializer,callback) {\n\tvar self = this;\n\t// Create the FileReader\n\tvar reader = new FileReader();\n\t// Onload\n\treader.onload = function(event) {\n\t\tvar text = event.target.result,\n\t\t\ttiddlerFields = {title: file.name || \"Untitled\"};\n\t\tif(isBinary) {\n\t\t\tvar commaPos = text.indexOf(\",\");\n\t\t\tif(commaPos !== -1) {\n\t\t\t\ttext = text.substr(commaPos + 1);\n\t\t\t}\n\t\t}\n\t\t// Check whether this is an encrypted TiddlyWiki file\n\t\tvar encryptedJson = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedJson) {\n\t\t\t// If so, attempt to decrypt it with the current password\n\t\t\t$tw.utils.decryptStoreAreaInteractive(encryptedJson,function(tiddlers) {\n\t\t\t\tcallback(tiddlers);\n\t\t\t});\n\t\t} else {\n\t\t\t// Otherwise, just try to deserialise any tiddlers in the file\n\t\t\tcallback(self.deserializeTiddlers(type,text,tiddlerFields,{deserializer: deserializer}));\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.\nIf the original tiddler doesn't exist, create  a vanilla tiddler variable,\nto check if additional fields have been added.\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\"]) || new $tw.Tiddler({text:\"\", tags:[]}),\n\t\ttitleModified = tiddler.fields[\"draft.title\"] !== tiddler.fields[\"draft.of\"];\n\treturn titleModified || !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);\t\n\tconsole.log(\"$tw.wiki.addToHistory() is deprecated since V5.1.23! Use the this.story.addToHistory() from the story-object!\")\n};\n\n/*\nAdd a new tiddler to the story river\ntitle: a title string or an array of title strings\nfromTitle: the title of the tiddler from which the navigation originated\nstoryTitle: title of story tiddler (defaults to $:/StoryList)\noptions: see story.js\n*/\nexports.addToStory = function(title,fromTitle,storyTitle,options) {\n\tvar story = new $tw.Story({wiki: this, storyTitle: storyTitle});\n\tstory.addToStory(title,fromTitle,options);\n\tconsole.log(\"$tw.wiki.addToStory() is deprecated since V5.1.23! Use the this.story.addToStory() from the story-object!\")\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nexports.generateDraftTitle = function(title) {\n\tvar c = 0,\n\t\tdraftTitle,\n\t\tusername = this.getTiddlerText(\"$:/status/UserName\"),\n\t\tattribution = username ? \" by \" + username : \"\";\n\tdo {\n\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\" + attribution;\n\t\tc++;\n\t} while(this.tiddlerExists(draftTitle));\n\treturn draftTitle;\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// Determine whether a plugin by title is dynamically loadable\nexports.doesPluginRequireReload = function(title) {\n\treturn this.doesPluginInfoRequireReload(this.getPluginInfo(title) || this.getTiddlerDataCached(title));\n};\n\n// Determine whether a plugin info structure is dynamically loadable\nexports.doesPluginInfoRequireReload = function(pluginInfo) {\n\tif(pluginInfo) {\n\t\tvar foundModule = false;\n\t\t$tw.utils.each(pluginInfo.tiddlers,function(tiddler) {\n\t\t\tif(tiddler.type === \"application/javascript\" && $tw.utils.hop(tiddler,\"module-type\")) {\n\t\t\t\tfoundModule = true;\n\t\t\t}\n\t\t});\n\t\treturn foundModule;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.slugify = function(title,options) {\n\tvar tiddler = this.getTiddler(title),\n\t\tslug;\n\tif(tiddler && tiddler.fields.slug) {\n\t\tslug = tiddler.fields.slug;\n\t} else {\n\t\tslug = $tw.utils.transliterate(title.toString().toLowerCase()) // Replace diacritics with basic lowercase ASCII\n\t\t\t.replace(/\\s+/g,\"-\")                                       // Replace spaces with -\n\t\t\t.replace(/[^\\w\\-\\.]+/g,\"\")                                 // Remove all non-word chars except dash and dot\n\t\t\t.replace(/\\-\\-+/g,\"-\")                                     // Replace multiple - with single -\n\t\t\t.replace(/^-+/,\"\")                                         // Trim - from start of text\n\t\t\t.replace(/-+$/,\"\");                                        // Trim - from end of text\n\t}\n\t// If the resulting slug is blank (eg because the title is just punctuation characters)\n\tif(!slug) {\n\t\t// ...then just use the character codes of the title\n\t\tvar result = [];\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tresult.push(char.charCodeAt(0).toString());\n\t\t});\n\t\tslug = result.join(\"-\");\n\t}\n\treturn slug;\n};\n\n})();\n\n",
            "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\nselect-tag-background:\nselect-tag-foreground:\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\nselect-tag-background:\nselect-tag-foreground:\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\nselect-tag-background:\nselect-tag-foreground:\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\nselect-tag-background:\nselect-tag-foreground:\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\nselect-tag-background:\nselect-tag-foreground:\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/CupertinoDark": {
            "title": "$:/palettes/CupertinoDark",
            "tags": "$:/tags/Palette",
            "name": "Cupertino Dark",
            "description": "A macOS inspired dark palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #FF453A\nalert-border: #FF453A\nalert-highlight: #FFD60A\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #282828\nblockquote-bar: <<colour page-background>>\nbutton-foreground: <<colour background>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #FF453A\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour tiddler-info-background>>\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: #3F638B\ndropdown-tab-background: #323232\ndropzone-background: #30D158\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #BF5AF2\nexternal-link-foreground: #32D74B\nforeground: #FFFFFF\nmenubar-background: #464646\nmenubar-foreground: #ffffff\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: #98989D\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #323232\npre-background: #464646\npre-border: transparent\nprimary: #0A84FF\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour background>>\nsidebar-controls-foreground-hover: #FF9F0A\nsidebar-controls-foreground: #8E8E93\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: #3F638B\nsidebar-tab-background: <<colour background>>\nsidebar-tab-border-selected: <<colour background>>\nsidebar-tab-border: <<colour background>>\nsidebar-tab-divider: <<colour background>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: #ffffff\nstatic-alert-foreground: #B4B4B4\ntab-background-selected: #3F638B\ntab-background: <<colour page-background>>\ntab-border-selected: <<colour page-background>>\ntab-border: <<colour page-background>>\ntab-divider: <<colour page-background>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #464646\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #48484A\ntag-foreground: #323232\ntiddler-background: <<colour background>>\ntiddler-border: transparent\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: #48484A\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #1E1E1E\ntiddler-info-border: #1E1E1E\ntiddler-info-tab-background: #3F638B\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\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 very-muted-foreground>>\nvery-muted-foreground: #464646\nselection-background: #3F638B\nselection-foreground: #ffffff\nwikilist-background: <<colour page-background>>\nwikilist-button-background: #3F638B\nwikilist-button-foreground: <<colour foreground>>\nwikilist-button-open: #32D74B\nwikilist-button-open-hover: #32D74B\nwikilist-button-reveal: #0A84FF\nwikilist-button-reveal-hover: #0A84FF\nwikilist-button-remove: #FF453A\nwikilist-button-remove-hover: #FF453A\nwikilist-droplink-dragover: #32D74B\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour foreground>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-url: <<colour muted-foreground>>\n"
        },
        "$:/palettes/DarkPhotos": {
            "title": "$:/palettes/DarkPhotos",
            "created": "20150402111612188",
            "description": "Good with dark photo backgrounds",
            "modified": "20150402112344080",
            "name": "DarkPhotos",
            "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: #ddd\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #336438\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\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/DesertSand": {
            "title": "$:/palettes/DesertSand",
            "tags": "$:/tags/Palette",
            "name": "Desert Sand",
            "description": "A desert sand palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #E9E0C7\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour foreground>>\ncode-background: #F3EDDF\ncode-border: #C3BAA1\ncode-foreground: #ab3250\ndiff-delete-background: #bd8b8b\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #91c093\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ad3434\ndownload-background: #6ca16c\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: #E9E0C7\ndropdown-tab-background: #BAB29C\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: #313163\nexternal-link-foreground: #555592\nforeground: #2D2A23\nmenubar-background: #CDC2A6\nmenubar-foreground: #5A5446\nmessage-background: #ECE5CF\nmessage-border: #D6CBAA\nmessage-foreground: #5f6e7d\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #8A8885\nmodal-footer-background: #CDC2A6\nmodal-footer-border: #9D998E\nmodal-header-border: #9D998E\nmuted-foreground: #9D998E\nnotification-background: #F0E9D7\nnotification-border: #939189\npage-background: #e0d3af\npre-background: #D6CBAA\npre-border: #CDC2A6\nprimary: #5B6F55\nselection-background: #9D947B\nselection-foreground: <<colour foreground>>\nselect-tag-background: #F0E9D7\nselect-tag-foreground: #2D2A23\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #2D2A23\nsidebar-controls-foreground: #867F69\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #867F69\nsidebar-muted-foreground-hover: #706A58\nsidebar-muted-foreground: #B3A98C\nsidebar-tab-background-selected: #e0d3af\nsidebar-tab-background: #A6A193\nsidebar-tab-border-selected: #C3BAA1\nsidebar-tab-border: #C3BAA1\nsidebar-tab-divider: #CDC2A6\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #2D2A23\nsidebar-tiddler-link-foreground-hover: #433F35\nsidebar-tiddler-link-foreground: #706A58\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #A6A193\ntab-background-selected: #E9E0C7\ntab-background: #A6A193\ntab-border-selected: #C3BAA1\ntab-border: #C3BAA1\ntab-divider: #CDC2A6\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #2D2A23\ntable-border: #9D998E\ntable-footer-background: #8A8885\ntable-header-background: #B0AA98\ntag-background: #706A58\ntag-foreground: #E3D7B7\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #9D947B\ntiddler-controls-foreground-selected: #706A58\ntiddler-controls-foreground: #C3BAA1\ntiddler-editor-background: #E9E0C7\ntiddler-editor-border-image: #A6A193\ntiddler-editor-border: #A6A193\ntiddler-editor-fields-even: #D6CBAA\ntiddler-editor-fields-odd: #C3BAA1\ntiddler-info-background: #E3D7B7\ntiddler-info-border: #BAB29C\ntiddler-info-tab-background: #E9E0C7\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #867F69\ntiddler-title-foreground: #374464\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: #8A8885\nvery-muted-foreground: #CDC2A6\nwikilist-background: <<colour page-background>>\nwikilist-item: #CDC2A6\nwikilist-info: #161512\nwikilist-title: #433F35\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #706A58\nwikilist-button-open: #7db66a\nwikilist-button-open-hover: #56a556\nwikilist-button-reveal: #5a6c9e\nwikilist-button-reveal-hover: #454591\nwikilist-button-remove: #bc5972\nwikilist-button-remove-hover: #814040\nwikilist-toolbar-background: #CDC2A6\nwikilist-toolbar-foreground: #2D2A23\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #A6A193\nwikilist-button-foreground: #161512\n"
        },
        "$:/palettes/GruvboxDark": {
            "title": "$:/palettes/GruvboxDark",
            "name": "Gruvbox Dark",
            "description": "Retro groove color scheme",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "license": "https://github.com/morhetz/gruvbox",
            "text": "alert-background: #cc241d\nalert-border: #cc241d\nalert-highlight: #d79921\nalert-muted-foreground: #504945\nbackground: #3c3836\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour page-background>>\ncode-background: #504945\ncode-border: #504945\ncode-foreground: #fb4934\ndiff-delete-background: #fb4934\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #b8bb26\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #fb4934\ndownload-background: #b8bb26\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #665c54\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ebdbb2\ndropdown-tab-background: #665c54\ndropzone-background: #98971a\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #d3869b\nexternal-link-foreground: #8ec07c\nforeground: #fbf1c7\nmenubar-background: #504945\nmenubar-foreground: <<colour foreground>>\nmessage-background: #83a598\nmessage-border: #83a598\nmessage-foreground: #3c3836\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #504945\nmodal-footer-background: #3c3836\nmodal-footer-border: #3c3836\nmodal-header-border: #3c3836\nmuted-foreground: #d5c4a1\nnotification-background: <<colour primary>>\nnotification-border: <<colour primary>>\npage-background: #282828\npre-background: #504945\npre-border: #504945\nprimary: #d79921\nselect-tag-background: #665c54\nselect-tag-foreground: <<colour foreground>>\nselection-background: #458588\nselection-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour page-background>>\nsidebar-controls-foreground-hover: #7c6f64\nsidebar-controls-foreground: #504945\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #fbf1c7\nsidebar-muted-foreground-hover: #7c6f64\nsidebar-muted-foreground: #504945\nsidebar-tab-background-selected: #bdae93\nsidebar-tab-background: #3c3836\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #bdae93\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #282828\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #458588\nsidebar-tiddler-link-foreground: #98971a\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ebdbb2\ntab-background: #665c54\ntab-border-selected: #665c54\ntab-border: #665c54\ntab-divider: #bdae93\ntab-foreground-selected: #282828\ntab-foreground: #ebdbb2\ntable-border: #7c6f64\ntable-footer-background: #665c54\ntable-header-background: #504945\ntag-background: #d3869b\ntag-foreground: #282828\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #7c6f64\ntiddler-controls-foreground-selected: <<colour primary>>\ntiddler-controls-foreground: #665c54\ntiddler-editor-background: #32302f\ntiddler-editor-border-image: #282828\ntiddler-editor-border: #282828\ntiddler-editor-fields-even: #504945\ntiddler-editor-fields-odd: #7c6f64\ntiddler-info-background: #32302f\ntiddler-info-border: #ebdbb2\ntiddler-info-tab-background: #ebdbb2\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #7c6f64\ntiddler-title-foreground: #a89984\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: #504945\nvery-muted-foreground: #bdae93\nwikilist-background: <<colour page-background>>\nwikilist-button-background: #acacac\nwikilist-button-foreground: <<colour button-foreground>>\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: <<colour muted-foreground>>\nwikilist-button-open-hover: <<colour primary>>\nwikilist-button-open: <<colour dropzone-background>>\nwikilist-button-remove: <<colour dirty-indicator>>\nwikilist-button-remove-hover: <<colour alert-background>>\nwikilist-droplink-dragover: <<colour dropzone-background>>\nwikilist-button-reveal: <<colour sidebar-tiddler-link-foreground-hover>>\nwikilist-button-reveal-hover: <<colour message-background>>\n"
        },
        "$:/palettes/Nord": {
            "title": "$:/palettes/Nord",
            "name": "Nord",
            "description": "An arctic, north-bluish color palette.",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "license": "MIT, arcticicestudio, https://github.com/arcticicestudio/nord/blob/develop/LICENSE.md",
            "text": "alert-background: #D08770\nalert-border: #D08770\nalert-highlight: #B48EAD\nalert-muted-foreground: #4C566A\nbackground: #3b4252\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour page-background>>\ncode-background: #2E3440\ncode-border: #2E3440\ncode-foreground: #BF616A\ndiff-delete-background: #BF616A\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #A3BE8C\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #BF616A\ndownload-background: #A3BE8C\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ECEFF4\ndropdown-tab-background: #4C566A\ndropzone-background: #A3BE8C\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #5E81AC\nexternal-link-foreground: #8FBCBB\nforeground: #d8dee9\nmenubar-background: #2E3440\nmenubar-foreground: #d8dee9\nmessage-background: #2E3440\nmessage-border: #2E3440\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #3b4252\nmodal-footer-background: #3b4252\nmodal-footer-border: #3b4252\nmodal-header-border: #3b4252\nmuted-foreground: #4C566A\nnotification-background: <<colour primary>>\nnotification-border: #EBCB8B\npage-background: #2e3440\npre-background: #2E3440\npre-border: #2E3440\nprimary: #5E81AC\nselect-tag-background: #3b4252\nselect-tag-foreground: <<colour foreground>>\nselection-background: #5E81AC\nselection-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour page-background>>\nsidebar-controls-foreground-hover: #D8DEE9\nsidebar-controls-foreground: #4C566A\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #D8DEE9\nsidebar-muted-foreground-hover: #4C566A\nsidebar-muted-foreground: #4C566A\nsidebar-tab-background-selected: #ECEFF4\nsidebar-tab-background: #4C566A\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #4C566A\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #4C566A\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #A3BE8C\nsidebar-tiddler-link-foreground: #81A1C1\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ECEFF4\ntab-background: #4C566A\ntab-border-selected: #4C566A\ntab-border: #4C566A\ntab-divider: #4C566A\ntab-foreground-selected: #4C566A\ntab-foreground: #D8DEE9\ntable-border: #4C566A\ntable-footer-background: #2e3440\ntable-header-background: #2e3440\ntag-background: #A3BE8C\ntag-foreground: #4C566A\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: \ntiddler-controls-foreground-selected: #EBCB8B\ntiddler-controls-foreground: #4C566A\ntiddler-editor-background: #2e3440\ntiddler-editor-border-image: #2e3440\ntiddler-editor-border: #3b4252\ntiddler-editor-fields-even: #2e3440\ntiddler-editor-fields-odd: #2e3440\ntiddler-info-background: #2e3440\ntiddler-info-border: #2e3440\ntiddler-info-tab-background: #2e3440\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #4C566A\ntiddler-title-foreground: #81A1C1\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: #2d3038\nvery-muted-foreground: #2d3038\nwikilist-background: <<colour page-background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-item: <<colour background>>\nwikilist-title: <<colour foreground>>\nwikilist-info: <<colour muted-foreground>>\nwikilist-button-open: #A3BE8C\nwikilist-button-open-hover: #A3BE8C\nwikilist-button-reveal: #81A1C1\nwikilist-button-reveal-hover: #81A1C1\nwikilist-button-remove: #B48EAD\nwikilist-button-remove-hover: #B48EAD\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\nselect-tag-background:\nselect-tag-foreground:\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\nselect-tag-background:\nselect-tag-foreground:\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/SolarizedDark": {
            "title": "$:/palettes/SolarizedDark",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "description": "Precision dark colors for machines and people",
            "license": "MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE",
            "name": "SolarizedDark",
            "text": "alert-background: #073642\nalert-border: #93a1a1\nalert-highlight: #d33682\nalert-muted-foreground: #d33682\nbackground: #073642\nblockquote-bar: #d33682\nbutton-background: #073642\nbutton-border: #586e75\nbutton-foreground: #93a1a1\ncode-background: #073642\ncode-border: #586e75\ncode-foreground: #93a1a1\ndirty-indicator: inherit\ndownload-background: #859900\ndownload-foreground: #073642\ndragger-background: #073642\ndragger-foreground: #839496\ndropdown-background: #073642\ndropdown-border: #93a1a1\ndropdown-tab-background: #002b36\ndropdown-tab-background-selected: #073642\ndropzone-background: #859900\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: #268bd2\nexternal-link-foreground-hover:\nexternal-link-foreground-visited: #268bd2\nforeground: #839496\nmessage-background: #002b36\nmessage-border: #586e75\nmessage-foreground: #839496\nmodal-backdrop: #657b83\nmodal-background: #002b36\nmodal-border: #586e75\nmodal-footer-background: #073642\nmodal-footer-border: #586e75\nmodal-header-border: #586e75\nmuted-foreground: #93a1a1\nnotification-background: #002b36\nnotification-border: #586e75\npage-background: #073642\npre-background: inherit\npre-border: #657b83\nprimary: #859900\nselect-tag-background: #002b36\nselect-tag-foreground: #839496\nsidebar-button-foreground: #93a1a1\nsidebar-controls-foreground: #93a1a1\nsidebar-controls-foreground-hover: #eee8d5\nsidebar-foreground: #93a1a1\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: #839496\nsidebar-muted-foreground-hover: #93a1a1\nsidebar-tab-background: #002b36\nsidebar-tab-background-selected: #073642\nsidebar-tab-border: #073642\nsidebar-tab-border-selected: #839496\nsidebar-tab-divider: #002b36\nsidebar-tab-foreground: #657b83\nsidebar-tab-foreground-selected: #93a1a1\nsidebar-tiddler-link-foreground: #2aa198\nsidebar-tiddler-link-foreground-hover: #eee8d5\nsite-title-foreground: #d33682\nstatic-alert-foreground: #93a1a1\ntab-background: #073642\ntab-background-selected: #002b36\ntab-border: #586e75\ntab-border-selected: #93a1a1\ntab-divider: #93a1a1\ntab-foreground: #839496\ntab-foreground-selected: #93a1a1\ntable-border: #586e75\ntable-footer-background: #073642\ntable-header-background: #073642\ntag-background: #b58900\ntag-foreground: #002b36\ntiddler-background: #002b36\ntiddler-border: #586e75\ntiddler-controls-foreground: inherit\ntiddler-controls-foreground-hover: #d33682\ntiddler-controls-foreground-selected: #2aa198\ntiddler-editor-background: #002b36\ntiddler-editor-border: #073642\ntiddler-editor-border-image: #002b36\ntiddler-editor-fields-even: #002b36\ntiddler-editor-fields-odd: #073642\ntiddler-info-background: #073642\ntiddler-info-border: #657b83\ntiddler-info-tab-background: #002b36\ntiddler-link-background: #002b36\ntiddler-link-foreground: #2aa198\ntiddler-subtitle-foreground: #839496\ntiddler-title-foreground: #d33682\ntoolbar-cancel-button: #839496\ntoolbar-close-button: #839496\ntoolbar-delete-button: #dc322f\ntoolbar-done-button: #839496\ntoolbar-edit-button: #839496\ntoolbar-info-button: #839496\ntoolbar-new-button: #839496\ntoolbar-options-button: #839496\ntoolbar-save-button: inherit\nuntagged-background: #586e75\nvery-muted-foreground: #586e75\n"
        },
        "$:/palettes/SolarizedLight": {
            "title": "$:/palettes/SolarizedLight",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "description": "Precision colors for machines and people",
            "license": "MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE",
            "name": "SolarizedLight",
            "text": "alert-background: #eee8d5\nalert-border: #586e75\nalert-highlight: #d33682\nalert-muted-foreground: #d33682\nbackground: #eee8d5\nblockquote-bar: #d33682\nbutton-background: #eee8d5\nbutton-border: #93a1a1\nbutton-foreground: #586e75\ncode-background: #eee8d5\ncode-border: #93a1a1\ncode-foreground: #586e75\ndirty-indicator: inherit\ndownload-background: #859900\ndownload-foreground: #eee8d5\ndragger-background: #eee8d5\ndragger-foreground: #657b83\ndropdown-background: #eee8d5\ndropdown-border: #586e75\ndropdown-tab-background: #fdf6e3\ndropdown-tab-background-selected: #eee8d5\ndropzone-background: #859900\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: #268bd2\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #268bd2\nforeground: #657b83\nmessage-background: #fdf6e3\nmessage-border: #93a1a1\nmessage-foreground: #657b83\nmodal-backdrop: #839496\nmodal-background: #fdf6e3\nmodal-border: #93a1a1\nmodal-footer-background: #eee8d5\nmodal-footer-border: #93a1a1\nmodal-header-border: #93a1a1\nmuted-foreground: #586e75\nnotification-background: #fdf6e3\nnotification-border: #93a1a1\npage-background: #eee8d5\npre-background: #eee8d5\npre-border: #839496\nprimary: #859900\nselect-tag-background: #fdf6e3\nselect-tag-foreground: #657b83\nsidebar-button-foreground: #586e75\nsidebar-controls-foreground: #586e75\nsidebar-controls-foreground-hover: #d33682\nsidebar-foreground: #586e75\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: #657b83\nsidebar-muted-foreground-hover: #586e75\nsidebar-tab-background: #fdf6e3\nsidebar-tab-background-selected: #eee8d5\nsidebar-tab-border: #eee8d5\nsidebar-tab-border-selected: #657b83\nsidebar-tab-divider: #fdf6e3\nsidebar-tab-foreground: #839496\nsidebar-tab-foreground-selected: #586e75\nsidebar-tiddler-link-foreground: #2aa198\nsidebar-tiddler-link-foreground-hover: #002b36\nsite-title-foreground: #d33682\nstatic-alert-foreground: #586e75\ntab-background: #eee8d5\ntab-background-selected: #fdf6e3\ntab-border: #93a1a1\ntab-border-selected: #586e75\ntab-divider: #586e75\ntab-foreground: #657b83\ntab-foreground-selected: #586e75\ntable-border: #93a1a1\ntable-footer-background: #eee8d5\ntable-header-background: #eee8d5\ntag-background: #b58900\ntag-foreground: #fdf6e3\ntiddler-background: #fdf6e3\ntiddler-border: #93a1a1\ntiddler-controls-foreground: inherit\ntiddler-controls-foreground-hover: #d33682\ntiddler-controls-foreground-selected: #2aa198\ntiddler-editor-background: #fdf6e3\ntiddler-editor-border: #eee8d5\ntiddler-editor-border-image: #fdf6e3\ntiddler-editor-fields-even: #fdf6e3\ntiddler-editor-fields-odd: #eee8d5\ntiddler-info-background: #eee8d5\ntiddler-info-border: #839496\ntiddler-info-tab-background: #fdf6e3\ntiddler-link-background: #fdf6e3\ntiddler-link-foreground: #2aa198\ntiddler-subtitle-foreground: #657b83\ntiddler-title-foreground: #d33682\ntoolbar-cancel-button: #657b83\ntoolbar-close-button: #657b83\ntoolbar-delete-button: #dc322f\ntoolbar-done-button: #657b83\ntoolbar-edit-button: #657b83\ntoolbar-info-button: #657b83\ntoolbar-new-button: #657b83\ntoolbar-options-button: #657b83\ntoolbar-save-button: inherit\nuntagged-background: #586e75\nvery-muted-foreground: #93a1a1\n"
        },
        "$:/palettes/SpartanDay": {
            "title": "$:/palettes/SpartanDay",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "description": "Cold, spartan day colors",
            "name": "Spartan Day",
            "text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #FAFAFA\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: #ececec\ncode-border: #ececec\ncode-foreground: \ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #FFFFFF\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #F5F5F5\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: \nexternal-link-foreground: \nforeground: rgba(0, 0, 0, 0.87)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(0, 0, 0, 0.54)\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour very-muted-foreground>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(0, 0, 0, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #f4f4f4\npre-background: #ececec\npre-border: #ececec\nprimary: #3949ab\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #aeaeae\nsidebar-controls-foreground: #c6c6c6\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground-hover: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground: rgba(0, 0, 0, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(0, 0, 0, 0.87)\nsidebar-tab-foreground: rgba(0, 0, 0, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(0, 0, 0, 0.87)\nsidebar-tiddler-link-foreground: rgba(0, 0, 0, 0.54)\nsite-title-foreground: rgba(0, 0, 0, 0.87)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(0, 0, 0, 0.87)\ntab-foreground: rgba(0, 0, 0, 0.54)\ntable-border: #d8d8d8\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: #f9f9f9\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: #e8e7e7\ntiddler-editor-fields-even: rgba(0, 0, 0, 0.1)\ntiddler-editor-fields-odd: rgba(0, 0, 0, 0.04)\ntiddler-info-background: #F5F5F5\ntiddler-info-border: #F5F5F5\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #000000\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 very-muted-foreground>>\nvery-muted-foreground: rgba(0, 0, 0, 0.12)\n"
        },
        "$:/palettes/SpartanNight": {
            "title": "$:/palettes/SpartanNight",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "description": "Dark spartan colors",
            "name": "Spartan Night",
            "text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #303030\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #424242\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #050505\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #7c318c\nexternal-link-foreground: #9e3eb3\nforeground: rgba(255, 255, 255, 0.7)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(255, 255, 255, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #212121\npre-background: #2a2a2a\npre-border: transparent\nprimary: #5656f3\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #494949\nsidebar-controls-foreground: #5d5d5d\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: rgba(255, 255, 255, 0.7)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #3a3a3a\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: rgb(55,55,55)\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #454545\ntiddler-info-border: #454545\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\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 very-muted-foreground>>\nvery-muted-foreground: rgba(255, 255, 255, 0.12)\n"
        },
        "$:/palettes/Twilight": {
            "title": "$:/palettes/Twilight",
            "tags": "$:/tags/Palette",
            "author": "Thomas Elmiger",
            "type": "application/x-tiddler-dictionary",
            "name": "Twilight",
            "description": "Delightful, soft darkness.",
            "text": "alert-background: rgb(255, 255, 102)\nalert-border: rgb(232, 232, 125)\nalert-highlight: rgb(255, 51, 51)\nalert-muted-foreground: rgb(224, 82, 82)\nbackground: rgb(38, 38, 38)\nblockquote-bar: rgba(240, 196, 117, 0.7)\nbutton-background: rgb(63, 63, 63)\nbutton-border: rgb(127, 127, 127)\nbutton-foreground: rgb(179, 179, 179)\ncode-background: rgba(0,0,0,0.03)\ncode-border: rgba(0,0,0,0.08)\ncode-foreground: rgb(255, 94, 94)\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: rgb(255, 94, 94)\ndownload-background: #19a974\ndownload-foreground: rgb(38, 38, 38)\ndragger-background: rgb(179, 179, 179)\ndragger-foreground: rgb(38, 38, 38)\ndropdown-background: rgb(38, 38, 38)\ndropdown-border: rgb(255, 255, 255)\ndropdown-tab-background: rgba(0,0,0,.1)\ndropdown-tab-background-selected: rgba(255,255,255,1)\ndropzone-background: #9eebcf\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: rgb(179, 179, 255)\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: rgb(153, 153, 255)\nforeground: rgb(179, 179, 179)\nmessage-background: <<colour tag-foreground>>\nmessage-border: #96ccff\nmessage-foreground: <<colour tag-background>>\nmodal-backdrop: rgb(179, 179, 179)\nmodal-background: rgb(38, 38, 38)\nmodal-border: rgba(0,0,0,.5)\nmodal-footer-background: #f4f4f4\nmodal-footer-border: rgba(0,0,0,.1)\nmodal-header-border: rgba(0,0,0,.2)\nmuted-foreground: rgb(255, 255, 255)\nnotification-background: <<colour tag-foreground>>\nnotification-border: <<colour tag-background>>\npage-background: rgb(26, 26, 26)\npre-background: rgb(25, 25, 25)\npre-border: rgba(0,0,0,.2)\nprimary: rgb(255, 201, 102)\nselect-tag-background: \nselect-tag-foreground: \nsidebar-button-foreground: rgb(179, 179, 179)\nsidebar-controls-foreground: rgb(153, 153, 153)\nsidebar-controls-foreground-hover: <<colour tiddler-controls-foreground-hover>>\nsidebar-foreground: rgb(141, 141, 141)\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: rgba(0, 0, 0, 0.5)\nsidebar-muted-foreground-hover: rgb(141, 141, 141)\nsidebar-tab-background: rgba(141, 141, 141, 0.2)\nsidebar-tab-background-selected: rgb(26, 26, 26)\nsidebar-tab-border: rgb(127, 127, 127)\nsidebar-tab-border-selected: rgb(127, 127, 127)\nsidebar-tab-divider: rgb(127, 127, 127)\nsidebar-tab-foreground: rgb(179, 179, 179)\nsidebar-tab-foreground-selected: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground-hover: rgb(115, 115, 115)\nsite-title-foreground: rgb(255, 201, 102)\nstatic-alert-foreground: rgba(0,0,0,.3)\ntab-background: rgba(0,0,0,0.125)\ntab-background-selected: rgb(38, 38, 38)\ntab-border: rgb(255, 201, 102)\ntab-border-selected: rgb(255, 201, 102)\ntab-divider: rgb(255, 201, 102)\ntab-foreground: rgb(179, 179, 179)\ntab-foreground-selected: rgb(179, 179, 179)\ntable-border: rgba(255,255,255,.3)\ntable-footer-background: rgba(0,0,0,.4)\ntable-header-background: rgba(0,0,0,.1)\ntag-background: rgb(255, 201, 102)\ntag-foreground: rgb(25, 25, 25)\ntiddler-background: rgb(38, 38, 38)\ntiddler-border: rgba(240, 196, 117, 0.7)\ntiddler-controls-foreground: rgb(128, 128, 128)\ntiddler-controls-foreground-hover: rgba(255, 255, 255, 0.8)\ntiddler-controls-foreground-selected: rgba(255, 255, 255, 0.9)\ntiddler-editor-background: rgb(33, 33, 33)\ntiddler-editor-border: rgb(63, 63, 63)\ntiddler-editor-border-image: rgb(25, 25, 25)\ntiddler-editor-fields-even: rgb(33, 33, 33)\ntiddler-editor-fields-odd: rgb(28, 28, 28)\ntiddler-info-background: rgb(43, 43, 43)\ntiddler-info-border: rgb(25, 25, 25)\ntiddler-info-tab-background: rgb(43, 43, 43)\ntiddler-link-background: rgb(38, 38, 38)\ntiddler-link-foreground: rgb(204, 204, 255)\ntiddler-subtitle-foreground: rgb(255, 255, 255)\ntiddler-title-foreground: rgb(255, 192, 76)\ntoolbar-cancel-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-done-button: \ntoolbar-edit-button: \ntoolbar-info-button: \ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \nuntagged-background: rgb(255, 255, 255)\nvery-muted-foreground: rgba(240, 196, 117, 0.7)\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\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\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\nselection-background:\nselection-foreground:\nselect-tag-background:\nselect-tag-foreground:\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\nwikilist-background: #e5e5e5\nwikilist-item: #fff\nwikilist-info: #000\nwikilist-title: #666\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #aaa\nwikilist-button-open: #4fb82b\nwikilist-button-open-hover: green\nwikilist-button-reveal: #5778d8\nwikilist-button-reveal-hover: blue\nwikilist-button-remove: #d85778\nwikilist-button-remove-hover: red\nwikilist-toolbar-background: #d3d3d3\nwikilist-toolbar-foreground: #888\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #acacac\nwikilist-button-foreground: #000\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"
        },
        "$:/library/sjcl.js/license": {
            "title": "$:/library/sjcl.js/license",
            "type": "text/plain",
            "text": "SJCL is open. You can use, modify and redistribute it under a BSD\nlicense or under the GNU GPL, version 2.0.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/BSD-2-Clause\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n1. Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/GPL-2.0\n\nThe Stanford Javascript Crypto Library (hosted here on GitHub) is a\nproject by the Stanford Computer Security Lab to build a secure,\npowerful, fast, small, easy-to-use, cross-browser library for\ncryptography in Javascript.\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University.\n\nThis program is free software; you can redistribute it and/or modify it\nunder the terms of the GNU General Public License as published by the\nFree Software Foundation; either version 2 of the License, or (at your\noption) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\nPublic License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program; if not, write to the Free Software Foundation, Inc.,\n59 Temple Place, Suite 330, Boston, MA 02111-1307 USA"
        },
        "$:/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)https://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-raw": {
            "title": "$:/core/templates/canonical-uri-external-raw",
            "text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external raw files that are stored in the same directory\n\n-->\n<$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": "<$macrocall $name=\"csvtiddlers\" filter=<<exportFilter>> format=\"quoted-comma-sep\" $output=\"text/raw\"/>\n"
        },
        "$:/core/templates/exporters/JsonFile": {
            "title": "$:/core/templates/exporters/JsonFile",
            "tags": "$:/tags/Exporter",
            "description": "{{$:/language/Exporters/JsonFile}}",
            "extension": ".json",
            "text": "<$macrocall $name=\"jsontiddlers\" filter=<<exportFilter>> $output=\"text/raw\"/>\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 tc-static-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\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>\n"
        },
        "$:/core/templates/exporters/TidFile": {
            "title": "$:/core/templates/exporters/TidFile",
            "tags": "$:/tags/Exporter",
            "description": "{{$:/language/Exporters/TidFile}}",
            "extension": ".tid",
            "condition": "[<count>compare:lte[1]]",
            "text": "\\define renderContent()\n{{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>"
        },
        "$:/core/save/all-external-js": {
            "title": "$:/core/save/all-external-js",
            "text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/core]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5-external-js.html}}\n"
        },
        "$:/core/templates/tiddlywiki5.js": {
            "title": "$:/core/templates/tiddlywiki5.js",
            "text": "\\rules only filteredtranscludeinline transcludeinline codeinline\n\n/*\n{{ $:/core/copyright.txt ||$:/core/templates/plain-text-tiddler}}\n`*/\n`<!--~~ Library modules ~~-->\n{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/plain-text-tiddler}}}\n<!--~~ Boot prefix ~~-->\n{{ $:/boot/bootprefix.js ||$:/core/templates/plain-text-tiddler}}\n<!--~~ Core plugin ~~-->\n{{$:/core/templates/tiddlywiki5.js/tiddlers}}\n<!--~~ Boot kernel ~~-->\n{{ $:/boot/boot.js ||$:/core/templates/plain-text-tiddler}}\n"
        },
        "$:/core/templates/tiddlywiki5.js/tiddlers": {
            "title": "$:/core/templates/tiddlywiki5.js/tiddlers",
            "text": "`\n$tw.preloadTiddlerArray(`<$text text=<<jsontiddlers \"[[$:/core]]\">>/>`);\n`\n"
        },
        "$:/core/templates/tiddlywiki5-external-js.html": {
            "title": "$:/core/templates/tiddlywiki5-external-js.html",
            "text": "\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n{{$:/core/templates/MOTW.html}}<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\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=\"mobile-web-app-capable\" content=\"yes\"/>\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{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}\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<!--~~ Raw markup for the bottom of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}\n</body>\n<script src=\"%24%3A%2Fcore%2Ftemplates%2Ftiddlywiki5.js\" onerror=\"alert('Error: Cannot load tiddlywiki.js');\"></script>\n</html>\n"
        },
        "$:/core/templates/html-div-skinny-tiddler": {
            "title": "$:/core/templates/html-div-skinny-tiddler",
            "text": "<!--\n\nThis template is a variant of $:/core/templates/html-div-tiddler used for saving skinny tiddlers (with no text field)\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre></pre>\n</div>`\n"
        },
        "$:/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/json-tiddler": {
            "title": "$:/core/templates/json-tiddler",
            "text": "<!--\n\nThis template is used for saving tiddlers as raw JSON\n\n--><$text text=<<jsontiddler>>/>"
        },
        "$:/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/templates/raw-static-tiddler": {
            "title": "$:/core/templates/raw-static-tiddler",
            "text": "<!--\n\nThis template is used for saving tiddlers as static HTML\n\n--><$view field=\"text\" format=\"plainwikified\" />"
        },
        "$:/core/save/all": {
            "title": "$:/core/save/all",
            "text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/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\\define skinnySaveTiddlerFilter()\n[!is[system]]\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\\define skinnySaveTiddlerFilter()\n[!is[system]is[image]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
        },
        "$:/core/templates/server/static.sidebar.wikitext": {
            "title": "$:/core/templates/server/static.sidebar.wikitext",
            "text": "\\whitespace trim\n<div class=\"tc-sidebar-scrollable\" style=\"overflow: auto;\">\n<div class=\"tc-sidebar-header\">\n<h1 class=\"tc-site-title\">\n<$transclude tiddler=\"$:/SiteTitle\"/>\n</h1>\n<div class=\"tc-site-subtitle\">\n<$transclude tiddler=\"$:/SiteSubtitle\"/>\n</div>\n<h2>\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$list filter={{$:/DefaultTiddlers}}>\n<div class=\"tc-menu-list-subitem\">\n<$link><$text text=<<currentTiddler>>/></$link>\n</div>\n</$list>\n</div>\n<!-- Currently disabled the recent list as it is unweildy when the responsive narrow view kicks in\n<h2>\n{{$:/language/SideBar/Recent/Caption}}\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n</div>\n</div>\n</div>\n-->\n"
        },
        "$:/core/templates/server/static.tiddler.html": {
            "title": "$:/core/templates/server/static.tiddler.html",
            "text": "\\whitespace trim\n\\define tv-wikilink-template() $uri_encoded$\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\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=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"%24%3A%2Fcore%2Ftemplates%2Fstatic.template.css\">\n<title><$view field=\"caption\" format=\"plainwikified\"><$view field=\"title\"/></$view>: <$view tiddler=\"$:/core/wiki/title\" format=\"plainwikified\"/></title>\n</head>\n<body class=\"tc-body\">\n<$transclude tiddler=\"$:/core/templates/server/static.sidebar.wikitext\" mode=\"inline\"/>\n<section class=\"tc-story-river\">\n<div class=\"tc-tiddler-frame\">\n<$transclude tiddler=\"$:/core/templates/server/static.tiddler.wikitext\" mode=\"inline\"/>\n</div>\n</section>\n</body>\n</html>"
        },
        "$:/core/templates/server/static.tiddler.wikitext": {
            "title": "$:/core/templates/server/static.tiddler.wikitext",
            "text": "\\whitespace trim\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<h2><$text text=<<currentTiddler>>/></h2>\n</div>\n</div>\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<div class=\"tc-tags-wrapper\">\n<$list filter=\"[all[current]tags[]sort[title]]\">\n<a href={{{ [<currentTiddler>encodeuricomponent[]] }}}>\n<$macrocall $name=\"tag-pill\" tag=<<currentTiddler>>/>\n</a>\n</$list>\n</div>\n<div class=\"tc-tiddler-body\">\n<$transclude mode=\"block\"/>\n</div>\n"
        },
        "$:/core/templates/single.tiddler.window": {
            "title": "$:/core/templates/single.tiddler.window",
            "text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$vars\n\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\n\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\n\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\n\ttv-show-missing-links={{$:/config/MissingLinks}}\n\tstoryviewTitle={{$:/view}}\n\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\n<$transclude mode=\"block\"/>\n\n</$navigator>\n\n</div>\n\n</$vars>\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{{{ [all[shadows+tiddlers]tag[$:/tags/RawStaticContent]!has[draft.of]] ||$:/core/templates/raw-static-tiddler}}}\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<!-- ensure splash screen isn't shown when JS is disabled -->\n`<style>\n.tc-remove-when-wiki-loaded {display: none;}\n</style>`\n"
        },
        "$:/core/templates/static.content": {
            "title": "$:/core/templates/static.content",
            "text": "<!-- For Google, and people without JavaScript-->\nThis [[TiddlyWiki|https://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=\"mobile-web-app-capable\" content=\"yes\"/>\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\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\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=\"mobile-web-app-capable\" content=\"yes\"/>\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 tc-static-story-river\">\n`<$view tiddler=\"$:/core/ui/ViewTemplate\" format=\"htmlwikified\"/>`\n</section>\n</body>\n</html>\n`\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<$list filter={{{ [<skinnySaveTiddlerFilter>] }}} template=\"$:/core/templates/html-div-skinny-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": "<$set name=\"saveTiddlerAndShadowsFilter\" filter=\"[subfilter<saveTiddlerFilter>] [subfilter<saveTiddlerFilter>plugintiddlers[]]\">\n`<!doctype html>\n`{{$:/core/templates/MOTW.html}}`<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n`{{{ [<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}`\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\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=\"mobile-web-app-capable\" content=\"yes\"/>\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`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/core/wiki/rawmarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}`\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}`\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<!--~~ Raw markup for the bottom of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}`\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]]\">\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/Actions/new-image": {
            "title": "$:/core/ui/Actions/new-image",
            "tags": "$:/tags/Actions",
            "description": "create a new image tiddler",
            "text": "\\define get-type()\nimage/$(imageType)$\n\\end\n\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars imageType={{$:/config/NewImageType}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" type=<<get-type>> tags=<<get-tags>>/>\n</$vars>\n"
        },
        "$:/core/ui/Actions/new-journal": {
            "title": "$:/core/ui/Actions/new-journal",
            "tags": "$:/tags/Actions",
            "description": "create a new journal tiddler",
            "text": "\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$reveal type=\"nomatch\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<get-tags>> text={{{ [<journalTitle>get[]] }}}/>\n</$reveal>\n<$reveal type=\"match\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<get-tags>> text=<<journalText>>/>\n</$reveal>\n</$wikify>\n</$vars>\n"
        },
        "$:/core/ui/Actions/new-tiddler": {
            "title": "$:/core/ui/Actions/new-tiddler",
            "tags": "$:/tags/Actions",
            "description": "create a new empty tiddler",
            "text": "\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars textFieldTags={{$:/config/NewTiddler/Tags}} tagsFieldTags={{$:/config/NewTiddler/Tags!!tags}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<get-tags>>/>\n</$vars>\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\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch/input}!match{$:/temp/advancedsearch}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Filter/Hint>>\n\n<div class=\"tc-search tc-advanced-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\" \n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\" \n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/temp/advancedsearch]]\" firstSearchFilterField=\"text\" \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> \n\t\tinputCancelActions=<<cancel-search-actions>>/>\n</$keyboard>\n</$keyboard>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterButton]!has[draft.of]]\"><$transclude/></$list>\n</div>\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}}>\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</div>\n</$set>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear": {
            "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear",
            "tags": "$:/tags/AdvancedSearch/FilterButton",
            "text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\" />\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete": {
            "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete",
            "tags": "$:/tags/AdvancedSearch/FilterButton",
            "text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button popup=<<qualify \"$:/state/filterDeleteDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/delete-button}}\n</$button>\n</$reveal>\n\n<$reveal state=<<qualify \"$:/state/filterDeleteDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<div class=\"tc-dropdown-item-plain\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\nAre you sure you wish to delete <<resultCount>> tiddler(s)?\n</$set>\n</div>\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn\">\n<$action-deletetiddler $filter={{$:/temp/advancedsearch}}/>\nDelete these tiddlers\n</$button>\n</div>\n</div>\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown": {
            "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown",
            "tags": "$:/tags/AdvancedSearch/FilterButton",
            "text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/filterDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</span>\n\n<$reveal state=<<qualify \"$:/state/filterDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text=<<navigateTo>>/><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text=<<navigateTo>>/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/><$action-sendmessage $message=\"tm-focus-selector\" $param='.tc-advanced-search input' />\"\"\">\n<div class=\"tc-block-dropdown-wrapper\">\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</div>\n</$linkcatcher>\n</$set>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter/FilterButtons/export": {
            "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/export",
            "tags": "$:/tags/AdvancedSearch/FilterButton",
            "text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$macrocall $name=\"exportButton\" exportFilter={{$:/temp/advancedsearch}} lingoBase=\"$:/language/Buttons/ExportTiddlers/\"/>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Shadows": {
            "title": "$:/core/ui/AdvancedSearch/Shadows",
            "tags": "$:/tags/AdvancedSearch",
            "caption": "{{$:/language/Search/Shadows/Caption}}",
            "first-search-filter": "[all[shadows]search<userInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]",
            "text": "\\define lingo-base() $:/language/Search/\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Shadows/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\"\n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/core/ui/AdvancedSearch/Shadows]]\"\n\t\tinputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> \n\t\tinputAcceptVariantActions=<<input-accept-variant-actions>>  filterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]\"/>\"\"\">\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]] -[[$:/temp/advancedsearch/input]]\">\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n\n</div>\n\n</$set>\n\n</$list>\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\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define next-search-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/advancedsearch\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/standard/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Standard/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$keyboard key=\"shift-alt-Right\" actions=<<next-search-tab>>>\n<$keyboard key=\"shift-alt-Left\" actions=<<next-search-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\"\n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\"\n\t\tfilterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$vars userInput={{{ [[$:/temp/advancedsearch]get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} searchListState=\"$:/temp/advancedsearch/selected-item\">\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}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/standard/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab/search-results/advancedsearch\" />\n</$list>\n</$vars>\n</$list>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/System": {
            "title": "$:/core/ui/AdvancedSearch/System",
            "tags": "$:/tags/AdvancedSearch",
            "caption": "{{$:/language/Search/System/Caption}}",
            "first-search-filter": "[is[system]search<userInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]",
            "text": "\\define lingo-base() $:/language/Search/\n\\define set-next-input-tab(beforeafter:\"after\",stateTitle,tag,defaultState,currentTabTiddler) <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo System/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\"\n\t\ttype=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/core/ui/AdvancedSearch/System]]\"\n\t\tinputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> \n\t\tinputAcceptVariantActions=<<input-accept-variant-actions>> filterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]\"/>\"\"\">\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]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]\">\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n\n</div>\n\n</$set>\n\n</$list>\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<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" default=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab--1498284803\"/>\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/cancel-button}}</$button>\n</div>\n<div class=\"tc-alert-subtitle\">\n<$wikify name=\"format\" text=<<lingo Tiddler/DateFormat>>>\n<$view field=\"component\"/> - <$view field=\"modified\" format=\"date\" template=<<format>>/> <$reveal type=\"nomatch\" state=\"!!count\" text=\"\"><span class=\"tc-alert-highlight\">({{$:/language/Count}}: <$view field=\"count\"/>)</span></$reveal>\n</$wikify>\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<<lingo Prompt>>\n"
        },
        "$:/core/ui/Components/plugin-info": {
            "title": "$:/core/ui/Components/plugin-info",
            "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,default-popup-state)\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\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 tc-plugin-info-description\">\n<h1>\n''<$text text={{{ [<currentTiddler>get[name]] ~[<currentTiddler>split[/]last[1]] }}}/>'': <$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-info(type,default-popup-state)\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$\" default-popup-state:\"\"\"$default-popup-state$\"\"\">>\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$\" default-popup-state:\"\"\"$default-popup-state$\"\"\" disabledMessage:\"<$macrocall $name='lingo' title='Disabled/Status'/>\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>> default=\"\"\"$default-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<$set name=\"tabsList\" filter=\"[<currentTiddler>list[]] contents\">\n<$macrocall $name=\"tabs\" state=<<tabs-state-macro>> tabsList=<<tabsList>> default={{{ [enlist<tabsList>] }}} template=\"$:/core/ui/PluginInfo\"/>\n</$set>\n</div>\n</div>\n</$reveal>\n</$set>\n\\end\n\n<$macrocall $name=\"plugin-info\" type=<<plugin-type>> default-popup-state=<<default-popup-state>>/>\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<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/TiddlerFields\" explicitState=\"$:/state/tab--959111941\"/>\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<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Theme\" explicitState=\"$:/state/tab--1963855381\"/>\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=\"$:/temp/advancedsearch/input\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/>\n<$action-setfield $tiddler=\"$:/state/tab--1498284803\" $value=\"$:/core/ui/AdvancedSearch/Filter\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-advanced-search input\"/>\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 tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\" class=\"tc-edit-texteditor\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n|<$link to=\"$:/language/DefaultNewTiddlerTitle\"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/language/DefaultNewTiddlerTitle\" default=\"\" tag=\"input\"/> |\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/Text\"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler=\"$:/config/NewJournal/Text\" tag=\"textarea\" class=\"tc-edit-texteditor\" default=\"\"/> |\n|<$link to=\"$:/config/NewTiddler/Tags\"><<lingo NewTiddler/Tags/Prompt>></$link> |<$vars currentTiddler=\"$:/config/NewTiddler/Tags\" tagField=\"text\">{{||$:/core/ui/EditTemplate/tags}}<$list filter=\"[<currentTiddler>tags[]] +[limit[1]]\" variable=\"ignore\"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field=\"text\" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=\"\"/></$button></$list></$vars> |\n|<$link to=\"$:/config/NewJournal/Tags\"><<lingo NewJournal/Tags/Prompt>></$link> |<$vars currentTiddler=\"$:/config/NewJournal/Tags\" tagField=\"text\">{{||$:/core/ui/EditTemplate/tags}}<$list filter=\"[<currentTiddler>tags[]] +[limit[1]]\" variable=\"ignore\"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field=\"text\" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=\"\"/></$button></$list></$vars> |\n|<$link to=\"$:/config/AutoFocus\"><<lingo AutoFocus/Prompt>></$link> |{{$:/snippets/minifocusswitcher}} |\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<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Basics\" explicitState=\"$:/state/tab--2112689675\"/>\n</div>\n"
        },
        "$:/core/ui/ControlPanel/KeyboardShortcuts": {
            "title": "$:/core/ui/ControlPanel/KeyboardShortcuts",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/KeyboardShortcuts/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/KeyboardShortcuts/\n\n\\define new-shortcut(title)\n<div class=\"tc-dropdown-item-plain\">\n<$edit-shortcut tiddler=\"$title$\" placeholder={{$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt}} focus=\"true\" style=\"width:auto;\"/> <$button>\n<<lingo Add/Caption>>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"[{$title$}]\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"$title$\"\n/>\n</$button>\n</div>\n\\end\n\n\\define shortcut-list-item(caption)\n<td>\n</td>\n<td style=\"text-align:right;font-size:0.7em;\">\n<<lingo Platform/$caption$>>\n</td>\n<td>\n<div style=\"position:relative;\">\n<$button popup=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> class=\"tc-btn-invisible\">\n{{$:/core/images/edit-button}}\n</$button>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutTitle)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\n<$reveal state=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown tc-popup-keep\">\n<$list filter=\"[list[$(shortcutTitle)$!!text]sort[title]]\" variable=\"shortcut\" emptyMessage=\"\"\"\n<div class=\"tc-dropdown-item-plain\">\n//<<lingo NoShortcuts/Caption>>//\n</div>\n\"\"\">\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint}}>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"+[remove<shortcut>]\"\n/>\n<small>{{$:/core/images/close-button}}</small>\n</$button>\n<kbd>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts=<<shortcut>>/>\n</kbd>\n</div>\n</$list>\n<hr/>\n<$macrocall $name=\"new-shortcut\" title=<<qualify \"$:/state/new-shortcut/$(shortcutTitle)$\">>/>\n</div>\n</div>\n</$reveal>\n</div>\n</td>\n\\end\n\n\\define shortcut-list(caption,prefix)\n<tr>\n<$list filter=\"[[$prefix$$(shortcutName)$]]\" variable=\"shortcutTitle\">\n<<shortcut-list-item \"$caption$\">>\n</$list>\n</tr>\n\\end\n\n\\define shortcut-editor()\n<<shortcut-list \"All\" \"$:/config/shortcuts/\">>\n<<shortcut-list \"Mac\" \"$:/config/shortcuts-mac/\">>\n<<shortcut-list \"NonMac\" \"$:/config/shortcuts-not-mac/\">>\n<<shortcut-list \"Linux\" \"$:/config/shortcuts-linux/\">>\n<<shortcut-list \"NonLinux\" \"$:/config/shortcuts-not-linux/\">>\n<<shortcut-list \"Windows\" \"$:/config/shortcuts-windows/\">>\n<<shortcut-list \"NonWindows\" \"$:/config/shortcuts-not-windows/\">>\n\\end\n\n\\define shortcut-preview()\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutPrefix)$$(shortcutName)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\\end\n\n\\define shortcut-item-inner()\n<tr>\n<td>\n<$reveal type=\"nomatch\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"open\"\n/>\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"close\"\n/>\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n''<$text text=<<shortcutName>>/>''\n</td>\n<td>\n<$transclude tiddler=\"$:/config/ShortcutInfo/$(shortcutName)$\"/>\n</td>\n<td>\n<$list filter=\"$:/config/shortcuts/ $:/config/shortcuts-mac/ $:/config/shortcuts-not-mac/ $:/config/shortcuts-linux/ $:/config/shortcuts-not-linux/ $:/config/shortcuts-windows/ $:/config/shortcuts-not-windows/\" variable=\"shortcutPrefix\">\n<<shortcut-preview>>\n</$list>\n</td>\n</tr>\n<$set name=\"dropdownState\" value={{$(dropdownStateTitle)$}}>\n<$list filter=\"[<dropdownState>match[open]]\" variable=\"listItem\">\n<<shortcut-editor>>\n</$list>\n</$set>\n\\end\n\n\\define shortcut-item()\n<$set name=\"dropdownStateTitle\" value=<<qualify \"$:/state/dropdown/keyboardshortcut/$(shortcutName)$\">>>\n<<shortcut-item-inner>>\n</$set>\n\\end\n\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]removeprefix[$:/config/ShortcutInfo/]]\" variable=\"shortcutName\">\n<<shortcut-item>>\n</$list>\n</tbody>\n</table>\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 install-plugin-actions()\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url={{!!url}} title={{$(assetInfo)$!!original-title}}/>\n<$set name=\"url\" value={{!!url}}>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]\" variable=\"dependency\">\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url=<<url>> title=<<dependency>>/>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define install-plugin-button()\n<div>\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$set name=\"reinstall-type\" value={{{ [<libraryVersion>compare:version:eq<installedVersion>then[tc-reinstall]] [<libraryVersion>compare:version:gt<installedVersion>then[tc-reinstall-upgrade]] [<libraryVersion>compare:version:lt<installedVersion>then[tc-reinstall-downgrade]] }}}>\n<$button actions=<<install-plugin-actions>> class={{{ [<assetInfo>get[original-title]has[version]then<reinstall-type>] tc-btn-invisible tc-install-plugin +[join[ ]] }}}>\n{{$:/core/images/download-button}}\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Install/Caption}}\">\n<$list filter=\"[<libraryVersion>compare:version:gt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[<libraryVersion>compare:version:lt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Reinstall/Caption}}\">\n{{$:/language/ControlPanel/Plugins/Downgrade/Caption}}\n</$list>\n\"\"\">\n{{$:/language/ControlPanel/Plugins/Update/Caption}}\n</$list>\n</$list>\n</$button>\n<div>\n</div>\n<$reveal stateTitle=<<assetInfo>> stateField=\"requires-reload\" type=\"match\" text=\"yes\">{{$:/language/ControlPanel/Plugins/PluginWillRequireReload}}</$reveal>\n</$set>\n</$set>\n</$set>\n</div>\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-plugin-info-toggle\">\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/chevron-right}}\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/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\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 tc-plugin-info-description\">\n<h1><strong><$text text={{{ [<assetInfo>get[name]] ~[<assetInfo>get[original-title]split[/]last[1]] }}}/></strong>: <$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<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"installedVersion\"><div><em>{{$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint}}</em></div></$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-buttons\">\n<<install-plugin-button>>\n</div>\n</div>\n<$set name=\"original-title\" value={{{ [<assetInfo>get[original-title]] }}}>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>>>\n<div class=\"tc-plugin-info-dropdown\">\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]] ~[<assetInfo>get[original-title]!is[tiddler]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-dropdown-message\">\n<$list filter=\"[<assetInfo>get[original-title]!is[tiddler]]\">\n{{$:/language/ControlPanel/Plugins/NotInstalled/Hint}}\n</$list>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]]\" variable=\"ignore\">\n<div>\n{{$:/language/ControlPanel/Plugins/AlsoRequires}}\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]\" variable=\"dependency\">\n<$text text=<<dependency>>/>\n</$list>\n</div>\n</$list>\n</$set>\n</div>\n</$list>\n<div class=\"tc-plugin-info-dropdown-body\">\n<$transclude tiddler=<<assetInfo>> field=\"readme\" mode=\"block\"/>\n</div>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-sub-plugins\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>sort[name]]\" variable=\"assetInfo\">\n<<display-plugin-info \"$type$\">>\n</$list>\n</div>\n</$list>\n</div>\n</$reveal>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<$reveal type=\"nomatch\" text=\"yes\" state=<<popup-state>> tag=\"div\" class=\"tc-plugin-info-sub-plugin-indicator\">\n<$wikify name=\"count\" text=\"\"\"<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>]\"/>\"\"\">\n<$button class=\"tc-btn-invisible\" set=<<popup-state>> setTo=\"yes\">\n{{$:/language/ControlPanel/Plugins/SubPluginPrompt}}\n</$button>\n</$wikify>\n</$reveal>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define load-plugin-library-button()\n<$list filter=\"[<currentTiddler>get[enabled]else[yes]match[yes]]\" variable=\"ignore\">\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</$list>\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:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[name]]\" variable=\"assetInfo\">\n<$list filter=\"[[$:/temp/RemoteAssetSearch/$(currentTiddler)$]has[text]] ~[<assetInfo>!has[parent-plugin]]\" variable=\"ignore\"><!-- Hide sub-plugins if we're not searching -->\n<<display-plugin-info \"$type$\">>\n</$list>\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<$set name=\"transclusion\" value=<<connectionTiddler>>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Add/Updates]] [[$:/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</$set>\n\n</$list>\n\\end\n\n\\define close-library-button()\n<$reveal type='nomatch' state='$:/temp/ServerConnection/$(PluginLibraryURL)$' text=''>\n<$button class='tc-btn-big-green'>\n<$action-sendmessage $message=\"tm-unload-plugin-library\" url={{!!url}}/>\n{{$:/core/images/chevron-left}} {{$:/language/ControlPanel/Plugins/ClosePluginLibrary}}\n<$action-deletetiddler $filter=\"[prefix[$:/temp/ServerConnection/$(PluginLibraryURL)$]][prefix[$:/temp/RemoteAssetInfo/$(PluginLibraryURL)$]]\"/>\n</$button>\n</$reveal>\n\\end\n\n\\define plugin-library-listing()\n<div class=\"tc-tab-set\">\n<$set name=\"defaultTab\" value={{{ [all[tiddlers+shadows]tag[$:/tags/PluginLibrary]] }}}>\n<div class=\"tc-tab-buttons\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$button set=<<qualify \"$:/state/addplugins/tab\">> setTo=<<currentTiddler>> default=<<defaultTab>> selectedClass=\"tc-tab-selected\">\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude field=\"caption\"/>\n</$set>\n</$button>\n</$list>\n</div>\n<div class=\"tc-tab-divider\"/>\n<div class=\"tc-tab-content\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$reveal type=\"match\" state=<<qualify \"$:/state/addplugins/tab\">> text=<<currentTiddler>> default=<<defaultTab>>>\n<h2><$link><$transclude field=\"caption\"><$view field=\"title\"/></$transclude></$link></h2>\n//<$view field=\"url\"/>//\n<$transclude mode=\"block\"/>\n<$set name=PluginLibraryURL value={{!!url}}>\n<<close-library-button>>\n</$set>\n<<display-server-connection>>\n</$reveal>\n</$list>\n</div>\n</$set>\n</div>\n\\end\n\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<div>\n<<plugin-library-listing>>\n</div>\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{{$:/PaletteManager}}\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 toggle(Type)\n<$checkbox\ntiddler=\"\"\"$:/config/WikiParserRules/$Type$/$(rule)$\"\"\"\nfield=\"text\"\nchecked=\"enable\"\nunchecked=\"disable\"\ndefault=\"enable\">\n<<rule>>\n</$checkbox>\n\\end\n\n\\define rules(type,Type)\n<$list filter=\"[wikiparserrules[$type$]]\" variable=\"rule\">\n<dd><<toggle $Type$>></dd>\n</$list>\n\\end\n\n<<lingo Hint>>\n\n<dl>\n<dt><<lingo Pragma/Caption>></dt>\n<<rules pragma Pragma>>\n<dt><<lingo Inline/Caption>></dt>\n<<rules inline Inline>>\n<dt><<lingo Block/Caption>></dt>\n<<rules block Block>>\n</dl>"
        },
        "$:/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/Add/Updates": {
            "title": "$:/core/ui/ControlPanel/Plugins/Add/Updates",
            "caption": "<$importvariables filter=\"$:/core/ui/ControlPanel/Plugins/Add/Updates\">{{$:/language/ControlPanel/Plugins/Updates/Caption}} (<<update-count>>)</$importvariables>",
            "text": "\\define each-updateable-plugin(body)\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}sort[title]]\" variable=\"assetInfo\">\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$list filter=\"[<assetInfo>get[original-title]has[version]!version<libraryVersion>]\" variable=\"ignore\">\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$list filter=\"[<installedversion>!match<libraryVersion>]\" variable=\"ignore\">\n$body$\n</$list>\n</$set>\n</$list>\n</$set>\n</$list>\n\\end\n\n\\define update-all-actions()\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<<install-plugin-actions>>\n\"\"\"/>\n\\end\n\n\\define update-count()\n<$wikify name=\"count-filter\" text=<<each-updateable-plugin \"&#91;&#91;<$text text=<<assetInfo>>/>]]\">>><$count filter=<<count-filter>>/></$wikify>\n\\end\n\n<$button actions=<<update-all-actions>> class=\"tc-btn-invisible tc-install-plugin tc-reinstall-upgrade\">\n{{$:/core/images/download-button}} {{||$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption}}\n</$button>\n\n<div class=\"tc-plugin-library-listing\">\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<$macrocall $name=\"display-plugin-info\" type={{{ [<assetInfo>get[original-plugin-type]] }}}/>\n\"\"\"/>\n</div>\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 tc-primary-btn\">\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 plugin-table(type)\n<$set name=\"plugin-type\" value=\"\"\"$type$\"\"\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n<$list filter=\"[!has[draft.of]plugin-type[$type$]sort[name]]\" emptyMessage=<<lingo \"Empty/Hint\">> template=\"$:/core/ui/Components/plugin-info\"/>\n</$set>\n</$set>\n\\end\n\n{{$:/core/ui/ControlPanel/Plugins/AddPlugins}}\n\n<<lingo Installed/Hint>>\n\n<$macrocall $name=\"tabs\" tabsList=\"[[$:/core/ui/ControlPanel/Plugins/Installed/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Installed/Themes]] [[$:/core/ui/ControlPanel/Plugins/Installed/Languages]]\" default=\"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\" explicitState=\"$:/state/tab--86143343\"/>\n"
        },
        "$:/core/ui/ControlPanel/Saving/DownloadSaver": {
            "title": "$:/core/ui/ControlPanel/Saving/DownloadSaver",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/DownloadSaver/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/DownloadSaver/\n\n<<lingo Hint>>\n\n!! <$link to=\"$:/config/DownloadSaver/AutoSave\"><<lingo AutoSave/Hint>></$link>\n\n<$checkbox tiddler=\"$:/config/DownloadSaver/AutoSave\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <<lingo AutoSave/Description>> </$checkbox>\n"
        },
        "$:/core/ui/ControlPanel/Saving/General": {
            "title": "$:/core/ui/ControlPanel/Saving/General",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/General/Caption}}",
            "list-before": "",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n{{$:/language/ControlPanel/Saving/General/Hint}}\n\n!! <$link to=\"$:/config/AutoSave\"><<lingo AutoSave/Caption>></$link>\n\n<<lingo AutoSave/Hint>>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"yes\"> <<lingo AutoSave/Enabled/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"no\"> <<lingo AutoSave/Disabled/Description>> </$radio>\n"
        },
        "$:/core/ui/ControlPanel/Saving/GitHub": {
            "title": "$:/core/ui/ControlPanel/Saving/GitHub",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/GitService/GitHub/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitHub\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitHub/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitHub/Password>> |<$password name=\"github\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitHub/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitHub/Branch\" default=\"main\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitHub/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitHub/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitHub/ServerURL\" default=\"https://api.github.com\" tag=\"input\"/> |"
        },
        "$:/core/ui/ControlPanel/Saving/GitLab": {
            "title": "$:/core/ui/ControlPanel/Saving/GitLab",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/GitService/GitLab/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitLab\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitLab/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitLab/Password>> |<$password name=\"gitlab\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitLab/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitLab/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitLab/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitLab/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitLab/ServerURL\" default=\"https://gitlab.com/api/v4\" tag=\"input\"/> |"
        },
        "$:/core/ui/ControlPanel/Saving/TiddlySpot": {
            "title": "$:/core/ui/ControlPanel/Saving/TiddlySpot",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/TiddlySpot/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/TiddlySpot/\n\n\\define siteURL(path)\nhttp://$(userName)$.tiddlyspot.com/$path$/\n\\end\n\\define siteLink(path)\n<$reveal type=\"nomatch\" state=\"$:/UploadName\" text=\"\">\n<$set name=\"userName\" value={{$:/UploadName}}>\n<$reveal type=\"match\" state=\"$:/UploadURL\" text=\"\">\n<<siteURL $path$>>\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\n<div class=\"tc-message-box\">\n\n<<lingo ReadOnly>>\n\n</div>\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/UploadName\" default=\"\" tag=\"input\"/> |\n|<<lingo Password>> |<$password name=\"upload\"/> |\n|<<lingo Backups>> |<<siteLink backup>> |\n|<<lingo ControlPanel>> |<<siteLink controlpanel>> |\n\n''<<lingo Advanced/Heading>>''\n\n|<<lingo ServerURL>>  |<$edit-text tiddler=\"$:/UploadURL\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/UploadFilename\" default=\"index.html\" tag=\"input\"/> |\n|<<lingo UploadDir>> |<$edit-text tiddler=\"$:/UploadDir\" default=\".\" tag=\"input\"/> |\n|<<lingo BackupDir>> |<$edit-text tiddler=\"$:/UploadBackupDir\" default=\".\" tag=\"input\"/> |\n\n<<lingo TiddlySpot/Hint>>\n"
        },
        "$:/core/ui/ControlPanel/Saving/Gitea": {
            "title": "$:/core/ui/ControlPanel/Saving/Gitea",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/GitService/Gitea/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~Gitea\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/Gitea/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo Gitea/Password>> |<$password name=\"Gitea\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/Gitea/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/Gitea/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/Gitea/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/Gitea/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/Gitea/ServerURL\" default=\"https://gitea/api/v1\" tag=\"input\"/> |\n"
        },
        "$:/core/ui/ControlPanel/Saving": {
            "title": "$:/core/ui/ControlPanel/Saving",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/Saving/Caption}}",
            "text": "{{$:/language/ControlPanel/Saving/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Saving]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Saving/General\" explicitState=\"$:/state/tab-2065006209\"/>\n</div>\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/DefaultMoreSidebarTab": {
            "title": "$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab",
            "caption": "{{$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption}}",
            "tags": "$:/tags/ControlPanel/Settings",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultMoreSidebarTab/\n\n<$link to=\"$:/config/DefaultMoreSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultMoreSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
        },
        "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab": {
            "title": "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab",
            "caption": "{{$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption}}",
            "tags": "$:/tags/ControlPanel/Settings",
            "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/EditorToolbar": {
            "title": "$:/core/ui/ControlPanel/Settings/EditorToolbar",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/EditorToolbar/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/EditorToolbar/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/TextEditor/EnableToolbar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/TextEditor/EnableToolbar\"><<lingo Description>></$link> </$checkbox>\n\n"
        },
        "$:/core/ui/ControlPanel/Settings/InfoPanelMode": {
            "title": "$:/core/ui/ControlPanel/Settings/InfoPanelMode",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/InfoPanelMode/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/InfoPanelMode/\n<$link to=\"$:/config/TiddlerInfo/Mode\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"popup\"> <<lingo Popup/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"sticky\"> <<lingo Sticky/Description>> </$radio>\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/MissingLinks": {
            "title": "$:/core/ui/ControlPanel/Settings/MissingLinks",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/MissingLinks/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/MissingLinks/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/MissingLinks\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/MissingLinks\"><<lingo Description>></$link> </$checkbox>\n\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/NavigationPermalinkviewMode": {
            "title": "$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationPermalinkviewMode/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/CopyToClipboard\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/CopyToClipboard\"><<lingo CopyToClipboard/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\"><<lingo UpdateAddressBar/Description>></$link> </$checkbox>\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/Stylesheets": {
            "title": "$:/core/ui/ControlPanel/Stylesheets",
            "tags": "$:/tags/ControlPanel/Advanced",
            "caption": "{{$:/language/ControlPanel/Stylesheets/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo Stylesheets/Hint>>\n\n{{$:/snippets/peek-stylesheets}}\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\n\\define config-base() $:/config/EditToolbarButtons/Visibility/\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<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>"
        },
        "$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate": {
            "title": "$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate",
            "text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"><$transclude tiddler={{!!icon}}/></span> <$transclude field=\"caption\"/> -- <i class=\"tc-muted\"><$transclude field=\"description\"/></i>\n</$draggable>\n"
        },
        "$:/core/ui/ControlPanel/Toolbars/EditorToolbar": {
            "title": "$:/core/ui/ControlPanel/Toolbars/EditorToolbar",
            "tags": "$:/tags/ControlPanel/Toolbars",
            "caption": "{{$:/language/ControlPanel/Toolbars/EditorToolbar/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditorToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditorToolbar/Hint}}\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditorToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate\"/>\n"
        },
        "$:/core/ui/ControlPanel/Toolbars/ItemTemplate": {
            "title": "$:/core/ui/ControlPanel/Toolbars/ItemTemplate",
            "text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"> <$transclude field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude field=\"description\"/></i></span>\n</$draggable>\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\n\\define config-base() $:/config/PageControlButtons/Visibility/\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<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/PageControls\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\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\n\\define config-base() $:/config/ViewToolbarButtons/Visibility/\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<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/ViewToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\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<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\" class=\"tc-vertical\" explicitState=\"$:/state/tabs/controlpanel/toolbars-1345989671\"/>\n</div>\n"
        },
        "$:/ControlPanel": {
            "title": "$:/ControlPanel",
            "icon": "$:/core/images/options-button",
            "color": "#bbb",
            "text": "<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Info\" explicitState=\"$:/state/tab-1749438307\"/>\n</div>\n"
        },
        "$:/core/ui/DefaultSearchResultList": {
            "title": "$:/core/ui/DefaultSearchResultList",
            "tags": "$:/tags/SearchResults",
            "caption": "{{$:/language/Search/DefaultResults/Caption}}",
            "first-search-filter": "[!is[system]search:title<userInput>sort[title]limit[250]]",
            "second-search-filter": "[!is[system]search<userInput>sort[title]limit[250]]",
            "text": "\\define searchResultList()\n//<small>{{$:/language/Search/Matches/Title}}</small>//\n\n<$list filter=\"[<userInput>minlength[1]]\" variable=\"ignore\">\n<$list filter={{{ [<configTiddler>get[first-search-filter]] }}}>\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</$list>\n\n//<small>{{$:/language/Search/Matches/All}}</small>//\n\n<$list filter=\"[<userInput>minlength[1]]\" variable=\"ignore\">\n<$list filter={{{ [<configTiddler>get[second-search-filter]] }}}>\n<span class={{{[<currentTiddler>addsuffix[-secondaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</$list>\n\n\\end\n<<searchResultList>>\n"
        },
        "$:/core/ui/EditTemplate/body/preview/diffs-current": {
            "title": "$:/core/ui/EditTemplate/body/preview/diffs-current",
            "tags": "$:/tags/EditPreview",
            "caption": "differences from current",
            "list-after": "$:/core/ui/EditTemplate/body/preview/output",
            "text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
        },
        "$:/core/ui/EditTemplate/body/preview/diffs-shadow": {
            "title": "$:/core/ui/EditTemplate/body/preview/diffs-shadow",
            "tags": "$:/tags/EditPreview",
            "caption": "differences from shadow (if any)",
            "list-after": "$:/core/ui/EditTemplate/body/preview/output",
            "text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{{ [{!!draft.of}shadowsource[]] }}} sourceSubTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
        },
        "$:/core/ui/EditTemplate/body/preview/output": {
            "title": "$:/core/ui/EditTemplate/body/preview/output",
            "tags": "$:/tags/EditPreview",
            "caption": "{{$:/language/EditTemplate/Body/Preview/Type/Output}}",
            "text": "\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$set name=\"tv-tiddler-preview\" value=\"yes\">\n\n<$transclude />\n\n</$set>\n"
        },
        "$:/state/showeditpreview": {
            "title": "$:/state/showeditpreview",
            "text": "no"
        },
        "$:/core/ui/EditTemplate/body/editor": {
            "title": "$:/core/ui/EditTemplate/body/editor",
            "text": "<$edit\n\n  field=\"text\"\n  class=\"tc-edit-texteditor tc-edit-texteditor-body\"\n  placeholder={{$:/language/EditTemplate/Body/Placeholder}}\n  tabindex={{$:/config/EditTabIndex}}\n  focus={{{ [{$:/config/AutoFocus}match[text]then[true]] ~[[false]] }}}\n  cancelPopups=\"yes\"\n\n><$set\n\n  name=\"targetTiddler\"\n  value=<<currentTiddler>>\n\n><$list\n\n  filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]]\"\n\n><$reveal\n\n  type=\"nomatch\"\n  state=<<config-visibility-title>>\n  text=\"hide\"\n  class=\"tc-text-editor-toolbar-item-wrapper\"\n\n><$transclude\n\n  tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\"\n  mode=\"inline\"\n\n/></$reveal></$list></$set></$edit>\n"
        },
        "$:/core/ui/EditTemplate/body/toolbar/button": {
            "title": "$:/core/ui/EditTemplate/body/toolbar/button",
            "text": "\\define toolbar-button-icon()\n<$list\n\n  filter=\"[all[current]!has[custom-icon]]\"\n  variable=\"no-custom-icon\"\n\n><$transclude\n\n  tiddler={{!!icon}}\n\n/></$list>\n\\end\n\n\\define toolbar-button-tooltip()\n{{!!description}}<$macrocall $name=\"displayshortcuts\" $output=\"text/plain\" shortcuts={{!!shortcuts}} prefix=\"` - [\" separator=\"] [\" suffix=\"]`\"/>\n\\end\n\n\\define toolbar-button()\n<$list\n\n  filter={{!!condition}}\n  variable=\"list-condition\"\n\n><$wikify\n\n  name=\"tooltip-text\"\n  text=<<toolbar-button-tooltip>>\n  mode=\"inline\"\n  output=\"text\"\n\n><$list\n\n  filter=\"[all[current]!has[dropdown]]\"\n  variable=\"no-dropdown\"\n\n><$button\n\n  class=\"tc-btn-invisible $(buttonClasses)$\"\n  tooltip=<<tooltip-text>>\n  actions={{!!actions}}\n\n><span\n\n  data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n  tiddler=<<currentTiddler>>\n  field=\"text\"\n\n/></$button></$list><$list\n\n  filter=\"[all[current]has[dropdown]]\"\n  variable=\"dropdown\"\n\n><$set\n\n  name=\"dropdown-state\"\n  value=<<qualify \"$:/state/EditorToolbarDropdown\">>\n\n><$button\n\n  popup=<<dropdown-state>>\n  class=\"tc-popup-keep tc-btn-invisible $(buttonClasses)$\"\n  selectedClass=\"tc-selected\"\n  tooltip=<<tooltip-text>>\n  actions={{!!actions}}\n\n><span\n\n  data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n  tiddler=<<currentTiddler>>\n  field=\"text\"\n\n/></$button><$reveal\n\n  state=<<dropdown-state>>\n  type=\"popup\"\n  position=\"below\"\n  animate=\"yes\"\n  tag=\"span\"\n\n><div\n\n  class=\"tc-drop-down tc-popup-keep\"\n\n><$transclude\n\n  tiddler={{!!dropdown}}\n  mode=\"block\"\n\n/></div></$reveal></$set></$list></$wikify></$list>\n\\end\n\n\\define toolbar-button-outer()\n<$set\n\n  name=\"buttonClasses\"\n  value={{!!button-classes}}\n\n><<toolbar-button>></$set>\n\\end\n\n<<toolbar-button-outer>>"
        },
        "$:/core/ui/EditTemplate/body": {
            "title": "$:/core/ui/EditTemplate/body",
            "tags": "$:/tags/EditTemplate",
            "text": "\\define lingo-base() $:/language/EditTemplate/Body/\n\\define config-visibility-title()\n$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$\n\\end\n<$list filter=\"[all[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\" tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"></$edit-text>\n\n</div>\n\n</$list>\n\n<$list filter=\"[all[current]!has[_canonical_uri]]\">\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\">\n\n<div class=\"tc-tiddler-preview\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n<div class=\"tc-tiddler-preview-preview\">\n\n<$transclude tiddler={{$:/state/editpreviewtype}} mode=\"inline\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/preview/output\" mode=\"inline\"/>\n\n</$transclude>\n\n</div>\n\n</div>\n\n</$reveal>\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\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 current-tiddler-new-field-selector()\n[data-tiddler-title=\"$(currentTiddlerCSSescaped)$\"] .tc-edit-field-add-name-wrapper input\n\\end\n\n\\define new-field-actions()\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<storeTitle>] [<searchListState>]\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/>\n\\end\n\n\\define delete-state-tiddlers() <$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<storeTitle>] [<searchListState>]\"/>\n\n\\define cancel-search-actions-inner()\n<$list filter=\"[<storeTitle>has[text]] [<newFieldNameTiddler>has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\">\n<<delete-state-tiddlers>>\n</$list>\n\\end\n\n\\define cancel-search-actions()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<newFieldNameTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<<cancel-search-actions-inner>>\"\"\">\n<$action-setfield $tiddler=<<newFieldNameTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n</$set>\n\\end\n\n\\define new-field()\n<$vars name={{{ [<newFieldNameTiddler>get[text]] }}}>\n<$reveal type=\"nomatch\" text=\"\" default=<<name>>>\n<$button tooltip=<<lingo Fields/Add/Button/Hint>>>\n<$action-sendmessage $message=\"tm-add-field\"\n$name=<<name>>\n$value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<storeTitle>] [<searchListState>]\"/>\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</$vars>\n\\end\n\\whitespace trim\n\n<div class=\"tc-edit-fields\">\n<table class={{{ [all[current]fields[]] :filter[lookup[$:/config/EditTemplateFields/Visibility/]!match[hide]] +[count[]!match[0]] +[then[tc-edit-fields]] ~[[tc-edit-fields tc-edit-fields-small]] }}}>\n<tbody>\n<$list filter=\"[all[current]fields[]] +[sort[title]]\" variable=\"currentField\" storyview=\"pop\">\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<$keyboard key=\"((delete-field))\" actions=\"\"\"<$action-deletefield $field=<<currentField>>/><$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/></$set>\"\"\">\n<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n</$keyboard>\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>>/><$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/></$set>\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 tc-big-gap-right\">\n<<lingo Fields/Add/Prompt>>\n</em>\n<$vars refreshTitle=<<qualify \"$:/temp/fieldname/refresh\">> storeTitle=<<newFieldNameInputTiddler>> searchListState=<<newFieldNameSelectionTiddler>>>\n<div class=\"tc-edit-field-add-name-wrapper\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<newFieldNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>>\n\t\tselectionStateTitle=<<searchListState>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}}\n\t\tfocusPopup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}}\n\t\tfocus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}} cancelPopups=\"yes\"\n\t\tconfigTiddlerFilter=\"[[$:/config/EditMode/fieldname-filter]]\" inputCancelActions=<<cancel-search-actions>> />\n<$button popup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown tc-small-gap\" 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<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher to=<<newFieldNameTiddler>>>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/User>>\n</div>\n<$set name=\"newFieldName\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[!is[shadow]!is[system]fields[]search:title<newFieldName>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type\"  variable=\"currentField\">\n<$list filter=\"[<currentField>addsuffix[-primaryList]] -[<searchListState>get[text]]\" emptyMessage=\"\"\"<$link to=<<currentField>> class=\"tc-list-item-selected\"><$text text=<<currentField>>/></$link>\"\"\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$list>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/System>>\n</div>\n<$list filter=\"[fields[]search:title<newFieldName>sort[]] -[!is[shadow]!is[system]fields[]]\" variable=\"currentField\">\n<$list filter=\"[<currentField>addsuffix[-secondaryList]] -[<searchListState>get[text]]\" emptyMessage=\"\"\"<$link to=<<currentField>> class=\"tc-list-item-selected\"><$text text=<<currentField>>/></$link>\"\"\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$list>\n</$set>\n</$linkcatcher>\n</$set>\n</div>\n</$reveal>\n</div>\n<span class=\"tc-edit-field-add-value tc-small-gap-right\">\n<$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}>\n<$keyboard key=\"((add-field))\" actions=<<new-field-actions>>>\n<$edit-text tiddler=<<newFieldValueTiddler>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class=\"tc-edit-texteditor\" tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n</$keyboard>\n</$set>\n</span>\n<span class=\"tc-edit-field-add-button\">\n<$macrocall $name=\"new-field\"/>\n</span>\n</$vars>\n</div>\n</$fieldmangler>\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": "\\whitespace trim\n\n\\define lingo-base() $:/language/EditTemplate/\n\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-body-inner(colour,fallbackTarget,colourA,colourB,icon,tagField:\"tags\")\n\\whitespace trim\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<span style=<<tag-styles>> class=\"tc-tag-label tc-tag-list-item\">\n<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view field=\"title\" format=\"text\" />\n<$button class=\"tc-btn-invisible tc-remove-tag-button\" style=<<tag-styles>>><$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"-[{!!title}]\"/>{{$:/core/images/close-button}}</$button>\n</span>\n</$vars>\n\\end\n\n\\define tag-body(colour,palette,icon,tagField:\"tags\")\n<$macrocall $name=\"tag-body-inner\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon=\"\"\"$icon$\"\"\" tagField=<<__tagField__>>/>\n\\end\n\n\\define edit-tags-template(tagField:\"tags\")\n\\whitespace trim\n<div class=\"tc-edit-tags\">\n<$list filter=\"[list[!!$tagField$]sort[title]]\" storyview=\"pop\">\n<$macrocall $name=\"tag-body\" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}} tagField=<<__tagField__>>/>\n</$list>\n<$vars tabIndex={{$:/config/EditTabIndex}} cancelPopups=\"yes\">\n<$macrocall $name=\"tag-picker\" tagField=<<__tagField__>>/>\n</$vars>\n</div>\n\\end\n<$set name=\"saveTiddler\" value=<<currentTiddler>>>\n<$macrocall $name=\"edit-tags-template\" tagField=<<tagField>>/>\n</$set>\n"
        },
        "$:/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={{{ [{$:/config/AutoFocus}match[title]then[true]] ~[[false]] }}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n\n<$vars pattern=\"\"\"[\\|\\[\\]{}]\"\"\" bad-chars=\"\"\"`| [ ] { }`\"\"\">\n\n<$list filter=\"[all[current]regexp:draft.title<pattern>]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/BadCharacterWarning}}\n\n</div>\n\n</$list>\n\n</$vars>\n\n<$reveal state=\"!!draft.title\" type=\"nomatch\" text={{!!draft.of}} tag=\"div\">\n\n<$list filter=\"[{!!draft.title}!is[missing]]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/Exists/Prompt}}\n\n</div>\n\n</$list>\n\n<$list filter=\"[{!!draft.of}!is[missing]]\" variable=\"listItem\">\n\n<$vars fromTitle={{!!draft.of}} toTitle={{!!draft.title}}>\n\n<$checkbox tiddler=\"$:/config/RelinkOnRename\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> {{$:/language/EditTemplate/Title/Relink/Prompt}}</$checkbox>\n\n<$list filter=\"[title<fromTitle>backlinks[]limit[1]]\" variable=\"listItem\">\n\n<$vars stateTiddler=<<qualify \"$:/state/edit/references\">> >\n\n<$reveal type=\"nomatch\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"show\" class=\"tc-btn-invisible\">{{$:/core/images/right-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"hide\" class=\"tc-btn-invisible\">{{$:/core/images/down-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$tiddler tiddler=<<fromTitle>> >\n<$transclude tiddler=\"$:/core/ui/TiddlerInfo/References\"/>\n</$tiddler>\n</$reveal>\n\n</$vars>\n\n</$list>\n\n</$vars>\n\n</$list>\n\n</$reveal>\n"
        },
        "$:/core/ui/EditTemplate/type": {
            "title": "$:/core/ui/EditTemplate/type",
            "tags": "$:/tags/EditTemplate",
            "first-search-filter": "[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]sort[description]sort[group-sort]removeprefix[$:/language/Docs/Types/]search<userInput>]",
            "text": "\\define lingo-base() $:/language/EditTemplate/\n\\define input-cancel-actions() <$list filter=\"[<storeTitle>get[text]] [<currentTiddler>get[type]] +[limit[1]]\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\"><$action-sendmessage $message=\"tm-remove-field\" $param=\"type\"/><$action-deletetiddler $filter=\"[<typeInputTiddler>] [<refreshTitle>] [<typeSelectionTiddler>]\"/></$list>\n\\whitespace trim\n<$set name=\"refreshTitle\" value=<<qualify \"$:/temp/type-search/refresh\">>>\n<div class=\"tc-edit-type-selector-wrapper\">\n<em class=\"tc-edit tc-big-gap-right\"><<lingo Type/Prompt>></em>\n<div class=\"tc-type-selector-dropdown-wrapper\">\n<div class=\"tc-type-selector\"><$fieldmangler>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<currentTiddler>> storeTitle=<<typeInputTiddler>> refreshTitle=<<refreshTitle>> selectionStateTitle=<<typeSelectionTiddler>> field=\"type\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-edit-typeeditor tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups=\"yes\" configTiddlerFilter=\"[[$:/core/ui/EditTemplate/type]]\" inputCancelActions=<<input-cancel-actions>>/><$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown tc-small-gap\" 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}}<$action-deletetiddler $filter=\"[<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]\"/></$button>\n</$fieldmangler></div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\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-sort]]'>\n<div class=\"tc-dropdown-item\">\n<$text text={{!!group}}/>\n</div>\n<$set name=\"userInput\" value={{{ [<typeInputTiddler>get[text]] }}}>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]] +[removeprefix[$:/language/Docs/Types/]] +[search<userInput>]\"><span class={{{ [<currentTiddler>addsuffix[-primaryList]] -[<typeSelectionTiddler>get[text]] +[then[]else[tc-list-item-selected]] }}}><$link to={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]get[name]] }}}><$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\"description\"/> (<$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\"name\"/>)</$link></span>\n</$list>\n</$set>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</$set>\n</div>\n</div>\n</div>\n</$set>\n"
        },
        "$:/core/ui/EditTemplate": {
            "title": "$:/core/ui/EditTemplate",
            "text": "\\define delete-edittemplate-state-tiddlers() <$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<newFieldNameInputTiddler>] [<newFieldNameSelectionTiddler>] [<newTagNameTiddler>] [<newTagNameInputTiddler>] [<newTagNameSelectionTiddler>] [<typeInputTiddler>] [<typeSelectionTiddler>]\"/>\n\\define save-tiddler-actions()\n<$action-sendmessage $message=\"tm-add-tag\" $param={{{ [<newTagNameTiddler>get[text]] }}}/>\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<<delete-edittemplate-state-tiddlers>>\n<$action-sendmessage $message=\"tm-save-tiddler\"/>\n\\end\n\\define cancel-delete-tiddler-actions(message)\n<<delete-edittemplate-state-tiddlers>>\n<$action-sendmessage $message=\"tm-$message$-tiddler\"/>\n\\end\n<div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-edit-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}>\n<$fieldmangler>\n<$vars storyTiddler=<<currentTiddler>> newTagNameTiddler=<<qualify \"$:/temp/NewTagName\">> newFieldNameTiddler=<<qualify \"$:/temp/NewFieldName\">> newFieldValueTiddler=<<qualify \"$:/temp/NewFieldValue\">> newFieldNameInputTiddler=<<qualify \"$:/temp/NewFieldName/input\">> newFieldNameSelectionTiddler=<<qualify \"$:/temp/NewFieldName/selected-item\">> newTagNameInputTiddler=<<qualify \"$:/temp/NewTagName/input\">> newTagNameSelectionTiddler=<<qualify \"$:/temp/NewTagName/selected-item\">> typeInputTiddler=<<qualify \"$:/temp/Type/input\">> typeSelectionTiddler=<<qualify \"$:/temp/Type/selected-item\">>>\n<$keyboard key=\"((cancel-edit-tiddler))\" actions=<<cancel-delete-tiddler-actions \"cancel\">>>\n<$keyboard key=\"((save-tiddler))\" actions=<<save-tiddler-actions>>>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>>/>\n</$set>\n</$list>\n</$keyboard>\n</$keyboard>\n</$vars>\n</$fieldmangler>\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": "\\whitespace trim\n<$button actions=<<cancel-delete-tiddler-actions \"cancel\">> tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/cancel-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span>\n</$list>\n</$button>\n"
        },
        "$:/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": "\\whitespace trim\n<$button actions=<<cancel-delete-tiddler-actions \"delete\">> tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/delete-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Delete/Caption}}/></span>\n</$list>\n</$button>\n"
        },
        "$:/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": "\\define save-tiddler-button()\n\\whitespace trim\n<$fieldmangler><$button tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=<<tv-config-toolbar-class>>>\n<<save-tiddler-actions>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/done-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Save/Caption}}/></span>\n</$list>\n</$button></$fieldmangler>\n\\end\n<<save-tiddler-button>>\n"
        },
        "$:/core/ui/EditorToolbar/bold": {
            "title": "$:/core/ui/EditorToolbar/bold",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/bold",
            "caption": "{{$:/language/Buttons/Bold/Caption}}",
            "description": "{{$:/language/Buttons/Bold/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((bold))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"''\"\n\tsuffix=\"''\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/clear-dropdown": {
            "title": "$:/core/ui/EditorToolbar/clear-dropdown",
            "text": "''{{$:/language/Buttons/Clear/Hint}}''\n\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"clear\"\n\tcolour=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n\n</div>\n"
        },
        "$:/core/ui/EditorToolbar/clear": {
            "title": "$:/core/ui/EditorToolbar/clear",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/erase",
            "caption": "{{$:/language/Buttons/Clear/Caption}}",
            "description": "{{$:/language/Buttons/Clear/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/clear-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/editor-height-dropdown": {
            "title": "$:/core/ui/EditorToolbar/editor-height-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/EditorHeight/\n''<<lingo Hint>>''\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"auto\"> {{$:/core/images/auto-height}} <<lingo Caption/Auto>></$radio>\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"fixed\"> {{$:/core/images/fixed-height}} <<lingo Caption/Fixed>> <$edit-text tag=\"input\" tiddler=\"$:/config/TextEditor/EditorHeight/Height\" default=\"100px\"/></$radio>\n"
        },
        "$:/core/ui/EditorToolbar/editor-height": {
            "title": "$:/core/ui/EditorToolbar/editor-height",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/fixed-height",
            "custom-icon": "yes",
            "caption": "{{$:/language/Buttons/EditorHeight/Caption}}",
            "description": "{{$:/language/Buttons/EditorHeight/Hint}}",
            "condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]",
            "dropdown": "$:/core/ui/EditorToolbar/editor-height-dropdown",
            "text": "<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n{{$:/core/images/fixed-height}}\n</$reveal>\n<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n{{$:/core/images/auto-height}}\n</$reveal>\n"
        },
        "$:/core/ui/EditorToolbar/excise-dropdown": {
            "title": "$:/core/ui/EditorToolbar/excise-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/Excise/\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<<lingo Caption/NewTitle>> <$edit-text tag=\"input\" tiddler=\"$config-title$/new-title\" default=\"\" focus=\"true\"/>\n\n<$set name=\"new-title\" value={{$config-title$/new-title}}>\n<$list filter=\"\"\"[<new-title>is[tiddler]]\"\"\">\n<div class=\"tc-error\">\n<<lingo Caption/TiddlerExists>>\n</div>\n</$list>\n</$set>\n\n<$checkbox tiddler=\"\"\"$config-title$/tagnew\"\"\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"false\"> <<lingo Caption/Tag>></$checkbox>\n\n<<lingo Caption/Replace>> <$select tiddler=\"\"\"$config-title$/type\"\"\" default=\"transclude\">\n<option value=\"link\"><<lingo Caption/Replace/Link>></option>\n<option value=\"transclude\"><<lingo Caption/Replace/Transclusion>></option>\n<option value=\"macro\"><<lingo Caption/Replace/Macro>></option>\n</$select>\n\n<$reveal state=\"\"\"$config-title$/type\"\"\" type=\"match\" text=\"macro\">\n<<lingo Caption/MacroName>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/macro-title\"\"\" default=\"translink\"/>\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"excise\"\n\ttitle={{$config-title$/new-title}}\n\ttype={{$config-title$/type}}\n\tmacro={{$config-title$/macro-title}}\n\ttagnew={{$config-title$/tagnew}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"$config-title$/new-title\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Excise>>\n</$button>\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Excise/\">>/>\n"
        },
        "$:/core/ui/EditorToolbar/excise": {
            "title": "$:/core/ui/EditorToolbar/excise",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/excise",
            "caption": "{{$:/language/Buttons/Excise/Caption}}",
            "description": "{{$:/language/Buttons/Excise/Hint}}",
            "condition": "[<targetTiddler>type[]] [<targetTiddler>type[text/vnd.tiddlywiki]] +[first[]]",
            "shortcuts": "((excise))",
            "dropdown": "$:/core/ui/EditorToolbar/excise-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/heading-1": {
            "title": "$:/core/ui/EditorToolbar/heading-1",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-1",
            "caption": "{{$:/language/Buttons/Heading1/Caption}}",
            "description": "{{$:/language/Buttons/Heading1/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "button-classes": "tc-text-editor-toolbar-item-start-group",
            "shortcuts": "((heading-1))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"1\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-2": {
            "title": "$:/core/ui/EditorToolbar/heading-2",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-2",
            "caption": "{{$:/language/Buttons/Heading2/Caption}}",
            "description": "{{$:/language/Buttons/Heading2/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-2))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"2\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-3": {
            "title": "$:/core/ui/EditorToolbar/heading-3",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-3",
            "caption": "{{$:/language/Buttons/Heading3/Caption}}",
            "description": "{{$:/language/Buttons/Heading3/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-3))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"3\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-4": {
            "title": "$:/core/ui/EditorToolbar/heading-4",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-4",
            "caption": "{{$:/language/Buttons/Heading4/Caption}}",
            "description": "{{$:/language/Buttons/Heading4/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-4))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"4\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-5": {
            "title": "$:/core/ui/EditorToolbar/heading-5",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-5",
            "caption": "{{$:/language/Buttons/Heading5/Caption}}",
            "description": "{{$:/language/Buttons/Heading5/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-5))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"5\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-6": {
            "title": "$:/core/ui/EditorToolbar/heading-6",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-6",
            "caption": "{{$:/language/Buttons/Heading6/Caption}}",
            "description": "{{$:/language/Buttons/Heading6/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-6))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"6\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/italic": {
            "title": "$:/core/ui/EditorToolbar/italic",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/italic",
            "caption": "{{$:/language/Buttons/Italic/Caption}}",
            "description": "{{$:/language/Buttons/Italic/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((italic))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"//\"\n\tsuffix=\"//\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/line-width-dropdown": {
            "title": "$:/core/ui/EditorToolbar/line-width-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/LineWidth/\n\n\\define toolbar-line-width-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(line-width)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/LineWidth\"\n\t$value=\"$(line-width)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; margin: 4px calc(80px - $(line-width)$); background-color: #000; width: calc(100px + $(line-width)$ * 2); height: $(line-width)$; border-radius: 120px; vertical-align: middle;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(line-width)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/LineWidth\" type=\"match\" text=\"\"\"$(line-width)$\"\"\" tag=\"span\">\n\n<$entity entity=\"&nbsp;\"/>\n\n<$entity entity=\"&#x2713;\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/LineWidths}} variable=\"line-width\">\n\n<<toolbar-line-width-inner>>\n\n</$list>\n"
        },
        "$:/core/ui/EditorToolbar/line-width": {
            "title": "$:/core/ui/EditorToolbar/line-width",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/line-width",
            "caption": "{{$:/language/Buttons/LineWidth/Caption}}",
            "description": "{{$:/language/Buttons/LineWidth/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/line-width-dropdown",
            "text": "<$text text={{$:/config/BitmapEditor/LineWidth}}/>\n"
        },
        "$:/core/ui/EditorToolbar/link-dropdown": {
            "title": "$:/core/ui/EditorToolbar/link-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/Link/\n\n\\define add-link-actions()\n<$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"make-link\" text={{$(linkTiddler)$}} />\n<$action-deletetiddler $filter=\"[<dropdown-state>] [<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]\"/>\n\\end\n\n\\define get-focus-selector() [data-tiddler-title=\"$(cssEscapedTitle)$\"] .tc-create-wikitext-link input\n\n\\define cancel-search-actions-inner()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}><$list filter=\"[<searchTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]\"/>\"\"\"><$action-setfield $tiddler=<<searchTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/></$list></$set>\n\\end\n\n\\define cancel-search-actions() <$list filter=\"[<storeTitle>!has[text]] +[<searchTiddler>!has[text]]\" emptyMessage=\"\"\"<<cancel-search-actions-inner>>\"\"\"><$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"wrap-selection\" prefix=\"\" suffix=\"\"/></$list>\n\n\\define external-link()\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\" actions=<<add-link-actions>>>\n{{$:/core/images/chevron-right}}\n</$button>\n\\end\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<$vars searchTiddler=\"\"\"$config-title$/search\"\"\" linkTiddler=\"\"\"$config-title$/link\"\"\" linktext=\"\" searchListState=<<qualify \"$:/temp/link-search/selected-item\">> refreshTitle=<<qualify \"$:/temp/link-search/refresh\">> storeTitle=<<qualify \"$:/temp/link-search/input\">>>\n\n<$vars linkTiddler=<<searchTiddler>>>\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">> class=\"tc-create-wikitext-link\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<searchTiddler>> storeTitle=<<storeTitle>>\n\t\tselectionStateTitle=<<searchListState>> refreshTitle=<<refreshTitle>> type=\"search\" filterMinLength=\"1\"\n\t\ttag=\"input\" focus=\"true\" class=\"tc-popup-handle\" inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<add-link-actions>> placeholder={{$:/language/Search/Search}} default=\"\" \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\" />\n</$keyboard>\n</$keyboard>\n<$reveal tag=\"span\" state=<<storeTitle>> type=\"nomatch\" text=\"\">\n<<external-link>>\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\">\n<<cancel-search-actions>><$set name=\"cssEscapedTitle\" value={{{ [<storyTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-focus-selector>>/></$set>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</$vars>\n\n<$reveal tag=\"div\" state=<<storeTitle>> type=\"nomatch\" text=\"\">\n\n<$linkcatcher actions=<<add-link-actions>> to=<<linkTiddler>>>\n\n<$vars userInput={{{ [<storeTitle>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}>\n\n{{$:/core/ui/SearchResults}}\n\n</$vars>\n\n</$linkcatcher>\n\n</$reveal>\n\n</$vars>\n\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Link/\">>/>\n"
        },
        "$:/core/ui/EditorToolbar/link": {
            "title": "$:/core/ui/EditorToolbar/link",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/link",
            "caption": "{{$:/language/Buttons/Link/Caption}}",
            "description": "{{$:/language/Buttons/Link/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "button-classes": "tc-text-editor-toolbar-item-start-group",
            "shortcuts": "((link))",
            "dropdown": "$:/core/ui/EditorToolbar/link-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/linkify": {
            "title": "$:/core/ui/EditorToolbar/linkify",
            "caption": "{{$:/language/Buttons/Linkify/Caption}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "description": "{{$:/language/Buttons/Linkify/Hint}}",
            "icon": "$:/core/images/linkify",
            "list-before": "$:/core/ui/EditorToolbar/mono-block",
            "shortcuts": "((linkify))",
            "tags": "$:/tags/EditorToolbar",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"[[\"\n\tsuffix=\"]]\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/list-bullet": {
            "title": "$:/core/ui/EditorToolbar/list-bullet",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/list-bullet",
            "caption": "{{$:/language/Buttons/ListBullet/Caption}}",
            "description": "{{$:/language/Buttons/ListBullet/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((list-bullet))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"*\"\n\tcount=\"1\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/list-number": {
            "title": "$:/core/ui/EditorToolbar/list-number",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/list-number",
            "caption": "{{$:/language/Buttons/ListNumber/Caption}}",
            "description": "{{$:/language/Buttons/ListNumber/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((list-number))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"1\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/mono-block": {
            "title": "$:/core/ui/EditorToolbar/mono-block",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/mono-block",
            "caption": "{{$:/language/Buttons/MonoBlock/Caption}}",
            "description": "{{$:/language/Buttons/MonoBlock/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "button-classes": "tc-text-editor-toolbar-item-start-group",
            "shortcuts": "((mono-block))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n```\"\n\tsuffix=\"```\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/mono-line": {
            "title": "$:/core/ui/EditorToolbar/mono-line",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/mono-line",
            "caption": "{{$:/language/Buttons/MonoLine/Caption}}",
            "description": "{{$:/language/Buttons/MonoLine/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((mono-line))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"`\"\n\tsuffix=\"`\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/more-dropdown": {
            "title": "$:/core/ui/EditorToolbar/more-dropdown",
            "text": "\\define config-title()\n$:/config/EditorToolbarButtons/Visibility/$(toolbarItem)$\n\\end\n\n\\define conditional-button()\n<$list filter={{$(toolbarItem)$!!condition}} variable=\"condition\">\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\" mode=\"inline\"/> <$transclude tiddler=<<toolbarItem>> field=\"description\"/>\n</$list>\n\\end\n\n<div class=\"tc-text-editor-toolbar-more\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]] -[[$:/core/ui/EditorToolbar/more]]\">\n<$reveal type=\"match\" state=<<config-visibility-title>> text=\"hide\" tag=\"div\">\n<<conditional-button>>\n</$reveal>\n</$list>\n</div>\n"
        },
        "$:/core/ui/EditorToolbar/more": {
            "title": "$:/core/ui/EditorToolbar/more",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/down-arrow",
            "caption": "{{$:/language/Buttons/More/Caption}}",
            "description": "{{$:/language/Buttons/More/Hint}}",
            "condition": "[<targetTiddler>]",
            "dropdown": "$:/core/ui/EditorToolbar/more-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/opacity-dropdown": {
            "title": "$:/core/ui/EditorToolbar/opacity-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/Opacity/\n\n\\define toolbar-opacity-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(opacity)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Opacity\"\n\t$value=\"$(opacity)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(current-paint-colour)$; opacity: $(opacity)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(opacity)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/Opacity\" type=\"match\" text=\"\"\"$(opacity)$\"\"\" tag=\"span\">\n\n<$entity entity=\"&nbsp;\"/>\n\n<$entity entity=\"&#x2713;\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n\\define toolbar-opacity()\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/Opacities}} variable=\"opacity\">\n\n<<toolbar-opacity-inner>>\n\n</$list>\n\\end\n\n<$set name=\"current-paint-colour\" value={{$:/config/BitmapEditor/Colour}}>\n\n<$set name=\"current-opacity\" value={{$:/config/BitmapEditor/Opacity}}>\n\n<<toolbar-opacity>>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/EditorToolbar/opacity": {
            "title": "$:/core/ui/EditorToolbar/opacity",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/opacity",
            "caption": "{{$:/language/Buttons/Opacity/Caption}}",
            "description": "{{$:/language/Buttons/Opacity/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/opacity-dropdown",
            "text": "<$text text={{$:/config/BitmapEditor/Opacity}}/>\n"
        },
        "$:/core/ui/EditorToolbar/paint-dropdown": {
            "title": "$:/core/ui/EditorToolbar/paint-dropdown",
            "text": "''{{$:/language/Buttons/Paint/Hint}}''\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Colour\"\n\t$value=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
        },
        "$:/core/ui/EditorToolbar/paint": {
            "title": "$:/core/ui/EditorToolbar/paint",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/paint",
            "caption": "{{$:/language/Buttons/Paint/Caption}}",
            "description": "{{$:/language/Buttons/Paint/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/paint-dropdown",
            "text": "\\define toolbar-paint()\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(colour-picker-value)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\\end\n<$set name=\"colour-picker-value\" value={{$:/config/BitmapEditor/Colour}}>\n<<toolbar-paint>>\n</$set>\n"
        },
        "$:/core/ui/EditorToolbar/picture-dropdown": {
            "title": "$:/core/ui/EditorToolbar/picture-dropdown",
            "text": "\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n''{{$:/language/Buttons/Picture/Hint}}''\n\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext=<<replacement-text>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
        },
        "$:/core/ui/EditorToolbar/picture": {
            "title": "$:/core/ui/EditorToolbar/picture",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/picture",
            "caption": "{{$:/language/Buttons/Picture/Caption}}",
            "description": "{{$:/language/Buttons/Picture/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((picture))",
            "dropdown": "$:/core/ui/EditorToolbar/picture-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/preview-type-dropdown": {
            "title": "$:/core/ui/EditorToolbar/preview-type-dropdown",
            "text": "\\define preview-type-button()\n<$button tag=\"a\">\n\n<$action-setfield $tiddler=\"$:/state/editpreviewtype\" $value=\"$(previewType)$\"/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<previewType>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<previewType>> field=\"title\" mode=\"inline\"/>\n\n</$transclude> \n\n<$reveal tag=\"span\" state=\"$:/state/editpreviewtype\" type=\"match\" text=<<previewType>> default=\"$:/core/ui/EditTemplate/body/preview/output\">\n\n<$entity entity=\"&nbsp;\"/>\n\n<$entity entity=\"&#x2713;\"/>\n\n</$reveal>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]]\" variable=\"previewType\">\n\n<<preview-type-button>>\n\n</$list>\n"
        },
        "$:/core/ui/EditorToolbar/preview-type": {
            "title": "$:/core/ui/EditorToolbar/preview-type",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/chevron-down",
            "caption": "{{$:/language/Buttons/PreviewType/Caption}}",
            "description": "{{$:/language/Buttons/PreviewType/Hint}}",
            "condition": "[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]butfirst[]limit[1]]",
            "button-classes": "tc-text-editor-toolbar-item-adjunct",
            "dropdown": "$:/core/ui/EditorToolbar/preview-type-dropdown"
        },
        "$:/core/ui/EditorToolbar/preview": {
            "title": "$:/core/ui/EditorToolbar/preview",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/preview-open",
            "custom-icon": "yes",
            "caption": "{{$:/language/Buttons/Preview/Caption}}",
            "description": "{{$:/language/Buttons/Preview/Hint}}",
            "condition": "[<targetTiddler>]",
            "button-classes": "tc-text-editor-toolbar-item-start-group",
            "shortcuts": "((preview))",
            "text": "<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-open}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"no\"/>\n</$reveal>\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-closed}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"yes\"/>\n</$reveal>\n"
        },
        "$:/core/ui/EditorToolbar/quote": {
            "title": "$:/core/ui/EditorToolbar/quote",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/quote",
            "caption": "{{$:/language/Buttons/Quote/Caption}}",
            "description": "{{$:/language/Buttons/Quote/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((quote))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n<<<\"\n\tsuffix=\"<<<\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/rotate-left": {
            "title": "$:/core/ui/EditorToolbar/rotate-left",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/rotate-left",
            "caption": "{{$:/language/Buttons/RotateLeft/Caption}}",
            "description": "{{$:/language/Buttons/RotateLeft/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"rotate-left\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/size-dropdown": {
            "title": "$:/core/ui/EditorToolbar/size-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/Size/\n\n\\define toolbar-button-size-preset(config-title)\n<$set name=\"width\" filter=\"$(sizePair)$ +[first[]]\">\n\n<$set name=\"height\" filter=\"$(sizePair)$ +[last[]]\">\n\n<$button tag=\"a\">\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n\t$value=<<width>>\n/>\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n\t$value=<<height>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/presets-popup\"\"\"\n/>\n\n<$text text=<<width>>/> &times; <$text text=<<height>>/>\n\n</$button>\n\n</$set>\n\n</$set>\n\\end\n\n\\define toolbar-button-size(config-title)\n''{{$:/language/Buttons/Size/Hint}}''\n\n<<lingo Caption/Width>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-width\"\"\" default=<<tv-bitmap-editor-width>> focus=\"true\" size=\"8\"/> <<lingo Caption/Height>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-height\"\"\" default=<<tv-bitmap-editor-height>> size=\"8\"/> <$button popup=\"\"\"$config-title$/presets-popup\"\"\" class=\"tc-btn-invisible tc-popup-keep\" style=\"width: auto; display: inline-block; background-colour: inherit;\" selectedClass=\"tc-selected\">\n{{$:/core/images/down-arrow}}\n</$button>\n\n<$reveal tag=\"span\" state=\"\"\"$config-title$/presets-popup\"\"\" type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down tc-popup-keep\">\n\n<$list filter={{$:/config/BitmapEditor/ImageSizes}} variable=\"sizePair\">\n\n<$macrocall $name=\"toolbar-button-size-preset\" config-title=\"$config-title$\"/>\n\n</$list>\n\n</div>\n\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"resize\"\n\twidth={{$config-title$/new-width}}\n\theight={{$config-title$/new-height}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Resize>>\n</$button>\n\\end\n\n<$macrocall $name=\"toolbar-button-size\" config-title=<<qualify \"$:/state/Size/\">>/>\n"
        },
        "$:/core/ui/EditorToolbar/size": {
            "title": "$:/core/ui/EditorToolbar/size",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/size",
            "caption": "{{$:/language/Buttons/Size/Caption}}",
            "description": "{{$:/language/Buttons/Size/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/size-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/stamp-dropdown": {
            "title": "$:/core/ui/EditorToolbar/stamp-dropdown",
            "text": "\\define toolbar-button-stamp-inner()\n<$button tag=\"a\">\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext={{$(snippetTitle)$}}\n/>\n\n</$list>\n\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix={{{ [[$(snippetTitle)$]addsuffix[/prefix]get[text]] }}}\nsuffix={{{ [[$(snippetTitle)$]addsuffix[/suffix]get[text]] }}}\n/>\n\n</$list>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<snippetTitle>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<snippetTitle>> field=\"title\" />\n\n</$transclude>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TextEditor/Snippet]!has[draft.of]sort[caption]]\" variable=\"snippetTitle\">\n\n<<toolbar-button-stamp-inner>>\n\n</$list>\n\n----\n\n<$button tag=\"a\">\n\n<$action-sendmessage\n\t$message=\"tm-new-tiddler\"\n\ttags=\"$:/tags/TextEditor/Snippet\"\n\tcaption={{$:/language/Buttons/Stamp/New/Title}}\n\ttext={{$:/language/Buttons/Stamp/New/Text}}\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<em>\n\n<$text text={{$:/language/Buttons/Stamp/Caption/New}}/>\n\n</em>\n\n</$button>\n"
        },
        "$:/core/ui/EditorToolbar/stamp": {
            "title": "$:/core/ui/EditorToolbar/stamp",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/stamp",
            "caption": "{{$:/language/Buttons/Stamp/Caption}}",
            "description": "{{$:/language/Buttons/Stamp/Hint}}",
            "condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]",
            "shortcuts": "((stamp))",
            "dropdown": "$:/core/ui/EditorToolbar/stamp-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/strikethrough": {
            "title": "$:/core/ui/EditorToolbar/strikethrough",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/strikethrough",
            "caption": "{{$:/language/Buttons/Strikethrough/Caption}}",
            "description": "{{$:/language/Buttons/Strikethrough/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((strikethrough))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"~~\"\n\tsuffix=\"~~\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/subscript": {
            "title": "$:/core/ui/EditorToolbar/subscript",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/subscript",
            "caption": "{{$:/language/Buttons/Subscript/Caption}}",
            "description": "{{$:/language/Buttons/Subscript/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((subscript))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\",,\"\n\tsuffix=\",,\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/superscript": {
            "title": "$:/core/ui/EditorToolbar/superscript",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/superscript",
            "caption": "{{$:/language/Buttons/Superscript/Caption}}",
            "description": "{{$:/language/Buttons/Superscript/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((superscript))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"^^\"\n\tsuffix=\"^^\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/transcludify": {
            "title": "$:/core/ui/EditorToolbar/transcludify",
            "caption": "{{$:/language/Buttons/Transcludify/Caption}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "description": "{{$:/language/Buttons/Transcludify/Hint}}",
            "icon": "$:/core/images/transcludify",
            "list-before": "$:/core/ui/EditorToolbar/mono-block",
            "shortcuts": "((transcludify))",
            "tags": "$:/tags/EditorToolbar",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"{{\"\n\tsuffix=\"}}\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/underline": {
            "title": "$:/core/ui/EditorToolbar/underline",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/underline",
            "caption": "{{$:/language/Buttons/Underline/Caption}}",
            "description": "{{$:/language/Buttons/Underline/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((underline))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"__\"\n\tsuffix=\"__\"\n/>\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/SessionTiddlers": {
            "title": "$:/core/Filters/SessionTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[haschanged[]]",
            "description": "{{$:/language/Filters/SessionTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/ShadowTiddlers": {
            "title": "$:/core/Filters/ShadowTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[all[shadows]sort[title]]",
            "description": "{{$:/language/Filters/ShadowTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/StoryList": {
            "title": "$:/core/Filters/StoryList",
            "tags": "$:/tags/Filter",
            "filter": "[list[$:/StoryList]] -$:/AdvancedSearch",
            "description": "{{$:/language/Filters/StoryList}}",
            "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\n\\define messageField() message-$(payloadTiddler)$\n\n\\define payloadTitleFilter() [<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>]\n\n\\define overWriteWarning()\n<$list filter=\"[<currentTiddler>!has<suppressedField>]\">\n<$text text={{{[subfilter<payloadTitleFilter>!is[tiddler]then[]] ~[<lingo-base>addsuffix[Listing/Rename/OverwriteWarning]get[text]]}}}/>\n</$list>\n\\end\n\n\\define selectionField() selection-$(payloadTiddler)$\n\n\\define renameField() rename-$(payloadTiddler)$\n\n\\define suppressedField() suppressed-$(payloadTiddler)$\n\n\\define newImportTitleTiddler() $:/temp/NewImportTitle-$(payloadTiddler)$\n\n\\define previewPopupState() $(currentTiddler)$!!popup-$(payloadTiddler)$\n\n\\define renameFieldState() $(currentTiddler)$!!state-rename-$(payloadTiddler)$\n\n\\define select-all-actions()\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<$action-setfield $field={{{ [<payloadTiddler>addprefix[selection-]] }}} $value={{$:/state/import/select-all}}/>\n</$list>\n\\end\n\n<table class=\"tc-import-table\">\n<tbody>\n<tr>\n<th align=\"left\">\n<$checkbox tiddler=\"$:/state/import/select-all\" field=\"text\" checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" actions=<<select-all-actions>>>\n<<lingo Listing/Select/Caption>>\n</$checkbox>\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 class={{{[<currentTiddler>has<suppressedField>then[tc-row-disabled]] ~[subfilter<payloadTitleFilter>is[tiddler]then[tc-row-warning]] }}}>\n<td>\n<$checkbox field=<<selectionField>> checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}/>\n</td>\n<td>\n<$reveal type=\"nomatch\" state=<<renameFieldState>> text=\"yes\" tag=\"div\">\n<$reveal type=\"nomatch\" state=<<previewPopupState>> text=\"yes\" tag=\"div\" class=\"tc-flex\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown tc-flex-grow-1 tc-word-break\" set=<<previewPopupState>> setTo=\"yes\" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}>\n<span class=\"tc-small-gap-right\">{{$:/core/images/right-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/>\n</$button>\n<$list filter=\"[<currentTiddler>!has<suppressedField>]\"><$button class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"yes\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/Tooltip]get[text]]}}}>{{$:/core/images/edit-button}}</$button></$list>\n</$reveal>\n<$reveal type=\"match\" state=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<previewPopupState>> setTo=\"no\">\n<span class=\"tc-small-gap-right\">{{$:/core/images/down-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/>\n</$button>\n</$reveal>\n</$reveal>\n<$reveal type=\"match\" state=<<renameFieldState>> text=\"yes\" tag=\"div\">\n<$text text={{{[<lingo-base>addsuffix[Listing/Rename/Prompt]get[text]]}}}/>\n</$reveal>\n</td>\n<td>\n<$view field=<<messageField>>/>\n<<overWriteWarning>>\n</td>\n</tr>\n<$reveal type=\"match\" state=<<renameFieldState>> text=\"yes\" tag=\"tr\">\n<td colspan=\"3\">\n<div class=\"tc-flex\">\n<$edit-text tiddler=<<newImportTitleTiddler>>  default={{{[subfilter<payloadTitleFilter>]}}} tag=\"input\" class=\"tc-import-rename tc-flex-grow-1\"/><span class=\"tc-small-gap-left\"><$button  class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"no\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/CancelRename]get[text]]}}}>{{$:/core/images/close-button}}<$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button><span class=\"tc-small-gap-right\"/></span><$button  class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"no\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/ConfirmRename]get[text]]}}}>{{$:/core/images/done-button}}<$action-setfield $field=<<renameField>> $value={{{[<newImportTitleTiddler>get[text]minlength[1]else<payloadTiddler>]}}} /><$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button>\n</div>\n</td>\n</$reveal>\n<tr>\n<td colspan=\"3\">\n<$reveal type=\"match\" text=\"yes\" state=<<previewPopupState>> tag=\"div\">\n<$list filter=\"[{$:/state/importpreviewtype}has[text]]\" variable=\"listItem\" emptyMessage={{$:/core/ui/ImportPreviews/Text}}>\n<$transclude tiddler={{$:/state/importpreviewtype}}/>\n</$list>\n</$reveal>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/ImportPreviews/Diff": {
            "title": "$:/core/ui/ImportPreviews/Diff",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/Diff}}",
            "text": "<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>>/>\n"
        },
        "$:/core/ui/ImportPreviews/DiffFields": {
            "title": "$:/core/ui/ImportPreviews/DiffFields",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/DiffFields}}",
            "text": "<$macrocall $name=\"compareTiddlers\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>> exclude=\"text\"/>\n"
        },
        "$:/core/ui/ImportPreviews/Fields": {
            "title": "$:/core/ui/ImportPreviews/Fields",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/Fields}}",
            "text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[<payloadTiddler>subtiddlerfields<currentTiddler>sort[]] -text\" variable=\"fieldName\">\n<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<fieldName>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<fieldName>> tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>>/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/ImportPreviews/Text": {
            "title": "$:/core/ui/ImportPreviews/Text",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/Text}}",
            "text": "<$transclude tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> mode=\"block\"/>\n"
        },
        "$:/core/ui/ImportPreviews/TextRaw": {
            "title": "$:/core/ui/ImportPreviews/TextRaw",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/TextRaw}}",
            "text": "<pre><code><$view tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> /></code></pre>"
        },
        "$:/core/ui/KeyboardShortcuts/advanced-search": {
            "title": "$:/core/ui/KeyboardShortcuts/advanced-search",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((advanced-search))",
            "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\" preventScroll=\"true\"/>\n</$navigator>\n"
        },
        "$:/core/ui/KeyboardShortcuts/change-sidebar-layout": {
            "title": "$:/core/ui/KeyboardShortcuts/change-sidebar-layout",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((change-sidebar-layout))",
            "text": "<$list filter=\"[{$:/themes/tiddlywiki/vanilla/options/sidebarlayout}match[fixed-fluid]]\" \nemptyMessage=\"\"\"<$action-setfield $tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" text=\"fixed-fluid\"/>\"\"\">\n<$action-setfield $tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" text=\"fluid-fixed\"/>\n</$list>\n"
        },
        "$:/core/ui/KeyboardShortcuts/new-image": {
            "title": "$:/core/ui/KeyboardShortcuts/new-image",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((new-image))",
            "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-image}}\n</$navigator>\n"
        },
        "$:/core/ui/KeyboardShortcuts/new-journal": {
            "title": "$:/core/ui/KeyboardShortcuts/new-journal",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((new-journal))",
            "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-journal}}\n</$navigator>\n"
        },
        "$:/core/ui/KeyboardShortcuts/new-tiddler": {
            "title": "$:/core/ui/KeyboardShortcuts/new-tiddler",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((new-tiddler))",
            "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-tiddler}}\n</$navigator>\n"
        },
        "$:/core/ui/KeyboardShortcuts/save-wiki": {
            "title": "$:/core/ui/KeyboardShortcuts/save-wiki",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((save-wiki))",
            "text": "<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n"
        },
        "$:/core/ui/KeyboardShortcuts/sidebar-search": {
            "title": "$:/core/ui/KeyboardShortcuts/sidebar-search",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((sidebar-search))",
            "text": "<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n"
        },
        "$:/core/ui/KeyboardShortcuts/switcher": {
            "title": "$:/core/ui/KeyboardShortcuts/switcher",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((layout-switcher))",
            "text": "<$action-sendmessage $message=\"tm-show-switcher\" switch=\"layout\"/>"
        },
        "$:/core/ui/KeyboardShortcuts/toggle-sidebar": {
            "title": "$:/core/ui/KeyboardShortcuts/toggle-sidebar",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((toggle-sidebar))",
            "text": "<$list filter=\"[[$:/state/sidebar]is[missing]] [{$:/state/sidebar}removeprefix[yes]]\" emptyMessage=\"\"\"\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"yes\"/>\n\"\"\">\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"no\"/>\n</$list>\n"
        },
        "$:/snippets/LayoutSwitcher": {
            "title": "$:/snippets/LayoutSwitcher",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ControlPanel/LayoutSwitcher/Caption}}",
            "text": "<$linkcatcher to=\"$:/layout\">\n<div class=\"tc-chooser\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/Layout]] [[$:/core/ui/PageTemplate]] +[!is[draft]sort[name]]\">\n<$list filter=\"[{$:/layout}!has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/layout}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$transclude field=\"name\"/>'' - <$transclude field=\"description\"/></$link></div>\n</$set>\n\"\"\">\n<$set name=\"cls\" filter=\"[all[current]field:title[$:/core/ui/PageTemplate]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$transclude field=\"name\"/>'' - <$transclude field=\"description\"/></$link></div>\n</$set>\n</$list>\n</$list>\n</div>\n</$linkcatcher>\n"
        },
        "$:/core/ui/ListItemTemplate": {
            "title": "$:/core/ui/ListItemTemplate",
            "text": "<div class=\"tc-menu-list-item\">\n<$link />\n</div>"
        },
        "$:/Manager/ItemMain/Fields": {
            "title": "$:/Manager/ItemMain/Fields",
            "tags": "$:/tags/Manager/ItemMain",
            "caption": "{{$:/language/Manager/Item/Fields}}",
            "text": "<table>\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
        },
        "$:/Manager/ItemMain/RawText": {
            "title": "$:/Manager/ItemMain/RawText",
            "tags": "$:/tags/Manager/ItemMain",
            "caption": "{{$:/language/Manager/Item/RawText}}",
            "text": "<pre><code><$view/></code></pre>\n"
        },
        "$:/Manager/ItemMain/WikifiedText": {
            "title": "$:/Manager/ItemMain/WikifiedText",
            "tags": "$:/tags/Manager/ItemMain",
            "caption": "{{$:/language/Manager/Item/WikifiedText}}",
            "text": "<$transclude mode=\"block\"/>\n"
        },
        "$:/Manager/ItemSidebar/Colour": {
            "title": "$:/Manager/ItemSidebar/Colour",
            "tags": "$:/tags/Manager/ItemSidebar",
            "caption": "{{$:/language/Manager/Item/Colour}}",
            "text": "\\define swatch-styles()\nheight: 1em;\nbackground-color: $(colour)$\n\\end\n\n<$vars colour={{!!color}}>\n<p style=<<swatch-styles>>/>\n</$vars>\n<p>\n<$edit-text field=\"color\" tag=\"input\" type=\"color\"/> / <$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/>\n</p>\n"
        },
        "$:/Manager/ItemSidebar/Icon": {
            "title": "$:/Manager/ItemSidebar/Icon",
            "tags": "$:/tags/Manager/ItemSidebar",
            "caption": "{{$:/language/Manager/Item/Icon}}",
            "text": "<p>\n<div class=\"tc-manager-icon-editor\">\n<$button popup=<<qualify \"$:/state/popup/image-picker\">> class=\"tc-btn-invisible\">\n<$transclude tiddler={{!!icon}}>\n{{$:/language/Manager/Item/Icon/None}}\n</$transclude>\n</$button>\n<div class=\"tc-block-dropdown-wrapper\" style=\"position: static;\">\n<$reveal state=<<qualify \"$:/state/popup/image-picker\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-popup\">\n<div class=\"tc-block-dropdown tc-popup-keep\" style=\"width: 80%; left: 10%; right: 10%; padding: 0.5em;\">\n<$macrocall $name=\"image-picker-include-tagged-images\" actions=\"\"\"\n<$action-setfield $field=\"icon\" $value=<<imageTitle>>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/image-picker\">>/>\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n</div>\n</p>\n"
        },
        "$:/Manager/ItemSidebar/Tags": {
            "title": "$:/Manager/ItemSidebar/Tags",
            "tags": "$:/tags/Manager/ItemSidebar",
            "caption": "{{$:/language/Manager/Item/Tags}}",
            "text": "\\whitespace trim\n\\define tag-checkbox-actions()\n<$action-listops\n\t$tiddler=\"$:/config/Manager/RecentTags\"\n\t$subfilter=\"[<tag>] [list[$:/config/Manager/RecentTags]] +[limit[12]]\"\n/>\n\\end\n\n\\define tag-picker-actions()\n<<tag-checkbox-actions>>\n\\end\n\n<p>\n<$list filter=\"[all[current]tags[]] [list[$:/config/Manager/RecentTags]] +[sort[title]] \" variable=\"tag\" storyview=\"pop\">\n<div>\n<$checkbox tiddler=<<currentTiddler>> tag=<<tag>> actions=<<tag-checkbox-actions>>>\n<$macrocall $name=\"tag-pill\" tag=<<tag>>/>\n</$checkbox>\n</div>\n</$list>\n</p>\n<p>\n<$fieldmangler>\n<$macrocall $name=\"tag-picker\" actions=<<tag-picker-actions>>/>\n</$fieldmangler>\n</p>\n"
        },
        "$:/Manager/ItemSidebar/Tools": {
            "title": "$:/Manager/ItemSidebar/Tools",
            "tags": "$:/tags/Manager/ItemSidebar",
            "caption": "{{$:/language/Manager/Item/Tools}}",
            "text": "<p>\n<$button to=<<currentTiddler>>>{{$:/core/images/link}} open</$button>\n</p>\n<p>\n<$button message=\"tm-edit-tiddler\" param=<<currentTiddler>>>{{$:/core/images/edit-button}} edit</$button>\n</p>\n"
        },
        "$:/Manager": {
            "title": "$:/Manager",
            "icon": "$:/core/images/list",
            "color": "#bbb",
            "text": "\\define lingo-base() $:/language/Manager/\n\n\\define list-item-content-item()\n<div class=\"tc-manager-list-item-content-item\">\n\t<$vars state-title=\"\"\"$:/state/popup/manager/item/$(listItem)$\"\"\">\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"hide\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/down-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"nomatch\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"show\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/right-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\" class=\"tc-manager-list-item-content-item-body\">\n\t\t\t<$transclude tiddler=<<listItem>>/>\n\t\t</$reveal>\n\t</$vars>\n</div>\n\\end\n\n<div class=\"tc-manager-wrapper\">\n\t<div class=\"tc-manager-controls\">\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Show/Prompt>> <$select tiddler=\"$:/config/Manager/Show\" default=\"tiddlers\">\n\t\t\t\t<option value=\"tiddlers\"><<lingo Controls/Show/Option/Tiddlers>></option>\n\t\t\t\t<option value=\"tags\"><<lingo Controls/Show/Option/Tags>></option>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Search/Prompt>> <$edit-text tiddler=\"$:/config/Manager/Filter\" tag=\"input\" default=\"\" placeholder={{$:/language/Manager/Controls/Search/Placeholder}}/>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/FilterByTag/Prompt>> <$select tiddler=\"$:/config/Manager/Tag\" default=\"\">\n\t\t\t\t<option value=\"\"><<lingo Controls/FilterByTag/None>></option>\n\t\t\t\t<$list filter=\"[!is{$:/config/Manager/System}tags[]!is[system]sort[title]]\" variable=\"tag\">\n\t\t\t\t\t<option value=<<tag>>><$text text=<<tag>>/></option>\n\t\t\t\t</$list>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Sort/Prompt>> <$select tiddler=\"$:/config/Manager/Sort\" default=\"title\">\n\t\t\t\t<optgroup label=\"Common\">\n\t\t\t\t\t<$list filter=\"title modified modifier created creator created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t\t<optgroup label=\"All\">\n\t\t\t\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}fields[]sort[title]] -title -modified -modifier -created -creator -created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t</$select>\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/Order\" field=\"text\" checked=\"reverse\" unchecked=\"forward\" default=\"forward\">\n\t\t\t\t<<lingo Controls/Order/Prompt>>\n\t\t\t</$checkbox>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/System\" field=\"text\" checked=\"\" unchecked=\"system\" default=\"system\">\n\t\t\t\t{{$:/language/SystemTiddlers/Include/Prompt}}\n\t\t\t</$checkbox>\n\t\t</div>\n\t</div>\n\t<div class=\"tc-manager-list\">\n\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}search{$:/config/Manager/Filter}tag:strict{$:/config/Manager/Tag}sort{$:/config/Manager/Sort}order{$:/config/Manager/Order}]\">\n\t\t\t<$vars transclusion=<<currentTiddler>>>\n\t\t\t\t<div style=\"tc-manager-list-item\">\n\t\t\t\t\t<$button popup=<<qualify \"$:/state/manager/popup\">> class=\"tc-btn-invisible tc-manager-list-item-heading\" selectedClass=\"tc-manager-list-item-heading-selected\">\n\t\t\t\t\t\t<$text text=<<currentTiddler>>/>\n\t\t\t\t\t</$button>\n\t\t\t\t\t<$reveal state=<<qualify \"$:/state/manager/popup\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-manager-list-item-content tc-popup-handle\">\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-tiddler\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemMain]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-sidebar\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemSidebar]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</$reveal>\n\t\t\t\t</div>\n\t\t\t</$vars>\n\t\t</$list>\n\t</div>\n</div>\n"
        },
        "$:/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/Explorer": {
            "title": "$:/core/ui/MoreSideBar/Explorer",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Explorer/Caption}}",
            "text": "<<tree \"$:/\">>\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/Plugins": {
            "title": "$:/core/ui/MoreSideBar/Plugins",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
            "text": "\n{{$:/language/ControlPanel/Plugins/Installed/Hint}}\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar/Plugins]!has[draft.of]]\" default=\"$:/core/ui/MoreSideBar/Plugins/Plugins\" explicitState=\"$:/state/tab-1163638994\"/>\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/MoreSideBar/Plugins/Languages": {
            "title": "$:/core/ui/MoreSideBar/Plugins/Languages",
            "tags": "$:/tags/MoreSideBar/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}}",
            "text": "<$list filter=\"[!has[draft.of]plugin-type[language]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"
        },
        "$:/core/ui/MoreSideBar/Plugins/Plugins": {
            "title": "$:/core/ui/MoreSideBar/Plugins/Plugins",
            "tags": "$:/tags/MoreSideBar/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}}",
            "text": "<$list filter=\"[!has[draft.of]plugin-type[plugin]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}>>/>\n"
        },
        "$:/core/ui/MoreSideBar/Plugins/Theme": {
            "title": "$:/core/ui/MoreSideBar/Plugins/Theme",
            "tags": "$:/tags/MoreSideBar/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}}",
            "text": "<$list filter=\"[!has[draft.of]plugin-type[theme]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\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": "\\whitespace trim\n\\define advanced-search-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>match[yes]]\">\n{{$:/core/images/advanced-search-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[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=<<advanced-search-button>>>\n<<advanced-search-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>match[yes]]\">\n{{$:/core/images/close-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[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": "\\whitespace trim\n\\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>match[yes]]\">\n{{$:/core/images/options-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[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": "\\whitespace trim\n<$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>match[yes]]\">\n{{$:/core/images/locked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[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>match[yes]]\">\n{{$:/core/images/unlocked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n"
        },
        "$:/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>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[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>match[yes]]\">\n{{$:/core/images/full-screen-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[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>match[yes]]\">\n{{$:/core/images/home-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[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>match[yes]]\">\n{{$:/core/images/import-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[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": "\\whitespace trim\n\\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>match[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<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[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\">\n{{$:/snippets/languageswitcher}}\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/manager": {
            "title": "$:/core/ui/Buttons/manager",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/list}} {{$:/language/Buttons/Manager/Caption}}",
            "description": "{{$:/language/Buttons/Manager/Hint}}",
            "text": "\\whitespace trim\n\\define manager-button(class)\n<$button to=\"$:/Manager\" tooltip={{$:/language/Buttons/Manager/Hint}} aria-label={{$:/language/Buttons/Manager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/list}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Manager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/Manager]]\" emptyMessage=<<manager-button>>>\n<<manager-button \"tc-selected\">>\n</$list>\n"
        },
        "$:/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>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[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<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\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-image": {
            "title": "$:/core/ui/Buttons/new-image",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/new-image-button}} {{$:/language/Buttons/NewImage/Caption}}",
            "description": "{{$:/language/Buttons/NewImage/Hint}}",
            "text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/NewImage/Hint}} aria-label={{$:/language/Buttons/NewImage/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-image}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-image-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewImage/Caption}}/></span>\n</$list>\n</$button>\n"
        },
        "$:/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": "\\whitespace trim\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-journal}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournal/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<<journalButton>>\n"
        },
        "$:/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": "\\whitespace trim\n<$button actions={{$:/core/ui/Actions/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>match[yes]]\">\n{{$:/core/images/new-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewTiddler/Caption}}/></span>\n</$list>\n</$button>\n"
        },
        "$:/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": "\\whitespace trim\n<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>match[yes]]\">\n{{$:/core/images/palette}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[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>\n"
        },
        "$:/core/ui/Buttons/print": {
            "title": "$:/core/ui/Buttons/print",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/print-button}} {{$:/language/Buttons/Print/Caption}}",
            "description": "{{$:/language/Buttons/Print/Hint}}",
            "text": "<$button message=\"tm-print\" tooltip={{$:/language/Buttons/Print/Hint}} aria-label={{$:/language/Buttons/Print/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/print-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Print/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/refresh": {
            "title": "$:/core/ui/Buttons/refresh",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption}}",
            "description": "{{$:/language/Buttons/Refresh/Hint}}",
            "text": "<$button message=\"tm-browser-refresh\" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/refresh-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[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 tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n<span class=\"tc-dirty-indicator\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/save-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[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": "\\whitespace trim\n\\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>match[yes]]\">\n<$set name=\"storyview\" value={{$:/view}}>\n<$transclude tiddler=<<icon>>/>\n</$set>\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[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{{$:/snippets/viewswitcher}}\n</div>\n</$reveal>\n"
        },
        "$:/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": "\\whitespace trim\n\\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>match[yes]]\">\n{{$:/core/images/tag-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[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": "\\whitespace trim\n<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>match[yes]]\">\n{{$:/core/images/theme-button}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[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{{$:/snippets/themeswitcher}}\n</$linkcatcher>\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/timestamp": {
            "title": "$:/core/ui/Buttons/timestamp",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/timestamp-on}} {{$:/language/Buttons/Timestamp/Caption}}",
            "description": "{{$:/language/Buttons/Timestamp/Hint}}",
            "text": "\\whitespace trim\n<$reveal type=\"nomatch\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/On/Hint}} aria-label={{$:/language/Buttons/Timestamp/On/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"yes\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-on}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/On/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/Off/Hint}} aria-label={{$:/language/Buttons/Timestamp/Off/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"no\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-off}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/Off/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n"
        },
        "$:/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>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[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": "\\whitespace trim\n\\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<$set name=\"hidden\" value=<<config-title>>>\n<$list filter=\"[<hidden>!text[hide]]\" storyview=\"pop\" variable=\"ignore\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$set>\n</$list>\n</$set>\n</$list>\n</div>\n"
        },
        "$:/core/ui/PageStylesheet": {
            "title": "$:/core/ui/PageStylesheet",
            "text": "\\import [[$:/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"
        },
        "$:/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/drafts": {
            "title": "$:/core/ui/PageTemplate/drafts",
            "tags": "$:/tags/PageTemplate",
            "text": "\\whitespace trim\n<$reveal state=\"$:/status/IsReadOnly\" type=\"nomatch\" text=\"yes\" tag=\"div\" class=\"tc-drafts-list\">\n<$list filter=\"[has[draft.of]!sort[modified]] -[list[$:/StoryList]]\">\n<$link>\n{{$:/core/images/edit-button}} <$text text=<<currentTiddler>>/>\n</$link>\n</$list>\n</$reveal>\n"
        },
        "$:/core/ui/PageTemplate/pluginreloadwarning": {
            "title": "$:/core/ui/PageTemplate/pluginreloadwarning",
            "tags": "$:/tags/PageTemplate",
            "text": "\\define lingo-base() $:/language/\n\n<$list filter=\"[{$:/status/RequireReloadDueToPluginChange}match[yes]]\">\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": "\\whitespace trim\n\\define config-title()\n$:/config/SideBarSegments/Visibility/$(listItem)$\n\\end\n\n<$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<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBarSegment]!has[draft.of]]\" variable=\"listItem\">\n\n<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"  tag=\"div\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n\n</$reveal>\n\n</$list>\n\n</$reveal>\n\n</div>\n\n</$scrollable>\n"
        },
        "$:/core/ui/PageTemplate/story": {
            "title": "$:/core/ui/PageTemplate/story",
            "tags": "$:/tags/PageTemplate",
            "text": "\\whitespace trim\n<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={{$:/config/ui/ViewTemplate}} editTemplate={{$:/config/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\" storyview=\"pop\">\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\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
        },
        "$:/core/ui/PageTemplate": {
            "title": "$:/core/ui/PageTemplate",
            "name": "{{$:/language/PageTemplate/Name}}",
            "description": "{{$:/language/PageTemplate/Description}}",
            "text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$vars\n\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\n\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\n\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\n\ttv-enable-drag-and-drop={{$:/config/DragAndDrop/Enable}}\n\ttv-show-missing-links={{$:/config/MissingLinks}}\n\tstoryviewTitle={{$:/view}}\n\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n\n<$dropzone enable=<<tv-enable-drag-and-drop>>>\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</$vars>\n"
        },
        "$:/PaletteManager": {
            "title": "$:/PaletteManager",
            "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\\define edit-colour-placeholder()\n edit $(colourName)$\n\\end\n\\define colour-tooltip(showhide) $showhide$ editor for $(newColourName)$ \n\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\\define delete-colour-index-actions() <$action-setfield $index=<<colourName>>/>\n\\define palette-manager-colour-row-segment()\n\\whitespace trim\n<$edit-text index=<<colourName>> tag=\"input\" placeholder=<<edit-colour-placeholder>> default=\"\"/>\n<br>\n<$edit-text index=<<colourName>> type=\"color\" tag=\"input\" class=\"tc-palette-manager-colour-input\"/>\n<$list filter=\"[<currentTiddler>getindex<colourName>removeprefix[<<]removesuffix[>>]] [<currentTiddler>getindex<colourName>removeprefix[<$]removesuffix[/>]]\" variable=\"ignore\">\n<$set name=\"state\" value={{{ [[$:/state/palettemanager/]addsuffix<currentTiddler>addsuffix[/]addsuffix<colourName>] }}}>\n<$wikify name=\"newColourName\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall={{{ [<currentTiddler>getindex<colourName>] }}}/>\"\"\">\n<$reveal state=<<state>> type=\"nomatch\" text=\"show\">\n<$button tooltip=<<colour-tooltip show>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" set=<<state>> setTo=\"show\">{{$:/core/images/down-arrow}}<$text text=<<newColourName>> class=\"tc-small-gap-left\"/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$button tooltip=<<colour-tooltip hide>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" actions=\"\"\"<$action-deletetiddler $tiddler=<<state>>/>\"\"\">{{$:/core/images/up-arrow}}<$text text=<<newColourName>> class=\"tc-small-gap-left\"/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$set name=\"colourName\" value=<<newColourName>>>\n<br>\n<<palette-manager-colour-row-segment>>\n<br><br>\n</$set>\n</$reveal>\n</$wikify>\n</$set>\n</$list>\n\\end\n\\define palette-manager-colour-row()\n\\whitespace trim\n<tr>\n<td>\n<span style=\"float:right;\">\n<$button tooltip={{$:/language/ControlPanel/Palette/Editor/Delete/Hint}} aria-label={{$:/language/ControlPanel/Palette/Editor/Delete/Hint}} class=\"tc-btn-invisible\" actions=<<delete-colour-index-actions>>>\n{{$:/core/images/delete-button}}</$button>\n</span>\n''<$macrocall $name=\"describePaletteColour\" colour=<<colourName>>/>''<br/>\n<$macrocall $name=\"colourName\" $output=\"text/plain\"/>\n</td>\n<td>\n<<palette-manager-colour-row-segment>>\n</td>\n</tr>\n\\end\n\\define palette-manager-table()\n\\whitespace trim\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]indexes[]]\" variable=\"colourName\">\n<$list filter=\"[<currentTiddler>indexes[]removeprefix<colourName>suffix[]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[{$:/state/palettemanager/showexternal}removeprefix[yes]suffix[]]\" variable=\"ignore\">\n<<palette-manager-colour-row>>\n</$list>\n\"\"\">\n<<palette-manager-colour-row>>\n</$list>\n</$list>\n</tbody>\n</table>\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<$checkbox tiddler=\"$:/state/palettemanager/showexternal\" field=\"text\" checked=\"yes\" unchecked=\"no\"><span class=\"tc-small-gap-left\"><<lingo Names/External/Show>></span></$checkbox>\n\n<<palette-manager-table>>\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\\define default-tiddler-title()\n$:/core/ui/PluginInfo/Default/$(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\">\n<$transclude tiddler=<<default-tiddler-title>> mode=\"block\">\n{{$:/language/ControlPanel/Plugin/NoInfoFound/Hint}}\n</$transclude>\n</$transclude>\n</$transclude>\n</$transclude>\n"
        },
        "$:/core/ui/PluginInfo/Default/contents": {
            "title": "$:/core/ui/PluginInfo/Default/contents",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link />\n</li>\n</$list>\n</ul>\n"
        },
        "$:/core/ui/PluginListItemTemplate": {
            "title": "$:/core/ui/PluginListItemTemplate",
            "text": "<div class=\"tc-menu-list-item\">\n<$link to={{!!title}}><$view field=\"description\"><$view field=\"title\"/></$view></$link>\n</div>"
        },
        "$:/core/ui/RootTemplate": {
            "title": "$:/core/ui/RootTemplate",
            "text": "<$transclude tiddler={{{ [{$:/layout}has[text]] ~[[$:/core/ui/PageTemplate]] }}} mode=\"inline\"/>\n\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}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab/search-results/sidebar\"/>\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<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\" default={{$:/config/DefaultMoreSidebarTab}} state=\"$:/state/tab/moresidebar\" class=\"tc-vertical tc-sidebar-tabs-more\" explicitState=\"$:/state/tab/moresidebar-1850697562\"/>\n</div>\n"
        },
        "$:/core/ui/SideBar/Open": {
            "title": "$:/core/ui/SideBar/Open",
            "tags": "$:/tags/SideBar",
            "caption": "{{$:/language/SideBar/Open/Caption}}",
            "text": "\\whitespace trim\n\\define lingo-base() $:/language/CloseAll/\n\n\\define drop-actions()\n<$action-listops $tiddler=<<tv-story-list>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define placeholder()\n<div class=\"tc-droppable-placeholder\"/>\n\\end\n\n\\define droppable-item(button)\n\\whitespace trim\n<$droppable actions=<<drop-actions>> enable=<<tv-allow-drag-and-drop>>>\n<<placeholder>>\n<div>\n$button$\n</div>\n</$droppable>\n\\end\n\n<div class=\"tc-sidebar-tab-open\">\n<$list filter=\"[list<tv-story-list>]\" history=<<tv-history-list>> storyview=\"pop\">\n<div class=\"tc-sidebar-tab-open-item\">\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=\"tc-btn-invisible tc-btn-mini tc-small-gap-right\">{{$:/core/images/close-button}}</$button><$link to={{!!title}}><$view field=\"title\"/></$link>\"\"\"/>\n</div>\n</$list>\n<$tiddler tiddler=\"\">\n<div>\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-all-tiddlers\" class=\"tc-btn-invisible tc-btn-mini\"><<lingo Button>></$button>\"\"\"/>\n</div>\n</$tiddler>\n</div>\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;\" class={{{ [<listItem>encodeuricomponent[]addprefix[tc-btn-]] }}}>\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": "<$transclude tiddler=\"$:/core/ui/SideBarSegments/search\"/>\n\n<$transclude tiddler=\"$:/core/ui/SideBarSegments/tabs\"/>\n\n"
        },
        "$:/core/ui/SideBarSegments/page-controls": {
            "title": "$:/core/ui/SideBarSegments/page-controls",
            "tags": "$:/tags/SideBarSegment",
            "text": "{{||$:/core/ui/PageTemplate/pagecontrols}}\n"
        },
        "$:/core/ui/SideBarSegments/search": {
            "title": "$:/core/ui/SideBarSegments/search",
            "tags": "$:/tags/SideBarSegment",
            "text": "\\whitespace trim\n\n\\define count-popup-button()\n\\whitespace trim\n<$button popup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<$list filter=\"[{$(searchTiddler)$}minlength{$:/config/Search/MinLength}limit[1]]\" variable=\"listItem\">\n<$vars userInput={{{ [<searchTiddler>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} replaceRegexp=\"limit\\[\\d+\\]\">\n<$vars primaryListFilter={{{ [<configTiddler>get[first-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}} secondaryListFilter={{{ [<configTiddler>get[second-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}}>\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[subfilter<primaryListFilter>] [subfilter<secondaryListFilter>]\"/>\"\"\">\n{{$:/language/Search/Matches}}\n</$set>\n</$vars>\n</$vars>\n</$list>\n</$button>\n\\end\n\n\\define search-results-list()\n\\whitespace trim\n<$vars userInput={{$(searchTiddler)$}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}>\n<$list filter=\"[<userInput>minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$tiddler tiddler=<<configTiddler>>>\n\n{{$:/core/ui/SearchResults}}\n\n</$tiddler>\n\n</$list>\n</$vars>\n\\end\n\n\\define cancel-search-actions() <$list filter=\"[<searchTiddler>get[text]!match{$:/temp/search}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/search]] [<searchTiddler>] [<searchListState>]\"/>\"\"\"><$action-setfield $tiddler=\"$:/temp/search\" text={{{ [<searchTiddler>get[text]] }}}/><$action-setfield $tiddler=\"$:/temp/search/refresh\" text=\"yes\"/></$list>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define advanced-search-actions() <$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search/input}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/search/input}}/><<delete-state-tiddlers>><$action-navigate $to=\"$:/AdvancedSearch\"/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\" preventScroll=\"true\"/><$action-deletetiddler $filter=\"$:/temp/search $:/temp/search/input $:/temp/search/refresh [<searchListState>]\"/>\n\n<div class=\"tc-sidebar-lists tc-sidebar-search\">\n\n<$vars editTiddler=\"$:/temp/search\" searchTiddler=\"$:/temp/search/input\" searchListState=<<qualify \"$:/state/search-list/selected-item\">>>\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$keyboard key=\"((advanced-search-sidebar))\" actions=<<advanced-search-actions>>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<editTiddler>> storeTitle=<<searchTiddler>> \n\t\tselectionStateTitle=<<searchListState>> refreshTitle=\"$:/temp/search/refresh\" type=\"search\" \n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify \"$:/state/popup/search-dropdown\">> \n\t\tclass=\"tc-popup-handle\" filterMinLength={{$:/config/Search/MinLength}} inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> cancelPopups=\"yes\" \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\"/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n<$reveal state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<<advanced-search-actions>>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>><$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n{{$:/core/images/close-button}}\n</$button>\n<<count-popup-button>>\n</$reveal>\n<$reveal state=<<searchTiddler>> 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=<<searchTiddler>> 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<<search-results-list>>\n\n</$reveal>\n\n</$reveal>\n\n</$vars>\n\n</div>\n"
        },
        "$:/core/ui/SideBarSegments/site-subtitle": {
            "title": "$:/core/ui/SideBarSegments/site-subtitle",
            "tags": "$:/tags/SideBarSegment",
            "text": "<div class=\"tc-site-subtitle\">\n\n<$transclude tiddler=\"$:/SiteSubtitle\" mode=\"inline\"/>\n\n</div>\n"
        },
        "$:/core/ui/SideBarSegments/site-title": {
            "title": "$:/core/ui/SideBarSegments/site-title",
            "tags": "$:/tags/SideBarSegment",
            "text": "<h1 class=\"tc-site-title\">\n\n<$transclude tiddler=\"$:/SiteTitle\" mode=\"inline\"/>\n\n</h1>\n"
        },
        "$:/core/ui/SideBarSegments/tabs": {
            "title": "$:/core/ui/SideBarSegments/tabs",
            "tags": "$:/tags/SideBarSegment",
            "text": "<div class=\"tc-sidebar-lists tc-sidebar-tabs\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\" default={{$:/config/DefaultSidebarTab}} state=\"$:/state/tab/sidebar\" class=\"tc-sidebar-tabs-main\" explicitState=\"$:/state/tab/sidebar--595412856\"/>\n\n</div>\n"
        },
        "$:/core/ui/SwitcherModal": {
            "title": "$:/core/ui/SwitcherModal",
            "subtitle": "<$text text={{{[<switch>lookup[$:/language/Switcher/Subtitle/]]}}}/>",
            "class": "tc-modal-centered",
            "text": "<$tiddler tiddler={{{[<switch>lookup[$:/config/SwitcherTargets/]]}}}>\n\n\n<$transclude/>\n\n\n</$tiddler>"
        },
        "$:/TagManager": {
            "title": "$:/TagManager",
            "icon": "$:/core/images/tag-button",
            "color": "#bbb",
            "text": "\\define lingo-base() $:/language/TagManager/\n\\define iconEditorTab(type)\n\\whitespace trim\n<$link to=\"\"><<lingo Icons/None>></$link>\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\\whitespace trim\n<div class=\"tc-drop-down-wrapper\">\n<$button popupTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal stateTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=<<__title__>> icon=<<navigateTo>>/>\"\"\">\n<<iconEditorTab type:\"!\">>\n<hr/>\n<<iconEditorTab type:\"\">>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n\\end\n\\define toggleButton(state)\n\\whitespace trim\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"closed\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"open\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"open\" default=\"closed\">\n<$button setTitle=<<__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\\whitespace trim\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>{{||$:/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={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} /> \n</td>\n</tr>\n<tr>\n<td></td>\n<td colspan=\"4\">\n<$reveal stateTitle={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} 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 style=\"position:relative;\">\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/TagPickerTagTemplate": {
            "title": "$:/core/ui/TagPickerTagTemplate",
            "text": "\\whitespace trim\n<$button class=<<button-classes>> tag=\"a\" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}>\n<$list filter=\"[<saveTiddler>minlength[1]]\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter=\"[<tag>]\"/>\n</$list>\n<$set name=\"currentTiddlerCSSEscaped\" value={{{ [<saveTiddler>escapecss[]] }}}>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-tagpicker-focus-selector>> preventScroll=\"true\"/>\n</$set>\n<<delete-tag-state-tiddlers>>\n<$list filter=\"[<refreshTitle>minlength[1]]\">\n<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n<<actions>>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<$wikify name=\"foregroundColor\" text=\"\"\"<$macrocall $name=\"contrastcolour\" target={{!!color}} fallbackTarget=<<fallbackTarget>> colourA=<<colourA>> colourB=<<colourB>>/>\"\"\">\n<span class=\"tc-tag-label tc-btn-invisible\" style=<<tag-pill-styles>>>\n<$transclude tiddler={{!!icon}}/><$view field=\"title\" format=\"text\"/>\n</span>\n</$wikify>\n</$set>\n</$button>\n"
        },
        "$:/core/ui/TagTemplate": {
            "title": "$:/core/ui/TagTemplate",
            "text": "\\whitespace trim\n<span class=\"tc-tag-list-item\" data-tag-title=<<currentTiddler>>>\n<$set name=\"transclusion\" value=<<currentTiddler>>>\n<$macrocall $name=\"tag-pill-body\" tag=<<currentTiddler>> icon={{!!icon}} colour={{!!color}} palette={{$:/palette}} element-tag=\"\"\"$button\"\"\" element-attributes=\"\"\"popup=<<qualify \"$:/state/popup/tag\">> dragFilter='[all[current]tagging[]]' tag='span'\"\"\"/>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\" animate=\"yes\" class=\"tc-drop-down\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</$set>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TagDropdown]!has[draft.of]]\" variable=\"listItem\"> \n<$transclude tiddler=<<listItem>>/> \n</$list>\n<hr>\n<$macrocall $name=\"list-tagged-draggable\" tag=<<currentTiddler>>/>\n</$reveal>\n</$set>\n</span>\n"
        },
        "$:/core/ui/TiddlerFieldTemplate": {
            "title": "$:/core/ui/TiddlerFieldTemplate",
            "text": "<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<listItem>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<listItem>>/>\n</td>\n</tr>"
        },
        "$:/core/ui/TiddlerFields": {
            "title": "$:/core/ui/TiddlerFields",
            "text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/TiddlerInfo/Advanced/PluginInfo": {
            "title": "$:/core/ui/TiddlerInfo/Advanced/PluginInfo",
            "tags": "$:/tags/TiddlerInfo/Advanced",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<$list filter=\"[all[current]has[plugin-type]]\">\n\n! <<lingo Heading>>\n\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</li>\n</$list>\n</ul>\n\n</$list>\n"
        },
        "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo": {
            "title": "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo",
            "tags": "$:/tags/TiddlerInfo/Advanced",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/ShadowInfo/\n<$set name=\"infoTiddler\" value=<<currentTiddler>>>\n\n''<<lingo Heading>>''\n\n<$list filter=\"[all[current]!is[shadow]]\">\n\n<<lingo NotShadow/Hint>>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]]\">\n\n<<lingo Shadow/Hint>>\n\n<$list filter=\"[all[current]shadowsource[]]\">\n\n<$set name=\"pluginTiddler\" value=<<currentTiddler>>>\n<<lingo Shadow/Source>>\n</$set>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\">\n\n<<lingo OverriddenShadow/Hint>>\n\n</$list>\n\n\n</$list>\n</$set>\n"
        },
        "$:/core/ui/TiddlerInfo/Advanced": {
            "title": "$:/core/ui/TiddlerInfo/Advanced",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/Advanced/Caption}}",
            "text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\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>"
        },
        "$:/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": "<div style=\"position:relative;\">\n<div class=\"tc-tiddler-controls\" style=\"position:absolute;right:0;\">\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n</div>\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\" default={{$:/config/TiddlerInfo/Default}}/>\n"
        },
        "$:/core/ui/TopBar/menu": {
            "title": "$:/core/ui/TopBar/menu",
            "tags": "$:/tags/TopRightBar",
            "text": "<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]!match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible tc-hide-sidebar-btn\">{{$:/core/images/chevron-right}}</$button>\n</$list>\n<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible tc-show-sidebar-btn\">{{$:/core/images/chevron-left}}</$button>\n</$list>\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\" stateTitle=<<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\\define buttons()\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<<lingo Listing/Preview>> <$select tiddler=\"$:/state/importpreviewtype\" default=\"$:/core/ui/ImportPreviews/Text\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ImportPreview]!has[draft.of]]\">\n<option value=<<currentTiddler>>>{{!!caption}}</option>\n</$list>\n</$select>\n\\end\n\n<$list filter=\"[all[current]field:plugin-type[import]]\">\n\n<div class=\"tc-import\">\n\n<<lingo Listing/Hint>>\n\n<<buttons>>\n\n{{||$:/core/ui/ImportListing}}\n\n<<buttons>>\n\n</div>\n\n</$list>\n"
        },
        "$:/core/ui/ViewTemplate/plugin": {
            "title": "$:/core/ui/ViewTemplate/plugin",
            "tags": "$:/tags/ViewTemplate",
            "text": "<$reveal tag=\"div\" class=\"tc-tiddler-plugin-info\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[current]has[plugin-type]] -[all[current]field:plugin-type[import]]\">\n<$set name=\"plugin-type\" value={{!!plugin-type}}>\n<$set name=\"default-popup-state\" value=\"yes\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n{{||$:/core/ui/Components/plugin-info}}\n</$set>\n</$set>\n</$set>\n</$list>\n</$reveal>"
        },
        "$:/core/ui/ViewTemplate/subtitle": {
            "title": "$:/core/ui/ViewTemplate/subtitle",
            "tags": "$:/tags/ViewTemplate",
            "text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}} />\n<$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\" stateTitle=<<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>\n"
        },
        "$:/core/ui/ViewTemplate/title": {
            "title": "$:/core/ui/ViewTemplate/title",
            "tags": "$:/tags/ViewTemplate",
            "text": "\\whitespace trim\n\\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\"><$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\"><$transclude tiddler=<<listItem>>/></$set></$reveal></$list>\n</span>\n<$set name=\"tv-wikilinks\" value={{$:/config/Tiddlers/TitleLinks}}>\n<$link>\n<$set name=\"foregroundColor\" value={{!!color}}>\n<$list filter=\"[all[current]has[icon]]~[[$:/config/DefaultTiddlerIcon]has[text]]\">\n<span class=\"tc-tiddler-title-icon\" style=<<title-styles>>>\n<$transclude tiddler={{!!icon}}>\n<$transclude tiddler={{$:/config/DefaultTiddlerIcon}}/>\n</$transclude>\n</span>\n</$list>\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<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>> mode=\"block\"/></$list>\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\" stateTitle=<<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\" stateTitle=<<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 folded-state()\n$:/state/folded/$(currentTiddler)$\n\\end\n\\define cancel-delete-tiddler-actions(message) <$action-sendmessage $message=\"tm-$message$-tiddler\"/>\n\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$vars storyTiddler=<<currentTiddler>> tiddlerInfoState=<<qualify \"$:/state/popup/tiddler-info\">>><div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-view-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[shadow]is[tiddler]then[tc-tiddler-overridden-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>>/></$list>\n</div>\n</$vars>\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": "\\whitespace trim\n<$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>match[yes]]\">\n{{$:/core/images/clone-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Clone/Caption}}/>\n</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": "\\whitespace trim\n<$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>match[yes]]\">\n{{$:/core/images/close-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/CloseOthers/Caption}}/>\n</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": "\\whitespace trim\n<$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>match[yes]]\">\n{{$:/core/images/close-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Close/Caption}}/>\n</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": "\\whitespace trim\n<$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>match[yes]]\">\n{{$:/core/images/edit-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Edit/Caption}}/>\n</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": "{{$:/core/images/chevron-up}} {{$:/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": "\\whitespace trim\n<$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>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/FoldOthers/Caption}}/>\n</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": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$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>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Fold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$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>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Unfold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n"
        },
        "$:/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": "\\whitespace trim\n\\define button-content()\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/info-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Info/Caption}}/>\n</span>\n</$list>\n\\end\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"popup\">\n<$button popup=<<tiddlerInfoState>> tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$reveal state=<<tiddlerInfoState>> type=\"match\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"yes\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=<<tiddlerInfoState>> type=\"nomatch\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n</$reveal>"
        },
        "$:/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": "\\whitespace trim\n\\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>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/More/Caption}}/>\n</span>\n</$list>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"belowleft\" 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<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\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": "\\whitespace trim\n\\define newHereActions()\n<$set name=\"tags\" filter=\"[<currentTiddler>] [{$:/config/NewTiddler/Tags}]\">\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<tags>>/>\n</$set>\n\\end\n\\define newHereButton()\n<$button actions=<<newHereActions>> tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-here-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewHere/Caption}}/>\n</span>\n</$list>\n</$button>\n\\end\n<<newHereButton>>\n"
        },
        "$:/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": "\\whitespace trim\n\\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<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewJournalHere/Caption}}/>\n</span>\n</$list>\n</$wikify>\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>\n</$set>\n</$set>\n"
        },
        "$:/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": "\\whitespace trim\n<$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>match[yes]]\">\n{{$:/core/images/open-window}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/OpenWindow/Caption}}/>\n</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": "\\whitespace trim\n<$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>match[yes]]\">\n{{$:/core/images/permalink-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permalink/Caption}}/>\n</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": "\\whitespace trim\n<$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>match[yes]]\">\n{{$:/core/images/permaview-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permaview/Caption}}/>\n</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/AutoFocus": {
            "title": "$:/config/AutoFocus",
            "text": "title"
        },
        "$:/config/AutoSave": {
            "title": "$:/config/AutoSave",
            "text": "yes"
        },
        "$:/config/BitmapEditor/Colour": {
            "title": "$:/config/BitmapEditor/Colour",
            "text": "#444"
        },
        "$:/config/BitmapEditor/ImageSizes": {
            "title": "$:/config/BitmapEditor/ImageSizes",
            "text": "[[62px 100px]] [[100px 62px]] [[124px 200px]] [[200px 124px]] [[248px 400px]] [[371px 600px]] [[400px 248px]] [[556px 900px]] [[600px 371px]] [[742px 1200px]] [[900px 556px]] [[1200px 742px]]"
        },
        "$:/config/BitmapEditor/LineWidth": {
            "title": "$:/config/BitmapEditor/LineWidth",
            "text": "3px"
        },
        "$:/config/BitmapEditor/LineWidths": {
            "title": "$:/config/BitmapEditor/LineWidths",
            "text": "0.25px 0.5px 1px 2px 3px 4px 6px 8px 10px 16px 20px 28px 40px 56px 80px"
        },
        "$:/config/BitmapEditor/Opacities": {
            "title": "$:/config/BitmapEditor/Opacities",
            "text": "0.01 0.025 0.05 0.075 0.1 0.15 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0"
        },
        "$:/config/BitmapEditor/Opacity": {
            "title": "$:/config/BitmapEditor/Opacity",
            "text": "1.0"
        },
        "$:/config/DefaultMoreSidebarTab": {
            "title": "$:/config/DefaultMoreSidebarTab",
            "text": "$:/core/ui/MoreSideBar/Tags"
        },
        "$:/config/DefaultSidebarTab": {
            "title": "$:/config/DefaultSidebarTab",
            "text": "$:/core/ui/SideBar/Open"
        },
        "$:/config/DownloadSaver/AutoSave": {
            "title": "$:/config/DownloadSaver/AutoSave",
            "text": "no"
        },
        "$:/config/Drafts/TypingTimeout": {
            "title": "$:/config/Drafts/TypingTimeout",
            "text": "400"
        },
        "$:/config/EditMode/fieldname-filter": {
            "title": "$:/config/EditMode/fieldname-filter",
            "first-search-filter": "[!is[shadow]!is[system]fields[]search:title<userInput>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type",
            "second-search-filter": "[fields[]search:title<userInput>sort[]] -[!is[shadow]!is[system]fields[]]"
        },
        "$:/config/EditTabIndex": {
            "title": "$:/config/EditTabIndex",
            "text": "1\n"
        },
        "$:/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/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4": {
            "title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4",
            "text": "hide"
        },
        "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5": {
            "title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5",
            "text": "hide"
        },
        "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6": {
            "title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6",
            "text": "hide"
        },
        "$:/config/EditorTypeMappings/image/gif": {
            "title": "$:/config/EditorTypeMappings/image/gif",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/webp": {
            "title": "$:/config/EditorTypeMappings/image/webp",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/heic": {
            "title": "$:/config/EditorTypeMappings/image/heic",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/heif": {
            "title": "$:/config/EditorTypeMappings/image/heif",
            "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/Manager/Show": {
            "title": "$:/config/Manager/Show",
            "text": "tiddlers"
        },
        "$:/config/Manager/Filter": {
            "title": "$:/config/Manager/Filter",
            "text": ""
        },
        "$:/config/Manager/Order": {
            "title": "$:/config/Manager/Order",
            "text": "forward"
        },
        "$:/config/Manager/Sort": {
            "title": "$:/config/Manager/Sort",
            "text": "title"
        },
        "$:/config/Manager/System": {
            "title": "$:/config/Manager/System",
            "text": "system"
        },
        "$:/config/Manager/Tag": {
            "title": "$:/config/Manager/Tag",
            "text": ""
        },
        "$:/state/popup/manager/item/$:/Manager/ItemMain/RawText": {
            "title": "$:/state/popup/manager/item/$:/Manager/ItemMain/RawText",
            "text": "hide"
        },
        "$:/config/MissingLinks": {
            "title": "$:/config/MissingLinks",
            "text": "yes"
        },
        "$:/config/Navigation/UpdateAddressBar": {
            "title": "$:/config/Navigation/UpdateAddressBar",
            "text": "no"
        },
        "$:/config/Navigation/UpdateHistory": {
            "title": "$:/config/Navigation/UpdateHistory",
            "text": "no"
        },
        "$:/config/NewImageType": {
            "title": "$:/config/NewImageType",
            "text": "jpeg"
        },
        "$:/config/OfficialPluginLibrary": {
            "title": "$:/config/OfficialPluginLibrary",
            "tags": "$:/tags/PluginLibrary",
            "url": "https://tiddlywiki.com/library/v5.1.24/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/manager": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/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/new-image": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image",
            "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/print": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print",
            "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/timestamp": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp",
            "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/RegisterPluginType/plugin": {
            "title": "$:/config/RegisterPluginType/plugin",
            "text": "yes"
        },
        "$:/config/RegisterPluginType/theme": {
            "title": "$:/config/RegisterPluginType/theme",
            "text": "no"
        },
        "$:/config/RegisterPluginType/language": {
            "title": "$:/config/RegisterPluginType/language",
            "text": "no"
        },
        "$:/config/RegisterPluginType/info": {
            "title": "$:/config/RegisterPluginType/info",
            "text": "yes"
        },
        "$:/config/RegisterPluginType/import": {
            "title": "$:/config/RegisterPluginType/import",
            "text": "no"
        },
        "$:/config/SaveWikiButton/Template": {
            "title": "$:/config/SaveWikiButton/Template",
            "text": "$:/core/save/all"
        },
        "$:/config/SaverFilter": {
            "title": "$:/config/SaverFilter",
            "text": "[all[]] -[prefix[$:/HistoryList]] -[prefix[$:/StoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\n"
        },
        "$:/config/Search/AutoFocus": {
            "title": "$:/config/Search/AutoFocus",
            "text": "true"
        },
        "$:/config/Search/MinLength": {
            "title": "$:/config/Search/MinLength",
            "text": "3"
        },
        "$:/config/SearchResults/Default": {
            "title": "$:/config/SearchResults/Default",
            "text": "$:/core/ui/DefaultSearchResultList"
        },
        "$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]": {
            "title": "$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]",
            "text": "yes"
        },
        "$:/config/ShortcutInfo/add-field": {
            "title": "$:/config/ShortcutInfo/add-field",
            "text": "{{$:/language/EditTemplate/Fields/Add/Button/Hint}}"
        },
        "$:/config/ShortcutInfo/advanced-search": {
            "title": "$:/config/ShortcutInfo/advanced-search",
            "text": "{{$:/language/Buttons/AdvancedSearch/Hint}}"
        },
        "$:/config/ShortcutInfo/advanced-search-sidebar": {
            "title": "$:/config/ShortcutInfo/advanced-search-sidebar",
            "text": "{{$:/language/Shortcuts/Input/AdvancedSearch/Hint}}"
        },
        "$:/config/ShortcutInfo/bold": {
            "title": "$:/config/ShortcutInfo/bold",
            "text": "{{$:/language/Buttons/Bold/Hint}}"
        },
        "$:/config/ShortcutInfo/cancel-edit-tiddler": {
            "title": "$:/config/ShortcutInfo/cancel-edit-tiddler",
            "text": "{{$:/language/Buttons/Cancel/Hint}}"
        },
        "$:/config/ShortcutInfo/change-sidebar-layout": {
            "title": "$:/config/ShortcutInfo/change-sidebar-layout",
            "text": "{{$:/language/Shortcuts/SidebarLayout/Hint}}"
        },
        "$:/config/ShortcutInfo/delete-field": {
            "title": "$:/config/ShortcutInfo/delete-field",
            "text": "{{$:/language/EditTemplate/Field/Remove/Hint}}"
        },
        "$:/config/ShortcutInfo/excise": {
            "title": "$:/config/ShortcutInfo/excise",
            "text": "{{$:/language/Buttons/Excise/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-1": {
            "title": "$:/config/ShortcutInfo/heading-1",
            "text": "{{$:/language/Buttons/Heading1/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-2": {
            "title": "$:/config/ShortcutInfo/heading-2",
            "text": "{{$:/language/Buttons/Heading2/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-3": {
            "title": "$:/config/ShortcutInfo/heading-3",
            "text": "{{$:/language/Buttons/Heading3/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-4": {
            "title": "$:/config/ShortcutInfo/heading-4",
            "text": "{{$:/language/Buttons/Heading4/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-5": {
            "title": "$:/config/ShortcutInfo/heading-5",
            "text": "{{$:/language/Buttons/Heading5/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-6": {
            "title": "$:/config/ShortcutInfo/heading-6",
            "text": "{{$:/language/Buttons/Heading6/Hint}}"
        },
        "$:/config/ShortcutInfo/input-accept": {
            "title": "$:/config/ShortcutInfo/input-accept",
            "text": "{{$:/language/Shortcuts/Input/Accept/Hint}}"
        },
        "$:/config/ShortcutInfo/input-accept-variant": {
            "title": "$:/config/ShortcutInfo/input-accept-variant",
            "text": "{{$:/language/Shortcuts/Input/AcceptVariant/Hint}}"
        },
        "$:/config/ShortcutInfo/input-cancel": {
            "title": "$:/config/ShortcutInfo/input-cancel",
            "text": "{{$:/language/Shortcuts/Input/Cancel/Hint}}"
        },
        "$:/config/ShortcutInfo/input-down": {
            "title": "$:/config/ShortcutInfo/input-down",
            "text": "{{$:/language/Shortcuts/Input/Down/Hint}}"
        },
        "$:/config/ShortcutInfo/input-tab-left": {
            "title": "$:/config/ShortcutInfo/input-tab-left",
            "text": "{{$:/language/Shortcuts/Input/Tab-Left/Hint}}"
        },
        "$:/config/ShortcutInfo/input-tab-right": {
            "title": "$:/config/ShortcutInfo/input-tab-right",
            "text": "{{$:/language/Shortcuts/Input/Tab-Right/Hint}}"
        },
        "$:/config/ShortcutInfo/input-up": {
            "title": "$:/config/ShortcutInfo/input-up",
            "text": "{{$:/language/Shortcuts/Input/Up/Hint}}"
        },
        "$:/config/ShortcutInfo/italic": {
            "title": "$:/config/ShortcutInfo/italic",
            "text": "{{$:/language/Buttons/Italic/Hint}}"
        },
        "$:/config/ShortcutInfo/layout-switcher": {
            "title": "$:/config/ShortcutInfo/layout-switcher",
            "text": "{{$:/language/LayoutSwitcher/Description}}"
        },
        "$:/config/ShortcutInfo/link": {
            "title": "$:/config/ShortcutInfo/link",
            "text": "{{$:/language/Buttons/Link/Hint}}"
        },
        "$:/config/ShortcutInfo/linkify": {
            "title": "$:/config/ShortcutInfo/linkify",
            "text": "{{$:/language/Buttons/Linkify/Hint}}"
        },
        "$:/config/ShortcutInfo/list-bullet": {
            "title": "$:/config/ShortcutInfo/list-bullet",
            "text": "{{$:/language/Buttons/ListBullet/Hint}}"
        },
        "$:/config/ShortcutInfo/list-number": {
            "title": "$:/config/ShortcutInfo/list-number",
            "text": "{{$:/language/Buttons/ListNumber/Hint}}"
        },
        "$:/config/ShortcutInfo/mono-block": {
            "title": "$:/config/ShortcutInfo/mono-block",
            "text": "{{$:/language/Buttons/MonoBlock/Hint}}"
        },
        "$:/config/ShortcutInfo/mono-line": {
            "title": "$:/config/ShortcutInfo/mono-line",
            "text": "{{$:/language/Buttons/MonoLine/Hint}}"
        },
        "$:/config/ShortcutInfo/new-image": {
            "title": "$:/config/ShortcutInfo/new-image",
            "text": "{{$:/language/Buttons/NewImage/Hint}}"
        },
        "$:/config/ShortcutInfo/new-journal": {
            "title": "$:/config/ShortcutInfo/new-journal",
            "text": "{{$:/language/Buttons/NewJournal/Hint}}"
        },
        "$:/config/ShortcutInfo/new-tiddler": {
            "title": "$:/config/ShortcutInfo/new-tiddler",
            "text": "{{$:/language/Buttons/NewTiddler/Hint}}"
        },
        "$:/config/ShortcutInfo/picture": {
            "title": "$:/config/ShortcutInfo/picture",
            "text": "{{$:/language/Buttons/Picture/Hint}}"
        },
        "$:/config/ShortcutInfo/preview": {
            "title": "$:/config/ShortcutInfo/preview",
            "text": "{{$:/language/Buttons/Preview/Hint}}"
        },
        "$:/config/ShortcutInfo/quote": {
            "title": "$:/config/ShortcutInfo/quote",
            "text": "{{$:/language/Buttons/Quote/Hint}}"
        },
        "$:/config/ShortcutInfo/save-tiddler": {
            "title": "$:/config/ShortcutInfo/save-tiddler",
            "text": "{{$:/language/Buttons/Save/Hint}}"
        },
        "$:/config/ShortcutInfo/save-wiki": {
            "title": "$:/config/ShortcutInfo/save-wiki",
            "text": "{{$:/language/Buttons/SaveWiki/Hint}}"
        },
        "$:/config/ShortcutInfo/sidebar-search": {
            "title": "$:/config/ShortcutInfo/sidebar-search",
            "text": "{{$:/language/Buttons/SidebarSearch/Hint}}"
        },
        "$:/config/ShortcutInfo/stamp": {
            "title": "$:/config/ShortcutInfo/stamp",
            "text": "{{$:/language/Buttons/Stamp/Hint}}"
        },
        "$:/config/ShortcutInfo/strikethrough": {
            "title": "$:/config/ShortcutInfo/strikethrough",
            "text": "{{$:/language/Buttons/Strikethrough/Hint}}"
        },
        "$:/config/ShortcutInfo/subscript": {
            "title": "$:/config/ShortcutInfo/subscript",
            "text": "{{$:/language/Buttons/Subscript/Hint}}"
        },
        "$:/config/ShortcutInfo/superscript": {
            "title": "$:/config/ShortcutInfo/superscript",
            "text": "{{$:/language/Buttons/Superscript/Hint}}"
        },
        "$:/config/ShortcutInfo/toggle-sidebar": {
            "title": "$:/config/ShortcutInfo/toggle-sidebar",
            "text": "{{$:/language/Buttons/ToggleSidebar/Hint}}"
        },
        "$:/config/ShortcutInfo/transcludify": {
            "title": "$:/config/ShortcutInfo/transcludify",
            "text": "{{$:/language/Buttons/Transcludify/Hint}}"
        },
        "$:/config/ShortcutInfo/underline": {
            "title": "$:/config/ShortcutInfo/underline",
            "text": "{{$:/language/Buttons/Underline/Hint}}"
        },
        "$:/config/SwitcherTargets/layout": {
            "title": "$:/config/SwitcherTargets/layout",
            "text": "$:/snippets/LayoutSwitcher"
        },
        "$:/config/SwitcherTargets/language": {
            "title": "$:/config/SwitcherTargets/language",
            "text": "$:/snippets/languageswitcher"
        },
        "$:/config/SwitcherTargets/palette": {
            "title": "$:/config/SwitcherTargets/palette",
            "text": "$:/core/ui/ControlPanel/Palette"
        },
        "$:/config/SwitcherTargets/theme": {
            "title": "$:/config/SwitcherTargets/theme",
            "text": "$:/core/ui/ControlPanel/Theme"
        },
        "$:/config/SyncFilter": {
            "title": "$:/config/SyncFilter",
            "text": "[is[tiddler]] -[[$:/core]] -[[$:/library/sjcl.js]] -[prefix[$:/boot/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\n"
        },
        "$:/config/SyncSystemTiddlersFromServer": {
            "title": "$:/config/SyncSystemTiddlersFromServer",
            "text": "no"
        },
        "$:/config/Tags/MinLength": {
            "title": "$:/config/Tags/MinLength",
            "text": "0"
        },
        "$:/config/TextEditor/EditorHeight/Height": {
            "title": "$:/config/TextEditor/EditorHeight/Height",
            "text": "400px"
        },
        "$:/config/TextEditor/EditorHeight/Mode": {
            "title": "$:/config/TextEditor/EditorHeight/Mode",
            "text": "auto"
        },
        "$:/config/TiddlerInfo/Default": {
            "title": "$:/config/TiddlerInfo/Default",
            "text": "$:/core/ui/TiddlerInfo/Fields"
        },
        "$:/config/TiddlerInfo/Mode": {
            "title": "$:/config/TiddlerInfo/Mode",
            "text": "popup"
        },
        "$:/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-mac/bold": {
            "title": "$:/config/shortcuts-mac/bold",
            "text": "meta-B"
        },
        "$:/config/shortcuts-mac/input-tab-left": {
            "title": "$:/config/shortcuts-mac/input-tab-left",
            "text": "ctrl-Left"
        },
        "$:/config/shortcuts-mac/input-tab-right": {
            "title": "$:/config/shortcuts-mac/input-tab-right",
            "text": "ctrl-Right"
        },
        "$:/config/shortcuts-mac/italic": {
            "title": "$:/config/shortcuts-mac/italic",
            "text": "meta-I"
        },
        "$:/config/shortcuts-mac/underline": {
            "title": "$:/config/shortcuts-mac/underline",
            "text": "meta-U"
        },
        "$:/config/shortcuts-mac/new-image": {
            "title": "$:/config/shortcuts-mac/new-image",
            "text": "ctrl-I"
        },
        "$:/config/shortcuts-mac/new-journal": {
            "title": "$:/config/shortcuts-mac/new-journal",
            "text": "ctrl-J"
        },
        "$:/config/shortcuts-mac/new-tiddler": {
            "title": "$:/config/shortcuts-mac/new-tiddler",
            "text": "ctrl-N"
        },
        "$:/config/shortcuts-mac/save-wiki": {
            "title": "$:/config/shortcuts-mac/save-wiki",
            "text": "meta-S"
        },
        "$:/config/shortcuts-not-mac/bold": {
            "title": "$:/config/shortcuts-not-mac/bold",
            "text": "ctrl-B"
        },
        "$:/config/shortcuts-not-mac/italic": {
            "title": "$:/config/shortcuts-not-mac/italic",
            "text": "ctrl-I"
        },
        "$:/config/shortcuts-not-mac/underline": {
            "title": "$:/config/shortcuts-not-mac/underline",
            "text": "ctrl-U"
        },
        "$:/config/shortcuts-not-mac/new-image": {
            "title": "$:/config/shortcuts-not-mac/new-image",
            "text": "alt-I"
        },
        "$:/config/shortcuts-not-mac/new-journal": {
            "title": "$:/config/shortcuts-not-mac/new-journal",
            "text": "alt-J"
        },
        "$:/config/shortcuts-not-mac/new-tiddler": {
            "title": "$:/config/shortcuts-not-mac/new-tiddler",
            "text": "alt-N"
        },
        "$:/config/shortcuts/add-field": {
            "title": "$:/config/shortcuts/add-field",
            "text": "enter"
        },
        "$:/config/shortcuts/advanced-search": {
            "title": "$:/config/shortcuts/advanced-search",
            "text": "ctrl-shift-A"
        },
        "$:/config/shortcuts/advanced-search-sidebar": {
            "title": "$:/config/shortcuts/advanced-search-sidebar",
            "text": "alt-Enter"
        },
        "$:/config/shortcuts/cancel-edit-tiddler": {
            "title": "$:/config/shortcuts/cancel-edit-tiddler",
            "text": "escape"
        },
        "$:/config/shortcuts/change-sidebar-layout": {
            "title": "$:/config/shortcuts/change-sidebar-layout",
            "text": "shift-alt-Down"
        },
        "$:/config/shortcuts/delete-field": {
            "title": "$:/config/shortcuts/delete-field",
            "text": "shift-alt-D"
        },
        "$:/config/shortcuts/excise": {
            "title": "$:/config/shortcuts/excise",
            "text": "ctrl-E"
        },
        "$:/config/shortcuts/sidebar-search": {
            "title": "$:/config/shortcuts/sidebar-search",
            "text": "ctrl-shift-F"
        },
        "$:/config/shortcuts/heading-1": {
            "title": "$:/config/shortcuts/heading-1",
            "text": "ctrl-1"
        },
        "$:/config/shortcuts/heading-2": {
            "title": "$:/config/shortcuts/heading-2",
            "text": "ctrl-2"
        },
        "$:/config/shortcuts/heading-3": {
            "title": "$:/config/shortcuts/heading-3",
            "text": "ctrl-3"
        },
        "$:/config/shortcuts/heading-4": {
            "title": "$:/config/shortcuts/heading-4",
            "text": "ctrl-4"
        },
        "$:/config/shortcuts/heading-5": {
            "title": "$:/config/shortcuts/heading-5",
            "text": "ctrl-5"
        },
        "$:/config/shortcuts/heading-6": {
            "title": "$:/config/shortcuts/heading-6",
            "text": "ctrl-6"
        },
        "$:/config/shortcuts/input-accept": {
            "title": "$:/config/shortcuts/input-accept",
            "text": "Enter"
        },
        "$:/config/shortcuts/input-accept-variant": {
            "title": "$:/config/shortcuts/input-accept-variant",
            "text": "ctrl-Enter"
        },
        "$:/config/shortcuts/input-cancel": {
            "title": "$:/config/shortcuts/input-cancel",
            "text": "Escape"
        },
        "$:/config/shortcuts/input-down": {
            "title": "$:/config/shortcuts/input-down",
            "text": "Down"
        },
        "$:/config/shortcuts/input-tab-left": {
            "title": "$:/config/shortcuts/input-tab-left",
            "text": "alt-Left"
        },
        "$:/config/shortcuts/input-tab-right": {
            "title": "$:/config/shortcuts/input-tab-right",
            "text": "alt-Right"
        },
        "$:/config/shortcuts/input-up": {
            "title": "$:/config/shortcuts/input-up",
            "text": "Up"
        },
        "$:/config/shortcuts/layout-switcher": {
            "title": "$:/config/shortcuts/layout-switcher",
            "text": "ctrl-shift-L"
        },
        "$:/config/shortcuts/link": {
            "title": "$:/config/shortcuts/link",
            "text": "ctrl-L"
        },
        "$:/config/shortcuts/linkify": {
            "title": "$:/config/shortcuts/linkify",
            "text": "alt-shift-L"
        },
        "$:/config/shortcuts/list-bullet": {
            "title": "$:/config/shortcuts/list-bullet",
            "text": "ctrl-shift-L"
        },
        "$:/config/shortcuts/list-number": {
            "title": "$:/config/shortcuts/list-number",
            "text": "ctrl-shift-N"
        },
        "$:/config/shortcuts/mono-block": {
            "title": "$:/config/shortcuts/mono-block",
            "text": "ctrl-shift-M"
        },
        "$:/config/shortcuts/mono-line": {
            "title": "$:/config/shortcuts/mono-line",
            "text": "ctrl-M"
        },
        "$:/config/shortcuts/picture": {
            "title": "$:/config/shortcuts/picture",
            "text": "ctrl-shift-I"
        },
        "$:/config/shortcuts/preview": {
            "title": "$:/config/shortcuts/preview",
            "text": "alt-P"
        },
        "$:/config/shortcuts/quote": {
            "title": "$:/config/shortcuts/quote",
            "text": "ctrl-Q"
        },
        "$:/config/shortcuts/save-tiddler": {
            "title": "$:/config/shortcuts/save-tiddler",
            "text": "ctrl+enter"
        },
        "$:/config/shortcuts/save-wiki": {
            "title": "$:/config/shortcuts/save-wiki",
            "text": "ctrl-S"
        },
        "$:/config/shortcuts/stamp": {
            "title": "$:/config/shortcuts/stamp",
            "text": "ctrl-S"
        },
        "$:/config/shortcuts/strikethrough": {
            "title": "$:/config/shortcuts/strikethrough",
            "text": "ctrl-T"
        },
        "$:/config/shortcuts/subscript": {
            "title": "$:/config/shortcuts/subscript",
            "text": "ctrl-shift-B"
        },
        "$:/config/shortcuts/superscript": {
            "title": "$:/config/shortcuts/superscript",
            "text": "ctrl-shift-P"
        },
        "$:/config/shortcuts/toggle-sidebar": {
            "title": "$:/config/shortcuts/toggle-sidebar",
            "text": "alt-shift-S"
        },
        "$:/config/shortcuts/transcludify": {
            "title": "$:/config/shortcuts/transcludify",
            "text": "alt-shift-T"
        },
        "$:/config/ui/EditTemplate": {
            "title": "$:/config/ui/EditTemplate",
            "text": "$:/core/ui/EditTemplate"
        },
        "$:/config/ui/ViewTemplate": {
            "title": "$:/config/ui/ViewTemplate",
            "text": "$:/core/ui/ViewTemplate"
        },
        "$:/config/WikiParserRules/Inline/wikilink": {
            "title": "$:/config/WikiParserRules/Inline/wikilink",
            "text": "enable"
        },
        "$:/snippets/currpalettepreview": {
            "title": "$:/snippets/currpalettepreview",
            "text": "\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\\define swatchStyle()\nbackground-color: $(swatchColour)$;\n\\end\n\\define swatch-inner()\n<$set name=\"swatchColour\" value={{##$(colourResolved)$}}>\n<$list filter=\"[<swatchColour>!prefix[<<colour ]!suffix[>>]]\" variable=\"ignore\">\n<div class=\"tc-swatch\" style=<<swatchStyle>> title=<<swatchTitle>>/>\n</$list>\n<$list filter=\"[<swatchColour>prefix[<<colour ]suffix[>>]]\" variable=\"ignore\">\n<$wikify name=\"colourResolved\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall=<<swatchColour>>/>\"\"\">\n<<swatch-inner>>\n</$wikify>\n</$list>\n</$set>\n\\end\n\\define swatch()\n<$set name=\"swatchColour\" value={{##$(colour)$}}>\n<$set name=\"swatchTitle\" value=<<colour>>>\n<$list filter=\"[<swatchColour>!prefix[<<colour ]!suffix[>>]]\" variable=\"ignore\">\n<div class=\"tc-swatch\" style=<<swatchStyle>> title=<<swatchTitle>>/>\n</$list>\n<$list filter=\"[<swatchColour>prefix[<<colour ]suffix[>>]]\" variable=\"ignore\">\n<$wikify name=\"colourResolved\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall=<<swatchColour>>/>\"\"\">\n<<swatch-inner>>\n</$wikify>\n</$list>\n</$set>\n</$set>\n\\end\n<div class=\"tc-swatches-horiz\"><$list filter=\"\nforeground\nbackground\nmuted-foreground\nprimary\npage-background\ntab-background\ntiddler-info-background\n\" variable=\"colour\"><<swatch>></$list></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": "\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n\n<$linkcatcher to=\"$:/language\">\n<div class=\"tc-chooser tc-language-chooser\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/language}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link>\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</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
        },
        "$:/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 tiddler=\"$:/config/DefaultColourMappings/$name$\"/></$transclude></$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 column-count(columns)\n``\n-moz-column-count: $columns$;\n-webkit-column-count: $columns$;\ncolumn-count: $columns$;\n``\n\\end\n\n\\define datauri(title)\n<$macrocall $name=\"makedatauri\" type={{$title$!!type}} text={{$title$}} _canonical_uri={{$title$!!_canonical_uri}}/>\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\n\\define if-background-attachment(text)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" type=\"nomatch\" text=\"\">$text$</$reveal>\n\\end\n"
        },
        "$:/core/macros/colour-picker": {
            "title": "$:/core/macros/colour-picker",
            "tags": "$:/tags/Macro",
            "text": "\\define colour-picker-update-recent()\n<$action-listops\n\t$tiddler=\"$:/config/ColourPicker/Recent\"\n\t$subfilter=\"$(colour-picker-value)$ [list[$:/config/ColourPicker/Recent]remove[$(colour-picker-value)$]] +[limit[8]]\"\n/>\n\\end\n\n\\define colour-picker-inner(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(colour-picker-value)$\"\"\">\n\n$(colour-picker-update-recent)$\n\n$actions$\n\n<span style=\"display:inline-block; background-color: $(colour-picker-value)$; width: 100%; height: 100%; border-radius: 50%;\"/>\n\n</$button>\n\\end\n\n\\define colour-picker-recent-inner(actions)\n<$set name=\"colour-picker-value\" value=\"$(recentColour)$\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\\end\n\n\\define colour-picker-recent(actions)\n{{$:/language/ColourPicker/Recent}} <$list filter=\"[list[$:/config/ColourPicker/Recent]]\" variable=\"recentColour\">\n<$macrocall $name=\"colour-picker-recent-inner\" actions=\"\"\"$actions$\"\"\"/></$list>\n\\end\n\n\\define colour-picker(actions)\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker-recent\" actions=\"\"\"$actions$\"\"\"/>\n\n---\n\n<$list filter=\"LightPink Pink Crimson LavenderBlush PaleVioletRed HotPink DeepPink MediumVioletRed Orchid Thistle Plum Violet Magenta Fuchsia DarkMagenta Purple MediumOrchid DarkViolet DarkOrchid Indigo BlueViolet MediumPurple MediumSlateBlue SlateBlue DarkSlateBlue Lavender GhostWhite Blue MediumBlue MidnightBlue DarkBlue Navy RoyalBlue CornflowerBlue LightSteelBlue LightSlateGrey SlateGrey DodgerBlue AliceBlue SteelBlue LightSkyBlue SkyBlue DeepSkyBlue LightBlue PowderBlue CadetBlue Azure LightCyan PaleTurquoise Cyan Aqua DarkTurquoise DarkSlateGrey DarkCyan Teal MediumTurquoise LightSeaGreen Turquoise Aquamarine MediumAquamarine MediumSpringGreen MintCream SpringGreen MediumSeaGreen SeaGreen Honeydew LightGreen PaleGreen DarkSeaGreen LimeGreen Lime ForestGreen Green DarkGreen Chartreuse LawnGreen GreenYellow DarkOliveGreen YellowGreen OliveDrab Beige LightGoldenrodYellow Ivory LightYellow Yellow Olive DarkKhaki LemonChiffon PaleGoldenrod Khaki Gold Cornsilk Goldenrod DarkGoldenrod FloralWhite OldLace Wheat Moccasin Orange PapayaWhip BlanchedAlmond NavajoWhite AntiqueWhite Tan BurlyWood Bisque DarkOrange Linen Peru PeachPuff SandyBrown Chocolate SaddleBrown Seashell Sienna LightSalmon Coral OrangeRed DarkSalmon Tomato MistyRose Salmon Snow LightCoral RosyBrown IndianRed Red Brown FireBrick DarkRed Maroon White WhiteSmoke Gainsboro LightGrey Silver DarkGrey Grey DimGrey Black\" variable=\"colour-picker-value\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\n---\n\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" tag=\"input\" default=\"\" placeholder=\"\"/>\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" type=\"color\" tag=\"input\"/>\n<$set name=\"colour-picker-value\" value={{$:/config/ColourPicker/New}}>\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\n</div>\n\n\\end\n"
        },
        "$:/core/macros/copy-to-clipboard": {
            "title": "$:/core/macros/copy-to-clipboard",
            "tags": "$:/tags/Macro",
            "text": "\\define copy-to-clipboard(src,class:\"tc-btn-invisible\",style)\n<$button class=<<__class__>> style=<<__style__>> message=\"tm-copy-to-clipboard\" param=<<__src__>> tooltip={{$:/language/Buttons/CopyToClipboard/Hint}}>\n{{$:/core/images/copy-clipboard}} <$text text={{$:/language/Buttons/CopyToClipboard/Caption}}/>\n</$button>\n\\end\n\n\\define copy-to-clipboard-above-right(src,class:\"tc-btn-invisible\",style)\n<div style=\"position: relative;\">\n<div style=\"position: absolute; bottom: 0; right: 0;\">\n<$macrocall $name=\"copy-to-clipboard\" src=<<__src__>> class=<<__class__>> style=<<__style__>>/>\n</div>\n</div>\n\\end\n\n"
        },
        "$:/core/macros/diff": {
            "title": "$:/core/macros/diff",
            "tags": "$:/tags/Macro",
            "text": "\\define compareTiddlerText(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle)\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>>>\n<$diff-text source=<<source>> dest=<<dest>>/>\n</$set>\n</$set>\n\\end\n\n\\define compareTiddlers(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle,exclude)\n<table class=\"tc-diff-tiddlers\">\n<tbody>\n<$set name=\"sourceFields\" filter=\"[<__sourceTiddlerTitle__>fields[]sort[]]\">\n<$set name=\"destFields\" filter=\"[<__destSubTiddlerTitle__>subtiddlerfields<__destTiddlerTitle__>sort[]]\">\n<$list filter=\"[enlist<sourceFields>] [enlist<destFields>] -[enlist<__exclude__>] +[sort[]]\" variable=\"fieldName\">\n<tr>\n<th>\n<$text text=<<fieldName>>/> \n</th>\n<td>\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>> field=<<fieldName>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>> field=<<fieldName>>>\n<$diff-text source=<<source>> dest=<<dest>>>\n</$diff-text>\n</$set>\n</$set>\n</td>\n</tr>\n</$list>\n</$set>\n</$set>\n</tbody>\n</table>\n\\end\n"
        },
        "$:/core/macros/dumpvariables": {
            "title": "$:/core/macros/dumpvariables",
            "tags": "$:/tags/Macro",
            "text": "\\define dumpvariables()\n<ul>\n<$list filter=\"[variables[]]\" variable=\"varname\">\n<li>\n<strong><code><$text text=<<varname>>/></code></strong>:<br/>\n<$codeblock code={{{ [<varname>getvariable[]] }}}/>\n</li>\n</$list>\n</ul>\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<$vars hint={{{ [<__lingoBase__>addsuffix[Hint]get[text]] }}} caption={{{  [<__lingoBase__>addsuffix[Caption]get[text]] }}}>\n<span class=\"tc-popup-keep\"><$button popup=<<qualify \"$:/state/popup/export\">> tooltip=<<hint>> aria-label=<<caption>> class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/export-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text=<<caption>>/></span>\n</$list>\n</$button></span></$vars><$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$set name=\"count\" value={{{ [subfilter<__exportFilter__>count[]] }}}>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n<$list filter=\"[<currentTiddler>has[condition]subfilter{!!condition}limit[1]] ~[<currentTiddler>!has[condition]then[true]]\" variable=\"ignore\">\n<$button class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-download-file\" $param=<<currentTiddler>> exportFilter=<<__exportFilter__>> filename={{{ [<__baseFilename__>addsuffix{!!extension}] }}}/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n<$transclude field=\"description\"/>\n</$button>\n</$list>\n</$list>\n</$set>\n</div>\n</$reveal>\n\\end\n"
        },
        "$:/core/macros/image-picker": {
            "title": "$:/core/macros/image-picker",
            "created": "20170715180840889",
            "modified": "20170715180914005",
            "tags": "$:/tags/Macro",
            "type": "text/vnd.tiddlywiki",
            "text": "\\define image-picker-thumbnail(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(imageTitle)$\"\"\">\n$actions$\n<$transclude tiddler=<<imageTitle>>/>\n</$button>\n\\end\n\n\\define image-picker-list(filter,actions)\n<$list filter=\"\"\"$filter$\"\"\" variable=\"imageTitle\">\n<$macrocall $name=\"image-picker-thumbnail\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\\end\n\n\\define image-picker(actions,filter:\"[all[shadows+tiddlers]is[image]] -[type[application/pdf]] +[!has[draft.of]$subfilter$sort[title]]\",subfilter:\"\")\n<div class=\"tc-image-chooser\">\n<$vars state-system=<<qualify \"$:/state/image-picker/system\">>>\n<$checkbox tiddler=<<state-system>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"hide\">\n{{$:/language/SystemTiddlers/Include/Prompt}}\n</$checkbox>\n<$reveal state=<<state-system>> type=\"match\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$ +[!is[system]]\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n<$reveal state=<<state-system>> type=\"nomatch\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n</$vars>\n</div>\n\\end\n\n\\define image-picker-include-tagged-images(actions)\n<$macrocall $name=\"image-picker\" filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[!has[draft.of]sort[title]]\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n"
        },
        "$:/core/macros/keyboard-driven-input": {
            "title": "$:/core/macros/keyboard-driven-input",
            "tags": "$:/tags/Macro",
            "text": "\\define change-input-tab(stateTitle,tag,beforeafter,defaultState,actions)\n<$set name=\"tabsList\" filter=\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]]\">\n<$vars currentState={{{ [<__stateTitle__>!is[missing]get[text]] ~[<__defaultState__>] }}} firstTab={{{ [enlist<tabsList>nth[1]] }}} lastTab={{{ [enlist<tabsList>last[]] }}}>\n<$set name=\"nextTab\" value={{{ [all[shadows+tiddlers]tag<__tag__>!has[draft.of]$beforeafter$<currentState>] ~[[$beforeafter$]removeprefix[after]suffix[]addprefix<firstTab>] ~[[$beforeafter$]removeprefix[before]suffix[]addprefix<lastTab>] }}}>\n<$action-setfield $tiddler=<<__stateTitle__>> text=<<nextTab>>/>\n$actions$\n</$set>\n</$vars>\n</$set>\n\\end\n\n\\define keyboard-input-actions()\n<$list filter=\"[<__index__>match[]]\">\n<$action-setfield $tiddler=<<__storeTitle__>> text={{{ [<__tiddler__>get<__field__>] }}}/>\n</$list>\n<$list filter=\"[<__index__>!match[]]\">\n<$action-setfield $tiddler=<<__storeTitle__>> text={{{ [<__tiddler__>getindex<__index__>] }}}/>\n</$list>\n\\end\n\n\\define input-next-actions-inner()\n<$list filter=\"[<nextItem>minlength[1]]\" variable=\"ignore\">\n<$action-setfield $tiddler=<<__selectionStateTitle__>> text=<<nextItem>>/>\n<$list filter=\"[<__index__>match[]]\">\n<$action-setfield $tiddler=<<__tiddler__>> $field=<<__field__>> $value={{{ [<nextItem>] +[splitregexp[(?:.(?!-))+$]] }}}/>\n</$list>\n<$list filter=\"[<__index__>!match[]]\">\n<$action-setfield $tiddler=<<__tiddler__>> $index=<<__index__>> $value={{{ [<nextItem>] +[splitregexp[(?:.(?!-))+$]] }}}/>\n</$list>\n<$action-setfield $tiddler=<<__refreshTitle__>> text=\"yes\"/>\n</$list>\n\\end\n\n\\define input-next-actions(afterOrBefore:\"after\",reverse:\"\")\n<$list filter=\"[<__storeTitle__>get[text]minlength<__filterMinLength__>] [<__filterMinLength__>match[0]] +[limit[1]]\" variable=\"ignore\">\n<$vars userInput={{{ [<__storeTitle__>get[text]] }}} selectedItem={{{ [<__selectionStateTitle__>get[text]] }}}>\n<$set name=\"configTiddler\" value={{{ [subfilter<__configTiddlerFilter__>] }}}>\n<$vars primaryListFilter={{{ [<configTiddler>get<__firstSearchFilterField__>] }}} secondaryListFilter={{{ [<configTiddler>get<__secondSearchFilterField__>] }}}>\n<$set name=\"filteredList\" filter=\"[subfilter<primaryListFilter>addsuffix[-primaryList]] =[subfilter<secondaryListFilter>addsuffix[-secondaryList]]\">\n<$vars nextItem={{{ [enlist<filteredList>$afterOrBefore$<selectedItem>] ~[enlist<filteredList>$reverse$nth[1]] }}} firstItem={{{ [enlist<filteredList>nth[1]] }}} lastItem={{{ [enlist<filteredList>last[]] }}}>\n<$list filter=\"[<selectedItem>match<firstItem>!match<lastItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [[$afterOrBefore$]match[before]then<userInput>addsuffix[-userInput]] ~[<nextItem>] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>match<lastItem>!match<firstItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [[$afterOrBefore$]match[after]then<userInput>addsuffix[-userInput]] ~[<nextItem>] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>match<firstItem>match<lastItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [<userInput>addsuffix[-userInput]] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>!match<firstItem>!match<lastItem>]\" variable=\"ignore\">\n<<input-next-actions-inner>>\n</$list>\n</$vars>\n</$set>\n</$vars>\n</$set>\n</$vars>\n</$list>\n\\end\n\n\\define keyboard-driven-input(tiddler,storeTitle,field:\"text\",index:\"\",tag:\"input\",type,focus:\"\",inputAcceptActions,inputAcceptVariantActions,inputCancelActions,placeholder:\"\",default:\"\",class,focusPopup,rows,minHeight,tabindex,size,autoHeight,filterMinLength:\"0\",refreshTitle,selectionStateTitle,cancelPopups:\"\",configTiddlerFilter,firstSearchFilterField:\"first-search-filter\",secondSearchFilterField:\"second-search-filter\")\n\\whitespace trim\n<$keyboard key=\"((input-accept))\" actions=<<__inputAcceptActions__>>>\n<$keyboard key=\"((input-accept-variant))\" actions=<<__inputAcceptVariantActions__>>>\n<$keyboard key=\"((input-up))\" actions=<<input-next-actions \"before\" \"reverse[]\">>>\n<$keyboard key=\"((input-down))\" actions=<<input-next-actions>>>\n<$keyboard key=\"((input-cancel))\" actions=<<__inputCancelActions__>>>\n<$edit-text tiddler=<<__tiddler__>> field=<<__field__>> index=<<__index__>> \n\t\tinputActions=<<keyboard-input-actions>> tag=<<__tag__>> class=<<__class__>> \n\t\tplaceholder=<<__placeholder__>> default=<<__default__>> focusPopup=<<__focusPopup__>> \n\t\tfocus=<<__focus__>> type=<<__type__>> rows=<<__rows__>> minHeight=<<__minHeight__>> \n\t\ttabindex=<<__tabindex__>> size=<<__size__>> autoHeight=<<__autoHeight__>> \n\t\trefreshTitle=<<__refreshTitle__>> cancelPopups=<<__cancelPopups__>>/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\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:\"\",emptyMessage)\n\\whitespace trim\n<$type$ class=\"$class$\">\n<$list filter=\"$filter$\" emptyMessage=<<__emptyMessage__>>>\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\n\\define list-links-draggable-drop-actions()\n<$action-listops $tiddler=<<targetTiddler>> $field=<<targetField>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define list-links-draggable(tiddler,field:\"list\",type:\"ul\",subtype:\"li\",class:\"\",itemTemplate)\n\\whitespace trim\n<span class=\"tc-links-draggable-list\">\n<$vars targetTiddler=\"\"\"$tiddler$\"\"\" targetField=\"\"\"$field$\"\"\">\n<$type$ class=\"$class$\">\n<$list filter=\"[list[$tiddler$!!$field$]]\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"\"\"$subtype$\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\"/>\n<div>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$transclude>\n</div>\n</$droppable>\n</$list>\n<$tiddler tiddler=\"\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"div\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\">\n{{$:/core/images/blank}}\n</div>\n<div style=\"height:0.5em;\"/>\n</$droppable>\n</$tiddler>\n</$type$>\n</$vars>\n</span>\n\\end\n\n\\define list-tagged-draggable-drop-actions(tag)\n<!-- Save the current ordering of the tiddlers with this tag -->\n<$set name=\"order\" filter=\"[<__tag__>tagging[]]\">\n<!-- Remove any list-after or list-before fields from the tiddlers with this tag -->\n<$list filter=\"[<__tag__>tagging[]]\">\n<$action-deletefield $field=\"list-before\"/>\n<$action-deletefield $field=\"list-after\"/>\n</$list>\n<!-- Save the new order to the Tag Tiddler -->\n<$action-listops $tiddler=<<__tag__>> $field=\"list\" $filter=\"+[enlist<order>] +[insertbefore:currentTiddler<actionTiddler>]\"/>\n<!-- Make sure the newly added item has the right tag -->\n<!-- Removing this line makes dragging tags within the dropdown work as intended -->\n<!--<$action-listops $tiddler=<<actionTiddler>> $tags=<<__tag__>>/>-->\n<!-- Using the following 5 lines as replacement makes dragging titles from outside into the dropdown apply the tag -->\n<$list filter=\"[<actionTiddler>!contains:tags<__tag__>]\">\n<$fieldmangler tiddler=<<actionTiddler>>>\n<$action-sendmessage $message=\"tm-add-tag\" $param=<<__tag__>>/>\n</$fieldmangler>\n</$list>\n</$set>\n\\end\n\n\\define list-tagged-draggable(tag,subFilter,emptyMessage,itemTemplate,elementTag:\"div\",storyview:\"\")\n\\whitespace trim\n<span class=\"tc-tagged-draggable-list\">\n<$set name=\"tag\" value=<<__tag__>>>\n<$list filter=\"[<__tag__>tagging[]$subFilter$]\" emptyMessage=<<__emptyMessage__>> storyview=<<__storyview__>>>\n<$elementTag$ class=\"tc-menu-list-item\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</$transclude>\n</$elementTag$>\n</$droppable>\n</$elementTag$>\n</$list>\n<$tiddler tiddler=\"\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$ style=\"height:0.5em;\">\n</$elementTag$>\n</$droppable>\n</$tiddler>\n</$set>\n</span>\n\\end\n"
        },
        "$:/core/macros/tabs": {
            "title": "$:/core/macros/tabs",
            "tags": "$:/tags/Macro",
            "text": "\\define tabs(tabsList,default,state:\"$:/state/tab\",class,template,buttonTemplate,retain,actions,explicitState)\n<$set name=\"qualifiedState\" value=<<qualify \"$state$\">>>\n<$vars tabsState={{{ [<__explicitState__>minlength[1]] ~[<qualifiedState>] }}}>\n<div class=\"tc-tab-set $class$\">\n<div class=\"tc-tab-buttons $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\" storyview=\"pop\"><$set name=\"save-currentTiddler\" value=<<currentTiddler>>><$tiddler tiddler=<<currentTab>>><$button set=<<tabsState>> 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=\"$buttonTemplate$\" mode=\"inline\">\n<$transclude tiddler=<<currentTab>> field=\"caption\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$transclude>\n</$transclude>\n</$set></$tiddler>$actions$</$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=<<tabsState>> text=<<currentTab>> default=\"$default$\" retain=\"\"\"$retain$\"\"\">\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</$vars>\n</$set>\n\\end\n"
        },
        "$:/core/macros/tag-picker": {
            "title": "$:/core/macros/tag-picker",
            "tags": "$:/tags/Macro",
            "first-search-filter": "[tags[]!is[system]search:title<userInput>sort[]]",
            "second-search-filter": "[tags[]is[system]search:title<userInput>sort[]]",
            "text": "\\define get-tagpicker-focus-selector() [data-tiddler-title=\"$(currentTiddlerCSSEscaped)$\"] .tc-add-tag-name input\n\n\\define delete-tag-state-tiddlers() <$action-deletetiddler $filter=\"[<newTagNameTiddler>] [<storeTitle>] [<tagSelectionState>]\"/>\n\n\\define add-tag-actions(actions,tagField:\"tags\")\n<$set name=\"tag\" value={{{ [<__tiddler__>get[text]] }}}>\n<$list filter=\"[<saveTiddler>!contains:$tagField$<tag>!match[]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"-[<tag>]\"/>\n\"\"\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"[<tag>]\"/>\n$actions$\n</$list>\n</$set>\n<<delete-tag-state-tiddlers>>\n<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n\\end\n\n\\define clear-tags-actions-inner()\n<$list filter=\"[<storeTitle>has[text]] [<newTagNameTiddler>has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\">\n<<delete-tag-state-tiddlers>>\n</$list>\n\\end\n\n\\define clear-tags-actions()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<newTagNameTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<<clear-tags-actions-inner>>\"\"\">\n<$action-setfield $tiddler=<<newTagNameTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n</$set>\n\\end\n\n\\define tag-picker-inner(actions,tagField:\"tags\")\n\\whitespace trim\n<$vars newTagNameInputTiddlerQualified=<<qualify \"$:/temp/NewTagName/input\">> newTagNameSelectionTiddlerQualified=<<qualify \"$:/temp/NewTagName/selected-item\">> fallbackTarget={{$(palette)$##tag-background}} colourA={{$(palette)$##foreground}} colourB={{$(palette)$##background}}>\n<$vars storeTitle={{{ [<newTagNameInputTiddler>!match[]] ~[<newTagNameInputTiddlerQualified>] }}} tagSelectionState={{{ [<newTagNameSelectionTiddler>!match[]] ~[<newTagNameSelectionTiddlerQualified>] }}}>\n<$vars refreshTitle=<<qualify \"$:/temp/NewTagName/refresh\">> nonSystemTagsFilter=\"[tags[]!is[system]search:title<userInput>sort[]]\" systemTagsFilter=\"[tags[]is[system]search:title<userInput>sort[]]\">\n<div class=\"tc-edit-add-tag\">\n<div>\n<span class=\"tc-add-tag-name tc-small-gap-right\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<newTagNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>>\n\t\tselectionStateTitle=<<tagSelectionState>> inputAcceptActions=\"\"\"<$macrocall $name=\"add-tag-actions\" actions=<<__actions__>> tagField=<<__tagField__>>/>\"\"\"\n\t\tinputCancelActions=<<clear-tags-actions>> tag=\"input\" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}}\n\t\tfocusPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex=<<tabIndex>> \n\t\tfocus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}} filterMinLength={{$:/config/Tags/MinLength}} \n\t\tcancelPopups=<<cancelPopups>> configTiddlerFilter=\"[[$:/core/macros/tag-picker]]\"/>\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><$reveal state=<<storeTitle>> type=\"nomatch\" text=\"\"><$button class=\"tc-btn-invisible tc-small-gap tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Tags/ClearInput/Hint}} aria-label={{$:/language/EditTemplate/Tags/ClearInput/Caption}}>{{$:/core/images/close-button}}<<delete-tag-state-tiddlers>></$button></$reveal><span class=\"tc-add-tag-button tc-small-gap-left\">\n<$set name=\"tag\" value={{{ [<newTagNameTiddler>get[text]] }}}>\n<$button set=<<newTagNameTiddler>> setTo=\"\" class=\"\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"[<tag>]\"/>\n$actions$\n<$set name=\"currentTiddlerCSSEscaped\" value={{{ [<saveTiddler>escapecss[]] }}}>\n<<delete-tag-state-tiddlers>><$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-tagpicker-focus-selector>>/>\n</$set>\n{{$:/language/EditTemplate/Tags/Add/Button}}\n</$button>\n</$set>\n</span>\n</div>\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 tc-block-tags-dropdown\">\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=<<nonSystemTagsFilter>> variable=\"tag\">\n<$list filter=\"[<tag>addsuffix[-primaryList]] -[<tagSelectionState>get[text]]\" emptyMessage=\"\"\"<$vars button-classes=\"tc-btn-invisible tc-tag-button-selected\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\"\"\">\n<$vars button-classes=\"tc-btn-invisible\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\n</$list>\n</$list></$list>\n<hr>\n<$list filter=\"[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=<<systemTagsFilter>> variable=\"tag\">\n<$list filter=\"[<tag>addsuffix[-secondaryList]] -[<tagSelectionState>get[text]]\" emptyMessage=\"\"\"<$vars button-classes=\"tc-btn-invisible tc-tag-button-selected\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\"\"\">\n<$vars button-classes=\"tc-btn-invisible\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\n</$list>\n</$list></$list>\n</$set>\n</div>\n</$reveal>\n</div>\n</div>\n</$vars>\n</$vars>\n</$vars>\n\\end\n\\define tag-picker(actions,tagField:\"tags\")\n\\whitespace trim\n<$vars saveTiddler=<<currentTiddler>> palette={{$:/palette}}>\n<$list filter=\"[<newTagNameTiddler>match[]]\" emptyMessage=\"\"\"<$macrocall $name=\"tag-picker-inner\" actions=<<__actions__>> tagField=<<__tagField__>>/>\"\"\">\n<$set name=\"newTagNameTiddler\" value=<<qualify \"$:/temp/NewTagName\">>>\n<$macrocall $name=\"tag-picker-inner\" actions=<<__actions__>> tagField=<<__tagField__>>/>\n</$set>\n</$list>\n</$vars>\n\\end\n"
        },
        "$:/core/macros/tag": {
            "title": "$:/core/macros/tag",
            "tags": "$:/tags/Macro",
            "text": "\\define tag-pill-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-pill-inner(tag,icon,colour,fallbackTarget,colourA,colourB,element-tag,element-attributes,actions)\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<$element-tag$ $element-attributes$ class=\"tc-tag-label tc-btn-invisible\" style=<<tag-pill-styles>>>\n$actions$<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view tiddler=<<__tag__>> field=\"title\" format=\"text\" />\n</$element-tag$>\n</$vars>\n\\end\n\n\\define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions)\n<$macrocall $name=\"tag-pill-inner\" tag=<<__tag__>> icon=\"\"\"$icon$\"\"\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n\n\\define tag-pill(tag,element-tag:\"span\",element-attributes:\"\",actions:\"\")\n<span class=\"tc-tag-list-item\" data-tag-title=<<__tag__>>>\n<$macrocall $name=\"tag-pill-body\" tag=<<__tag__>> icon={{{ [<__tag__>get[icon]] }}} colour={{{ [<__tag__>get[color]] }}} palette={{$:/palette}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</span>\n\\end\n\n\\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": {
            "title": "$:/core/macros/timeline",
            "created": "20141212105914482",
            "modified": "20141212110330815",
            "tags": "$:/tags/Macro",
            "text": "\\define timeline-title()\n\\whitespace trim\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}}><<timeline-title>></$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(tag,sort:\"\",itemClassFilter,exclude,path)\n<ol class=\"tc-toc\">\n  <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n    <$vars item=<<currentTiddler>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n      <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n        <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n          <li class=<<toc-item-class>>>\n            <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}><$view field='caption'><$view field='title'/></$view></$link>\">\n              <<toc-caption>>\n            </$list>\n            <$macrocall $name=\"toc-body\" tag=<<item>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n          </li>\n        </$set>\n      </$set>\n    </$vars>\n  </$list>\n</ol>\n\\end\n\n\\define toc(tag,sort:\"\",itemClassFilter:\"\")\n<$macrocall $name=\"toc-body\"  tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> />\n\\end\n\n\\define toc-linked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n    <li class=<<toc-item-class>>>\n    <$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}>\n      <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n          {{$:/core/images/right-arrow}}\n        </$button>\n      </$reveal>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n          {{$:/core/images/down-arrow}}\n        </$button>\n      </$reveal>\n      <<toc-caption>>\n    </$link>\n    <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n      <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n    </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n    <li class=<<toc-item-class>>>\n      <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n          {{$:/core/images/right-arrow}}\n          <<toc-caption>>\n        </$button>\n      </$reveal>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n          {{$:/core/images/down-arrow}}\n          <<toc-caption>>\n        </$button>\n      </$reveal>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n      </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-expandable-empty-message()\n<$macrocall $name=\"toc-linked-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-expandable(tag,sort:\"\",itemClassFilter:\"\",exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n  <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n    <ol class=\"tc-toc toc-expandable\">\n      <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n        <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=<<toc-expandable-empty-message>> >\n          <$macrocall $name=\"toc-unlinked-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"\"\"itemClassFilter\"\"\" exclude=<<excluded>> path=<<path>> />\n        </$list>\n      </$list>\n    </ol>\n  </$set>\n</$vars>\n\\end\n\n\\define toc-linked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\" >\n    <li class=<<toc-item-class>>>\n      <$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}>\n          <$list filter=\"[all[current]tagging[]$sort$limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>\">\n          <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n            <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n              {{$:/core/images/right-arrow}}\n            </$button>\n          </$reveal>\n          <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n            <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n              {{$:/core/images/down-arrow}}\n            </$button>\n          </$reveal>\n        </$list>\n        <<toc-caption>>\n      </$link>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n      </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n    <li class=<<toc-item-class>>>\n      <$list filter=\"[all[current]tagging[]$sort$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\" stateTitle=<<toc-state>> text=\"open\">\n          <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n            {{$:/core/images/right-arrow}}\n            <<toc-caption>>\n          </$button>\n        </$reveal>\n        <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n          <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n            {{$:/core/images/down-arrow}}\n            <<toc-caption>>\n          </$button>\n        </$reveal>\n      </$list>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n      </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-selective-expandable-empty-message()\n<$macrocall $name=\"toc-linked-selective-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-selective-expandable(tag,sort:\"\",itemClassFilter,exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n  <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n    <ol class=\"tc-toc toc-selective-expandable\">\n      <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n        <$list filter=\"[all[current]toc-link[no]]\" variable=\"ignore\" emptyMessage=<<toc-selective-expandable-empty-message>> >\n          <$macrocall $name=\"toc-unlinked-selective-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n        </$list>\n      </$list>\n    </ol>\n  </$set>\n</$vars>\n\\end\n\n\\define toc-tabbed-external-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$tiddler tiddler={{{ [<__selectedTiddler__>get[text]] }}}>\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=\"[all[current]] -[<__selectedTiddler__>get[text]]\"/>\n      </div>\n    </$linkcatcher>\n    <div class=\"tc-tabbed-table-of-contents-content\">\n      <$reveal stateTitle=<<__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 stateTitle=<<__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"
        },
        "$:/core/macros/translink": {
            "title": "$:/core/macros/translink",
            "tags": "$:/tags/Macro",
            "text": "\\define translink(title,mode:\"block\")\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: black; foreground; white;\">\n<$link to=\"\"\"$title$\"\"\">\n<$text text=\"\"\"$title$\"\"\"/>\n</$link>\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: white; foreground; black;\">\n<$transclude tiddler=\"\"\"$title$\"\"\" mode=\"$mode$\">\n\"<$text text=\"\"\"$title$\"\"\"/>\" is missing\n</$transclude>\n</div>\n</div>\n\\end\n"
        },
        "$:/core/macros/tree": {
            "title": "$:/core/macros/tree",
            "tags": "$:/tags/Macro",
            "text": "\\define leaf-link(full-title,chunk,separator: \"/\")\n<$link to=<<__full-title__>>><$text text=<<__chunk__>>/></$link>\n\\end\n\n\\define leaf-node(prefix,chunk)\n<li>\n<$list filter=\"[<__prefix__>addsuffix<__chunk__>is[shadow]] [<__prefix__>addsuffix<__chunk__>is[tiddler]]\" variable=\"full-title\">\n<$list filter=\"[<full-title>removeprefix<__prefix__>]\" variable=\"chunk\">\n<span>{{$:/core/images/file}}</span> <$macrocall $name=\"leaf-link\" full-title=<<full-title>> chunk=<<chunk>>/>\n</$list>\n</$list>\n</li>\n\\end\n\n\\define branch-node(prefix,chunk,separator: \"/\")\n<li>\n<$set name=\"reveal-state\" value={{{ [[$:/state/tree/]addsuffix<__prefix__>addsuffix<__chunk__>] }}}>\n<$reveal type=\"nomatch\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"show\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"hide\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<span>(<$count filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>removeprefix<__chunk__>] -[<__prefix__>addsuffix<__chunk__>]\"/>)</span>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$macrocall $name=\"tree-node\" prefix={{{ [<__prefix__>addsuffix<__chunk__>] }}} separator=<<__separator__>>/>\n</$reveal>\n</$set>\n</li>\n\\end\n\n\\define tree-node(prefix,separator: \"/\")\n<ol>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]!suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"leaf-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"branch-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n</ol>\n\\end\n\n\\define tree(prefix: \"$:/\",separator: \"/\")\n<div class=\"tc-tree\">\n<span><$text text=<<__prefix__>>/></span>\n<div>\n<$macrocall $name=\"tree-node\" prefix=<<__prefix__>> separator=<<__separator__>>/>\n</div>\n</div>\n\\end\n"
        },
        "$:/core/macros/utils": {
            "title": "$:/core/macros/utils",
            "text": "\\define colour(colour)\n$colour$\n\\end\n"
        },
        "$:/snippets/minifocusswitcher": {
            "title": "$:/snippets/minifocusswitcher",
            "text": "<$select tiddler=\"$:/config/AutoFocus\">\n<$list filter=\"title tags text type fields\">\n<option value=<<currentTiddler>>><<currentTiddler>></option>\n</$list>\n</$select>\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": "<$transclude tiddler=\"$:/PaletteManager\"/>\n"
        },
        "$:/snippets/palettepreview": {
            "title": "$:/snippets/palettepreview",
            "text": "<$set name=\"currentTiddler\" value={{$:/palette}}>\n{{||$:/snippets/currpalettepreview}}\n</$set>\n"
        },
        "$:/snippets/paletteswitcher": {
            "title": "$:/snippets/paletteswitcher",
            "text": "<$linkcatcher to=\"$:/palette\">\n<div class=\"tc-chooser\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]sort[name]]\"><$set name=\"cls\" filter=\"[all[current]prefix{$:/palette}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' - <$view field=\"description\" format=\"text\"/>{{||$:/snippets/currpalettepreview}}</$link>\n</div></$set>\n</$list>\n</div>\n</$linkcatcher>\n"
        },
        "$:/snippets/peek-stylesheets": {
            "title": "$:/snippets/peek-stylesheets",
            "text": "\\define expandable-stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$vars state=<<qualify \"$:/state/peek-stylesheets/open/\">>>\n<$set name=\"state\" value={{{ [<state>addsuffix<currentTiddler>] }}}>\n<li>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"no\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"yes\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"div\">\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</$reveal>\n</li>\n</$set>\n</$vars>\n</$list>\n</ol>\n\\end\n\n\\define stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<li>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</li>\n</$list>\n</ol>\n\\end\n\n<$vars modeState=<<qualify \"$:/state/peek-stylesheets/mode/\">>>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"expanded\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Stylesheets/Expand/Caption}}</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"restored\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}} {{$:/language/ControlPanel/Stylesheets/Restore/Caption}}</$button>\n</$reveal>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<expandable-stylesheets-list>>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<stylesheets-list>>\n</$reveal>\n\n</$vars>\n"
        },
        "$:/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/AdvancedSearch/FilterButton": {
            "title": "$:/tags/AdvancedSearch/FilterButton",
            "list": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown $:/core/ui/AdvancedSearch/Filter/FilterButtons/clear $:/core/ui/AdvancedSearch/Filter/FilterButtons/export $:/core/ui/AdvancedSearch/Filter/FilterButtons/delete"
        },
        "$:/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/EditorToolbar": {
            "title": "$:/tags/EditorToolbar",
            "list": "$:/core/ui/EditorToolbar/paint $:/core/ui/EditorToolbar/opacity $:/core/ui/EditorToolbar/line-width $:/core/ui/EditorToolbar/rotate-left $:/core/ui/EditorToolbar/clear $:/core/ui/EditorToolbar/bold $:/core/ui/EditorToolbar/italic $:/core/ui/EditorToolbar/strikethrough $:/core/ui/EditorToolbar/underline $:/core/ui/EditorToolbar/superscript $:/core/ui/EditorToolbar/subscript $:/core/ui/EditorToolbar/mono-line $:/core/ui/EditorToolbar/mono-block $:/core/ui/EditorToolbar/quote $:/core/ui/EditorToolbar/list-bullet $:/core/ui/EditorToolbar/list-number $:/core/ui/EditorToolbar/heading-1 $:/core/ui/EditorToolbar/heading-2 $:/core/ui/EditorToolbar/heading-3 $:/core/ui/EditorToolbar/heading-4 $:/core/ui/EditorToolbar/heading-5 $:/core/ui/EditorToolbar/heading-6 $:/core/ui/EditorToolbar/link $:/core/ui/EditorToolbar/excise $:/core/ui/EditorToolbar/picture $:/core/ui/EditorToolbar/stamp $:/core/ui/EditorToolbar/size $:/core/ui/EditorToolbar/editor-height $:/core/ui/EditorToolbar/more $:/core/ui/EditorToolbar/preview $:/core/ui/EditorToolbar/preview-type"
        },
        "$:/tags/Manager/ItemMain": {
            "title": "$:/tags/Manager/ItemMain",
            "list": "$:/Manager/ItemMain/WikifiedText $:/Manager/ItemMain/RawText $:/Manager/ItemMain/Fields"
        },
        "$:/tags/Manager/ItemSidebar": {
            "title": "$:/tags/Manager/ItemSidebar",
            "list": "$:/Manager/ItemSidebar/Tags $:/Manager/ItemSidebar/Colour $:/Manager/ItemSidebar/Icon $:/Manager/ItemSidebar/Tools"
        },
        "$:/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]] [[$:/core/ui/MoreSideBar/Explorer]] [[$:/core/ui/MoreSideBar/Plugins]]",
            "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/new-image]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/manager]] [[$:/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/timestamp]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/print]] [[$:/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/PluginLibrary": {
            "title": "$:/tags/PluginLibrary",
            "list": "$:/config/OfficialPluginLibrary"
        },
        "$:/tags/SideBar": {
            "title": "$:/tags/SideBar",
            "list": "[[$:/core/ui/SideBar/Open]] [[$:/core/ui/SideBar/Recent]] [[$:/core/ui/SideBar/Tools]] [[$:/core/ui/SideBar/More]]",
            "text": ""
        },
        "$:/tags/SideBarSegment": {
            "title": "$:/tags/SideBarSegment",
            "list": "[[$:/core/ui/SideBarSegments/site-title]] [[$:/core/ui/SideBarSegments/site-subtitle]] [[$:/core/ui/SideBarSegments/page-controls]] [[$:/core/ui/SideBarSegments/search]] [[$:/core/ui/SideBarSegments/tabs]]"
        },
        "$:/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": "<$linkcatcher to=\"$:/theme\">\n<div class=\"tc-chooser\"><$list filter=\"[plugin-type[theme]sort[title]]\"><$set name=\"cls\" filter=\"[all[current]field:title{$:/theme}] [[$:/theme]!has[text]addsuffix[s/tiddlywiki/vanilla]field:title<currentTiddler>] +[limit[1]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' <$view field=\"description\" format=\"text\"/></$link></div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
        },
        "$:/core/wiki/title": {
            "title": "$:/core/wiki/title",
            "text": "{{$:/SiteTitle}}\n<$list filter=\"[{$:/SiteSubtitle}trim[]minlength[1]]\" variable=\"ignore\">\n--- {{$:/SiteSubtitle}}\n</$list>"
        },
        "$:/view": {
            "title": "$:/view",
            "text": "classic"
        },
        "$:/snippets/viewswitcher": {
            "title": "$:/snippets/viewswitcher",
            "text": "\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<$linkcatcher to=\"$:/view\">\n<div class=\"tc-chooser tc-viewswitcher\">\n<$list filter=\"[storyviews[]]\" variable=\"storyview\">\n<$set name=\"cls\" filter=\"[<storyview>prefix{$:/view}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link to=<<storyview>>><$transclude tiddler=<<icon>>/><$text text=<<storyview>>/></$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
        }
    }
}
Entrance
no
$:/core/ui/PageTemplate
$:/palettes/SolarizedLight
Dwelling in the here and now
Zen hub
show
hide
no
$:/core/ui/ControlPanel/Palette
$:/core/ui/ControlPanel/Basics
$:/core/ui/ControlPanel/LoadedModules
$:/core/ui/ControlPanel/Saving
$:/core/ui/TiddlerInfo/References
$:/core/ui/ControlPanel/Saving/General
$:/core/ui/SideBar/Tools
$:/core/ui/ControlPanel/Toolbars/PageControls
no
no
holy

{
    "tiddlers": {
        "$:/themes/tiddlywiki/snowwhite/base": {
            "title": "$:/themes/tiddlywiki/snowwhite/base",
            "tags": "[[$:/tags/Stylesheet]]",
            "text": "\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\n\\end\n\n\\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: <<sidebarbreakpoint-minus-one>>) {\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\ntextarea.tc-edit-texteditor {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\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-set > .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-set > .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": "{{$:/language/ThemeTweaks/ThemeTweaks}}",
            "text": "\\define lingo-base() $:/language/ThemeTweaks/\n\n\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n\\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<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"\n\t$value=<<imageTitle>>\n/>\n\n\"\"\"/>\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\"><<lingo Settings/BackgroundImageAttachment/Scroll>></option>\n<option value=\"fixed\"><<lingo Settings/BackgroundImageAttachment/Fixed>></option>\n</$select>\n\\end\n\n\\define backgroundimagesize-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\" default=\"scroll\">\n<option value=\"auto\"><<lingo Settings/BackgroundImageSize/Auto>></option>\n<option value=\"cover\"><<lingo Settings/BackgroundImageSize/Cover>></option>\n<option value=\"contain\"><<lingo Settings/BackgroundImageSize/Contain>></option>\n</$select>\n\\end\n\n<<lingo ThemeTweaks/Hint>>\n\n! <<lingo Options>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><<lingo Options/SidebarLayout>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><option value=\"fixed-fluid\"><<lingo Options/SidebarLayout/Fixed-Fluid>></option><option value=\"fluid-fixed\"><<lingo Options/SidebarLayout/Fluid-Fixed>></option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><<lingo Options/StickyTitles>></$link><br>//<<lingo Options/StickyTitles/Hint>>// |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><option value=\"no\">{{$:/language/No}}</option><option value=\"yes\">{{$:/language/Yes}}</option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><<lingo Options/CodeWrapping>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><option value=\"pre\">{{$:/language/No}}</option><option value=\"pre-wrap\">{{$:/language/Yes}}</option></$select> |\n\n! <<lingo Settings>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"><<lingo Settings/FontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\"><<lingo Settings/CodeFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\"><<lingo Settings/EditorFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"><<lingo Settings/BackgroundImage>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" default=\"\" tag=\"input\"/> |<<backgroundimage-dropdown>> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\"><<lingo Settings/BackgroundImageAttachment>></$link> |<<backgroundimageattachment-dropdown>> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\"><<lingo Settings/BackgroundImageSize>></$link> |<<backgroundimagesize-dropdown>> | |\n\n! <<lingo Metrics>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\"><<lingo Metrics/FontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\"><<lingo Metrics/LineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\"><<lingo Metrics/BodyFontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\"><<lingo Metrics/BodyLineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\"><<lingo Metrics/StoryLeft>></$link><br>//<<lingo Metrics/StoryLeft/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\"><<lingo Metrics/StoryTop>></$link><br>//<<lingo Metrics/StoryTop/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\"><<lingo Metrics/StoryRight>></$link><br>//<<lingo Metrics/StoryRight/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\"><<lingo Metrics/StoryWidth>></$link><br>//<<lingo Metrics/StoryWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"><<lingo Metrics/TiddlerWidth>></$link><br>//<<lingo Metrics/TiddlerWidth/Hint>>//<br> |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\"><<lingo Metrics/SidebarBreakpoint>></$link><br>//<<lingo Metrics/SidebarBreakpoint/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\"><<lingo Metrics/SidebarWidth>></$link><br>//<<lingo Metrics/SidebarWidth/Hint>>// |^<$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 sidebarbreakpoint()\n<$text text={{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}/>\n\\end\n\n\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\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\\define if-editor-height-fixed(then,else)\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n$then$\n</$reveal>\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n$else$\n</$reveal>\n\\end\n\n\\define set-type-selector-min-width()\n<$set name=\"typeLength\" value={{{ [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]get[name]length[]maxall[]] }}}>\n\n\t.tc-type-selector-dropdown-wrapper {\n\t\tmin-width: calc(<<typeLength>>ch + 4em);\n\t}\n\n\t.tc-type-selector-dropdown-wrapper input.tc-edit-typeeditor {\n\t\tmin-width: <<typeLength>>ch;\n\t}\n\n</$set>\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\ninput[type=\"search\"] {\n  outline-offset: initial;\n}\n\nhtml button {\n\tline-height: 1.2;\n\tcolor: <<colour button-foreground>>;\n\tfill: <<colour button-foreground>>;\n\tbackground: <<colour button-background>>;\n\tborder-color: <<colour button-border>>;\n}\n\n/*\n** Basic element styles\n*/\n\nhtml, body {\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\tword-wrap: break-word;\n\t<<custom-background-datauri>>\n\tcolor: <<colour foreground>>;\n\tbackground-color: <<colour page-background>>;\n\tfill: <<colour foreground>>;\n}\n\n<<if-background-attachment \"\"\"\n\nbody.tc-body {\n        background-color: transparent;\n}\n\n\"\"\">>\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n\tfont-size: 2em;\n}\n\nh1, h2, h3, h4, h5, h6 {\n\tline-height: 1.2;\n\tfont-weight: 300;\n}\n\npre {\n\tdisplay: block;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\tword-break: normal;\n\tword-wrap: break-word;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\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\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\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\tquotes: \"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\";\n}\n\nblockquote > div {\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n}\n\nblockquote.tc-big-quote {\n\tfont-family: Georgia, serif;\n\tposition: relative;\n\tbackground: <<colour pre-background>>;\n\tborder-left: none;\n\tmargin-left: 50px;\n\tmargin-right: 50px;\n\tpadding: 10px;\n    border-radius: 8px;\n}\n\nblockquote.tc-big-quote cite:before {\n\tcontent: \"\\2014 \\2009\";\n}\n\nblockquote.tc-big-quote:before {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: open-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n    left: -50px;\n    top: 42px;\n}\n\nblockquote.tc-big-quote:after {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: close-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n    right: -80px;\n    bottom: -20px;\n}\n\ndl dt {\n\tfont-weight: bold;\n\tmargin-top: 6px;\n}\n\nbutton, textarea, input, select {\n\toutline-color: <<colour primary>>;\n}\n\ntextarea,\ninput[type=text],\ninput[type=search],\ninput[type=\"\"],\ninput:not([type]) {\n\tcolor: <<colour foreground>>;\n\tbackground: <<colour background>>;\n}\n\ninput[type=\"checkbox\"] {\n  vertical-align: middle;\n}\n\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-results-button,\ninput[type=\"search\"]::-webkit-search-results-decoration {\n\t-webkit-appearance:none;\n}\n\n.tc-muted {\n\tcolor: <<colour muted-foreground>>;\n}\n\nsvg.tc-image-button {\n\tpadding: 0px 1px 1px 0px;\n}\n\n.tc-icon-wrapper > svg {\n\twidth: 1em;\n\theight: 1em;\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::selection {\n\tbackground-color: Highlight;\n\tcolor: HighlightText;\n\tbackground-color: <<colour selection-background>>;\n\tcolor: <<colour selection-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\t/* next 2 elements needed, since normalize 8.0.1 */\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\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: 500;\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.tc-drop-down a.tc-tiddlylink:hover {\n\tcolor: <<colour tiddler-link-background>>;\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\ttop: -1000px;\n\tleft: -1000px;\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-page-container > .tc-dropzone {\n\tmin-height: 100vh;\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.tc-droppable > .tc-droppable-placeholder {\n\tdisplay: none;\n}\n\n.tc-droppable.tc-dragover > .tc-droppable-placeholder {\n\tdisplay: block;\n\tborder: 2px dashed <<colour dropzone-background>>;\n}\n\n.tc-draggable {\n\tcursor: move;\n}\n\n.tc-sidebar-tab-open .tc-droppable-placeholder, .tc-tagged-draggable-list .tc-droppable-placeholder,\n.tc-links-draggable-list .tc-droppable-placeholder {\n\tline-height: 2em;\n\theight: 2em;\n}\n\n.tc-sidebar-tab-open-item {\n\tposition: relative;\n}\n\n.tc-sidebar-tab-open .tc-btn-invisible.tc-btn-mini svg {\n\tfont-size: 0.7em;\n\tfill: <<colour muted-foreground>>;\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, label svg, label img {\n\tvertical-align: middle;\n}\n\n.tc-btn-invisible {\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\tcursor: pointer;\n\tcolor: <<colour foreground>>;\n\tfill: <<colour foreground>>;\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/* used for documentation \"fake\" buttons */\n.tc-btn-standard {\n\tline-height: 1.8;\n\tcolor: #667;\n\tbackground-color: #e0e0e0;\n\tborder: 1px solid #888;\n\tpadding: 2px 1px 2px 1px;\n\tmargin: 1px 4px 1px 4px;\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\tborder-radius: 2px;\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-primary-btn {\n \tbackground: <<colour primary>>;\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\n.tc-sidebar-lists button small {\n\tcolor: <<colour foreground>>;\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\twidth: calc(100% + 2px);\n\tmargin-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\ttop: 6px;\n\tbottom: 6px;\n}\n\n.tc-fold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-unfold-banner {\n\t\tposition: static;\n\t\twidth: calc(100% + 59px);\n\t}\n\n\t.tc-fold-banner {\n\t\twidth: 16px;\n\t\tmargin-left: -16px;\n\t\tfont-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}\n\n.tc-tags-wrapper {\n\tmargin: 4px 0 14px 0;\n}\n\n.tc-tags-wrapper .tc-tag-list-item {\n\tmargin-right: 7px;\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\n.tc-block-tags-dropdown > .tc-btn-invisible:hover {\n\tbackground-color: <<colour primary>>;\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: 400;\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-sidebar-scrollable .tc-tag-label {\n\ttext-shadow: none;\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\tmargin-right: 3px; \n\tmargin-bottom: 1px;\n\tvertical-align: bottom;\n}\n\n.tc-edit-tags button.tc-remove-tag-button svg {\n\tfont-size: 0.7em;\n\tvertical-align: middle;\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\nbutton.tc-btn-invisible.tc-remove-tag-button {\n\toutline: none;\n}\n\n.tc-tag-button-selected,\n.tc-list-item-selected a.tc-tiddlylink, a.tc-list-item-selected {\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour tiddler-background>>;\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@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-topbar-right {\n\t\tright: 10px;\n\t}\n\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@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-show-sidebar-btn svg.tc-image-chevron-left, .tc-hide-sidebar-btn svg.tc-image-chevron-right {\n\t\ttransform: rotate(-90deg);\n\t}\n\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 .tc-drop-down {\n  font-size: 1rem;\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-sidebar-lists .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: <<sidebarbreakpoint-minus-one>>) {\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\ttransition:  min-height {{$:/config/AnimationDuration}}ms ease-in-out, padding-top {{$:/config/AnimationDuration}}ms ease-in-out, padding-bottom {{$:/config/AnimationDuration}}ms ease-in-out;\n\t}\n\t\n\t<<if-no-sidebar \"\"\"\n\n\t\t.tc-sidebar-header {\n\t\t\tmin-height: 0;\n\t\t\tpadding-top: 0;\n\t\t\tpadding-bottom: 0;\n\t\t}\n\n\t\"\"\">>\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t}\n}\n\n@media (min-width: <<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\thtml[dir=\"rtl\"] .tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tright: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\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: calc(100% - {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}});\n\t}\n\n\">>\n\n\t.tc-story-river.tc-static-story-river {\n\t\tmargin-right: 0;\n\t\tpadding-right: 42px;\n\t}\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: 0;\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\toverflow: hidden;\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@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-tiddler-info {\n\t\tpadding: 14px 14px 14px 14px;\n\t}\n\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: <<sidebarbreakpoint-minus-one>>) {\n\t.tc-tiddler-frame {\n\t\tpadding: 14px 14px 14px 14px;\n\t\tmargin-bottom: .5em;\n\t}\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -14px 0 -14px;\n\t}\n}\n\n@media (min-width: <<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.35em;\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\tmargin-right: .1em;\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-subtitle .tc-tiddlylink {\n\tmargin-right: .3em;\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.tc-tiddler-controls > span > span > button,\n.tc-tiddler-controls > span > span > 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\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img {\n\theight: 0.75em;\n}\n\n.tc-search button svg, .tc-search a svg {\n    height: 1.2em;\n    width: 1.2em;\n    margin: 0 0.25em;\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 .tc-edit-texteditor {\n\twidth: 100%;\n\tmargin: 4px 0 4px 0;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor,\n.tc-tiddler-frame iframe.tc-edit-texteditor {\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\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-editor-background>>;\n}\n\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-background>>;\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\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** Editor\n*/\n\n.tc-editor-toolbar {\n\tmargin-top: 8px;\n}\n\n.tc-editor-toolbar button {\n\tvertical-align: middle;\n\tbackground-color: <<colour tiddler-controls-foreground>>;\n\tcolor: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n\tborder-radius: 4px;\n\tpadding: 3px;\n\tmargin: 2px 0 2px 4px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-adjunct {\n\tmargin-left: 1px;\n\twidth: 1em;\n\tborder-radius: 8px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-start-group {\n\tmargin-left: 11px;\n}\n\n.tc-editor-toolbar button.tc-selected {\n\tbackground-color: <<colour primary>>;\n}\n\n.tc-editor-toolbar button svg {\n\twidth: 1.6em;\n\theight: 1.2em;\n}\n\n.tc-editor-toolbar button:hover {\n\tbackground-color: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour background>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more {\n\twhite-space: normal;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more button {\n\tdisplay: inline-block;\n\tpadding: 3px;\n\twidth: auto;\n}\n\n.tc-editor-toolbar .tc-search-results {\n\tpadding: 0;\n}\n\n/*\n** Adjustments for fluid-fixed mode\n*/\n\n@media (min-width: <<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-type-selector .tc-edit-typeeditor {\n\twidth: auto;\n}\n\n.tc-type-selector-dropdown-wrapper {\n\tdisplay: inline-block;\n}\n\n<<set-type-selector-min-width>>\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-add-tag .tc-keyboard {\n\tdisplay:inline;\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: 49%;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tmargin: 4px 0 3px 3px;\n\tpadding: 3px 3px 3px 3px;\n}\n\n<<if-editor-height-fixed then:\"\"\"\n\n.tc-tiddler-preview-preview {\n\toverflow-y: scroll;\n\theight: {{$:/config/TextEditor/EditorHeight/Height}};\n}\n\n\"\"\">>\n\n.tc-tiddler-frame .tc-tiddler-preview .tc-edit-texteditor {\n\twidth: 49%;\n}\n\n.tc-tiddler-frame .tc-tiddler-preview canvas.tc-edit-bitmapeditor {\n\tmax-width: 49%;\n}\n\n.tc-edit-fields {\n\twidth: 100%;\n}\n\n.tc-edit-fields.tc-edit-fields-small {\n\tmargin-top: 0;\n\tmargin-bottom: 0;\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-wrapper input.tc-edit-texteditor {\n\twidth: auto;\n}\n\n.tc-edit-field-add-name-wrapper {\n\tdisplay: inline-block;\n}\n\n.tc-edit-field-add-value {\n\tdisplay: inline-block;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-edit-field-add-value {\n\t\twidth: 35%;\n\t}\n\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-viewswitcher .tc-image-button {\n\tmargin-right: .3em;\n}\n\n.tc-storyview-zoomin-tiddler {\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 100%;\n}\n\n@media (min-width: <<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 background>>;\n}\n\n.tc-drop-down .tc-drop-down-info {\n\tpadding-left: 14px;\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 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-tab-set .tc-tab-buttons button {\n\tdisplay: inline-block;\n    width: auto;\n    margin-bottom: 0px;\n    border-bottom-left-radius: 0;\n    border-bottom-right-radius: 0;\n}\n\n.tc-drop-down .tc-prompt {\n\tpadding: 0 14px;\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-plain,\n.tc-block-dropdown .tc-dropdown-item-plain {\n\tpadding: 4px 14px 4px 7px;\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.tc-tiddlylink: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\tpadding: 0 7px 0 7px;\n}\n\n.tc-image-chooser, .tc-colour-chooser {\n\twhite-space: normal;\n}\n\n.tc-image-chooser a,\n.tc-colour-chooser a {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\ttext-align: center;\n\tposition: relative;\n}\n\n.tc-image-chooser a {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 2px;\n\tmargin: 2px;\n\twidth: 4em;\n\theight: 4em;\n}\n\n.tc-colour-chooser a {\n\tpadding: 3px;\n\twidth: 2em;\n\theight: 2em;\n\tvertical-align: middle;\n}\n\n.tc-image-chooser a:hover,\n.tc-colour-chooser a:hover {\n\tbackground: <<colour primary>>;\n\tpadding: 0px;\n\tborder: 3px solid <<colour primary>>;\n}\n\n.tc-image-chooser a svg,\n.tc-image-chooser a img {\n\tdisplay: inline-block;\n\twidth: auto;\n\theight: auto;\n\tmax-width: 3.5em;\n\tmax-height: 3.5em;\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tmargin: auto;\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\tz-index: 900;\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/*\n** Centered modals\n*/\n.tc-modal-centered .tc-modal {\n\twidth: auto;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%) !important;\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\tborder-bottom-left-radius: 0;\n\tborder-bottom-right-radius: 0;\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\tborder-top-right-radius: 0;\n\tborder-bottom-right-radius: 0;\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\toverflow: auto;\n}\n\n.tc-sidebar-lists .tc-tab-buttons {\n\tmargin-bottom: -1px;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tcolor: <<colour sidebar-tab-foreground-selected>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border-selected>>;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tcolor: <<colour sidebar-tab-foreground>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border>>;\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\tborder-top: 1px solid <<colour sidebar-tab-divider>>;\n}\n\n.tc-more-sidebar > .tc-tab-set > .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-set > .tc-tab-buttons > button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tborder: none;\n}\n\n/*\n** Manager\n*/\n\n.tc-manager-wrapper {\n\t\n}\n\n.tc-manager-controls {\n\t\n}\n\n.tc-manager-control {\n\tmargin: 0.5em 0;\n}\n\n.tc-manager-list {\n\twidth: 100%;\n\tborder-top: 1px solid <<colour muted-foreground>>;\n\tborder-left: 1px solid <<colour muted-foreground>>;\n\tborder-right: 1px solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item {\n\n}\n\n.tc-manager-list-item-heading {\n    display: block;\n    width: 100%;\n    text-align: left;\t\n\tborder-bottom: 1px solid <<colour muted-foreground>>;\n\tpadding: 3px;\n}\n\n.tc-manager-list-item-heading-selected {\n\tfont-weight: bold;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n\tbackground-color: <<colour foreground>>;\n}\n\n.tc-manager-list-item-heading:hover {\n\tbackground: <<colour primary>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-manager-list-item-content {\n\tdisplay: flex;\n}\n\n.tc-manager-list-item-content-sidebar {\n    flex: 1 0;\n    background: <<colour tiddler-editor-background>>;\n    border-right: 0.5em solid <<colour muted-foreground>>;\n    border-bottom: 0.5em solid <<colour muted-foreground>>;\n    white-space: nowrap;\n}\n\n.tc-manager-list-item-content-item-heading {\n\tdisplay: block;\n\twidth: 100%;\n\ttext-align: left;\n    background: <<colour muted-foreground>>;\n\ttext-transform: uppercase;\n\tfont-size: 0.6em;\n\tfont-weight: bold;\n    padding: 0.5em 0 0.5em 0;\n}\n\n.tc-manager-list-item-content-item-body {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-manager-list-item-content-item-body > pre {\n\tmargin: 0.5em 0 0.5em 0;\n\tborder: none;\n\tbackground: inherit;\n}\n\n.tc-manager-list-item-content-tiddler {\n    flex: 3 1;\n    border-left: 0.5em solid <<colour muted-foreground>>;\n    border-right: 0.5em solid <<colour muted-foreground>>;\n    border-bottom: 0.5em solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item-content-item-body > table {\n\tborder: none;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.tc-manager-list-item-content-item-body > table td {\n\tborder: none;\n}\n\n.tc-manager-icon-editor > button {\n\twidth: 100%;\n}\n\n.tc-manager-icon-editor > button > svg,\n.tc-manager-icon-editor > button > button {\n\twidth: 100%;\n\theight: auto;\n}\n\n/*\n** Import table\n*/\n\n.tc-import-table {\n\twidth: 100%;\n}\n\n.tc-import-table svg.tc-image-edit-button {\n\tmax-width: unset;\n}\n\n.tc-import-table th:first-of-type {\n\twidth: 10%;\n}\n\n.tc-import-table th:last-of-type {\n\twidth: 30%;\n}\n\n.tc-import-table .tc-row-disabled {\n\tbackground: <<colour very-muted-foreground>>10;\n\topacity: 0.8;\n}\n\n.tc-import-table .tc-row-warning {\n\tbackground: <<colour diff-delete-background>>50;\n}\n\n/*\n** Alerts\n*/\n\n.tc-alerts {\n\tposition: fixed;\n\ttop: 28px;\n\tleft: 0;\n\tright: 0;\n\tmax-width: 50%;\n\tz-index: 20000;\n}\n\n.tc-alert {\n\tposition: relative;\n\tmargin: 14px;\n\tpadding: 7px;\n\tborder: 1px solid <<colour alert-border>>;\n\tbackground-color: <<colour alert-background>>;\n}\n\n.tc-alert-toolbar {\n\tposition: absolute;\n\ttop: 7px;\n\tright: 7px;\n    line-height: 0;\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    font-size: 0.8em;\n    margin-bottom: 0.5em;\n}\n\n.tc-alert-body > p {\n\tmargin: 0;\n}\n\n.tc-alert-highlight {\n\tcolor: <<colour alert-highlight>>;\n}\n\n@media (min-width: <<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** Floating drafts list\n*/\n\n.tc-drafts-list {\n\tz-index: 2000;\n\tposition: fixed;\n\tfont-size: 0.8em;\n\tleft: 0;\n\tbottom: 0;\n}\n\n.tc-drafts-list a {\n\tmargin: 0 0.5em;\n\tpadding: 4px 4px;\n\tborder-top-left-radius: 4px;\n\tborder-top-right-radius: 4px;\n\tborder: 1px solid <<colour background>>;\n\tborder-bottom-none;\n\tbackground: <<colour dirty-indicator>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a:hover {\n\ttext-decoration: none;\n\tbackground: <<colour foreground>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a svg {\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: text-bottom;\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: flex;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tfill: <<colour muted-foreground>>;\n\tbackground-color: <<colour background>>;\n\tmargin: 0.5em 0 0.5em 0;\n\tpadding: 4px;\n    align-items: center;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info {\n    margin: 0.5em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugin-indicator {\n\tmargin: -16px 1em 0 2em;\n}\n\n.tc-plugin-info-sub-plugin-indicator button {\n\tcolor: <<colour background>>;\n\tbackground: <<colour foreground>>;\n\tborder-radius: 8px;\n    padding: 2px 7px;\n    font-size: 0.75em;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info-dropdown {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\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-chunk > svg {\n\tfill: <<colour background>>;\n}\n\n.tc-plugin-info-chunk {\n    margin: 2px;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description {\n\tflex-grow: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-buttons {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tflex-grow: 0;\n\tflex-shrink: 0;\n    text-align: right;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h1 {\n\tfont-size: 1em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h2 {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description div {\n\tfont-size: 0.7em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle img, .tc-plugin-info-chunk.tc-plugin-info-toggle svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon img, .tc-plugin-info-chunk.tc-plugin-info-icon svg {\n\twidth: 2em;\n\theight: 2em;\n}\n\n.tc-plugin-info-dropdown {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\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 0 1em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugins {\n\tpadding: 0.5em;\n    margin: 0 1em 1em 1em;\n\tbackground: <<colour notification-background>>;\n}\n\n.tc-install-plugin {\n\tfont-weight: bold;\n\tbackground: green;\n\tcolor: white;\n\tfill: white;\n\tborder-radius: 4px;\n\tpadding: 3px;\n}\n\n.tc-install-plugin.tc-reinstall-downgrade {\n\tbackground: red;\n}\n\n.tc-install-plugin.tc-reinstall {\n\tbackground: blue;\n}\n\n.tc-install-plugin.tc-reinstall-upgrade {\n\tbackground: orange;\n}\n\n.tc-check-list {\n\tline-height: 2em;\n}\n\n.tc-check-list .tc-image-button {\n\theight: 1.5em;\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.tc-message-box svg {\n\twidth: 1em;\n\theight: 1em;\n    vertical-align: text-bottom;\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-right: 1px solid <<colour table-header-background>>;\n\tborder-left: 1px solid <<colour table-header-background>>;\n}\n\n\n.tc-chooser-item {\n\tborder-bottom: 1px solid <<colour table-header-background>>;\n\tborder-top: 1px solid <<colour table-header-background>>;\n\tpadding: 2px 4px 2px 14px;\n}\n\n.tc-drop-down .tc-chooser-item {\n\tpadding: 2px;\n}\n\n.tc-chosen,\n.tc-chooser-item:hover {\n\tbackground-color: <<colour table-header-background>>;\n\tborder-color: <<colour table-footer-background>>;\n}\n\n.tc-chosen .tc-tiddlylink {\n\tcursor:default;\n}\n\n.tc-chooser-item .tc-tiddlylink {\n\tdisplay: block;\n\ttext-decoration: none;\n\tbackground-color: transparent;\n}\n\n.tc-chooser-item:hover .tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-chosen .tc-tiddlylink,\n.tc-drop-down .tc-chooser-item .tc-tiddlylink:hover {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-chosen > .tc-tiddlylink:before {\n\tmargin-left: -10px;\n\tposition: relative;\n\tcontent: \"» \";\n}\n\n.tc-chooser-item svg,\n.tc-chooser-item img{\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: middle;\n}\n\n.tc-language-chooser .tc-image-button img {\n\twidth: 2em;\n\tvertical-align: -0.15em;\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\ninput.tc-palette-manager-colour-input {\n\twidth: 100%;\n\tpadding: 0;\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 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::-webkit-file-upload-button {\n\tcursor:pointer;\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\ttext-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\tmin-width: 100%;\n\tmin-height: 100%;\n\tmax-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** Diffs\n*/\n\n.tc-diff-equal {\n\tbackground-color: <<colour diff-equal-background>>;\n\tcolor: <<colour diff-equal-foreground>>;\n}\n\n.tc-diff-insert {\n\tbackground-color: <<colour diff-insert-background>>;\n\tcolor: <<colour diff-insert-foreground>>;\n}\n\n.tc-diff-delete {\n\tbackground-color: <<colour diff-delete-background>>;\n\tcolor: <<colour diff-delete-foreground>>;\n}\n\n.tc-diff-invisible {\n\tbackground-color: <<colour diff-invisible-background>>;\n\tcolor: <<colour diff-invisible-foreground>>;\n}\n\n.tc-diff-tiddlers th {\n\ttext-align: right;\n\tbackground: <<colour background>>;\n\tfont-weight: normal;\n\tfont-style: italic;\n}\n\n.tc-diff-tiddlers pre {\n    margin: 0;\n    padding: 0;\n    border: none;\n    background: none;\n}\n\n/*\n** Errors\n*/\n\n.tc-error {\n\tbackground: #f00;\n\tcolor: #fff;\n}\n\n/*\n** Tree macro\n*/\n\n.tc-tree div {\n    \tpadding-left: 14px;\n}\n\n.tc-tree ol {\n    \tlist-style-type: none;\n    \tpadding-left: 0;\n    \tmargin-top: 0;\n}\n\n.tc-tree ol ol {\n    \tpadding-left: 1em;    \n}\n\n.tc-tree button { \n    \tcolor: #acacac;\n}\n\n.tc-tree svg {\n     \tfill: #acacac;\n}\n\n.tc-tree span svg {\n    \twidth: 1em;\n    \theight: 1em;\n    \tvertical-align: baseline;\n}\n\n.tc-tree li span {\n    \tcolor: lightgray;\n}\n\nselect {\n        color: <<colour select-tag-foreground>>;\n        background: <<colour select-tag-background>>;\n}\n\n/*\n** Utility classes for SVG icons\n*/\n\n.tc-fill-background {\n\tfill: <<colour background>>;\n}\n\n/*\n** Flexbox utility classes\n*/\n\n.tc-flex {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-flex-column {\n\tflex-direction: column;\n}\n\n.tc-flex-row {\n\tflex-direction: row;\n}\n\n.tc-flex-grow-1 {\n\tflex-grow: 1;\n}\n\n.tc-flex-grow-2 {\n\tflex-grow: 2;\n}\n\n/*\n** Other utility classes\n*/\n\n.tc-small-gap {\n\tmargin-left: .5em;\n\tmargin-right: .5em;\n}\n\n.tc-small-gap-left {\n\tmargin-left: .5em;\n}\n\n.tc-small-gap-right {\n\tmargin-right: .5em;\n}\n\n.tc-big-gap {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\n}\n\n.tc-big-gap-left {\n\tmargin-left: 1em;\n}\n\n.tc-big-gap-right {\n\tmargin-right: 1em;\n}\n\n.tc-word-break {\n\tword-break: break-all;\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/options/codewrapping": {
            "title": "$:/themes/tiddlywiki/vanilla/options/codewrapping",
            "text": "pre-wrap"
        },
        "$:/themes/tiddlywiki/vanilla/reset": {
            "title": "$:/themes/tiddlywiki/vanilla/reset",
            "type": "text/plain",
            "text": "/*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\n\n/*\nDocument\n========\n*/\n\n/**\nUse a better box model (opinionated).\n*/\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\n/**\nUse a more readable tab size (opinionated).\n*/\n\n:root {\n  -moz-tab-size: 4;\n  tab-size: 4;\n}\n\n/**\n1. Correct the line height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n*/\n\nhtml {\n  line-height: 1.15; /* 1 */\n  -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/*\nSections\n========\n*/\n\n/**\nRemove the margin in all browsers.\n*/\n\nbody {\n  margin: 0;\n}\n\n/**\nImprove consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n*/\n\nbody {\n  font-family:\n    system-ui,\n    -apple-system, /* Firefox supports this but not yet `system-ui` */\n    'Segoe UI',\n    Roboto,\n    Helvetica,\n    Arial,\n    sans-serif,\n    'Apple Color Emoji',\n    'Segoe UI Emoji';\n}\n\n/*\nGrouping content\n================\n*/\n\n/**\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n*/\n\nhr {\n  height: 0; /* 1 */\n  color: inherit; /* 2 */\n}\n\n/*\nText-level semantics\n====================\n*/\n\n/**\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr[title] {\n  text-decoration: underline dotted;\n}\n\n/**\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\n/**\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n2. Correct the odd 'em' font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n  font-family:\n    ui-monospace,\n    SFMono-Regular,\n    Consolas,\n    'Liberation Mono',\n    Menlo,\n    monospace; /* 1 */\n  font-size: 1em; /* 2 */\n}\n\n/**\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n  font-size: 80%;\n}\n\n/**\nPrevent 'sub' and 'sup' elements from affecting the 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\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\n/*\nTabular data\n============\n*/\n\n/**\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n*/\n\ntable {\n  text-indent: 0; /* 1 */\n  border-color: inherit; /* 2 */\n}\n\n/*\nForms\n=====\n*/\n\n/**\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  font-family: inherit; /* 1 */\n  font-size: 100%; /* 1 */\n  line-height: 1.15; /* 1 */\n  margin: 0; /* 2 */\n}\n\n/**\nRemove the inheritance of text transform in Edge and Firefox.\n1. Remove the inheritance of text transform in Firefox.\n*/\n\nbutton,\nselect { /* 1 */\n  text-transform: none;\n}\n\n/**\nCorrect the inability to style clickable types in iOS and Safari.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n  -webkit-appearance: button;\n}\n\n/**\nRemove the inner border and padding in Firefox.\n*/\n\n::-moz-focus-inner {\n  border-style: none;\n  padding: 0;\n}\n\n/**\nRestore the focus styles unset by the previous rule.\n*/\n\n:-moz-focusring {\n  outline: 1px dotted ButtonText;\n}\n\n/**\nRemove the additional ':invalid' styles in Firefox.\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\n*/\n\n:-moz-ui-invalid {\n  box-shadow: none;\n}\n\n/**\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\n*/\n\nlegend {\n  padding: 0;\n}\n\n/**\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n  vertical-align: baseline;\n}\n\n/**\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/**\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n  -webkit-appearance: textfield; /* 1 */\n  outline-offset: -2px; /* 2 */\n}\n\n/**\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n/**\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to 'inherit' in Safari.\n*/\n\n::-webkit-file-upload-button {\n  -webkit-appearance: button; /* 1 */\n  font: inherit; /* 2 */\n}\n\n/*\nInteractive\n===========\n*/\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n  display: list-item;\n}\n"
        },
        "$:/themes/tiddlywiki/vanilla/settings/fontfamily": {
            "title": "$:/themes/tiddlywiki/vanilla/settings/fontfamily",
            "text": "system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\""
        },
        "$:/themes/tiddlywiki/vanilla/settings/codefontfamily": {
            "title": "$:/themes/tiddlywiki/vanilla/settings/codefontfamily",
            "text": "\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,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``\n<$list filter=\"[range[100]]\">\n`.tc-story-river .tc-tiddler-frame:nth-child(100n+`<$text text=<<currentTiddler>>/>`) {\nz-index: `<$text text={{{ [[200]subtract<currentTiddler>] }}}/>`;\n}\n`\n</$list>\n</$reveal>\n"
        }
    }
}
fluid-fixed
https://zen.tiddlyhost.com
yes
classic
Nguồn: https://langmai.org/phat-duong/tung-gioi/gioi-ban-tiep-hien-tan-tu/

Kính thưa các bạn đồng tu, hôm nay chúng ta có cơ hội quý báu được ngồi lại với nhau để ôn tụng mười bốn giới Tiếp Hiện. Mười bốn giới Tiếp Hiện là nền tảng của dòng tu Tiếp Hiện. Đó là bó đuốc soi đường, là con thuyền chuyên chở, là bậc thầy chỉ lối của chúng ta. Những giới này giúp ta tiếp xúc được với tự tánh tương tức của vạn vật và thấy được rằng hạnh phúc của chúng ta liên hệ một cách mật thiết với hạnh phúc của mọi người, mọi loài. Tương tức không phải là một lý thuyết, đó là một sự thật mà mỗi người trong chúng ta đều có thể kinh nghiệm trực tiếp bất cứ lúc nào trong đời sống hàng ngày. Mười bốn giới Tiếp Hiện có công năng chế tác và nuôi lớn Định và Tuệ trong ta và do đó giúp ta vượt thắng sự sợ hãi và ảo tưởng về một cái ta riêng biệt.

! Giới thứ nhất: Thái độ cởi mở

Ý thức được những khổ đau do thái độ cuồng tín và thiếu bao dung gây ra, con xin nguyện thực tập để không bị vướng mắc vào bất cứ một chủ nghĩa nào, một lý thuyết nào, một ý thức hệ nào, kể cả những chủ thuyết Phật giáo. Con nguyện nhìn nhận những giáo nghĩa Bụt dạy như những pháp môn hướng dẫn thực tập để làm phát khởi tuệ giác và từ bi mà không phải là những chân lý để thờ phụng và bảo vệ, nhất là bảo vệ bằng những phương tiện bạo động. Thấy được rằng niềm cuồng tín dù dưới bất kỳ hình thức nào cũng đều bắt nguồn từ cách tư duy lưỡng nguyên và kỳ thị, con xin nguyện tập nhìn với thái độ cởi mở và với tuệ giác tương tức để có thể chuyển hóa tập khí vướng mắc vào giáo điều và năng lượng bạo động trong con và trên thế giới.

! Giới thứ hai: Phá bỏ kiến chấp

Ý thức được những khổ đau do kiến chấp và vọng tưởng gây ra, con xin nguyện thực tập để phá bỏ thái độ hẹp hòi và cố chấp, để có thể mở lòng ra mà đón nhận kinh nghiệm và tuệ giác của kẻ khác, và nhờ đó thừa hưởng được nhiều lợi lạc từ trí tuệ tập thể. Con biết rằng những kiến thức hiện giờ con đang có không phải là những chân lý bất di bất dịch. Tuệ giác chân thật chỉ có thể đạt được do sự thực tập quán chiếu và lắng nghe, bằng sự buông bỏ tất cả mọi ý niệm mà không phải bằng sự chứa chấp kiến thức khái niệm. Con nguyện suốt đời là một người đi tìm học và thường trực sử dụng chánh niệm để quán chiếu sự sống trong con và xung quanh con trong từng giây phút.

! Giới thứ ba: Tự do nhận thức

Ý thức được những khổ đau do sự cưỡng bức người khác vâng theo cái thấy của mình, con nguyện không ép buộc bất cứ một ai, kể cả trẻ em, đi theo quan điểm của mình, bằng bất cứ cách nào: uy quyền, sự mua chuộc, sự dọa nạt, sự tuyên truyền và giáo dục nhồi sọ. Con nguyện tôn trọng sự khác biệt của kẻ khác và quyền tự do nhận thức của họ. Tuy nhiên con biết con phải sử dụng những phương tiện đối thoại từ bi và ái ngữ để giúp người khác cởi bỏ cuồng tín và cố chấp.

! Giới thứ tư: Ý thức về khổ đau

Ý thức rằng tiếp xúc và quán chiếu về bản chất của khổ đau có thể giúp con có thêm hiểu biết và phát khởi tâm từ bi, con nguyện thực tập quay về với tự thân và sử dụng năng lượng chánh niệm để nhận diện, chấp nhận, ôm ấp và lắng nghe những nổi khổ niềm đau trong con. Thay vì trốn tránh thực tại khổ đau và tìm cách khỏa lấp niềm đau trong con bằng sự tiêu thụ, con sẽ hết lòng thực tập hơi thở ý thức và bước chân chánh niệm để nhìn sâu vào những gốc rễ của khổ đau. Con ý thức rằng con chỉ có thể tìm thấy con đường thoát khổ khi nào con thấu hiểu được nguồn gốc của khổ đau. Và một khi thấu hiểu được khổ đau của tự thân thì con mới có khả năng hiểu được những khổ đau của người khác. Bằng những phương tiện tiếp xúc, tường thuật, hình ảnh, âm thanh, con nguyện thường xuyên tự đánh thức mình và đánh thức những người xung quanh về sự có mặt của những đau khổ hiện thực khắp nơi trên thế giới. Con nguyện tìm tới với những kẻ khổ đau để hiểu biết được tình trạng của họ và để giúp đỡ họ.

! Giới thứ năm: Nếp sống lành mạnh và từ bi

Ý thức rằng hạnh phúc chân thật chỉ thật sự có mặt khi nào các yếu tố an ổn, vững chãi, thảnh thơi và từ bi có mặt, con nguyện không tích lũy tiền bạc và của cải trong khi nhiều người đang đói khổ thiếu thốn, không đặt danh vọng, quyền hành, giàu sang và sự hưởng thụ dục lạc làm mục tiêu của đời mình vì con biết những thứ ấy sẽ đem lại cho con nhiều khổ đau và tuyệt vọng. Con nguyện thực tập nhìn sâu vào cách con nuôi dưỡng thân tâm bằng bốn loại thực phẩm: đoàn thực, xúc thực, tư niệm thực và thức thực. Con nguyện không chơi bài bạc, không uống rượu, không sử dụng các chất ma túy và bất cứ một sản phẩm nào có độc tố, trong đó có mạng lưới toàn cầu, trò chơi điện tử, phim ảnh, các chương trình truyền thanh, truyền hình, sách báo và cả chuyện trò, vì con biết rằng những thứ ấy có thể gây tàn hại trên thân tâm con cũng như trên thân tâm của cộng đồng. Con nguyện thực tập tiêu thụ như thế nào để nuôi dưỡng được lòng từ bi, sự lành mạnh và niềm vui sống cho thân tâm con cũng như cho gia đình, xã hội và cả cho trái đất.

! Giới thứ sáu: Chăm sóc cơn giận

Ý thức được rằng sân hận và oán thù có tác dụng cắt đứt truyền thông giữa người với người và tạo ra nhiều khổ đau cho cả hai phía, con nguyện học hỏi phương pháp chăm sóc năng lượng sân hận và oán thù khi chúng phát khởi trên ý thức con; cũng như phương pháp nhận diện và chuyển hóa hạt giống của sân hận và oán thù trong chiều sâu tâm thức con. Con nguyện tập luyện để mỗi khi cơn giận hoặc sự bực tức phát khởi, con sẽ không nói gì và làm gì cả mà chỉ thực tập hơi thở chánh niệm hoặc đi thiền hành để nhận diện và nhìn sâu vào bản chất của các tâm niệm sân hận và oán thù ấy. Con ý thức rằng gốc rễ của các cơn giận đó không phải ở bên ngoài con mà nằm ngay trong nhận thức sai lầm của con và nơi sự thiếu hiểu biết về khổ đau của chính con và của người kia. Bằng phương pháp quán chiếu về vô thường, con sẽ có thể nhìn lại chính con và nhìn lại người mà con nghĩ đã gây nên tâm niệm sân hận và oán thù trong con bằng con mắt từ bi và nhận ra rằng mối liên hệ giữa con và người đó quý giá biết nhường nào. Con cũng nguyện thực tập Chánh Tinh Tấn để nuôi dưỡng khả năng hiểu biết và thương yêu, khả năng chế tác niềm vui và lòng bao dung, không kỳ thị trong con. Nhờ đó, con sẽ dần dần chuyển hóa những bạo động, hận thù, sợ hãi trong con và giúp cho những người khác cũng làm được như vậy.

! Giới thứ bảy: Hiện pháp lạc trú

Ý thức được rằng sự sống chỉ có thể thật sự có mặt trong giây phút hiện tại, con nguyện tập luyện để có thể sống sâu sắc từng giây phút trong cuộc sống hàng ngày của con. Con nguyện không để cho những hối tiếc về quá khứ, những lo lắng về tương lai và những tham dục, giận hờn và ganh tỵ đối với những gì đang xảy ra trong hiện tại lôi kéo con và làm cho con đánh mất sự sống mầu nhiệm. Con xin nguyện thực tập giáo lý hiện pháp lạc trú, sử dụng hơi thở và nụ cười chánh niệm để tiếp xúc với những gì đang diễn ra trong giây phút hiện tại và tiếp xúc với những gì mầu nhiệm, tươi mát và lành mạnh trong con và chung quanh con dù trong bất kỳ hoàn cảnh nào. Nhờ đó, con sẽ có thể nuôi lớn những hạt giống an lành, hiểu biết và thương yêu trong con để làm động lực chuyển hóa và trị liệu trong chiều sâu tâm thức. Con ý thức rằng hạnh phúc chân thật được phát sinh từ chính tự tâm và cách nhìn của con chứ không phải từ những điều kiện bên ngoài, và con có thể sống hạnh phúc trong giây phút hiện tại bằng cách nhận ra rằng con đã có quá đủ những điều kiện hạnh phúc.

! Giới thứ tám: Xây dựng đoàn thể tu học chân chính và duy trì sự truyền thông

Ý thức được rằng những khó khăn trong việc truyền thông giữa người với người luôn luôn đưa tới ngăn cách và khổ đau, con nguyện thực tập lắng nghe bằng tâm từ bi và nói năng bằng lời ái ngữ. Ý thức rằng một đoàn thể chân thật được xây dựng trên nền tảng không kỳ thị và hài hòa trong quan điểm, tư duy cũng như lời nói, con nguyện thực tập chia sẻ những hiểu biết và kinh nghiệm của con với những thành viên khác trong đoàn thể để cùng nhau đi đến một cái thấy chung.

Con nguyện học hạnh lắng nghe chăm chú mà không phán xét, phản ứng, không nói ra bất cứ một lời nào có thể tạo nên sự bất hòa và có thể làm tan vỡ đoàn thể. Mỗi khi có khó khăn xảy ra, con nguyện ở lại cùng tăng thân và thực tập nhìn lại chính mình cũng như nhìn lại những người khác để tìm ra tất cả những nguyên nhân và điều kiện đã tạo nên tình trạng khó khăn, trong đó có cả những tập khí của chính con. Con sẽ nhận trách nhiệm về những gì con đã nói và đã làm, những gì có thể đã góp phần tạo nên sự bất hòa và tìm cách duy trì được sự truyền thông. Con sẽ không hành xử như một nạn nhân mà sẽ cố gắng hết sức để giải quyết mọi vụ bất hòa, dù lớn dù nhỏ.

! Giới thứ chín: Ngôn ngữ chân thật và từ ái

Ý thức được rằng lời nói có thể tạo ra khổ đau hay hạnh phúc, con xin nguyện thực tập sử dụng lời nói chân thật, từ ái và có tính xây dựng. Con chỉ sử dụng những lời nói nào có thể mang lại niềm tự tin, an vui và hy vọng, những lời chân thật có tác dụng hòa giải và mang lại an lạc cho tự thân con cũng như giữa mọi người với nhau. Con nguyện thực tập ái ngữ và lắng nghe để giúp con và những người khác chuyển hóa khổ đau và tìm ra con đường vượt thoát tình trạng khó khăn đó. Con nguyện không nói dối để mưu cầu tài lợi và sự kính phục, không nói những lời gây chia rẽ và căm thù. Con xin nguyện bảo vệ hạnh phúc và sự hòa hợp của tăng thân bằng cách tránh nói lỗi của người khác khi họ vắng mặt và luôn đặt câu hỏi về tính chính xác của những tri giác mà con đang có. Con nguyện chỉ nói với mục đích muốn hiểu rõ và giúp chuyển hóa tình trạng. Con nguyện không loan truyền những tin mà con không biết chắc là có thật, không phê bình và lên án những gì con không biết rõ. Con nguyện can đảm nói ra sự thật về những tình trạng bất công, dù hành động này có thể gây khó khăn cho con hay mang lại những đe dọa cho sự an thân của mình.

! Giới thứ mười: Bảo vệ và nuôi dưỡng tăng thân

Ý thức rằng mục đích và bản chất của một đoàn thể tu học là sự thực hiện tuệ giác và từ bi, con nguyện sẽ không bao giờ lợi dụng đạo Bụt và các đoàn thể giáo hội vào mục tiêu lợi dưỡng hoặc quyền bính, không biến các giáo đoàn thành những tổ chức hoạt động chính trị. Tuy nhiên, con nhận thức rằng một đoàn thể tu học phải có ý thức và thái độ rõ rệt về tình trạng áp bức, bất công xã hội, và tìm cách chuyển đổi các tình trạng ấy mà không cần và không nên dấn thân vào những cuộc tranh chấp phe phái. Con nguyện học nhìn với con mắt tương tức để thấy con và những người khác đều là những tế bào của cùng một tăng thân. Một khi đã là một tế bào thật sự của tăng thân, có khả năng chế tác ra Niệm, Định và Tuệ để nuôi dưỡng chính mình và nuôi dưỡng toàn thể tăng thân thì mỗi người trong chúng con cũng đồng thời là một tế bào của Phật thân. Chúng con nguyện tích cực xây dựng tình huynh đệ, đi với nhau như một dòng sông và thực tập để làm lớn thêm ba đức là trí đức, ân đức và đoạn đức, để thực hiện được sự nghiệp giác ngộ tập thể.

! Giới thứ mười một: Chánh mạng

Ý thức rằng thiên nhiên và xã hội con người đã bị tàn phá trầm trọng vì bất công và bạo động, con nguyện không sinh sống bằng những nghề nghiệp có thể gây tàn hại cho con người và thiên nhiên. Con sẽ làm mọi cách có thể để chọn những phương tiện sống nào có khả năng góp phần vào sự an lành của mọi loài trên trái đất và có khả năng cho phép con thực hiện được lý tưởng từ bi và cứu khổ của đạo Bụt. Ý thức được về hiện thực của thế giới trên các mặt kinh tế, chính trị và xã hội, cũng như mối tương quan giữa con người với môi trường sinh thái, con nguyện hành xử một cách có trách nhiệm với tư cách một người tiêu thụ và một công dân. Con nguyện không đầu tư vào hay mua sắm những sản phẩm của những doanh nghiệp chuyên làm lợi cho một nhóm người trong khi tước đoạt môi trường và cơ hội sinh sống của những nhóm người khác.

! Giới thứ mười hai: Tôn trọng sự sống

Ý thức được những khổ đau do chiến tranh và các cuộc xung đột tạo ra, con nguyện thực tập sống đời sống hàng ngày của con theo tinh thần bất hại, thương yêu và theo tuệ giác tương tức. Con nguyện góp phần vào công việc giáo dục hòa bình, làm môi giới trong chánh niệm và thực tập hòa giải trong phạm vi gia đình, cộng đồng, giữa những nhóm dân tộc và tôn giáo, quốc gia và quốc tế. Con nguyện không giết hại sinh mạng, không tán thành sự chém giết. Con nguyện sẽ không yểm trợ bất cứ một hành vi giết chóc nào trên thế giới, trong tư tưởng hoặc trong cách sống hàng ngày của con. Con cũng sẽ thường xuyên quán chiếu với tăng thân con để tìm ra những biện pháp hữu hiệu nhằm bảo vệ sinh mạng, ngăn chặn chiến tranh và xây dựng hòa bình.

! Giới thứ mười ba: Tôn trọng quyền tư hữu

Ý thức được những khổ đau do lường gạt, trộm cướp và bất công xã hội gây ra, con xin nguyện nuôi dưỡng lòng từ bi trong cách suy nghĩ, nói năng và hành động của con. Con xin học theo hạnh đại từ để đem niềm vui sống và an lạc cho mọi người và mọi loài, để chia sẻ thì giờ, năng lực và tài vật của con với những kẻ đang thật sự thiếu thốn. Con nguyện không lấy làm tư hữu bất cứ một của cải nào không phải do mình tạo ra. Con nguyện tôn trọng quyền tư hữu của kẻ khác, nhưng cũng nguyện ngăn ngừa kẻ khác không cho họ tích trữ và làm giàu một cách bất lương trên sự đau khổ của con người và của muôn loại.

! Giới thứ mười bốn: Tình thương đích thực

> Dành cho Tiếp Hiện Tại Gia

Ý thức được rằng tình dục và tình yêu là hai cái khác nhau, rằng sự phối hợp giữa hai cơ thể do thúc đẩy của tình dục không những đã không thể giải tỏa được nỗi cô đơn mà còn tạo thêm nhiều khổ đau, chua cay và xa cách, con nguyện không ăn nằm với bất cứ ai không phải là vợ hay chồng của con. Ý thức được rằng thân và tâm là một, con nguyện học hỏi những phương pháp thích ứng để chăm sóc năng lượng tình dục trong con và nuôi lớn các tâm Từ, Bi, Hỷ và Xả giúp làm tăng trưởng hạnh phúc của con và của người khác. Con ý thức được rằng hành động tà dâm sẽ gây ra khổ đau cho kẻ khác và cho chính con trong hiện tại và trong tương lai. Con biết muốn bảo vệ hạnh phúc của mình và của kẻ khác thì phải biết tôn trọng những điều mà mình và kẻ khác đã cam kết. Con nguyện sẽ làm mọi cách có thể để bảo vệ trẻ em, không cho nạn tà dâm tiếp tục gây nên sự đổ vỡ của các gia đình và của đời sống đôi lứa. Con sẽ đối xử với thân thể con một cách kính trọng và từ bi. Con nguyện thực tập nhìn sâu vào bốn loại thực phẩm và thường xuyên học hỏi bảo tồn tinh, khí và thần để thực hiện lý tưởng độ đời. Con cũng ý thức trọn vẹn trách nhiệm của con về sự cho ra đời những sinh mạng mới và thường xuyên quán chiếu về môi trường sinh hoạt trong tương lai của những sinh mạng này.
Dành cho Tiếp Hiện Xuất Gia

Ý thức được rằng lý tưởng xuất gia chỉ có thể thực hiện được với sự cắt bỏ hoàn toàn những ràng buộc đối với ái dục, con nguyện giữ mình thật tinh khiết, tự bảo vệ nếp sống phạm hạnh của con và hết lòng bảo vệ tiết hạnh của kẻ khác. Con biết cô đơn và khổ đau không thể nào được giải tỏa bằng dục tình mà chỉ có thể được chuyển hóa bằng sự thực tập Từ, Bi, Hỷ và Xả. Con biết hành động dâm dục sẽ làm tan vỡ cuộc đời xuất gia của con, làm hại đến cuộc đời của kẻ khác và không cho con thực hiện được lý tưởng cứu độ chúng sanh của mình. Con nguyện học hỏi những phương pháp thích ứng để chăm sóc năng lượng tình dục trong con. Con nguyện không ép uổng thân thể con, không đối xử với thân thể con một cách bạo động và khinh xuất, không xem thân thể chỉ như là một dụng cụ. Con nguyện bảo trọng thân thể con, nguyện thực tập nhìn sâu vào bốn loại thực phẩm và thường xuyên học hỏi bảo tồn tinh, khí và thần để đi tới trên đường thành tựu đạo nghiệp.

(Tu chỉnh năm 2012)
Nguồn: https://plumvillage.org/mindfulness-practice/the-5-mindfulness-trainings/nam-gioi-tan-tu/

! Lời mở đầu

Kính thưa Đại chúng! Bây giờ là lúc chúng ta có cơ hội tụng chung Năm giới với nhau. Năm giới tức là năm phép thực tập chánh niệm, biểu hiện được một cách cụ thể giáo lý Tứ đế và Bát chánh đạo, con đường của Bụt, con đường của hiểu biết và thương yêu đích thực có khả năng đưa tới trị liệu, chuyển hóa và hạnh phúc cho bản thân và cho thế giới. Năm giới mang theo tuệ giác Tương tức, tức là Chánh kiến, có khả năng tháo bỏ mọi cuồng tín, cố chấp, kỳ thị, sợ hãi, hận thù và tuyệt vọng. Sống và thực tập theo Năm giới là chúng ta đã đi vào con đường mà các vị Bồ tát đang đi. Năm giới này đại diện cho cái thấy của đạo Bụt về một nền tâm linh và đạo đức toàn cầu. Biết rằng đang được đi trên con đường của Bụt, chúng ta không còn lý do gì để lo lắng cho hiện tại và sợ hãi cho tương lai.

!! Giới thứ nhất: Tôn trọng sự sống

Ý thức được những khổ đau do sự giết hại gây ra, con nguyện thực tập nuôi dưỡng tuệ giác Tương tức và lòng Từ bi, để có thể bảo vệ sự sống của mọi người, của mọi loài và môi trường sống. Con nguyện không giết hại, không để kẻ khác giết hại và không tán thành bất cứ một hành động giết hại nào trên thế giới, dù là trong tâm tưởnghay trong cách sống hằng ngày của con. Thấy được rằng tất cả những bạo động do sợ hãi, hận thù, tham vọng và cuồng tín gây ra đều bắt nguồn từ cách tư duy lưỡng nguyên và kỳ thị; con nguyện học hỏi thái độ cởi mở, không kỳ thị, không cố chấp vào bất cứ một quan điểm, một chủ thuyết hay một ý thức hệ nào để có thể chuyển hóa hạt giống cuồng tín, giáo điều và thiếu bao dung trong con và trên thế giới.

!! Giới thứ hai: Hạnh phúc chân thực

Ý thức được những khổ đau do lường gạt, trộm cướp, áp bức và bất công xã hội gây ra, con nguyện thực tập chia sẻ thì giờ, năng lực và tài vật của con với những kẻ thiếu thốn, trên cả ba phương diện tư duy, nói năng và hành động trong đời sống hằng ngày. Con nguyện không lấy làm tư hữu bất cứ một của cải nào không phải do tự mình tạo ra. Con nguyện thực tập nhìn sâu để thấy được hạnh phúc và khổ đau của người kia có liên hệ mật thiết đến hạnh phúc và khổ đau của chính con. Con biết hạnh phúc chân thực không thể nào có được nếu không có hiểu biết và thương yêu, trong khi đó đi tìm hạnh phúc bằng cách chạy theo quyền lực, danh vọng, giàu sang và sắc dục có thể đem lại nhiều hệ lụy và tuyệt vọng. Con ý thức được hạnh phúc chân thực phát sinh từ cách nhìn của con mà không phải từ bên ngoài đem tới. Thực tập tri túc giúp con sống hạnh phúc được ngay trong giây phút hiện tại để nhận diện những điều kiện hạnh phúc mà con đã có. Con nguyện thực tập theo Chánh mạng để có thể làm giảm thiểu khổ đau của mọi người và để chuyển ngược lại quá trình hâm nóng địa cầu.

!! Giới thứ ba: Tình thương đích thực

Ý thức được những khổ đau do thói tà dâm gây ra, con nguyện thực tập theo tinh thần trách nhiệm để giúp bảo hộ tiết hạnh và sự an toàn của mọi người, mọi gia đình và xã hội. Con biết tình dục và tình yêu là hai cái khác nhau. Những liên hệ tình dục do sự thèm khát gây nên luôn mang tới những hệ lụy, đổ vỡ cho con và cho kẻ khác. Con nguyện không ăn nằm với bất cứ ai nếu không có tình yêu đích thực và những cam kết chính thức lâu dài. Con sẽ làm mọi cách để bảo vệ trẻ em, không cho nạn tà dâm tiếp tục gây nên sự đổ vỡ của các gia đình và của đời sống đôi lứa. Con nguyện học hỏi những phương pháp thích ứng để chăm sóc năng lượng tình dục trong con, để thấy được sự thực thân tâm nhất như và nguyện nuôi lớn các đức Từ, Bi, Hỷ và Xả, tức là những yếu tố căn bản của một tình yêu thương đích thực, làm tăng trưởng hạnh phúc của con và của người khác. Con biết thực tập Tứ vô lượng tâm, con sẽ được tiếp tục đẹp đẽ và hạnh phúc trong tương lai.

!! Giới thứ tư: Ái ngữ và lắng nghe

Ý thức được những khổ đau do lời nói thiếu chánh niệm và thiếu khả năng lắng nghe gây ra, con nguyện học hạnh Ái ngữ và lắng nghe để có thể hiến tặng niềm vui cho người và làm vơi bớt nỗi khổ đau của người. Con nguyện tìm cách đem lại an bình và hòa giải giữa mọi người, giữa các quốc gia, chủng tộc và tôn giáo. Biết rằng lời nói có thể đem lại hạnh phúc hay khổ đau cho người, con nguyện học nói những lời có khả năng gây thêm niềm tự tin, an vui và hy vọng, những lời chân thực có giá trị xây dựng hiểu biết và hòa giải. Con nguyện không nói gì khi cơn giận tức đang có mặt trong con. Con nguyện tập thở và đi trong chánh niệm để nhìn sâu vào gốc rễ của cơn giận ấy, để nhận diện những tri giác sai lầm trong con và tìm cách hiểu được những khổ đau trong con và trong người mà con đang giận. Con nguyện học nói sự thực và lắng nghe sâu để có thể giúp người kia thay đổi và vượt thoát những khó khăn đang gặp phải. Con nguyện không loan truyền những tin mà con không biết chắc là có thật, không nói những điều có thể tạo nên sự bất hòa trong gia đình và trong đoàn thể. Con nguyện thực tập Chánh tinh tấn để nuôi dưỡng khả năng hiểu biết, thương yêu, hạnh phúc và không kỳ thị nơi con, để làm yếu dần những hạt giống bạo động, hận thù và sợ hãi mà con đang có trong chiều sâu tâm thức.

!! Giới thứ năm: Nuôi dưỡng và trị liệu

Ý thức được những khổ đau do sự tiêu thụ thiếu chánh niệm gây nên, con nguyện học hỏi cách chuyển hóa thân tâm, nuôi dưỡng sức khỏe cơ thể và tâm hồn bằng cách thực tập chánh niệm trong việc ăn uống và tiêu thụ. Con nguyện nhìn sâu vào bốn loại thực phẩm là đoàn thực, xúc thực, tư niệm thực và thức thực để tránh tiêu thụ những thực phẩm độc hại. Con nguyện không uống rượu, không sử dụng các chất ma túy, không ăn uống hoặc tiêu thụ bất cứ một sản phầm nào có độc tố, trong đó có mạng lưới toàn cầu, ca nhạc, phim ảnh, truyền thanh, truyền hình, sách báo, bài bạc và chuyện trò. Con nguyện thực tập thường xuyên trở về với giây phút hiện tại để tiếp xúc với những gì tươi mát, có khả năng nuôi dưỡng và trị liệu trong con và xung quanh con mà không để cho tiếc nuối và ưu sầu kéo con trở về quá khứ; không để lo lắng và sợ hãi kéo con đi về tương lai. Con nguyện không tiêu thụ chỉ để khỏa lấp sự khổ đau, cô đơn và lo lắng trong con. Con nguyện nhìn sâu vào tự tính tương quan, tương duyên của vạn vật để học tiêu thụ như thế nào mà duy trì được an vui trong thân tâm con, trong xã hội và trong môi trường sống.
Nguồn: https://langmai.org/phat-duong/kinh-nhac/

! Niệm Bụt

Tự thân của đức Như Lai, người từ chân như tới, thầy của chúng <br>
Là bậc xứng đáng nhất để được cúng dường <br>
Là bậc có trí giác chân thực và toàn diện <br>
Là bậc có đầy đủ công hạnh và tuệ giác <br>
Là bậc đã qua tới một cách nhiệm mầu <br>
Là bậc hiểu thấu thế gian <br>
Là bậc nhân sĩ cao tột có khả năng điều phục con người <br>
Là bậc thầy của cả hai giới thiên và nhân <br>
Là bậc tỉnh thức toàn vẹn <br>
Là bậc được tôn sùng quý trọng nhất trên đời. (C)

! Niệm Pháp

Diệu pháp của đức Thế Tôn <br>
Con đường mà chúng con đang nguyện đi theo <br>
Là giáo pháp đã được nhiệm mầu tuyên thuyết <br>
Là giáo pháp có thể chứng nghiệm ngay trong giờ phút hiện tại <br>
Là giáo pháp có giá trị vượt thoát thời gian <br>
Là giáo pháp mọi người có thể đến mà tự thấy <br>
Là giáo pháp có công năng dẫn đạo đi lên <br>
Là giáo pháp có công năng dập tắt phiền não <br>
Là giáo pháp người trí nào cũng có thể tự mình thông đạt. (C)

! Niệm Tăng

Tăng thân của đức Thế Tôn <br>
Là đoàn thể mà chúng con đang quay về nương tựa <br>
Là đoàn thể đang đi trên đường sáng ngời <br>
Là đoàn thể đang đi trên đường chính trực <br>
Là đoàn thể đang đi trên đường ứng hợp chân lý <br>
Là đoàn thể đang đi trên đường thánh thiện <br>
Là đoàn thể gồm thâu bốn đôi và tám bậc thánh quả <br>
Là đoàn thể xứng đáng được cúng dường <br>
Là đoàn thể xứng đáng được quy kính <br>
Là đoàn thể xứng đáng được tôn sùng <br>
Là đoàn thể xứng đáng được ngưỡng mộ <br>
Là ruộng phước quý hóa nhất trên đời. (C)

! Niệm Giới

Giới pháp của đức Thế Tôn <br>
Luật nghi chánh niệm mà chúng con đang hành trì <br>
Là giới thân nguyên vẹn <br>
Là giới thân không bao giờ bị sứt mẻ <br>
Là giới thân không bao giờ bị nhiễm ô <br>
Là giới thân không bao giờ bị tỳ vết <br>
Là giới thân không bao giờ bị hỗn tạp <br>
Là giới thân được người thức giả ngợi khen và hâm mộ <br>
Là giới thân có công năng bảo vệ tự do <br>
Là giới thân đưa tới sự không sợ hãi <br>
Là giới thân đưa tới chánh định <br>
Là giới thân đưa tới tuệ giác <br>
Là giới thân đưa tới giải thoát và hạnh phúc đời đời. (CCC)

! Lạy Đức Bồ tát Phổ Hiền

Lạy đức Bồ Tát Phổ Hiền, chúng con xin học theo hạnh nguyện của Bồ Tát, biết đem con mắt và trái tim đi vào cuộc sống. <br>
Chúng con xin nguyện buổi sáng dâng niềm vui cho người, buổi chiều giúp người bớt khổ. <br>
Chúng con biết hạnh phúc của người chính là hạnh phúc của mình, và nguyện thực hiện niềm vui trên con đường phụng sự. <br>
Chúng con biết mỗi lời nói, mỗi cái nhìn, mỗi cử chỉ và mỗi nụ cười đều có thể đem lại hạnh phúc cho người. <br>
Chúng con biết rằng, nếu chúng con siêng năng tu tập, thì tự thân chúng con có thể là một nguồn an lạc bất tuyệt cho những người thân yêu của chúng con và cho cả muôn loài. (C)

! Lạy đức Bồ tát Quán Thế Âm

Lạy đức Bồ Tát Quan Thế Âm, chúng con xin học theo hạnh Bồ Tát, biết lắng tai nghe cho cuộc đời bớt khổ. <br>
Ngài là trái tim biết nghe và biết hiểu. <br>
Chúng con xin tập ngồi nghe với tất cả sự chú tâm và thành khẩn của chúng con. <br>
Chúng con xin tập ngồi nghe với tâm không thành kiến. <br>
Chúng con xin tập ngồi nghe mà không phán xét, không phản ứng. <br>
Chúng con nguyện tập ngồi nghe để hiểu. <br>
Chúng con xin nguyện ngồi nghe chăm chú để có thể hiểu được những điều đang nghe và cả những điều không nói. <br>
Chúng con biết chỉ cần lắng nghe thôi, chúng con cũng đã làm vơi bớt rất nhiều khổ đau của kẻ khác rồi. (C)

! Lạy đức Bồ tát Văn Thù Sư Lợi

Lạy đức Bồ Tát Văn Thù Sư Lợi, <br>
chúng con xin học theo hạnh Bồ Tát, biết dừng lại và nhìn sâu vào lòng sự vật và vào lòng người. <br>
Chúng con xin tập nhìn với tất cả sự chú tâm và thành khẩn của chúng con. <br>
Chúng con xin tập nhìn với con mắt không thành kiến. <br>
Chúng con xin tập nhìn mà không phán xét, không phản ứng. <br>
Chúng con nguyện tập nhìn sâu để thấy và để hiểu những gốc rễ của mọi khổ đau, để thấy được tự tánh vô thường và vô ngã của vạn vật. <br>
Chúng con xin học theo hạnh Ngài, dùng gươm trí tuệ để đoạn trừ phiền não, giải thoát khổ đau cho chúng con và cho mọi giới. (C)

! Lạy đức Bồ tát Địa Tạng

Lạy đức Bồ Tát Địa Tạng, chúng con xin học theo hạnh Bồ Tát, tìm cách có mặt ở bất cứ nơi nào mà bóng tối, khổ đau, tuyệt vọng và áp bức còn đang trấn ngự, đẻ có thể mang đến những nơi ấy ánh sáng, niềm tin, hy vọng và giải thoát.

Chúng con nguyện không bao giờ quên lãng và bỏ rơi những người còn đang bị kẹt trong những tình uống tuyệt vọng, nguyện cố gắng thiết lập liên lạc với những ai đang không còn lối thoát, những ai bị bưng bít không vó phương tiện lên tiếng kêu gọi công bình, nhân phẩm và quyền được làm người.

Chúng con biết đại ngục có mặt khắp nơi trên thế giới và chúng con nguyện sẽ không bao giờ tiếp sức xây dựng thêm những đại ngục trần gian như thế; trái lại, chúng con xin nguyện nỗ lực giải trừ những đại ngục còn đang có mặt.

Chúng con nguyện tu học để đạt được đức vững chãi và kiên trì của Đất, để có thể trở thành trung kiên và không kỳ thị như Đất, và cũng đựơc như Đất có thể làm nơi nương tựa cho tất cả những ai cần đến chúng con. (C)
Nguồn: https://langmai.org/thien-duong/bai-tap-can-ban/

* [[Thiền tập căn bản - Hiện tại tuyệt vời]]
* [[Thiền tập căn bản - Ngồi thiền]]
* [[Thiền tập căn bản - Vững chãi – an ổn]]
* [[Thiền tập căn bản - Khỏe - nhẹ]]
* [[Thiền tập căn bản - Là hoa tươi mát]]
* [[Thiền tập căn bản - Em bé 5 tuổi bị thương]]
iVBORw0KGgoAAAANSUhEUgAAAMkAAAAcCAYAAADLNZuZAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AAA65SURBVHic7Zt3eFRV+sc/d2butEzJTBrJkBBapAQQWAEXKQqG3kVxQZFVF0VcVFYXlvWxCw/qT3+WBR9XBUSpkV6ESC8W7CBNEFJIn8m0ZNqdu38MSsCQIRFX2Gc+z5M/Mufe977vued73vecMyPIsiwTI0aMi6L4vR2IEeNKJyaSGDGiEBNJjBhRiIkkRowoqC7WEAgEeHdxLu6a6kYZNur0TJowBrVa3WjnYsS4Eqgzk9idTtRqNQNu7o1WbPgg14qRe9VqNXan81c7GSPG70mdIlm+cgMfbdtHhi2V8beOxGo2X7JBq9nM+FtHkmFL5aNt+1i+csNlczZGjN+DOkXi8dXw3eHDrFi1GZ1WZPzYYTS3NY1qrLmtKePHDkOnFVmxajPfHT6Mx1fTQJdkdi39kdazytghgfeLYto+ks/c/N/+OCd/eyHZ/1/Fb/UoKb+S/o8Vs9pXd3vYXsWt008wdnuQcEONy2FOHqrimYVFDHjqR7IfPUmP2YXc+W4Zr38dwHMFnIZdGN/xrQVkv+Gk9ArwrT4uuiYBKCgp5v0V6xg5JIdRw29mx67P+PLQoTqv7dK+PX17d8NR5Wb1hi04XK5GuiRgu8bMXUY1TQUQk+OY2FviD0ahkfauHgSthiG9zcjpChoSreSs5uX3Snm7WEVOdwN3dbTQJlGBuzLAsVNeliwpYPEuE7NuT2RY0u/Xj42N7/emXpEAOFwuFq9cy9CcPtzUtweJiSbydn9KOByZ6xQKBf17dadjdjtOnMpn/ZadBIOBX+VUy85WZnU++0+6iRnpv8rcVYOg1zFxhK5B94SdXma+VsoXNisL/26mm6nW8EvX0vtaExNvrOHND0p4dJ6M5pFkcgyX2fFLpDHxXQlEFQlAMBhg9cY8cvpcT8fsdsRbLKzftA2AoYNuIsOWyneHDrNl534ux7dc8rcXMvhbAxv/Go+toJIBrweY+nQqI1Veps0qZp3//OuVCfEs/UciXZVQXeLmpTVV5OUHcWtEOmbHM3OIkWs0kWtLjjh4fpOLfSUhQjo13a+z8sSgONJ+Ljxl8r+q4PE8D19XyiRnGnn0tkRyrJHWaPYD5R5eWeNg7ckgVYKS1teYmDHaQvdaA9N7xsXMjVVsKwyBRceEUclMzVIiSNU89kQpivGZzGkrs+qtU3zQPJW/BJwsOOznRBVkdrDy7GgjrVSAHCJ3WRl7bEmsmGjEpgBPkYtXNrvYURQmqa2FxztJvHdExf0TUyj7v2Ke32qk7ygdakBy1TB/VSUrjgXwmbTk9Dai31POmZzmvNpJZt07p1iY0YQ7XFW8dyxAkSwyeHAy9+rcPL3Jy6HyEEqbiSfHJ9DbFImt/JiDZze62FscwqdS0qKFkQdHWbnZKsB58UXPJWGvj4VrKll6xM+ZsJL27eOZMcLMtfrIeyo4aOf5LR4OlEmIFg29rk9gRi8tFgGkwkoGvykx5U6RbVs8fFMmYWoez9Oj9fywuYLFJwIU+JT0HpjCnOvVaOrx45LPSTQqEXN8PAAZtlQm3D6SCbdHFugA5vh4NCrxUs01DpWep2dlsu+ps3+PJTPUItC8nZ6WCghXunjgtTK2qQ3MujuNt0YZMR8pY9y7TvJlCFc6+duCKspbWHjxPhsv52go3lXKEwdC/CTt0BkHTx1QMH5cGovuiKdVhZOZG71UE90+YT/zFpSyRo7jsbvSeOc2MxmFdqat8+L9KQaphpc/rKZ1/xQWTk7mNpOP15Y5+FKqK2CZH/fb2dEkgbenN2PnNAumb8t59vOIv8Efq3jjpJoHRkQE4j1Rybh/VVHVPpHFDzXhbrWLexbY2elTkKzXM7GHmtJDXg5KgOTn9TfPsNCj4+FJabwxRI/94zLeLpbPe/7RPVUUdklh+YxmLOoOy98r4E/7VUy/P50d/0ihl6OK5/b4kYCw082sBQ5OpcXz3L023hlnoZPTySO5bioaOncG/bw67wxvVGi47w4biyfEk366kvtXeqiUwf5tGbctcFPTNoHXp6Qx+waR7zee4a6tfoI/2fB5+fdXItMnp7Pt0STaFVQyYW45JzqnkDuzGbn9lWxfY2dLlGXzJWUSkz6O0cMHYrWY2PzxXpxVToYM6gvAstyNmOPN5Nx4PePGDOPDtZtxVXvrN9hoBMwmFWYAKcjS5ZXsTUzgg+F64gWZw59VsV9rZuF4C93VAFqyDSEGveHkwzMmHqgOcEISuecGI30TBMhU09Si53St9Y4s6Lj/dis5RgCRvxa4ueVYkEpZxhPF/kNJQY6VC2T3NTMsS4mAllZWkb0ekZ9ViIL+g5P5cxsFoKFlvxpW/DtIQRC61jHHVCcbebiziBYgIY6b08v5V3kICSUHD3qpaG5hoAWQ/Mxb6UT6o43ne2hQA0nddFh2BcjuoEMLNE0WUXok7DK4DzlYZNczc3ICI0yRWNqqg3w9//y1pNjazN2ZShRAi7Y6MjdJ9O1npKUaUOvom6lgjSOEhAaVpKRnv2S69TbQVozYbFLp5sPPQ9hlSGzAm64+WsV75VoemZHIKAuAhqwxEpO3BjgWDHF8t4dgxxReGWggXgAytNhq/Azb7eLzfkl0j3jPkBsNZKgAg54bmwmsD5mY0lqJEkhvo6PlOi9FbqCeKjCqSJITEhk5rD9aUSR37RZOFxUBsGBxLgC+YICCkmLcbjcjBt/EuFuHsXpdHmWVFQ3okgYih/lsQwnPleh5cVo814gAMj8UBxEztHSsdbSjaarjWpWTo6UyYnsDY1PdzJmbT152HL1a6xnQyUD/Wh2kStLSIe6n/wS06kiylS/BPmk6Rl+nYtrS0wz4wkC/LB19OsUxtGlkoSoBKNVcm34ugQuiUG+qT05RRwYBgCCgql0WlktYkkTMAkhFHjZViIz9Q0QgAIGKIMV6PdNbRgxUVEnIVh02hczJ/ADVyUa61ioD9c20dFDWFomA2ag8N0gUAkpBSZLh3KSiVAChs81WPXf0DHLwpIdlZwJ8X1DD3iM+ghZ9PRHWhczpQj/ViQa61jp90LW2sqg1IFWzvhTadNZirlW1ZbbQkfyRn2NOIiIRlCTGnWtXKsBoVEUmHEBQCiiRa01gdVNvudXMZmPc6EEALMnd8LNAICIOX60F+umiIpbkRs5Exo0eRDObrf4n/woKD5Tx0D6BeyYmMcB0QaMgnL9zIoBCAWEZ0Oh45KFmbJxkoY9R4pMdpQx56jRT9wV+TtGCSkBTX7lcn31BSb+x6Wx7OIVJzQWKvrdz3+zTDF3m4Yx87gbtJVelAqJKuOhOUDgs4w/KyEC4RsKDAt1PipMl8g5UI2QZIllP8rPsEz/Z3YxkKSAsyyBwgW0B4VdsOwWKnUx5oYD7Nrg5GFByXfdEZt+opTFFuBQGBAHlxS6Q4Rc9I4CA3PDt8yjUKRKjTk92mzaMGZ6Dy13N0uXrKLfboxort9tZunwdLnc1Y4bnkN2mDUZdQ2eR+qk+ZefBXB+db2nC1Iza7gu0aCISzK/hYPDcp/7CGr4OiGSlCNiPO5n7sQ9Nlon7RqawaEYmH/xR4OO9Hk5G7dno9sN2L/PXOzluiuP2AUm8OrUZuybFYT/gZHtjd8Tr8adlqojrRx9Hw6Bqqqe7xk/u7hrsQYlvdpUx+7swpjgFQY+flctKWaKKZ2ZPESUCmWlqxDIfX9WqjH2FPr4PNdYfma/2O9gZb2Xlw6k8M8DM0GvUGCU52kRdZ2wZqWo0FT6+8Zz7NFTg4M6XythUoyYrBY6c9OGqZTz/pI8ynZrWxsbGUDd1lltjRw3BajFxqqCINZu2NWhL11Xt5f3cdYwYdBMD+/XE7uhw2ZwNOz38c5EDR6cUXsoScLjPrnYFAUOcgrbdzHTbU8nMpSpm9dFh8dSwYI2LyhYJ3JImoD0eYM1mB8eR+XMbEdHpY9XxEKYmapIFcNf7dCGqfaE6zLf7K1npgL/31JEaDvLpFz5cZj2t9MBl/YaOQPuuBrJ2Opn3tYnXuhiYNcHPjNwS+n2upEv3BOaOhJkbztDjgIqOHeJ5d4qZ7LPTuqWThfF5Rcx9345mQBzpfh+L1nvwqhubTQQSTSqE73x8dDxAP6tM/lEnL+4KEFSJfFkq0SK5ntvDATZscfNDqompnURMHSzcubWQFxbb0Q6Mo5UQJHeNg8PmRDrFqVDfYGD+4nKmp8hMaSviK3QxJ89Pqz5J9LjM+0d1isRqMREMBtmSt7tRZx7BYIAtebuZNGEMVsuF9VDjCRV62e6QcX5aQv9PazUodTz5uI07E83Me1DBC2scPD7fjkejomN2IkuGmGimALISeH2kzOyd5fxlSxilXqRDdgJvDTVgiSoSUESzbzDy5MQQz6x3MuPNSnwqJc0zDcy5J4Hu4tk1yWVEmRrPE328TFxRwhxNCtPbJ/DurIRaV8Sxu6dMQCGgvnDgi1qmT26CMtfOs285USbq+NPwZJJXlVLRyEHWslcSs0rLmb+gkFfUKjq2M/P0wwa25layeEcN/cfWU93LIXbudrC9g44pnUSUKg3TJqeiXW3n5XeqKENJu/YJvDncRJoAXJvMMoWdZ7dWcm+ehNqiodcgGzN7aRC5vH0tXIk/3619TpJxNR3N/heQwzI1EujFsx0TDrFjfQnTdwRI6BjP5G56OqSpaaoJU1QS4GipRFoHI13izrcT9vjZlQ9t22hIOTt2ZbeLe2c76TotnftTLtGhsIw3BHG/UOHVQSgQRlIp0NSj30vaAv6vIkkcL5MIqwRiX7L/JYJCQF/7hSpU9B1uY0O2m7e3O3lpoZ1Sf2TDRlAoaGLTMbGJgS5xFwzigI+3F9lR9U/hnz20pEgB1q528InVyKNJDXBIIRB3Fb8olVoRVQRXViaRg7zzaj7PFakYOjaNl68TY78KayjhMA63hEdWYDUqibvo9hAUf2/n8bVO9pRKSKKSZi1MPDbWSk7C1ZkVfiuuLJEA1V4JSaPEeOXluP9ZwpJMWCGgimmjTq44kcSIcaURq2ZixIhCTCQxYkQhJpIYMaIQE0mMGFH4D/QjyHA7O4k6AAAAAElFTkSuQmCC
! Linh Sơn Pháp Bảo Đại Tạng Kinh

* Nguồn tải xuống #1: https://sachphat.net/linh-son-phap-bao-dai-tang-kinh
* Nguồn tải xuống #2: http://www.daitangkinh.org/index.php/gioithieudtk
* Nguồn tải xuống #2: https://thuvienhoasen.org/p16a31409/dai-tang-kinh-tieng-viet-nam-truyen-va-bac-truyen (Thư viện Hoa Sen - có thể download nhưng hơi khó tra cứu)
<<<
Thở vào tâm tĩnh lặng  <br>
Thở ra miệng mỉm cười <br>
An trú trong hiện tại <br>
Giờ phút đẹp tuyệt vời
<<< 

! Thiền tập

* [[Các bài thiền tập căn bản (đọc tại đây)|Các bài thiền tập căn bản]]
* [[Thiền tập cho người bận rộn (đọc tại đây)|Thiền tập cho người bận rộn]] ([[Tải xuống bản PDF|https://hoavouu.com/images/file/qLC4AWEx0QgQAN0d/thien-tap-cho-nguoi-ban-ron.pdf]])

<html>
<iframe width="560" height="315" src="https://www.youtube.com/embed/hEgBG54cuMw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</html>

! Thiền tập ứng dụng

* [[Giận - Chuyển hóa cảm xúc tiêu cực|Giận]] ([[Tải xuống bản PDF|https://thuvienhoasen.org/images/file/YRjUvp1G0QgQAJ43/gian.pdf]])

! Liên lạc

Nếu có ai cần giúp đỡ xin vui lòng gửi câu hỏi tới page ''thesoundofbells'' hoặc thư điện tử dưới đây:

* Facebook messenger: https://www.facebook.com/thesoundofbells
* Địa chỉ thư điện tử: [img[contact.png]]

! Con đường giải thoát

* [[Khái quát về con đường]] (đang cập nhật)
DhammaTalks offers an extensive collection of English translations of suttas from the Pāli Canon, as well as a multitude of free downloads of Dhamma from the Kammaṭṭhāna (or Thai Forest) Tradition of Buddhism. Ṭhānissaro Bhikkhu of Metta Forest Monastery is the speaker, author or translator unless otherwise noted.
! 🇬🇧 English

* [[Getting started]] for beginners
* [[Zen hall]]

! 🇻🇳 Tiếng Việt

* [[Dành cho người mới bắt đầu]]
* [[Thiền đường]]
* Q: Do I need to become a Buddhist to meditate?
** A: No. Anyone can meditate. You can read more at [[Secular Meditation]].

* Q: I have never tried meditation before, how do I start?
** A: Please see [[Getting started]] section.

(to be updated)
Here are some beginner friendly materials

! Meditation guide

* [[With Each & Every Breath: A Guide to Meditation|https://www.dhammatalks.org/books/WithEachAndEveryBreath/Contents.html]] (Ṭhānissaro Bhikkhu) ([[Download|https://www.dhammatalks.org/ebook_index.html#eachandeverybreath]])
* [[Keeping the Breath in Mind & Lessons in Samadhi|https://www.dhammatalks.org/books/KeepingTheBreath/Section0000.html]] (Ajaan Lee Dhammadharo) ([[Download|https://www.dhammatalks.org/ebook_index.html#keepingthebreath]])
* [[Mindfulness in Plain English|https://mindfulness-in-plain-english.github.io/]] (Ven. Henepola Gunaratana) ([[Download|http://www.ahandfulofleaves.org/documents/Mindfulness%20in%20Plain%20English_Gunaratana.pdf]])

! Zen

* [[Zen Mind, Beginner's Mind|https://www.goodreads.com/book/show/402843.Zen_Mind_Beginner_s_Mind]] (Shunryu Suzuki)
* [[Zen Flesh, Zen Bones: A Collection of Zen and Pre-Zen Writings|https://www.goodreads.com/book/show/870160.Zen_Flesh_Zen_Bones]]

<html>
<iframe width="560" height="315" src="https://www.youtube.com/embed/UEUxFNkISnU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</html>

! The paths to awakening

* [[Introduction to the path]]
* [[The Wings to Awakening|https://www.dhammatalks.org/books/Wings/Section0000.html]] ([[Download|https://www.dhammatalks.org/ebook_index.html#wings]])

! See also

* [[Videos on meditation|Videos]]
* [[Buddhist Meditation|Learning materials]]

! Contact

If you need help, please contact me via:

* Facebook: https://www.facebook.com/thesoundofbells
* Email: [img[contact.png]]
! Mục lục

* [[Giận - Thực tập hạnh phúc]]
* [[Giận - Tiêu thụ sân hận]]
* [[Giận - Dập tắt lửa giận]]
* [[Giận - Tiếng nói của yêu thương chân thật]]
* [[Giận - Chuyển hóa]]
* [[Giận - Truyền thông với tâm từ bi]]
* [[Giận - Tâm kinh của bạn]]
* [[Giận - Không có kẻ thù]]
* [[Giận - David và Angelina]]
* [[Giận - Ôm ấp cơn giận bằng chánh niệm]]
* [[Giận - Hơi thở chánh niệm]]
* [[Giận - Phục hồi Tịnh Độ]]

Nguồn: https://langmai.org/tang-kinh-cac/vien-sach/thien-tap/gian/
! Những Vùng Năng Lượng

Chúng ta biết rằng khi giận thì không nên phản ứng, nghĩa là không nên nói, không nên làm bất cứ một điều gì. Khi giận mà nói năng hay hành động là không khôn ngoan. Ta phải trở về tự thân để chăm sóc cơn giận của mình.

Cơn giận là một vùng năng lượng trong ta. Nó là một phần của ta, là em bé đang kêu khóc mà ta có bổn phận phải săn sóc. Cách chăm sóc hay nhất là tạo ra một vùng năng lượng khác để ôm ấp và chăm sóc cơn giận. Vùng năng lượng thứ hai là chánh niệm. Chánh niệm là năng lượng của Bụt. Nó có sẵn trong ta và ta có thể chế tác ra bằng hơi thở có ý thức, bằng bước đi có ý thức. Bụt ở trong ta không phải là một ý niệm. Bụt ở trong ta không phải là một lý thuyết viển vông. Bụt ở trong ta là một thực thể bởi vì chúng ta ai cũng có thể chế tác năng lượng chánh niệm.

Chánh niệm có nghĩa là có mặt, là ý thức những gì đang xẩy ra trong ta và chung quanh ta. Năng lượng này tối ư quan trọng cho việc tu tập. Năng lượng chánh niệm giống như một người anh lớn, một người chị lớn hay một bà mẹ đang ôm ấp và chăm sóc em bé đau khổ, sân hận, tuyệt vọng hay ghen tức trong ta.

Vùng năng lượng thứ nhất là sân hận. Vùng năng lượng thứ hai là chánh niệm. Phương pháp tu tập là dùng năng lượng của chánh niệm để nhận diện và ôm ấp năng lượng của sân hận, với tất cả hiền dịu, không chút bạo động. Đây không phải là đàn áp sân hận. Chánh niệm là ta mà sân hận cũng là ta. Ta không nên trở thành một bãi chiến trường để hai vùng năng lượng đó đánh giặc với nhau. Đừng nên nghĩ rằng chánh niệm là chánh, là tốt và sân hận là tà, là xấu. Không nên nghĩ như vậy. Chúng ta chỉ cần nhận diện sân hận như là một năng lượng tiêu cực và chánh niệm như là một năng lượng tích cực. Rồi chúng ta sử dụng năng lượng tích cực để chăm sóc năng lượng tiêu cực.

! Cảm Thọ Có Tánh Chất Hữu Cơ

Phép thực tập của chúng ta được căn cứ trên tuệ giác bất nhị (non-duality). Cảm thọ tích cực hay tiêu cực đều có tánh chất hữu cơ và cùng thuộc về một thực tại. Vậy thì không cần phải chiến đấu. Chỉ cần ôm ấp và chăm sóc. Trong truyền thống Đạo Bụt, thiền tập không phải là tạo ra một bãi chiến trường để thiện đánh với ác. Đây là một điều rất quan trọng. Đừng tưởng rằng ta phải chiến đấu để tẩy trừ hạt giống tiêu cực ra khỏi tâm ta. Nghĩ như vậy là sai lầm. Phép thực tập là chuyển hóa tự thân. Nếu không có rác thì lấy gì để tạo ra phân xanh? Nếu không có phân xanh thì lấy gì để nuôi dưỡng hoa trái? Bạn cần đến những đau khổ, những yếu kém trong bạn. Bởi vì chúng đều là hữu cơ cho nên bạn biết là có cách chuyển hóa chúng và sử dụng chúng sao cho có lợi.

! Tuệ Giác Tương Tức

Pháp môn thực tập của chúng ta phải là bất bạo động. Bất bạo động chỉ có thể phát sinh từ tuệ giác bất nhị, tuệ giác tương tức. Theo tuệ giác này tất cả mọi sự mọi vật đều có liên hệ với nhau, và không có gì mà có thể tự nó có mặt một mình. Vậy thì bạo hành người khác tức là bạo hành chính mình. Chừng nào mà ta không có được tuệ giác bất nhị thì chừng đó ta sẽ còn bạo động, còn muốn trừng phạt, muốn đàn áp, muốn phá bỏ. Nhưng khi mà đã thấu triệt lẽ thật bất nhị và tương tức thì ta sẽ có thể mỉm cười với cả hoa và rác trong ta, ta có thể ôm ấp cả hai. Cho nên, tuệ giác tương tức là nền tảng của bất bạo động.

Khi mà bạn có được tuệ giác bất nhị và tương tức thì bạn sẽ đối xử với thân tâm bạn một cách thật sự bất bạo động. Bạn chăm lo các tâm hành của bạn, kể cả tâm hành sân hận, một cách bất bạo động. Bạn sẽ đối xử với cha mẹ, anh em, bạn bè, cộng đồng, xã hội của bạn với tất cả hiền dịu. Như vậy thì không thể nào có bạo động. Dưới cái nhìn của tuệ giác tương tức không có ai là kẻ thù.

Căn bản của sự thực tập của chúng ta là tuệ giác bất nhị, là tuệ giác tương tức. Tuệ giác này dạy ta chăm sóc nâng niu thân thể, chăm sóc nâng niu sân hận, tuyệt vọng trong ta. Sân hận có gốc rễ từ những yếu tố không phải là sân hận, từ lối sống hằng ngày của chúng ta. Nếu chăm lo thân tâm, không kỳ thị bất cứ gì, thì năng lượng tiêu cực không thể trấn áp ta được. Chúng ta làm cho những hạt giống tiêu cực trong ta suy yếu đi và không còn tràn ngập ta được nữa.
 
! Bộc Lộ Cơn Giận Một Cách Khôn Ngoan

Khi cơn giận phát hiện, ta phải nhận diện và chấp nhận rằng sân hận có mặt trong ta và cần được chăm sóc. Trong những lúc này ta đã được dạy là không vì giận mà nói gì hay làm gì. Phải tức khắc trở về tự thân và mời năng lượng chánh niệm lên để nhận diện, ôm ấp và chăm sóc cơn giận.

Nhưng chúng ta cũng được dạy rằng phải nói cho người kia biết là ta đang giận, ta đang khổ. “Người thương ơi! Tôi đang giận. Tôi đang khổ. Xin biết cho tôi điều đó.” Và nếu bạn thực tập giỏi thì bạn có thể nói thêm “Tôi đang cố gắng hết lòng để chăm sóc cơn giận của tôi.” Và câu thứ ba “Xin giúp tôi đi!” Bạn nói được ba câu đó là vì người kia là người thương, là người gần gũi nhất của bạn. Bạn còn cần đến người ấy. Bày tỏ cơn giận như thế là rất khôn ngoan, là rất thành thực, rất chung thủy bởi vì ngày nào ta đã có lời cam kết cùng nhau chia ngọt xẻ bùi.

Ngôn ngữ ấy, truyền thông ấy sẽ làm cho người kia thêm kính nể và thúc đẩy người ấy nghï lại và tu tập như bạn. Người kia sẽ thấy rằng bạn là người tự trọng. Bạn đã chứng tỏ rằng khi giận bạn biết chăm sóc cơn giận. Bạn đã cố gắng hết lòng để ôm ấp cơn giận, bạn không còn coi người làm cho bạn giận là kẻ thù đáng bị trừng phạt. Bạn xem người kia như là một đồng minh sẵn sàng có đó để hỗ trợ, nâng đỡ bạn. Ba câu nói ấy là ba câu nói  rất tích cực.

Hãy nhớ rằng phải nói cho người đã làm cho bạn giận biết trong vòng hai mươi bốn giờ. Bụt dạy rằng một ông thầy tu có quyền giận nhưng không được giận quá đêm.  Ôm giữ cơn giận quá lâu sẽ có hại cho sức khỏe. Đừng bao giờ ôm giữ cơn giận trong lòng quá một ngày. Bạn phải nói các câu đó trong bình tĩnh, yêu thương. Bạn phải tập để nói được như thế. Nếu bạn chưa đủ bình tĩnh sau hai mươi bốn giờ thì bạn phải viết ba câu đó lên giấy và trao cho người kia: “Người thương ơi! Tôi đang giận. Tôi đang khổ. Xin biết cho tôi điều đó. Tôi đang cố gắng để chăm sóc cơn giận của tôi. Xin giúp tôi.” Hãy trao tận tay thông điệp hòa bình ấy cho người kia. Ngay khi mà bạn nói lên những câu nói đó hay trao bức thư đó thì bạn đã cảm thấy nhẹ đi phần nào.

! Hẹn Nhau Tối Thứ Sáu

Bạn có thể thêm vào sau ba câu của thông điệp hòa bình trên câu sau đây: “Tối thứ sáu này chúng ta hãy ngồi lại với nhau để cùng nhìn sâu vào sự việc đã xẩy ra.” Nên nói câu này vào ngày Thứ Hai hay Thứ Ba. Như vậy bạn sẽ có ba hay bốn ngày để thực tập. Trong những ngày ấy bạn và người kia sẽ có cơ hội nhìn lại và hiểu rõ hơn nguyên nhân của xung đột. Bạn và người kia có thể gặp nhau bất cứ lúc nào nhưng chọn ngày Thứ Sáu là hay nhất vì nếu làm hòa được thì bạn và người kia sẽ có được những ngày cuối tuần tuyệt diệu với nhau.

Trong khi chờ ngày hẹn tối Thứ Sáu, bạn hãy thực tập hơi thở chánh niệm và nhìn sâu vào gốc rễ của cơn giận của bạn. Dầu cho là đang khi lái xe, đi bộ, nấu ăn, giặt rũa bạn hãy tiếp tục ôm ấp cơn giận của bạn trong chánh niệm. Như vậy bạn sẽ có cơ hội quán chiếu bản chất cơn giận. Bạn sẽ khám phá ra rằng nguyên nhân chính của đau khổ của bạn chính là hạt giống giận trong bạn. Có lẽ hạt giống giận ấy trong quá khứ đã được tưới tẩm quá nhiều lần bởi chính bạn hay những người khác.

Cơn giận có trong ta dưới hình thức một hạt giống. Chúng ta cũng còn có những hạt giống của thương yêu, hiểu biết. Trong tâm thức chúng ta có rất nhiều hạt giống tích cực cũng như tiêu cực. Phép thực tập là tránh tưới tẩm những hạt giống tiêu cực mà phải nhận diện và tưới tẩm những hạt giống tích cực. Đây là phép thực tập yêu thương.

! Tưới Tẩm Có Lựa Chọn

Bạn phải tự bảo vệ và bảo vệ người thương của bạn bằng cách thực tập tưới tẩm có lựa chọn (selective watering). Bạn nói với người kia: “Nếu em thực tình lo cho anh, thực tình thương yêu anh thì xin em đừng tưới tẩm những hạt giống tiêu cực trong anh mỗi ngày. Làm như thế anh sẽ khổ và anh sẽ làm em khổ theo. Em đừng tưới tẩm những hạt giống sân hận, bực bội, thất vọng, thiếu bao dung trong anh. Và anh cũng hứa là không tưới tẩm những hạt giống đó trong em. Anh biết em cũng có những hạt giống tiêu cực và anh sẽ cẩn thận không tưới tẩm những hạt giống đó trong em vì anh biết nếu anh làm em khổ anh cũng khổ theo. Anh hứa là chỉ tưới tẩm những hạt giống tích cực của thương yêu, hiểu biết trong em mà thôi.”

Tại Làng Mai chúng tôi gọi đó là tưới tẩm có lựa chọn. Nếu chúng ta dễ nổi giận là vì trong nhiều năm qua hạt giống giận trong ta đã được tưới tẩm quá nhiều lần. Ta để mặc cho chúng bị tưới tẩm. Ta đã không ký kết với những người thương chung quanh ta một bản thỏa hiệp sống chung an lạc, cùng cam kết sẽ chỉ tưới tẩm những hạt giống tích cực của nhau. Ta đã không biết thực tập tự bảo vệ. Nếu ta không biết tự bảo vệ thì ta không thể bảo vệ những người ta thương.

Khi ta ôm ấp và chăm sóc cơn giận thì ta sẽ cảm thấy nhẹ lòng. Ta có thể nhìn sâu vào sự việc và khám phá ra nhiều tuệ giác. Tuệ giác đầu tiên là hạt giống giận trong ta có thể đã được tưới tẩm thành quá lớn và là nguyên nhân chính của nỗi khổ của ta. Thấy được như thế ta sẽ nhận ra rằng người kia chỉ là nguyên nhân thứ yếu của nỗi khổ của ta mà thôi. Người kia không phải là nguyên nhân chính gây nên cơn giận của ta.

Nếu tiếp tục nhìn sâu hơn nữa thì ta sẽ thấy rằng người kia cũng đang đau khổ rất nhiều. Một người đau khổ luôn luôn làm cho những người chung quanh đau khổ theo. Người ấy không biết xử lý niềm đau nỗi khổ, không biết ôm ấp và chăm sóc niềm đau, nỗi khổ của mình cho nên đau khổ càng ngày càng lớn. Trong quá khứ ta đã không giúp người ấy. Ta đã không thực tập tưới tẩm có lựa chọn. Nếu ta biết tưới tẩm những hạt giống tích cực trong người ấy mỗi ngày thì người ấy đâu có như bây giờ.

Phương pháp tưới tẩm có lựa chọn rất hữu hiệu. Chỉ sau một giờ là đã thấy kết quả, người ấy sẽ rạng rỡ ra. Làm như vậy không khó khăn gì.

! Tưới Hoa

Cách đây vài năm, một cặp vợ chồng tử Bordeaux đến Làng Mai để nghe pháp thoại vào dịp Lễ Đản Sanh Bụt. Trong bài pháp thoại hôm đó tôi nói về phép thực tập tưới tẩm có lựa chọn, thực tập tưới hoa. Tôi để ý thấy bà vợ yên lặng khóc suốt bài pháp thoại. Sau pháp thoại tôi đến nói với ông chồng “Cây hoa của bạn cần được tưới tẩm đấy!” Người chồng tức thì hiểu ngay ý tôi và trên đường về nhà ông ta đã tưới tẩm những hạt giống tích cực nơi bà. Đường về nhà chỉ có một giờ mười phút lái xe. Khi hai vợ chồng về đến nhà, các con của bà rất ngạc nhiên vì thấy mẹ mình rất tươi mát và hạnh phúc. Đã lâu lắm, chưa bao giờ chúng thấy bà rạng rỡ như ngày hôm ấy.

Bà có rất nhiều hạt giống tốt trong bà nhưng ông đã không nhận ra. Ông ta không tưới tẩm chúng. Ông ta chỉ tưới tẩm những hạt giống tiêu cực bởi vì ông không có cơ hội tu tập. Ông có đủ khả năng tưới hoa, nhưng phải chờ đến khi tới Làng Mai để được nhắc nhở điều cần thực tập. Ông ta cần một vị thầy thúc đẩy ông ta làm chuyện đó. Cho nên một cộng đồng tu tập quan trọng vô cùng. Chúng ta cần tăng thân, cần sư anh, sư chị, cần bè bạn để nhắc nhở ta thực tập những gì mà chúng ta đã biết. Chánh Pháp có sẵn trong mỗi chúng ta, nhưng cần phải được tưới tẩm để có thể hiển lộ và trở thành có thật. Nếu bạn quả có tưới tẩm những hạt giống tích cực trong người thương của bạn thì người ấy ngày hôm nay đâu có gây đau khổ cho bạn như vậy. Vậy thì bạn chịu trách nhiệm một phần về khổ đau của bạn.

! Trở Về Để Giúp

Trong khi chờ tới ngày hẹn, ngày Thứ Sáu, bạn nên quán chiếu để nhận diện phần lỗi của bạn trong vụ xung đột. Không nên đổ lỗi hoàn toàn cho người kia. Bạn phải công nhận rằng lý do chính gây nên đau khổ của bạn là hạt giống giận trong bạn và người kia chỉ là một nguyên nhân phụ.

Khi  bạn nhận ra vai trò của bạn trong vụ xung đột, bạn sẽ càng cảm thấy nhẹ nhàng hơn. Bởi vì bạn có khả năng thực tập hơi thở chánh niệm, chăm sóc cơn giận, giải tỏa năng lượng tiêu cực chỉ trong vòng mười lăm phút là bạn thấy khỏe ra rồi.

Nhưng người kia có thể còn đang ở trong địa ngục và đang đau khổ rất nhiều. Người thương của bạn là đóa hoa của bạn, bạn phải chịu trách nhiệm. Bạn đã có lời hứa là sẽ chăm sóc người thương của bạn. Bạn biết rằng bạn có trách nhiệm phần nào về tình trạng hiện thời của người ấy bởi vì bạn đã không thực tập đàng hoàng, bạn đã không chăm sóc đóa hoa của bạn. Bạn cảm thấy thương người ấy gấp bội và nao nức muốn trở về để giúp đỡ. Người kia là người rất thân thương của bạn. Nếu bạn không giúp thì ai giúp người ấy bây giờ?

Khi bạn có ý muốn trở về với người kia để giúp đỡ là bạn biết rằng năng lượng sân hận trong bạn đã biến thành năng lượng của tình thương. Sự thực tập của bạn đã có kết quả. Rác đã biến thành hoa. Có thể là cần mất mười lăm phút, nửa giờ hay một giờ. Điều đó tùy thuộc ở nơi định lực, nơi mức độ chánh niệm của bạn. Điều đó cũng tùy thuộc nơi mức độ giác ngộ và tuệ giác mà bạn gặt hái được trong khi tu tập.

Có thể là mới ngày Thứ Ba và bạn còn ba ngày trước khi tới ngày hẹn. Nhưng bạn không muốn cho người kia kéo dài đau khổ. Vậy thì khi bạn nhận ra lỗi của mình thì tức khắc bạn phải điện thoại cho người kia ngay: “Em ạ, Anh đã bớt giận rồi. Anh đã có một tri giác sai lầm. Anh thấy rõ là anh đã làm cho cả hai ta cùng khổ. Chắc chúng ta không cần hẹn gặp nhau Thứ Sáu này.” Bạn hành động như thế là vì thương yêu.

Thường thường sân hận phát khởi từ một tri giác sai lầm. Vậy khi nhìn sâu vào nguyên nhân đã gây nên khổ đau và khám phá ra rằng đó chỉ là do tri giác sai lầm thì bạn phải cho người kia biết ngay. Người ấy không muốn làm bạn khổ mà với một lý do nào đó bạn cứ tin là người ấy cố ý như vậy. Mỗi một chúng ta – dầu là chồng, là vợ, là con, là bạn bè- đều phải thực tập để quán chiếu sâu sắc tri giác của mình.

! Có Chắc Là Đúng Không?

Một chàng nọ phải xa nhà khá lâu. Trước khi đi thì vợ anh ta đang mang thai.  Khi về nhà thì vợ anh đã sanh được một đứa con trai. Anh ta nghi đứa con không phải là con của anh, mà là con của ông hàng xóm thường qua nhà anh làm việc. Vì thế anh ta rất ghét đứa con trai. Nhìn mặt con mà anh cứ thấy nó giống ông hàng xóm. Cho đến một ngày nọ, người anh từ xa đến thăm và thốt lên: “Thằng nhỏ sao mà giống chú quá. Giống như khuôn đúc!” Nhờ ông anh tới thăm và nói câu nói đó mà người cha đã bỏ được tri giác sai lầm. Nhưng tri giác sai lầm ấy đã đè nặng tâm tư anh trong gần mười hai năm. Trong mười hai năm đó anh ta đã đau khổ vô cùng. Rồi người vợ vì thế mà cũng đau khổ theo. Lẽ tất nhiên đứa con trai cũng đau khổ vì bị cha ghét bỏ.

Chúng ta luôn luôn hành xử theo tri giác sai lầm. Vì vậy không nên tin chắc vào tri giác của mình. Khi ngắm mặt trời lặng ta tin chắc là ta đang thấy mặt trời thật. Nhưng khoa học chứng minh rằng mặt trời mà ta đang ngắm là hình ảnh của mặt trời trước đó tám phút. Tia sáng mặt trời phải mất tám phút để đi từ mặt trời đến quả đất. Khi nhìn một ngôi sao chúng ta cứ tưởng rằng ngôi sao còn đó, nhưng thật ra ngôi sao có thể đã biến mất hàng triệu năm về trước.

Cho nên phải cẩn thận lắm về tri giác nếu không thì sẽ đau khổ. Hãy viết lên một mảnh giấy câu: “Có chắc không?” và treo lên trong phòng. Trong các bệnh viện, nhất là trong các phòng thử nghiệm hay phòng phát thuốc, người ta đã treo lên một câu tương tự: “Mặc dầu bạn đã chắc rồi cũng xin kiểm soát lại (Even if you are sure, check again).” Câu này không phải là để nhắc nhở các bác sĩ, chuyên viên để ý đến các các hiện tượng tâm lý của bệnh nhân mà là để nhắc nhở các bác sĩ, chuyên viên kiểm soát lại định bệnh của mình hay kết quả thử nghiệm cho chắc để khỏi sơ sót. Ta có thể dùng cái biểu ngữ đó để tu tập:  “Mặc dầu bạn đã chắc rồi cũng xin kiểm soát lại.” Ta đã làm cho ta đau khổ. Ta đã tạo địa ngục cho chính ta và các người thân của ta. Ta có chắc rằng tri giác của ta là đúng hay không?

Nhiều người đau khổ vì tri giác sai lầm có đến mười năm, hai mươi năm. Họ tin chắc rằng người kia có ý phản bội, ám hại họ mặc dầu người kia chỉ có thiện chí với họ mà thôi. Mỗi khi đã là nạn nhân của tri giác sai lầm ta sẽ khổ sở vô cùng và ta làm những người chung quanh cùng khổ.

Khi giận hay khi đau khổ thì phải trở về  quán chiếu thật sâu sắc bản chất, nội dung tri giác của mình. Nếu ta có thể loại bỏ tri giác sai lầm thì bình an và hạnh phúc sẽ phục hồi và ta có thể lại thương yêu người khác.

! Cùng Nhau Quán Chiếu Cơn Giận

Khi người kia biết rằng bạn đã cố gắng hết lòng để tìm hiểu nguyên nhân cơn giận thì người ấy cũng sẽ hăng hái tu tập. Trong khi lái xe, nấu ăn người ấy sẽ tự hỏi “Ta đã làm gì, nói gì để làm cho người ấy đau khổ đến như vậy?” và sẽ có cơ hội  nhìn sâu và biết rằng trong quá khứ cách hành xử của mình đã làm cho bạn giận và bắt đầu xét lại về ý nghĩ cho là mình không có trách nhiệm gì trong vụ xung đột. Nếu người kia khám phá ra rằng mình đã vụng về, thấy cách hành xử của mình đã làm cho bạn giận thì người ấy phải tức thì điện thoại hay gửi Fax xin lỗi  bạn.

Vậy thì trong tuần bạn và người đó sẽ thấy rõ vấn đề hơn và buổi hẹn tối Thứ Sáu có thể là một cuộc gặp gỡ rất vui. Bạn và người kia sẽ có cơ hội  cùng nhau ăn một bữa cơm, hay uống một tách trà, ăn một cái bánh trong niềm vui tràn đầy yêu thương.

! Giãi Bày Tất Cả Tâm Tư, Dầu Có Khi Khó Khăn

Nếu trong tuần mà cả hai người thực tập không thành công thì buổi hẹn Ngày Thứ Sáu sẽ là cơ hội để cho bạn thực tập lắng nghe và ái ngữ. Người đang giận có quyền nói ra tâm tư của mình. Nếu bạn là người đã làm cho người kia giận thì bạn chỉ nên ngồi nghe bởi vì bạn đã có hứa rằng bạn sẽ ngồi nghe chăm chú mà không phản ứng. Bạn sẽ cố gắng thực tập lắng nghe với  tâm từ bi, lắng nghe mà không phán xét, không chỉ trích, không phân tích. Bạn lắng nghe chỉ để giúp người kia bộc lộ nỗi lòng, và vơi bớt khổ đau.

Khi bạn chia sẻ nỗi khổ của mình thì bạn có quyền nói ra hết tất cả cảm nghĩ tự đáy lòng bạn. Bạn có bổn phận làm như vậy vì người kia có quyền được biết rõ hết tự sự. Đã có lời  nguyện ước chung. Bạn nên nói cho người kia nghe tất cả những gì sâu kín trong tâm bạn, chỉ với một điều kiện là phải nói trong bình tĩnh và dùng lời ái ngữ. Ngay khi bạn cảm thấy bực bội, bất an, mất bình tĩnh thì phải dừng lại ngay. “Em ơi, anh không thể tiếp tục được nữa. Vậy chúng ta sẽ gặp nhau lại sau được không? Anh cần thì giờ để thực tập thở và thiền hành trong chánh niệm. Anh không thể làm tốt hơn lúc này và anh không chắc là anh sẽ nói chuyện bằng lời hòa nhã thành công với em.” Khi đó người kia sẽ đồng ý dời lại buổi họp, có thể là vào Thứ Sáu tuần sau.

Nếu bạn là người đang lắng nghe thì bạn cũng thực tập hơi thở chánh niệm. Thực tập hơi thở chánh niệm như thế để có thể lắng nghe mà không thành kiến. Lắng nghe với tâm từ bi và nghe hết mình để cho người kia có cơ hội vơi bớt khổ đau. Bạn có sẵn tâm từ bi và tâm từ bi của bạn sẽ phát khởi khi bạn thấy người kia đang đau khổ. Bởi vậy bạn phải nguyện làm Bồ Tát Lắng Nghe Quán Thế Âm. Bồ Tát Lắng Nghe Quán Thế Âm phải là một con người thật mà không phải là một ý niệm.

! Với Tâm Từ Bi Thì Bạn Sẽ Không Phạm Lỗi Lầm

Bạn có thể phạm lỗi lầm khi bạn quên đi là người kia đang khổ. Bạn có xu hướng nghĩ rằng chỉ có một mình khổ và người kia đang thích thú khi thấy mình khổ. Bạn sẽ nói những câu phũ phàng, làm những điều tệ bạc khi bạn tin như vậy. Ý thức rằng người kia cũng đang khổ sẽ giúp bạn thể hiện vai trò của Bồ Tát Lắng Nghe. Tâm từ bi được thắp sáng và bạn có thể giữ tâm từ bi trong suốt thời gian lắng nghe. Bạn sẽ là nhà tâm lý trị liệu giỏi nhất của người kia.

Trong khi người kia nói, có thể là người ấy sẽ lý luận, trách móc và có ý trừng phạt. Có thể  là người ấy nói giọng chua chát, bất cần. Nhưng mà tâm từ bi còn đó trong bạn, bạn sẽ không nao núng. Giọt nước từ bi vô cùng linh nghiệm. Nếu bạn quyết tâm thắp sáng tâm từ bi thì bạn sẽ được bảo vệ. Dầu cho người kia có nói gì đi nữa thì bạn cũng không khởi tâm sân hận, bực dọc, bởi vì tâm từ bi là linh dược chống sân hận. Không gì có thể dập tắt cơn giận được ngoài tâm từ bi. Bởi vì vậy, phép thực tập từ bi là một phép thực tập rất mầu nhiệm.

Từ bi chỉ có mặt khi hiểu biết có mặt. Hiểu biết gì? Hiểu rằng người kia đang đau khổ và ta phải giúp đỡ. Nếu ta không giúp người ấy thì ai giúp bây giờ? Khi lắng nghe người kia bạn có thể nhận thấy người kia có rất nhiều tri giác sai lầm trong khi nói. Tuy nhiên bạn vẫn giữ tâm từ bi vì bạn biết rằng người kia là nạn nhân của tri giác sai lầm. Nếu bạn muốn cải chính, thì bạn có thể cắt ngang không cho người ấy nói tiếp và bộc lộ hết tâm tư. Vậy thì bạn phải ngồi yên và lắng nghe với tất cả chú tâm, với tất cả thiện chí. Lắng nghe như thế có tác dụng chữa trị rất lớn.

Nếu muốn sửa chữa tri giác sai lầm của người kia thì nên đợi đúng lúc. Khi lắng nghe bạn chỉ có một mục đích: để cho người kia có cơ hội nói ra tất cả tâm tư sâu kín tự đáy lòng. Bạn sẽ không nói gì hết. Tối Thứ Sáu này là cơ hội hoàn toàn để cho người ấy nói. Bạn chỉ lắng nghe. Có thể là trong vài ngày nữa, khi người kia cảm thấy dễ chịu hơn, bạn sẽ cho người kia những dữ kiện để giúp người ấy sửa đổi  tri giác sai lầm. “Em ạ, những điều em nói hôm trước em không phải thật sự đã xẩy ra như vậy. Chuyện xẩy ra là như thế này . . . ”  Nhớ sử dụng ái ngữ khi sửa đổi tri giác sai lầm của người kia. Nếu cần thì nhờ một ai đó đã biết đích xác sự tình giải thích giùm để người kia loại bỏ được tri giác sai lầm.

! Kiên Nhẫn Là Chứng Tích Của Tình Yêu Đích Thực

Tâm sân hận sống động. Tâm sân hận phát khởi rồi cần thời gian để lắng xuống. Mặc dầu bạn có đủ bằng cớ để thuyết phục người kia rằng cơn giận của người ấy là do tri giác sai lầm của người ấy, bạn cũng không nên can thiệp ngay. Cũng như tham đắm, ghen ghét và tất cả những tâm hành bất thiện khác, tâm sân hận cần thời gian để biến hoại. Ngay cả trong trường hợp mà người kia nhận ra là mình đã hiểu lầm cũng vậy. Khi tắt quạt máy, quạt vẫn tiếp tục quay một thời gian khá lâu mới dừng lại. Cơn giận cũng vậy. Đừng có mong rằng người kia sẽ hết giận ngay. Như thế không thực tế. Để cho cơn giận có thì giờ tàn lụi. Đừng có gấp.

Kiên nhẫn là chứng tích của tình yêu đích thực. Một người cha muốn tỏ lộ tình thương yêu của mình cho các con thì phải kiên nhẫn. Bà mẹ, con trai, con gái cũng vậy. Nếu muốn thương yêu, bạn phải tập kiên nhẫn. Nếu không kiên nhẫn thì bạn không giúp người kia được.

Bạn cũng cần kiên nhẫn với chính bạn. Thực tập ôm ấp cơn giận đòi hỏi thời gian. Tuy nhiên chỉ cần năm phút thực tập hơi thở chánh niệm, bước đi chánh niệm là có thể ôm ấp đau khổ một cách hiệu quả. Nếu năm phút không đủ thì mười  phút, nếu mười phút không đủ thì mười lăm phút. Hãy dành đủ thì giờ cần thiết. Thực tập theo dõi hơi thở hay đi thiền hành ngoài trời là một pháp môn mầu nhiệm để ôm ấp cơn giận. Ngay cả thực tập chạy bộ (jogging) trong chánh niệm cũng giúp ích rất nhiều. Cũng như khi nấu một nồi khoai. Phải đun lửa ít nhất là mười lăm hay hai mươi phút khoai mới chín. Phải nấu cơn giận bằng ngọn lửa chánh niệm. Có thể là cần đến mười hay hai mươi phút. Có thể lâu hơn.

! Đạt Thắng Lợi

Khi nấu khoai thì phải đậy nắp để khỏi mất hơi. Đó gọi là định lực. Vậy thì khi thực tập hơi thở hay bước đi chánh niệm để chăm sóc sân hận chúng ta Ềkhông nên làm gì hết. Không nên nghe radio, không nên coi TiVi, hay đọc sách. Hãy ‘đậy nắp’ lại và chỉ làm có một việc: thực tập hơi thở chánh niệm, bước đi chánh niệm, đem toàn lực ra để chăm sóc cơn giận, như chăm sóc một em bé.

Sau một thời gian ôm ấp và quán chiếu, tuệ giác sẽ bừng nở và cơn giận sẽ suy giảm. Bạn sẽ cảm thấy nhẹ nhàng và phấn khởi trong ý muốn trở lại giúp người kia. Khi mở nồi khoai chín ra bạn sẽ thưởng thức mùi khoai thơm. Tâm sân hận đã được chuyển hóa thành tâm từ bi.

Đây là một điều có thể làm được. Cũng như bông hoa tu-líp. Khi mặt trời chiếu đủ sức nóng thì hoa sẽ nở. Cơn giận của bạn cũng là một bông hoa. Bạn ôm ấp nó bằng ánh sáng chánh niệm. Hãy để cho năng lượng của chánh niệm thấm vào năng lượng của sân hận. Sau năm, mười phút thực tập chánh niệm cơn giận sẽ được chuyển hóa.

Tất cả các tâm hành – sân hận, ganh tị, tuyệt vọng v..v.. đều chịu ảnh hưởng của chánh niệm cũng như cây cỏ chịu ảnh hưởng của ánh nắng. Nhờ nuôi dưỡng năng lượng chánh niệm mà ta có thể chữa trị thân và tâm bởi vì năng lượng chánh niệm chính là năng lượng của Bụt. Trong truyền thống đạo Cơ Đốc, người ta nói rằng Chúa Jesus có sẵn trong người năng lượng của Chúa Trời, năng lượng của Chúa Thánh Linh. Vì vậy mà Chúa Jesus có thể chữa trị cho nhiều người. Năng lượng có khả năng chữa trị đó được gọi là Chúa Thánh Linh. Trong ngôn ngữ của đạo Bụt năng lượng đó được gọi  là năng lượng của Bụt, năng lượng của Chánh niệm.

Chánh niệm chứa năng lượng của Định Lực, của Hiểu Biết và Từ Bi. Vậy thì, thiền tập theo đạo Bụt là thực tập chế tác năng lượng giúp ta có được sự tập trung, từ bi và hiểu biết. Tất cả mọi người trong một trung tâm tu tập chỉ có làm một việc đó và cùng nhau cống hiến một vùng năng lượng tập thể mạnh mẽ khả dĩ ôm ấp và bảo vệ chính họ và những người khác đến tu tập.

Chỉ cần một buổi thiền tập ta cũng đã nhận thấy là ta có thừa khả năng chăm sóc cơn giận. Ta đã đạt thắng lợi cho riêng ta và cho những người ta thương. Khi ta thất bại, những người ta thương cũng sẽ thất bại theo. Khi ta thắng, ta cũng thắng cho người ta thương. Vậy thì nếu khi một ai đó không biết cách tu tập thì ta sẽ tu tập cho ta và cả cho người ấy. Đừng đợi người kia thực tập rồi ta mới bắt đầu thực tập. Ta tu cho cả hai.
! Cứu Căn Nhà Cháy

Khi ai làm cho ta giận thì ta khổ. Ta muốn nói một câu hay làm một việc gì đó để cho người kia khổ, nghĩ rằng làm như thế thì ta sẽ bớt khổ. Ta tự bảo: “Tôi muốn trừng phạt anh. Tôi muốn làm cho anh đau khổ vì anh đã làm cho tôi đau khổ. Thấy anh đau khổ tôi sẽ cảm thấy dễ chịu hơn.”

Rất nhiều người có xu hướng hành động một cách trẻ con như vậy. Sự thật là khi ta làm cho người kia đau khổ thì người ấy sẽ trả đũa bằng cách làm cho ta đau khổ thêm. Kết quả là leo thang đau khổ cho cả hai bên. Đáng lẽ ra thì cả hai bên đều cần tình thương, cần giúp đỡ. Không ai đáng bị trừng phạt cả.

Khi ta giận, khi một ai đó làm cho ta giận thì ta phải trở về với thân tâm và chăm sóc cơn giận của mình. Không nên nói gì hết. Không nên làm gì hết. Khi đang giận mà nói năng hay hành động thì chỉ gây thêm đổ vỡ mà thôi.

Phần lớn chúng ta không làm được điều đó. Chúng ta không muốn trở về với tự thân. Chúng ta chỉ muốn theo đuổi người kia để trừng phạt.

Nếu một cái nhà đang cháy thì việc trước nhất phải làm là chữa cháy căn nhà chứ không phải chạy theo đuổi bắt người đốt nhà. Nếu chỉ lo chạy theo người mà ta nghi là đã đốt nhà thì căn nhà sẽ cháy rụi trong khi ta chạy theo đuổi bắt người kia. Như thế là không khôn ngoan. Phải trở về dập tắt lửa trước đã. Vậy thì khi giận, nếu tiếp tục đối đầu, tranh cãi với người làm cho ta giận, nếu chỉ muốn trừng phạt người ấy thì ta đã hành động y như người chạy theo người đốt nhà trong khi căn nhà của ta đang bốc lửa.

! Dụng Cụ Chữa Lửa

Bụt cho chúng ta nhiều dụng cụ rất hữu hiệu để dập tắt ngọn lửa đang thiêu đốt tâm ta. Đó là hơi thở chánh niệm. Đó là bước đi chánh niệm. Đó là thực tập ôm ấp sân hận, quán chiếu tri giác. Đó là phương pháp nhìn sâu vào người đã làm ta giận để nhận ra rằng người kia cũng đang đau khổ và cần được giúp đỡ. Những phương pháp trên đây rất thực tế và do chính đích thân Bụt dạy.

Hơi thở có ý thức là khi thở vào thì biết mình thở vào, biết là không khí đang đi vào cơ thể, khi thở ra thì biết là thở ra, biết là không khí đang đi ra khỏi cơ thể. Thở như thế thì tiếp xúc được với cả không khí và cơ thể đồng thời cũng tiếp xúc được cả với tâm bởi vì tâm đang tập trung chú ý vào hơi thở. Chỉ cần một hơi thở có ý thức là có thể trở về tiếp xúc với thân, tâm và những gì đang xẩy ra chung quanh. Chỉ cần ba hơi thở có ý thức là có thể duy trì được sự tiếp xúc đó.

Khi ta không đứng, không ngồi, không nằm thì ta đi. Nhưng mà ta đi đâu? Ta đã tới! Mỗi bước chân có thể đem ta về với giây phút hiện tại. Mỗi bước chân có thể đưa ta tiếp xúc với Tịnh Độ, tiếp xúc với Nước Chúa. Khi đi từ góc phòng này đến góc phòng kia, từ căn nhà này đến căn nhà kia, ta phải ý thức từng bước đi, ý thức bàn chân đang tiếp xúc với mặt đất, theo dõi hơi thở, theo dõi không khí vào ra cơ thể theo mỗi bước chân. Như thế chúng ta có thể đếm biết ra rằng ta đã bước thoải mái được bao nhiêu bước trong một hơi thở vào hay một hơi thở ra. Khi thở vào ta nói thầm “vào”, khi thở ra ta nói thầm “ra”. Như thế ta thực tập suốt ngày. Đây là một thực tập luôn luôn có sẵn và nhờ đó mà có thể thay đổi cả cuộc sống.

Có nhiều người chỉ ưa đọc sách nói về các truyền thống tâm linh, chỉ ưa lễ nghi hình thức mà ít khi thực tập các giáo lý đã dạy. Giáo lý của bất cứ truyền thống tâm linh nào cũng có thể chuyển hóa với điều kiện là phải đem ra mà thực tập. Thực tập như trên thì ta có thể ‘biến hầm lửa thành hồ sen.’ Và như thế không những có thể chấm dứt đau khổ trong ta mà còn là một nguồn vui tươi hạnh phúc cho những người chung quanh.

! Gương Mặt Khi Đang Giận

Khi giận nếu soi gương thì sẽ thấy khuôn mặt mình chẳng đẹp đẽ, chẳng coi được chút nào. Các bắp thịt trên mặt co rúm lại. Hãy nhìn một người đang giận. Gương mặt người đó căng thẳng trông mà phát sợ. Như một quả bom sắp nổ tung! Thế cho nên nhìn kỹ khuôn mặt mình khi đang giận có thể giúp ích rất nhiều. Đó là một tiếng chuông chánh niệm. Khi thấy gương mặt mình như vậy thì tự nhiên khởi ý muốn ‘làm ăn cho khá hơn.’ Khi giận quý vị dư biết phải làm gì để cho khuôn mặt tươi đẹp hơn. Chả cần đến mỹ phẩm. Chỉ cần thở hơi thở tĩnh lặng, bình an. Chỉ cần cười nụ cười chánh niệm. Nếu thở được như thế một hay hai lần là bạn sẽ thấy mình dễ coi ra rất nhiều. Nhìn vào gương, ‘thở vào tâm tĩnh lặng, thở ra miệng mỉm cười,’ là tự nhiên cảm thấy nhẹ nhõm.

Cơn giận là một hiện tượng tâm lý, tuy nhiên cơn giận cũng liên hệ với các yếu tố sinh hóa của cơ thể. Cơn giận làm cho các bắp thịt căng thẳng, nhưng khi biết mỉm cười bạn sẽ thư giãn và cơn giận sẽ giảm bớt ngay. Nụ cười giúp cho năng lượng chánh niệm phát sinh và từ đó giúp ta ôm ấp cơn giận.

Đời xưa, các quan trong triều luôn luôn cầm trên tay cái ‘hốt’ có gắn một tấm kiến soi nhỏ. Khi bệ kiến nhà vua thì phải luôn soi gương để sửa sang mũ áo, triều phục cho tề chỉnh. Có lẽ chúng ta cũng nên có sẵn một cái gương soi như vậy trong người. Thỉnh thoảng đem gương ra soi để xem sắc diện mình ra sao, vui, buồn, hay giận dữ? Nếu cần thì chỉ vài hơi thở và mỉm cười là bao nhiêu căng thẳng sẽ tiêu tan, ta sẽ cảm thấy nhẹ nhõm.

! Ôm Ấp Cơn Giận Bằng Tia Nắng Chánh Niệm

Cơn giận giống như một em bé đang la khóc và cần được mẹ ôm ấp. Bạn chính là mẹ cơn giận của bạn. Khi bắt đầu thở hơi thở chánh niệm là bạn đã có năng lượng của một bà mẹ để nâng niu, ôm ấp em bé sân hận của bạn. Chỉ cần ôm lấy cơn giận, chỉ cần thở vào, thở ra. Chỉ cần có thế thôi. Em bé sân hận sẽ lắng dịu ngay tức khắc.

Tất cả các giống thảo mộc đều được tia nắng mặt trời nuôi dưỡng. Khi tia nắng mặt trời chiếu xuống, ôm ấp thì cây cỏ sẽ sinh trưởng. Buổi sáng những đóa hoa thường vẫn còn khép kín. Khi mặt trời mọc, tia nắng mặt trời sẽ chiếu vào bông hoa. Các quang tử (photon) mang năng lượng của mặt trời từ từ thấm vào hoa. Cho đến một lúc thì, dầu muốn, dầu không,  hoa sẽ nở ra dưới ánh mai rực rỡ.

Cũng vậy, tất cả những hiện tượng trong tâm cũng như trong thân đều chịu ảnh hưởng của năng lượng chánh niệm. Nếu chánh niệm có đó và ôm ấp lấy thân thì thân sẽ chuyển hóa. Nếu chánh niệm có đó và ôm ấp lấy cơn giận thì cơn giận cũng sẽ chuyển hóa. Theo lời Bụt dạy, và theo kinh nghiệm của chính chúng ta, thì tất cả những gì trong cơ thể nếu được năng lượng của chánh niệm ôm ấp thì sẽ được chuyển hóa.

Cơn giận cũng như bông hoa kia. Ban đầu ta không hiểu được bản chất của cơn giận, ta không biết vì sao mà cơn giận phát khởi. Nhưng nếu biết ôm ấp bằng năng lượng của chánh niệm thì cơn giận sẽ từ từ khai mở. Ta có thể ngồi yên và theo dõi hơi thở hay đi thiền hành ngoài trời để chế tác năng lượng chánh niệm và ôm ấp cơn giận. Sau mười hay hai mươi phút thì cơn giận sẽ khai mở và đột nhiên ta thấy được bản chất của cơn giận. Có thể cơn giận đó chỉ là một tri giác sai lầm hay một hành động vụng về.

Nấu Chín Cơn Giận Cần phải duy trì năng lượng chánh niệm trong một thời gian để cho cơn giận, như một bông hoa dưới ánh nắng, có thể khai mở. Cũng giống như khi nấu một nồi khoai. Không thể hấp tấp đun lửa thật mạnh trong năm ba phút mà khoai chín ngay được. Phải nấu khoai ít nhất là mười lăm, hai mươi phút hay nửa giờ mới có được nồi khoai chín, thơm.

Cơn giận cũng thế. Cơn giận cũng cần nấu cho chín. Ban đầu thì cơn giận ‘còn sống’. Khoai còn sống thì ăn không được. Cơn giận ‘còn sống’ thì không có gì vui. Nhưng nếu biết chăm sóc, ôm ấp cơn giận, nghĩa là biết nấu cho chín, thì năng lượng tiêu cực của cơn giận sẽ được thay thế bằng năng lượng tích cực của hiểu biết và thương yêu.

Điều này bạn có thể làm được. Không phải chỉ có các Bậc Đại Nhân mới làm được. Chính bạn, bạn có thể làm được. Bạn có thể chuyển đổi đống rác của tâm sân hận thành bông hoa của tâm từ bi. Nhiều người đã có thể làm được như thế trong vòng mười lăm phút. Bí quyết là phải tiếp tục thực tập hơi thở chánh niệm, tiếp tục thực tập bước chân chánh niệm, chế tác năng lượng chánh niệm để ôm ấp cơn giận.

Hãy ôm ấp cơn giận với tất cả nâng niu, dịu hiền. Cơn giận không phải là kẻ thù, cơn giận là em bé do chính ta thai nghén và cho ra đời. Cơn giận cũng giống như bao tử hay buồng phổi. Mỗi khi bao tử hay buồng phổi bị bệnh ta không bao giờ nghĩ tới chuyện cắt bỏ nó đi. Cơn giận cũng vậy. Ta chấp nhận cơn giận trong ta, biết rằng ta có thể chăm sóc, chuyển hóa nó thành một năng lượng tích cực.

! Biến Rác Thành Hoa

Người làm vườn sử dụng phân xanh (compost) sẽ không bao giờ vất bỏ rác. Người ấy biết rằng rác là cần thiết để biến đổi thành phân xanh, nhờ đó mà có được rau cải, hoa trái. Trên đường thực tập, bạn cũng là một người làm vườn đang sử dụng phương pháp hữu cơ.

Cơn giận và tình yêu cũng có tính chất hữu cơ nghĩa là cả hai đều có thể thay đổi. Bạn hẳn đã biết tình yêu có thể biến thành thù hận. Tình yêu lúc ban đầu thì rất cao đẹp, rất nồng ấm. Tưởng chừng như nếu xa người mình yêu thì không thể nào sống nổi. Nhưng nếu không thực tập chánh niệm thì chỉ cần một năm, hai năm là tình yêu lý tưởng ấy có thể biến thành thù hận. Sống với nhau không chịu nổi được nhau và chỉ còn một con đường là ly dị. Tình yêu đã biến thành thù hận, bông hoa đã biến thành rác. Nhưng với năng lượng chánh niệm ta có thể nhìn rác và nói: “Ta không sợ. Ta có khả năng chuyển rác lại thành hoa, chuyển thù hận lại thành yêu thương.”

Nếu bạn khám ra một vài cọng rác trong tâm như sợ hãi, tuyệt vọng, thù hận chẳng hạn thì đừng có hoảng sợ. Như một nhà làm vườn giỏi, như một hành giả tu tập vững bạn có thể đối diện với rác trong bạn. “Tôi ý thức là đang có rác trong tôi. Tôi sẽ chuyển đổi rác ấy thành phân xanh để vun bón cho thương yêu được phục hồi.”

Những ai tin tưởng vào pháp môn tu tập sẽ không bao giờ chạy trốn khi gặp khó khăn trong liên hệ của cuộc sống. Khi đã nắm vững phép tu theo dõi hơi thở, bước chân chánh niệm, đi, đứng, nằm, ngồi, ăn uống trong chánh niệm ta có thể chế tác năng lượng chánh niệm để ôm ấp sân hận, tuyệt vọng trong ta. Chỉ cần ôm ấp thôi cũng đã đủ thoa dịu. Sau đó, trong khi vẫn tiếp tục ôm ấp ta sẽ quán chiếu sâu sắc vào bản chất của tâm sân hận trong  ta.

Vậy thì phép thực tập gồm có hai giai đoạn. Giai đoạn thứ nhất là ôm ấp và nhận diện. “Sân hận của ta ơi! Ta biết ngươi có đó. Ta sẽ chăm sóc ngươi cẩn thận.” Giai đoạn thứ hai là quán chiếu bản chất của cơn giận để tìm hiểu vì sao mà nó phát khởi.

! Chăm Sóc Em Bé Sân Hận

Chúng ta phải như là một bà mẹ luôn luôn lắng nghe tiếng con khóc. Một bà mẹ ở trong bếp nghe tiếng con khóc liền buông bỏ tất cả để  chạy vào phòng con. Dầu đang nấu một nồi canh ngon bà cũng bỏ đó mà đến với em bé. Sự hiện diện của bà mẹ đầy ấm áp, lo lắng, dịu hiền giống như những tia ấm mặt trời. Việc trước nhất là bà ẵm em bé lên và ôm em vào lòng. Khi bồng con, ôm ấp con, năng lượng yêu thương của mẹ thấm vào cơ thể con và thoa dịu con. Đây chính là điều mà chúng ta phải thực tập khi cơn giận bắt đầu xuất hiện trong ta. Phải buông bỏ tất cả những gì đang làm bởi vì điều quan trọng nhất lúc này là trở về với thân tâm mà chăm sóc em bé sân hận. Không có gì cấp thiết hơn là việc chăm sóc em bé sân hận trong ta.

Hãy nhớ lại hồi thơ ấu, khi chúng ta bị sốt. Mặc dầu đã được cho uống bao nhiêu thuốc nhưng không có gì làm cho ta cảm thấy khỏe khoắn hơn cho đến khi mẹ vào đặt tay lên trán. Dễ chịu làm sao! Bàn tay mẹ như bàn tay thiên thần. Bàn tay chuyền mát dịu và thương yêu vào cơ thể. Bàn tay của mẹ chính là bàn tay của bạn hôm nay. Nếu có chánh niệm, nếu thực tập hơi thở có ý thức bạn sẽ nhận ra rằng bàn tay của mẹ vẫn đang còn sống động trong bàn tay mình. Rồi nếu bạn đặt tay mình lên trán thì đó chính là bàn tay của mẹ với bao thương yêu dịu hiền. Khả năng thương yêu, dịu hiền của mẹ vẫn còn đó trong bạn ngày hôm nay.

Mẹ ẵm em bé trong tay với tất cả chánh niệm, chú tâm. Em bé sẽ cảm thấy an ổn vì được mẹ ấp ủ, như một bông hoa dưới ánh mặt trời. Nhưng mẹ không phải chỉ ẵm em bé mà thôi mà còn để ý tìm xem có gì xẩy ra cho em bé, và mẹ đã tìm ra rất nhanh, nhờ tình thương, nhờ tài ba của mẹ. Mẹ quả thật là một chuyên gia giỏi chăm sóc em bé.

Là một hành giả thiền tập chúng ta cũng phải là những chuyên gia giỏi chăm sóc cơn giận. Chúng ta phải chăm sóc sân hận, phải thực tập cho đến khi chúng ta hiểu rõ nguồn gốc và vận hành của tâm sân hận trong ta.

! Ôm Ấp Em Bé

Khi bồng em bé trong tay bà mẹ khám phá ra một cách dễ dàng lý do vì sao mà em bé khóc (nóng sốt, đói sữa hay ướt tã) và biết ngay là cần phải làm gì để cho em bé êm trở lại.

Chúng ta cũng vậy. Để đối trị với cơn giận ta phải ôm ấp cơn giận như bà mẹ ôm ấp em bé. Ta theo dõi hơi thở, đi thiền hành để ru dịu cơn giận. Năng lượng chánh niệm sẽ thấm vào cơn giận cũng như năng lượng của bà mẹ thấm vào em bé. Và cũng như bà mẹ ta biết ngay là cần phải làm gì để cho cơn giận êm dịu. Chẳng có gì khác. Nếu biết thực tập hơi thở, nụ cười chánh niệm và bước chân chánh niệm thì chắc chắn là ta sẽ phục hồi bình an trong vòng năm, mười, mười lăm phút.

! Tìm Hiểu Bản Chất Của Cơn Giận

Khi ai làm cho ta giận ta thường cho rằng chính người đó đã làm cho ta khổ. Ta đỗ lỗi hoàn toàn cho người đó. Tuy nhiên, nếu xét cho thật kỹ, ta sẽ khám phá ra rằng cơn giận đã có sẵn trong ta dưới hình thức một hạt giống, hạt giống giận. Hạt giống giận trong ta mới là nguyên nhân chính làm ta giận và khổ. Có rất nhiều người cũng gặp hoàn cảnh giống ta mà lại không nổi giận như ta. Cũng cùng một lời nói, cũng cùng một cử chỉ  mà người kia thì giữ được bình tĩnh trong khi ta lại giận dữ. Tại sao ta có thể nổi giận dễ dàng như vậy? Có thể là vì hạt giống giận trong ta quá mạnh. Và vì ta không có cơ hội tu tập chăm sóc cơn giận cho nên hạt giống giận đã được tưới tẩm quá nhiều trong quá khứ.

Tất cả chúng ta đều có sẵn hạt giống giận trong chiều sâu của tâm thức. Nhưng trong vài người hạt giống giận đã trở thành mạnh hơn những hạt giống của hiểu biết, thương yêu. Lý do là vì trong quá khứ những người ấy đã không tu tập. Khi bắt đầu tu tập và chế tác năng lượng chánh niệm thì tuệ giác đầu tiên mà ta có được là ta khám phá ra rằng nguyên nhân chính của khổ đau của ta không phải là tự người kia mà do ở hạt giống giận trong tâm ta. Thấy được như thế ta sẽ không còn trách móc người làm ta giận, làm ta khổ. Người kia chỉ là nguyên nhân thứ yếu của niềm đau nỗi khổ của ta.

Tuệ giác này giúp ta bớt khổ rất nhiều. Nhưng người kia thì vì không biết tu tập nên vẫn còn ở trong địa ngục.  Nhờ có chăm sóc cơn giận, ta ý thức rằng người kia còn đang đau khổ, và ta bắt đầu để tâm đến người ấy.

! Nên Giúp, Không Nên Phạt

Một người không biết xử lý đau khổ của mình thường vung vãi đau khổ ra chung quanh. Mình khổ và làm người khác khổ. Thường thường là như vậy. Vì vậy cho nên phải học cách xử lý đau khổ để đừng có vung vãi đau khổ ra chung quanh.

Nếu là cha hay là mẹ thì bạn phải biết rằng hạnh phúc trong gia đình bạn là một điều rất quan trọng. Vì tình thương đối với những người thân mà bạn không muốn làm cho họ khổ lây khi bạn khổ. Bạn thực tập chăm sóc khổ đau là vì khổ đau của bạn không phải là một vấn đề của riêng bạn. Khổ đau không phải là một vấn đề cá nhân. Hạnh phúc cũng không phải là một vấn đề cá nhân.

Khi một người giận mà không biết cách chăm sóc cơn giận cho nên đau khổ, cô đơn rồi làm cho những người chung quanh cùng khổ. Thoạt đầu chúng ta nghĩ rằng người đó đáng bị ta trừng phạt. Ta muốn trừng phạt vì người ấy làm cho ta khổ. Nhưng chỉ sau mươi, mười lăm phút thiền hành và quán chiếu ta khám phá ra rằng người ấy cần được giúp đỡ hơn là trừng phạt. Đây là một tuệ giác tốt đẹp.

Người kia có thể là người rất thân của ta, là vợ hay chồng, hay là con cái của ta. Nếu chính ta không giúp những người ta thương thì ai giúp họ bây giờ?

Vì biết ôm ấp cơn giận mà bạn sẽ cảm thấy dễ chịu hơn nhưng bạn nhận ra rằng người kia đang khổ. Nhờ thấy như vậy mà bạn có ý muốn đến với người ấy. Không ai giúp đỡ cho người ấy được ngoại trừ bạn. Và bây giờ trong lòng bạn tràn đầy ý muốn giúp đỡ. Đây là một ý tưởng hoàn toàn khác hẳn – ý muốn trừng phạt không còn nữa. Sân hận của bạn đã biến thành tình thương.

Thực tập Chánh Niệm đưa đến Định và Tuệ. Tuệ giác là hoa trái của sự tu tập. Nhờ đó mà bạn có khả năng thương yêu và tha thứ. Chỉ trong mười lăm phút hay nửa giờ sự thực tập có thể giải phóng bạn ra khỏi tâm sân hận và biến bạn thành một người dễ thương. Đây là sức mạnh của giáo pháp. Đây là mầu nhiệm của tu tập.

! Cắt Đứt Vòng Luân Hồi Sân Hận

Có một thiếu niên mười hai tuổi thường đến Làng Mai vào các mùa hè để tu tập với một số bạn trẻ. Ở nhà cứ mỗi khi em lầmlỗi gì hay cả khi em vấp té trầy da, chảy máu thì Ba của em thay vì giúp em lại la mắng nặng lời. “Cái thằng ngu này, tại sao mày làm vậy?” Em rất buồn và bất mãn với ba và nghĩ rằng ba em không thương em. Em tự nhủ rằng khi em lớn lên, lập gia đình, có con em sẽ không đối xử với con của em như thế. Nếu con em té ngã, bị trầy da, chảy máu em sẽ không bao giờ la con nặng lời mà sẽ ôm ấp và săn sóc nó.

Thế rồi, năm sau người thiếu niên ấy trở lại Làng Mai, lần này có em gái cùng đi theo. Một hôm em gái của em nằm chơi trên võng rồi bị té xuống đất. Bỗng nhiên em cảm thấy rất giận và cũng muốn hét lên “Cái con ngu này, Tại sao mày làm vậy?” giống hệt như ba em ở nhà. Nhưng nhờ có tu tập tại Làng Mai hai mùa hè nên em đã dừng lại được. Thay vì la mắng, em đã thực tập hơi thở chánh niệm, bước chân chánh niệm và chỉ trong mấy phút em đã giác ngộ một điều. Em thấy rõ phản ứng giận dữ của mình chính là năng lượng của tập khí do ba em truyền lại. Em đã muốn hành xử với em gái giống hệt như ba. Em chính là tiếp nối của ba em. Em chẳng bao giờ muốn đối xử với em gái như thế nhưng vì năng lượng của tập khí quá mạnh mà suýt nữa em đã hành động như ba em.

Đối với một thiếu niên mười hai tuổi đây là một giác ngộ khá lớn. Rồi em tiếp tục thiền hành và bỗng nhiên nẩy sinh quyết tâm tu tập để chuyển hóa năng lượng tập khí giận dữ trong người; hy vọng rằng em sẽ không trao truyền năng lượng tập khí ấy cho con em sau này. Em biết rằng chỉ có tu tập chánh niệm mới giúp cắt đứt vòng luân hồi của khổ đau do tập khí sân hận gây nên.

Cậu bé ấy cũng đã ý thức rằng ba của em cũng là nạn nhận của sự trao truyền tập khí sân hận. Ba của em chắc không muốn đối xử với em như vậy. Ông ta đã hành động như vậy chỉ vì tập khí trong ông quá mạnh. Khi cậu bé ý thức rằng ba của em là nạn nhân của sự trao truyền thì em không còn giận ba nữa. Liền sau đó em có ý muốn trở về nhà ngay để mời ba em cùng tu tập. Đây quả là quyết định khá lớn của một thiếu niên trẻ mười hai tuổi.

! Người Làm Vườn Giỏi

Khi đã cảm thông niềm đau nỗi khổ của người khác thì bạn không còn có ý muốn trừng phạt nữa mà chỉ muốn giúp đỡ. Làm được như vậy thì bạn biết bạn thực tập đã thành công. Bạn là một người làm vườn giỏi.

Trong mỗi chúng ta là một khu vườn mà chúng ta phải trở về và chăm sóc. Có lẽ đã từ lâu lắm ta đã bỏ phế khu vườn của ta. Chắc rằng ta đã biết rõ tình trạng khu vườn của ta và biết rõ phải làm gì để phục hồi phong quang của nó. Một khu vườn được chăm sóc kỹ lưỡng sẽ là nguồn vui cho rất nhiều người khác.

! Chăm Sóc Tự Thân, Chăm Sóc Người Khác

Khi còn nhỏ chúng ta được cha mẹ dạy tập thở, tập đi, tập ăn, tập nói. Đến khi tiếp nhận nếp sống tâm linh, ta như được sinh ra một lần thứ hai và phải bắt đầu tập lại. Ta lại phải tập thở, thở trong chánh niệm, tập đi, đi trong chánh niệm, tập ăn, ăn trong chánh niệm. Ta lại tập nghe, nghe trong chánh niệm, nghe với tâm từ bi. Ta lại tập nói, nói trong chánh niệm, nói với ngôn ngữ của yêu thương vì ta muốn giữ đúng lời phát nguyện ban đầu. “Em ơi, anh đang khổ, anh đang giận và anh muốn em biết cho anh điều đó.” Nói như vậy là giữ đúng lời phát nguyện. “Em ơi, anh sẽ cố gắng hết lòng. Anh sẽ chăm sóc tâm giận của anh, chăm sóc cho anh và cả cho em. Anh sẽ thực tập những gì mà anh học được của Thầy, của tăng thân.” Câu nói này sẽ làm cho người kia tâm phục và tin tưởng. Và câu nói sau  cùng “Em ơi, anh cần em giúp anh.” Đây là một lời tuyên bố mãnh liệt, bởi vì khi giận thì thường thường ta nói “Tôi không cần ai!’

Nếu nói được ba câu ấy một cách thành thực, nếu ba câu nói phát xuất từ đáy lòng thì sẽ có một sự chuyển hóa nơi người kia. Chắc chắn là như vậy. Và nhờ cách hành xử đó mà ta sẽ khuyến khích được người kia cùng tu tập. Người kia sẽ tự nhủ: “Anh ấy còn chung thủy với mình, anh ấy giữ lời phát nguyện. Anh ấy đang cố gắng thì mình cũng phải cố gắng mới được.”

Vậy thì chăm sóc tự thân tức là chăm sóc người thương. Có khả năng thương mình mới có khả năng thương người khác. Nếu bạn không chăm sóc bản thân, không hạnh phúc, không an lạc thì làm sao bạn có thể làm cho người khác hạnh phúc, an lạc? Làm sao bạn có thể giúp đỡ người kia và có thể thương yêu? Khả năng thương yêu người khác hoàn toàn tùy thuộc vào khả năng thương yêu, chăm sóc chính bản thân bạn.

! Chữa Trị Em Bé Bị Thương Tích Trong Ta

Rất nhiều người trong chúng ta đang có một em bé bị thương tích ở trong mình. Thương tích đó có thể là do cha hay mẹ truyền lại. Cha hay mẹ cũng có thể đã bị thương tích khi còn nhỏ. Vì cha mẹ ta không biết cách chữa trị em bé bị thương tích của thời ấu thơ cho nên đã truyền lại thương tích ấy cho ta. Nếu ta không biết cách chữa trị cho em bé bị thương tích trong ta thì ta sẽ trao truyền những thương tích ấy cho con, cho cháu. Vì vậy mà ta phải trở về với em bé bị thương tích trong ta mà tìm cách chữa trị.

Em bé bị thương tích trong ta rất cần được ta lưu tâm. Từ sâu thẳm của tâm thức ta, em bé mời gọi ta chú ý. Nếu có chánh niệm ta sẽ nghe được tiếng kêu cứu của em và ta sẽ trở về ôm ấp em bé thương tích trong ta “Thở vào, tôi sẽ trở về với em bé bị thương tích trong tôi. Thở ra, tôi sẽ chăm sóc em bé bị thương tích trong tôi.”

Muốn chăm sóc bản thân, ta phải trở về chăm sóc em bé thương tích trong ta. Mỗi ngày ta phải thực tập trở về với em. Phải ôm ấp em trong nâng niu, hiền dịu như người anh cả, người chị cả. Hãy thì thầm tâm sự với em bé bị thương tích ấy. Bạn có thể viết vài ba trang thư cho em để nói cho em biết rằng bạn biết là em đang có đó và hứa sẽ chăm sóc thương tích của em.

Khi nói đến hạnh lắng nghe với tâm từ bi, ta cứ nghĩ rằng lắng nghe chỉ là lắng nghe một người khác. Nhưng ta cũng phải lắng nghe em bé bị thương tích trong ta nữa. Em bé bị thương tích có mặt trong ta ngay trong giây phút này đây. Và ta có thể chữa lành em bé ngay trong giây phút này.  “Này em bé bị thương tích. Tôi đang có mặt cho em và đang lắng nghe em. Em hãy nói cho tôi nghe tất cả niềm đau nỗi khổ của em. Tôi đang lắng nghe em chăm chú.” Nếu bạn bỏ ra năm mười phút mỗi ngày lắng nghe em bé thì sự chữa trị sẽ có kết quả. Mỗi khi dạo chơi cảnh đẹp đồi cao bạn hãy mời em bé cùng dạo chơi. Mỗi khi ngắm ánh chiều tà rực rỡ bạn hãy mời em bé cùng ngắm. Làm như vậy trong vài tuần hay vài tháng thì thương tích trong em bé lần lần sẽ được chữa lành. Đó là diệu dụng của năng lượng chánh niệm.

! Trở Thành Một Người Tự Do

Mỗi phút giây tu tập là mỗi phút giây chế tác năng lượng chánh niệm. Năng lượng chánh niệm không phải là đến từ bên ngoài mà đến từ bên trong. Năng lượng của chánh niệm giúp ta có mặt bây giờ và ở đây. Khi uống một chén trà hay tách cà-phê trong chánh niệm thì thân và tâm hợp nhất toàn hảo. Ta có thật và chén trà cũng có thật. Khi vào quán ăn mà nhạc đệm ồn ào và trong óc đầy ắp dự án thì không thể uống trà thật sự. Ta đang uống những dự án, những lo âu chứ không phải uống trà. Ta không có thật và chén trà cũng không có thật. Chén trà chỉ thật sự có mặt khi nào ta thật sự có mặt, khi ta trở về với thân tâm, không còn bị ràng buộc bởi quá khứ, tương lai và lo âu. Khi ta có thật chén trà thành có thật và sự tiếp xúc của ta với chén trà mới có thật. Như vậy mới là đích thực uống trà.

Chúng ta có thể tổ chức những buổi thiền trà để bạn bè có dịp thực tập có mặt để có thể cùng thưởng thức trà và cùng vui bên nhau. Thiền trà là một phép thực tập. Một phép thực tập để có được tự do. Nếu tâm bận rong ruổi về quá khứ hay lo lắng cho tương lai, nếu trôi nổi trong những dự án hay trong sợ hãi, lo lắng, buồn giận thì không phải là người có tự do. Vì không thật sự có mặt bây giờ và ở đây cho nên sự sống không thật sự có mặt. Tách trà, người bạn ngồi trước mặt, bông hoa, trời xanh, mây trắng không thật sự có mặt. Muốn thật sự sống, muốn tiếp xúc sâu sắc với sự sống chúng ta phải có tự do. Thực tập chánh niệm giúp ta có tự do.

Năng lượng chánh niệm là năng lượng của sự có mặt, của thân tâm hợp nhất. Khi thực tập hơi thở chánh niệm, thực tập bước chân chánh niệm thì ta sẽ không còn bị quá khứ, tương lai hay dự án ràng buộc, khi đó ta thật sự sống, thật sự có mặt. Tự do là điều kiện căn bản giúp ta tiếp xúc với trời xanh, mây trắng, với chim hót, thông reo, với tách trà tên tay hay với người thân trước mặt. Vì vậy cho nên thực tập chánh niệm vô cùng quan trọng. Tuy nhiên đây không phải là một điều mà ta phải bỏ ra nhiều năm tháng thực tập. Chỉ cần một giờ thực tập là ta có thể trở nên chánh niệm hơn. Hãy thực tập để trở nên một người có tự do trong khi uống trà. Hãy thực tập để trở nên một người có tự do trong khi soạn bữa ăn sáng. Bất cứ giờ phút nào trong ngày cũng là một cơ hội để ta thực tập chánh niệm, để chế tác năng lượng chánh niệm.

! “Em Ơi, Anh Biết Em Có Đó, Và Anh Rất Hạnh Phúc”

Nhờ có năng lượng chánh niệm mà ta biết được gì đang có mặt trong giây phút hiện tại, kể cả người mà ta thương. Khi mà bạn nói được với người thương câu “Em ơi, anh biết em có mặt ở đó và anh rất hạnh phúc,” là bạn đã chứng tỏ rằng bạn là một người tự do, là bạn có chánh niệm, có khả năng trân quý những gì đang xẩy ra trong giây phút hiện tại. Những gì đang xẩy ra trong giây phút hiện tại là sự sống. Bạn đang còn sống và người thương trước mắt bạn đang còn sống.

Mức độ chánh niệm mà bạn đang có rất quan trọng. Bạn ấp ủ người thương bằng năng lượng chánh niệm đó. Bạn nhìn người thương và nói, “Em ơi, em còn sống đây và anh vô cùng hạnh phúc.”Không những bạn được hạnh phúc mà người thương của bạn cũng được hạnh phúc vì đang được chánh niệm của bạn bao bọc. Như thế thì khó mà có cơ hội sinh tâm sân hận.
Ai cũng có thể thực tập được điều này. Không cần phải năm, bảy tháng. Chỉ cần một hay hai phút thở chánh niệm hay thiền hành để đem thân tâm về với bây giờ và ở đây, để thật sự tỉnh thức. Khi đó bạn có thể đến với người thương của bạn nhìn người ấy, mỉm cười và nói lên câu, “Em ơi, em còn sống đây. Tuyệt diệu quá. Anh vô cùng hạnh phúc.”

Chánh niệm đem đến cho ta và người thương của ta hạnh phúc và tự do. Người thương của ta có thể đang bị chìm đắm trong lo lắng, sân hận hay thất niệm, nhưng nhờ chánh niệm mà ta có thể cứu người thương của ta và chính cả ta. Chánh niệm là năng lượng của Bụt, là năng lượng của giác ngộ. Khi có chánh niệm là có cánh tay từ bi của Bụt ôm ấp bảo hộ.
! Tập Khí Của Sân Hận

Có một chàng thanh niên tên là David. David hào hoa phong nhã và thông minh. Anh sinh ra trong một gia đình giàu có, sống trong nhung lụa, có đủ điều kiện để thành công. Nhưng anh ta không vui đời, không hạnh phúc vì anh không có khả năng sống hạnh phúc. David có rất nhiều vấn đề với cha mẹ, anh chị em trong nhà. Anh không có khả năng truyền thông. Anh ích kỷ, luôn luôn trách móc, đổ lỗi cho cha, mẹ, cho anh chị em. David rất đau khổ. Anh đau khổ không phải vì ai cũng thù ghét hay muốn trừng phạt anh, anh đau khổ vì không có khả năng yêu thương, hiểu biết. Anh kết bạn nhưng chỉ sau ít lâu thì bạn bè đều bỏ anh vì thật khó mà sống được gần với anh. Anh rất ích kỷ, thiếu hiểu biết và từ bi.

Một ngày nọ David lên chùa. Anh lên chùa không phải để nghe giảng pháp, anh chẳng thiết gì bài pháp thoại. Anh lên đó để tìm bạn, vì cô đơn. Anh không còn ai là bạn nữa. Anh giàu có, hào hoa phong nhã, nhiều người muốn làm quen với anh nhưng chỉ sau một thời gian ngắn là họ bỏ anh mà đi.

Sáng hôm ấy anh lên chùa vì cô dơn, vì thiếu bạn. Trên đường tới chùa David nhìn thấy một thiếu nữ xinh đẹp từ trong chùa đi ra. Anh ta vô cùng cảm xúc trước người đẹp và đem lòng yêu mến tức thời. Anh ta không còn thiết tới chùa, anh quay lui để theo chân người đẹp. Nhưng vì đường đông người, chen chân không kịp và người đẹp mất dạng. Sau một giờ tìm kiếm không ra, David ra về mang theo hình ảnh người đẹp trong tim. Anh ta mất ăn, mất ngủ. Qua đêm thứ ba, anh ta nằm mộng thấy một ông già quắc thước, râu dài trắng phau, cho anh ta hay, “Nếu muốn gặp người đẹp hôm kia thì ngày mai ra Chợ Đông.”David tỉnh dậy, không ngủ được, lòng nôn nao chờ trời sáng để đi tìm người đẹp. Sáng hôm đó anh ra Chợ Đông, chợ đang lúc vắng người, anh đi vào quán sách xem quanh. Bỗng nhiên anh thấy trên vách treo hình một người đẹp giống hệt người đẹp mà anh đã gặp hôm trước. Cũng cùng đôi mắt ấy, mũi ấy, miệng ấy. Anh ta nghĩ thầm đây có lẽ là người đẹp mà ông già trong mộng cho anh ta biết. Có lẽ anh không có phước phần để gặp được một người thật mà chỉ gặp một hình ảnh trong tranh. Anh ta bèn dốc hết tiền túi mua bức tranh về và treo lên vách phòng anh trong khu đại học (campus).

David sống cô độc, không có bạn. Có ngày anh chả thiết ra phòng ăn khu đại học (cafeteria), chỉ ăn mì gói qua bữa. Chắc bạn đã đoán ra được rằng David là một người Á Đông. Hôm đó David nấu hai tô mì. Một tô cho anh và một tô anh đặt trước bức tranh. Anh ta ăn mì và thỉnh thoảng nhìn lên bức tranh như để mời người đẹp trong tranh cùng ăn.

Nhiều người không có khả năng truyền thông với những người chung quanh. Họ nuôi mèo hay chó để cho có bạn, để chăm sóc, thương yêu. Thương yêu chó hay mèo dễ hơn vì chó, mèo không bao giờ tranh cãi. Có thể la chó, mắng mèo mà không sợ chúng phản ứng. David cũng vậy. Anh ta có thể sống hòa bình với người đẹp trong tranh, nhưng nếu có người đẹp thực sự đó chưa chắc anh ta đã có thể sống với người ấy quá hai mươi bốn giờ.

Một ngày nọ, David cảm thấy tuyệt vọng, không thể nuốt hết tô mì. Cuộc sống đối với anh không còn gì hương vị nữa. Anh ta nhìn lên bức tranh như muốn nói với người đẹp trong tranh “Sống như thế này thì có ích chi?’ Bỗng nhiên anh ta thấy người đẹp trong tranh nháy mắt và mỉm cười với anh. Anh ta sững sờ tưởng mình đang nằm mộng. Anh ta dụi mắt nhìn lại thì chỉ thấy người đẹp đứng yên bất động trong tranh. Vài ngày sau anh lại thấy người đẹp trong tranh lại nháy mắt và mỉm cười. Anh ta rất ngạc nhiên và ngẩn người ngắm bức tranh. Bỗng nhiên người đẹp từ trong tranh bước ra thành một người thật. Ta hãy gọi tên nàng là Angelina, người đẹp thiên thần (angel). Bạn không thể tưởng tượng là David sung sướng đến mức nào. Có được một người đẹp như vậy làm bạn là như lên thiên đàng.

Nhưng bạn cũng đoán ra được câu chuyện sẽ kết thúc như thế nào rồi. Vì không có khả năng sống hạnh phúc, ngay cả với một người tươi mát, dịu dàng như Angelina, chỉ ba, bốn tháng sau thì Angelina bỏ chàng. Một buổi sáng David thức dậy và thấy một bức thư ngắn của Angelina: “David, em không thể sống được với anh nữa. Anh quá ích kỷ, anh không lắng nghe ai được. Anh thông minh, hào hoa và giàu sang, nhưng anh không biết bảo trọng thâm tình với người khác.” Đọc thư xong, David vô cùng tuyệt vọng. Một người ngọt ngào, xinh đẹp như Angelina mà anh cũng không sống chung được thì anh có đáng gì? David muốn tự tử. Anh ta đi tìm một sợi dây.

Hằng năm tại Pháp có mười hai ngàn người tự tử, nghĩa là khoảng ba mươi ba người mỗi ngày. Như thế là quá nhiều. Tại Mỹ hay Âu Châu mức độ tự tử cũng tương đương. Có quá nhiều người bị chìm ngập trong tuyệt vọng. Rất nhiều người trong chúng ta không thể truyền thông và cuộc sống trở nên vô nghĩa.

! Dâng Lên Một Nén Tâm Hương

Trong khi David sửa soạn tự tử thì bỗng nhiên anh nhớ tới một ngày nọ Angelina mỉm cười và nói với anh ta, “David ơi, khi nào mà em không còn với anh, nếu anh có nhớ em quá thì anh chỉ cần thắp lên một nén hương.” Ngày Angelina nói với chàng câu đó là ngày mà nàng đã thuyết phục được David lên Chùa để nghe giảng pháp. Ngày hôm đó trong bài pháp thoại Sư Ông đã cắt nghĩa về thực tập dâng hương như là một cách để thiết lập truyền thông. Khi thắp hương là ta muốn truyền thông với Bụt, với Bồ Tát, với tổ tiên. Nếu ta có thể truyền thông với tổ tiên thì ta cũng có thể truyền thông với anh, chị, em, bạn bè quanh ta. Sư Ông nói rằng nén hương mà ta thắp lên phải là một nén tâm hương: nén hương của Niệm, của Định và của Tuệ. David ngồi gần Angelina nhưng anh không lắng nghe chăm chú. Tuy nhiên anh cũng nhớ đại khái lời giảng. Sau khi hai người rời Chùa thì Angelina quay lại nói với anh: “Nếu ngày nào anh muốn muốn tiếp xúc với em thì anh phải thắp lên một nén hương.”

Bây giờ nhớ lại, David từ bỏ ý định tự tử, chạy ra chợ mua về một nắm hương. Nhưng anh ta không biết cách thắp hương. Tại Làng Mai chúng tôi chỉ thắp một cây hương. David thì đốt luôn cả nắm hương, khói bay ngập phòng. David đợi nửa giờ, một giờ nhưng không thấy Angelina đâu. Khi đó anh ta mới nhớ lại lời Sư Ông dạy Ố “Muốn có truyền thông thực sự thì phải dâng lên nén hương của tự tâm, nén tâm hương, nghĩa là hương niệm, hương định, hương tuệ.” Thắp hương mà không có chánh niệm thì không linh ứng.

David ngồi đó và quán chiếu sâu sắc hoàn cảnh của mình. Anh thấy là mình đã không thành công với cha mẹ, với anh, với chị, với bạn bè và với xã hội. Anh đã thất bại với cả Angelina. Anh thấy rằng mình luôn luôn trách móc kẻ khác và sự trách móc này đã làm cho anh khổ. Đây là lần đầu tiên mà David đã có vài phút chú tâm suy nghiệm và anh bắt đầu có một vài tuệ giác. Đây là lần đầu tiên anh đã ngồi im lặng quán chiếu và thấy mình đã bất công với cha mẹ. Anh cũng thấy rằng truyền thông giữa anh và cha mẹ anh mà không có được là do lỗi của anh. Anh đã trách móc tất cả mọi người. Cho đến hôm nay anh mới hiểu rằng anh chịu trách nhiệm. Ngay cả đến một người xinh tươi, ngọt ngào như Angelina mà anh cũng thất bại.

David khóc, lần đầu tiên David khóc. Anh thật tình hối hận vì cách đối xử của anh với cha mẹ, anh chị em, bạn bè. Anh nhớ tới những đêm khuya anh say rượu về nhà đánh đập, hành hạ Angelina. Anh suy nghĩ như vậy và đột nhiên giọt từ bi thấm vào tim anh, một trái tim đầy đau khổ và thương tích. Cứ thế mà anh khóc. Càng khóc anh càng cảm thấy nhẹ bớt trong lòng. Bên trong anh bắt đầu có một sự chuyển hóa. Anh bắt đầu hiểu những gì mà Angelina muốn nói với anh, đó là nếp sống theo Năm Thực Tập Chánh Niệm (Năm Giới), thực tập nghe sâu và ái ngữ. Anh muốn làm mới và tự nhủ thầm nếu mà Angelina trở lại thì anh sẽ là một con người khác. “Ta sẽ biết cách săn sóc nàng, sẽ biết xây đắp hạnh phúc.” Ngay khi đó thì có tiếng gõ cửa và Angelina bước vào. Angelina đã trở lại. David chỉ thực tập trong vòng một giờ mà sự chuyển hóa đã là sâu sắc.

! David Và Angelina Đang Có Mặt Với Chúng Ta

Đừng có nghĩ rằng David chỉ là một nhân vật trong truyện, một nhân vật của thời xưa. Không. David vẫn còn sống. Anh ta đang ngồi chung với chúng ta hôm nay, tại đây. Angelina cũng vậy. Hãy nhớ rằng David là một thanh niên thông minh, hào hoa nhưng anh có một tập khí sâu dày là luôn luôn trách người khác đã làm cho mình khổ. David không thể truyền thông với cha mẹ, anh chị em, hay bạn bè. Anh đã làm cho họ đau khổ. Thực tình anh không muốn làm vậy, nhưng vì tập khí trong anh quá mạnh, anh không thể tránh được. David rất cô đơn. Anh nghĩ là trên đời không có ai cô đơn hơn anh. Anh khao khát có một người hiểu anh, kề cận anh. Tất cả chúng ta cũng đều có ước muốn ấy – đó là tâm lý thường tình. Ta cần một người thật sự hiểu và giúp ta đối phó với những khó khăn của cuộc sống. Vậy thì trường hợp của David cũng dễ hiểu thôi. David đã có những ước vọng sâu xa. David đã gặp nhiều khó khăn. Rồi Angelina đã đến trong đời chàng. May mắn đó cũng có thể xẩy ra cho chúng ta. Thỉnh thoảng một người rất mực tử tế đã đi vào cuộc sống của ta. Nếu biết trân quý, chăm sóc người ấy thì cuộc đời của ta sẽ thêm nhiều ý nghĩa. Nhưng nếu ta không biết chăm sóc tự thân, không biết chăm sóc tập khí thì ta sẽ không biết cách chăm sóc Angelina của ta. Ta có thể giận dỗi, đày đọa nàng. Vì thế mà Angelina đã bỏ ta mà đi bởi vì Angelina đã đau khổ quá nhiều vì ta.

! Giữ Gìn Angelina Trong Cuộc Sống

Ngày mà Angelina bước ra khỏi bức tranh và trở thành một người thật, Angelina nhìn David, nở nụ cười thiên thần. Nàng nhìn tô mì gói và nói, “Mì như ‘giậy’ mà anh ăn được? Xin chờ cho một chút!” Rồi nàng biến mất. Trong khoảnh khắc Angelina trở lại với một giỏ rau cải tươi và nấu cho David một tô mì ngon lành khác hẳn với tô mì-ăn-liền mà David thường ăn.

Angelina có tài. Nàng biết cách làm cho bạn hạnh phúc. Nhưng nếu bạn không có lòng biết ơn, bạn thiếu hiểu biết thì bạn không thể giữ mãi Angelina, và vì thế mà Angelina đã bỏ bạn mà đi. Có thể bạn là Angelina, và vì David là một người khó sống chung cho nên bạn phải bỏ đi, mặc dầu bạn đã cố gắng hết lòng. David đã không thể nhận ra rằng bạn là Angelina của mình. Tập khí thúc đẩy anh tiếp tục một cuộc sống, một lề lối tiêu thụ tàn phá thân tâm. Mặc dầu bạn năn nỉ hết lời David vẫn không ngưng uống rượu. Đêm đêm có thể là David đã từ quán rượu về say sưa và hành hạ bạn. Mặc dầu bao nhiêu cố gắng, ngọt ngào, kiên nhẫn anh cũng vẫn cắt lời bạn, không cho bạn nói hết câu. Anh không có khả năng lắng nghe bạn. Bạn kiên nhẫn, nhưng tới một lúc mà bạn không thể chịu được nữa. Không thể nào có truyền thông và bạn đành bỏ cuộc.

! Angelina Của Bạn Bây Giờ Ở Đâu?

Ai là David, và ai là Angelina? Tôi muốn quý vị trả lời cho tôi câu hỏi đó. Có phải bạn là David? Nếu bạn là David thì Angelina của bạn bây giờ ở đâu? Nàng còn đó với bạn hay không, hay là nàng đã bỏ bạn mà đi? Bạn đã làm chi cho nàng? Bạn đã đối xử với nàng như thế nào? Bạn có chăm sóc nàng hay không? Bạn có làm cho nàng hạnh phúc? Bạn phải tự hỏi bạn những câu hỏi đó. “Angelina của tôi, bây giờ nàng ở đâu? Nàng ở đâu bây giờ? Tôi đã làm chi cho nàng?” Đó là những câu hỏi rất quan trọng, những câu hỏi giúp ta nhìn sâu.

Đây là thiền tập, thiền tập đích thực. David có thể là người bạn đường của bạn. Angelina có thể là người bạn đường của bạn. Angelina có thể là phái nam hoặc phái nữ. David cũng vậy. Angelina đi vào cuộc sống của bạn. Ban đầu thì bạn rất hạnh phúc, bạn trân quý nàng. Bạn nghĩ rằng, đời sống thật đáng sống khi có nàng. Nhưng bạn đã không có thể giữ mãi ý thức đó. Bạn đã quên đi là Angelina là một tặng phẩm quý báu. Bạn làm nàng khổ quá nhiều cho nên nàng đã bỏ bạn mà đi. Đã có khi nàng van xin bạn nên thực tập Năm Giới Quý Báu, nhưng vì tập khí quá mạnh, bạn không bao giờ chịu nghe lời. Nàng đã từng năn nỉ bạn tiêu thụ vừa phải, ngưng hút thuốc, ngưng uống rượu. Nàng đã từng mời mọc bạn dùng lời ái ngữ, tập lắng nghe, thân cận các bậc thiện tri thức và xa lánh những người tưới tẩm những hạt giống tiêu cực trong bạn. Nhưng không bao giờ bạn nghe lời. Bạn vẫn tiếp tục theo nếp sống củ, bị tập khí lôi kéo. Vì đó mà nàng phải bỏ bạn mà đi.

Angelina của bạn có thể là con trai của bạn, có thể là con gái của bạn. Chúng đã tới với bạn trong cuộc đời của bạn. Bạn đã đối xử với các con như thế nào? Bạn có sống an hòa, thương yêu với các con hay không? Hay là bạn đã có vấn đề với Angelina của bạn? Có thể là Angelina đã bỏ nhà mà đi. Trong câu chuyện trên đây, David suýt tự tử sau khi Angelina bỏ đi. Nhưng David đã nhớ lại bài pháp thoại về thực tập truyền thông bằng nén tâm hương, và bỗng nhiên tuyệt vọng biến thành hy vọng. David tin tưởng rằng nếu anh ta dâng lên một nén hương của giới, niệm, định, tuệ thì Angelina có thể trở lại. David đã có một cơ hội ngồi xuống để suy nghiệm và nhìn lại cuộc đời mình.

! Làm Mới

Chúng ta mãi bôn ba, rong ruổi trong cuộc sống. Chúng ta không có khả năng hay cơ hội dừng lại để nhìn sâu vào cuộc đời của mình. Chúng ta phải nhìn lại, và nhìn sâu để có thể hiểu. David đã ngồi bốn mươi lăm phút trong phòng để nhìn lại cuộc đời mình. Anh đã giác ngộ nhiều điều và anh đã khóc. Lần đầu tiên trong đời anh khóc vì anh đã nhận ra tập khí của mình và những thương tích mà anh đã gây ra chung quanh, cho cha mẹ, cho anh chị em, cho bạn bè và cho chính bản thân.

Chúng ta ngồi thiền mỗi ngày, nhưng chúng ta có được những tuệ giác đó hay không? Trong khi thiền tập bạn phải thấy Angelina của bạn đã đến với bạn trong cuộc sống như một thiên thần. Bạn phải thấy tình trạng giữa bạn và nàng đã trở nên tồi tệ như thế nào. Bạn phải thấy là bạn đã đối xử nàng ra sao, đã làm cho nàng đau khổ như thế nào và vì sao nàng đã bỏ bạn mà di. Khi mà bạn có thể nhìn rõ vào mối liên hệ giữa bạn và Angelina như thế, là bạn đã thiền tập một cách sâu sắc. Tuệ giác mà bạn có được sẽ cho bạn biết là bạn phải làm gì và không nên làm gì. Bạn có thể dâng lên một nén tâm hương và gọi Angelina trở về. Angelina luôn luôn vẫn còn đó. Tình thương yêu vẫn còn trong nàng. Nàng sẵn sàng tha thứ, nếu bạn biết cách thắp lên một nén tâm hương, nén hương của Giới, Định, và Tuệ.

Bạn có thể là một người may mắn, bởi vì đã có hơn một Angelina đi vào cuộc đời bạn. Người bạn đường của bạn, cha mẹ, các con của bạn đều là những Angelinas của bạn. Phép thực tập ở đây là gọi lên những Angelinas của bạn bằng tên đích thực, phải nhận diện và trân quý họ như là những Angelinas của bạn. Đừng nói rằng không có Angelina nào trong đời bạn. Điều đó không đúng. Hãy ngồi xuống trong chánh niệm và gọi đúng tên Angelina. “Ange-lina của tôi, tôi xin lỗi. Angelina đã đi vào đời tôi, và tôi đã làm cho Angelina khổ. Đồng thời tôi cũng đã làm cho tôi khổ. Tôi không cố ý như thế. Nhưng chỉ vì tôi không khéo léo. Tôi không biết cách tự bảo vệ và bảo vệ Angelina bằng thực tập Năm Giới. Tôi muốn làm mới trở lại.” Nếu bạn thực tập đúng như vậy, Angelina sẽ trở lại với bạn.

! Bảo Vệ Những Angelinas Của Tôi

Tôi cũng là một David. Tôi có nhiều Angelinas trong đời tôi. Trong thiền đường nhỏ của tôi, tôi có một bức hình của hơn hai trăm Angelinas của tôi – đó là những đệ tử của tôi tại những trung tâm thiền tập của chúng tôi tại Pháp và Mỹ. Trước khi tôi bắt đầu thiền tọa, tôi luôn luôn nhìn vào bức hình ấy và cúi lạy các Angelinas của tôi. Rồi tôi ngồi xuống và nguyện sẽ sống như thế nào để cho những Angelinas của tôi sẽ không bỏ tôi mà đi. Tôi nguyện thực tập lời nói chánh niệm, thực tập Năm Giới, và sẽ không phụ lòng những Angelinas của tôi. Như thế tôi sẽ không gây đau khổ cho những Angelinas của tôi và có thể đem nguồn vui đến cho họ. Điều này làm cho tôi rất hạnh phúc.

Nếu Angelina của bạn đã bỏ bạn mà đi thì bạn phải làm sao để đem Angelina trở về với bạn? Angelina có thể còn đó nhưng sắp sửa bỏ đi hay Angelina đã bỏ đi rồi. Trong cả hai trường hợp thực tập bảo vệ là cần thiết. Bởi vì nhờ đó mà bạn có thể lưu giữ hay đem Angelina trở về. Xin đừng lạc vào khu rừng của ý niệm trừu tượng. Giáo pháp tâm linh sống động và có thể giúp bạn bảo vệ Angelina. Tuệ giác và từ bi đích thực phát khởi từ sự tiếp xúc với đau khổ hiện thực. Giáo pháp này xứng hợp, có hiệu quả và đáp ứng đúng hoàn cảnh. Hãy để thì giờ và năng lực để nhìn lại và tự hỏi: Angelina của tôi bây giờ ở đâu? Tôi đối xử với Angelina như thế nào? Nếu Angelina bỏ tôi mà đi thì tôi phải làm gì để đem Angelina trở về?
! Thở Để Chăm Sóc Cơn Giận

Khi năng lượng của sân hận, ghen ghét, hay tuyệt vọng phát hiện thì ta phải biết cách xử lý, nếu không thì ta sẽ bị những cảm xúc ấy tràn ngập và sẽ đau khổ vô cùng. Hơi thở chánh niệm là một pháp môn thực tập giúp ta chăm sóc cảm xúc.

Trước hết phải nên biết rằng muốn chăm sóc cảm xúc thì phải biết chăm sóc thân thể. Khi ý thức hơi thở vào, ra ta sẽ ý thức cơ thể. “Thở vào, tôi ý thức toàn thân tôi, thở ra tôi ý thức toàn thân tôi.” Hãy trở về với cơ thể, ôm ấp cơ thể bằng năng lượng chánh niệm do hơi thở chánh niệm chế tác.

Trong cuộc sống hằng ngày, vì bận rộn công kia việc nọ mà ta quên mất đi rằng cơ thể rất quan trọng cho ta. Cơ thể ta có thể là đang đau nhức, đang bị bệnh. Ta phải biết trở về ôm ấp nâng niu cơ thể ta bằng chánh niệm, như một bà mẹ ôm ấp em bé. Sau khi ôm ấp toàn thân, ta sẽ lần lượt ôm ấp từng bộ phận một trong cơ thể – mắt, mũi, phổi, tim, gan, thận , v..v..

! Thực Tập Buông Thư Toàn Thân Để Chăm Sóc Và Chữa Trị Cơn Giận

Tư thế tốt nhất để thực tập buông thư toàn thân (xem phụ lục D) là tư thế nằm.

Trước hết ta tập trung chú ý vào một phần của cơ thể, ví dụ như là quả tim. Khi thở vào, ta ý thức tim ta, khi thở ra, ta mỉm cười với tim ta. Ta gửi đến tim ta thương yêu, trìu mến.

Tiếp theo, ta làm cho cơ thể lắng dịu: “Thở vào tôi làm cho toàn thân tôi lắng dịu, thở ra tôi làm cho toàn thân tôi lắng dịu.” Cơ thể đang căng thẳng, bất an, hơi thở chánh niệm sẽ giúp cơ thể thư giãn và êm dịu, đồng thời cũng giúp cho tâm thần được thư giãn và êm dịu.

Khi hơi thở đã được êm dịu và điều hòa thì ta tiếp tục hơi thở như thế và hướng sự chú ý vào các phần khác trong cơ thể, lần lượt từ đầu đến chân.

Như thế có thể mất gần nửa giờ. Đây là một cách bày tỏ thương yêu, lo lắng hiệu quả nhất cho cơ thể.

Năng lượng của hơi thở chánh niệm là tia sáng soi rõ từng bộ phận trong thân thể, cũng như máy quang tuyến trong các bệnh viện, nhưng những tia chiếu ở đây không phải là tia quang tuyến X mà là những tia chiếu của thương yêu, của chánh niệm.

Hơi thở là một phần của cơ thể. Khi giận hay lo sợ thì hơi thở ngắn, dồn dập, phẩm chất của hơi thở trở nên yếu kém. Nếu biết sử dụng hơi thở vào, ra có ý thức, thì chỉ trong vài phút hơi thở sẽ êm dịu, điều hòa và tâm thần cũng trở nên lắng dịu.

Thở là một nghệ thuật cũng như thiền tập là một nghệ thuật. Phải thở như thế nào để thân và tâm được điều hòa, và không nên dồn ép hơi thở.

Chúng ta nên thực tập buông thư toàn thân như thế ít nhất là mỗi ngày một lần. Tốt nhất là vào buổi tối, trước khi đi ngũ. Nên tổ chức để cả gia đình cùng tập chung. Ban đầu thì có thể sử dụng băng cassette hướng dẫn để tập, sau thì tự mình có thể tự hướng dẫn cho cả nhà cùng tập.

! Bạn Có Thể Vượt Qua Cơn Bão Tố

Có nhiều cách đơn giản để đối trị cảm xúc mạnh. Một cách là “thở bằng bụng.” Khi có một cảm xúc mạnh như lo sợ hay giận dữ thì phép thực tập là tập trung chú ý xuống bụng. Tập trung chú ý vào phần ý thức là nguy hiểm. Cảm xúc mạnh cũng như một cơn bão đi ngang tâm thức. Đứng ở giữa cơn bão (tức là vùng ý thức) rất nguy hiểm. Vậy mà phần đông chúng ta cứ ở mãi trong phần ý thức, để mặt cho cảm xúc tràn ngập. Trái lại, chúng ta phải dồn sự chú ý vào phần gốc ở phía dưới bằng cách tập trung vào hơi thở ý thức, theo dõi sự phòng xẹp của bụng. Chúng ta có thể thực tập như thế trong tư thế ngồi hay tư thế nằm.

Khi nhìn một cây cao trong gió bão ta thấy phần trên của cây bị chao động mạnh, các cành nhỏ xem như có thể bị thổi gẩy bất cứ lúc nào. Nhưng khi nhìn xuống gốc cây thì khác hẳn. Gốc cây vẫn đứng vững và có thể chịu được cơn bảo. Chúng ta cũng như một thân cây. Não bộ của chúng ta giống như chóp cây trong cơn bão tố của cảm xúc, vì vậy chúng ta phải tập trung chú ý xuống phần bụng ngang với lỗ rún (đan điền). Ta bắt đầu thực tập hơi thở chánh niệm, chỉ chú ý vào hơi thở và sự phòng xẹp của bụng. Đây là một thực tập rất quan trọng vì nó giúp cho ta thấy rằng cảm xúc tuy có mạnh nhưng cũng chỉ đến đi trong chốc lát và không bao giờ kéo dài mãi. Thực tập như thế sẽ giúp ta vượt qua được những cơn bão của cảm xúc mạnh.

Nên nhớ rằng cảm xúc chỉ là một cảm xúc. Cảm xúc đến trong ta một thời gian rồi sẽ biến đi. Thế thì tại sao ta lại phải chết vì cảm xúc? Ta không phải chỉ là những cảm xúc. Ta còn có nhiều cái khác hơn là cảm xúc. Đây là điều quan trọng cần phải nhớ. Khi có một cảm xúc mạnh thì hãy tiếp tục thở hơi thở chánh niệm, hướng về huyệt đan điền và luôn luôn nhớ rằng cảm xúc mạnh sẽ đi qua. Sau một vài lần thực tập thành công như thế ta sẽ thêm tin tưởng. Đừng để bị kẹt vào những suy tư và cảm thọ. Hãy đem sự chú ý xuống bụng và thở vào, thở ra. Cơn bão sẽ đi qua, đừng quá lo sợ.

! Nhận Diện Và Ôm Ấp Các Tâm Hành

Chúng ta ôm ấp cơ thể bằng chánh niệm để làm êm dịu cơ thể. Với các tâm hành cũng vậy. “Thở vào, tôi ý thức tâm hành trong tôi, thở ra tôi làm cho tâm hành trong tôi êm dịu.” Tâm lý học đạo Bụt phân biệt năm mươi mốt tâm hành. Có những tâm hành gọi là bất thiện như tham, sân, si. Có những tâm hành gọi là thiện như niệm, định, từ, bi, hỉ, xả.

Khi một tâm hành thiện như một niềm vui hay một niệm từ bi khởi dậy, ta thở vào thở ra trong chánh niệm để ý thức niềm vui hay tâm niệm từ bi ấy trong ta. Ôm ấp các tâm hành thiện ấy bằng hơi thở chánh niệm như thế thì chúng lớn mạnh lên gấp bội. Hơi thở chánh niệm giúp ta duy trì chúng lâu hơn, ý thức chúng sâu sắc hơn. Vì vậy, thực tập ôm ấp các tâm hành thiện trong ta, như những niềm vui, hạnh phúc, thương yêu, rất quan trọng vì chúng là những thức ăn nuôi lớn chúng ta. Chúng ta thường nói tới câu “Thiền duyệt vi thực” bởi vì niềm vui của thiền tập, của chánh niệm có tác dụng nuôi dưỡng, nâng đỡ chúng ta như thức ăn bổ dưỡng.

Cũng vậy, khi những tâm hành bất thiện, như sân hận, ghen ghét, khởi dậy, chúng ta phải trở về với tự thân, sử dụng hơi thở chánh niệm để làm êm dịu và ôm ấp chúng như một bà mẹ ôm ấp đứa con đang bị nóng sốt. “Thở vào tôi làm cho tâm hành trong tôi êm dịu, thở ra tôi làm cho tâm hành trong tôi êm dịu.”

! Hạt Giống Sân Hận,Hạt Giống Từ Bi

Chúng ta thường nói tới tâm thức như là một thửa đất. Tất cả các loại hạt giống (tâm hành) đều được chôn vùi trong mảnh đất đó gọi là tàng thức (store consciousness). Các tâm hành sinh ra và phát khởi trong phần ý thức, sau một thời gian sẽ lắng xuống phần tàng thức dưới hình thái hạt giống.

Tâm từ bi cũng có sẵn trong tàng thức dưới hình thái hạt giống. Khi ta tiếp xúc hay tưới tẩm một hạt giống thì nó sẽ phát hiện lên phần ý thức. Nếu hạt giống tích cực được tưới tẩm thì ta sẽ cảm thấy vui vẻ, hạnh phúc, nếu hạt giống tiêu cực được tưới tẩm và phát hiện thì ta sẽ khổ đau. Khi niềm vui hay nỗi khổ còn vùi lấp trong tàng thức thì chúng là những hạt giống. Nhưng khi chúng phát hiện lên phần ý thức thì ta gọi chúng là tâm hành. Chúng ta phải nhận diện tâm sân hận dưới cả hai hình thái: hạt giống, ở dưới phần tàng thức và tâm hành, ở trên phần ý thức. Tâm hành là một vùng năng lượng phát hiện trên vùng ý thức. Nên nhớ rằng khi cơn giận của chúng ta chưa phát hiện, nó vẫn có mặt trong tàng thức, dưới dạng một hạt giống.

Ai cũng có hạt giống của sân hận trong mình. Khi hạt giống đó chưa phát hiện thì chúng ta không cảm thấy giận, chúng ta mát mẻ, tươi vui, dễ thương. Chúng ta cười, nói tự nhiên. Nhưng điều đó không có nghĩa là trong ta không có sân hận. Sân hận chưa phát hiện mà thôi, nhưng nó luôn luôn có đó trong tàng thức ta. Khi có một ai chạm vào hạt giống sân hận, hay tưới tẩm bằng hành động hay lời nói thì sân hận sẽ phát hiện lên phòng khách rất nhanh.

Một hành giả thiền tập giỏi không phải là một người không còn giận hay không còn  khổ đau. Chuyện này không thể có được. Một hành giả thiền tập giỏi là một người biết cách chăm sóc sân hận và đau khổ ngay khi chúng phát hiện. Người không thực tập sẽ không biết xử lý năng lượng sân hận khi nó phát hiện và dễ bị cơn giận tràn ngập.

Nếu bạn thực tập nếp sống chánh niệm thì bạn không bao giờ để cho sân hận tràn ngập. Bạn sẽ mời hạt giống chánh niệm lên để chăm sóc cơn giận. Hơi thở chánh niệm và bước đi chánh niệm sẽ giúp bạn làm việc đó.

! Tập Khí Và Hơi Thở Chánh Niệm

Tất cả chúng ta đều có tập khí. Chúng ta có đủ thông minh để biết rằng nếu hành xử theo tập khí thì sẽ gây đổ vỡ. Tuy biết vậy mà khi giận chúng ta vẫn nói năng theo tập khí, hành động theo tập khí đến nỗi gây biết bao đau khổ trong liên hệ với người khác, rồi sau đó lại hối tiếc và tự nhủ rằng sẽ không bao giờ nói năng, hành động như thế nữa. Chúng ta đã rất thành thực, nhưng rồi, khi giận chúng ta lại nói năng y như củ, hành dộng y như củ để rồi lại gây đổ vỡ như ngày nào.

Thông minh, kiến thức không giúp ta thay đổi được tập khí. Chỉ có thực tập nhận diện, ôm ấp và chuyển hóa mới giúp được. Bởi vậy cho nên Bụt dạy ta nên thực tập hơi thở chánh niệm để nhận diện và chăm sóc tập khí ngay khi vừa xuất hiện. Nếu biết ôm ấp năng lượng tập khí bằng năng lượng chánh niệm thì ta sẽ không phạm lỗi lầm và sẽ được an toàn.

Có một thanh niên Mỹ đến tu tập tại Làng Mai. Trong ba tuần lễ anh ta thực tập tinh chuyên và đi đứng khá vững chãi, Một ngày nọ anh được giao cho nhiệm vụ ra chợ mua sắm thực phẩm cho ngày Lể Tạ Ơn. Trong khi mua sắm, anh chợt để ý rằng anh ta hấp tấp hối hả, chỉ muốn mua sắm cho nhanh để về.

Đây là lần đầu tiên kể từ ba tuần lễ vừa qua mà anh ta cảm thấy mình hấp tấp, hối hả như vậy. Khi ở trong Làng Mai, anh tu tập có tăng thân vững chãi bao quanh. Nhờ năng lượng của tăng thân mà tập khí hấp tấp, hối hả nơi anh không có cơ hội xuất hiện. Hôm nay anh ta chỉ có một mình mua sắm, không có năng lượng của tăng thân bảo hộ cho nên năng lượng của tập khí phát hiện tức thì.

Anh nhận diện được tập khí một cách nhanh chóng và ý thức rằng tập khí này là do mẹ anh trao truyền cho anh. Mẹ anh luôn luôn hấp tấp, bất cứ việc gì cũng muốn làm cho thật nhanh. Thấy được như vậy, anh trở về với hơi thở chánh niệm và nói thầm: “Hello, Mom! Con biết mẹ đang có đây rồi.” Ngay sau đó tập khí hấp tấp biến mất nhanh chóng. Anh đã nhận diện tập khí và đã ôm ấp nó bằng năng lượng chánh niệm và đã có thể chuyển hóa được nó. Anh đã phục hồi được bình an và vững chãi mà anh có được trước khi ra chợ. Anh biết rằng anh thành công được như thế là nhờ anh đã có thực tập tại Làng Mai.

Tất cả chúng ta đều có thể làm được như thế. Mỗi khi tập khí phát khởi, chúng ta chỉ cần nhận diện, gọi đúng tên nó. Chúng ta thở trong chánh niệm và nói “Hello, tập khí ghen ghét của ta ơi; Hello, tập khí lo lắng của ta ơi; Hello, tập khí bực bội, giận hờn của ta ơi! Ta biết ngươi có đó, ta sẽ chăm sóc, ôm ấp ngươi với tất cả chánh niệm của ta.” Thở vào, ta nhận diện tập khí của ta, thở ra ta mỉm cười. Làm như thế thì tập khí không còn chế ngự ta được nữa. Ta được an toàn. Ta đã tự giải thoát.
! Bắt Đầu Từ Chính Bạn

Nếu không có truyền thông thì khó mà có hiểu biết thật sự. Nhưng phải nhớ rằng trước hết bạn phải truyền thông được với chính bạn. Nếu bạn không thể truyền thông được với chính bạn thì làm sao bạn có thể truyền thông với người khác? Thương yêu cũng vậy. Nếu bạn không thương yêu chính bạn thì làm sao bạn có thể thương yêu người khác. Nếu bạn không thể chấp nhận chính bạn, nếu bạn không thể đối xử từ bi với chính bạn thì làm sao bạn có thể chấp nhận, đối xử từ bi với người khác?

Rất nhiều khi bạn đã hành xử y như ba của bạn mà không biết. Và mặc dầu bạn hành xử như ba bạn, bạn vẫn có cảm tưởng là bạn và ba của bạn là hoàn toàn đối nghịch. Bạn không chấp nhận, bạn ghét bỏ ba của bạn. Bạn không chấp nhận ba của bạn tức là bạn không chấp nhận bạn. Ba của bạn có trong bạn; bạn là nối tiếp của ba của bạn. Cho nên, nếu bạn có thể truyền thông với chính bạn thì bạn sẽ có thể truyền thông với ba của bạn.

Ngã được làm bởi những yếu tố vô ngã, cho nên sự thực tập của chúng ta là hiểu rõ chính chúng ta. Người cha là một yếu tố vô ngã. Ta nói rằng cha ta không phải là ta, nhưng nếu không có cha ta thì không có ta. Cho nên cha ta hiện hữu trong thân, trong tâm ta. Cha ta là ta. Cho nên nếu bạn hiểu rõ bạn một cách sâu sắc thì bạn có thể hiểu rằng bạn là ba của bạn – ba của bạn không ở ngoài bạn.

Có rất nhiều yếu tố vô ngã khác mà bạn có thể tiếp xúc và nhận diện bên trong bạn – tổ tiên, quả đất, mặt trời, thực phẩm, và nhiều hơn nữa. Những yếu tố đó mới thoạt nhìn thì có vẻ như là không dính dáng gì tới ta, nhưng nếu không có chúng thì ta không thể sống được.

Giả thiết rằng hai phe lâm chiến muốn thương thảo trong khi cả hai bên đều không hiểu chi nhiều về tình hình phía bên mình. Mỗi phe phải biết rõ phe mình, biết rõ tình trạng quốc gia, dân tộc bên mình để có thể hiểu rõ phe bên kia, tình trạng quốc gia, dân tộc bên kia. Ngã và vô ngã không phải là hai thực thể riêng biệt, bởi vì đau khổ, hy vọng, hận thù của cả hai bên đều rất giống nhau.

Khi ta giận thì ta khổ. Nếu ta thực sự hiểu điều đó thì ta có thể hiểu được rằng người giận ta cũng khổ. Khi một người nào mắng chửi hay hành hung ta thì ta phải có đủ thông minh để thấy rằng người kia đang đau khổ vì bạo động và sân hận của chính người ấy. Ta có xu hướng quên đi điều đó. Ta cứ nghĩ rằng chỉ có ta là đang khổ và người kia là người đang đàn áp ta. Chỉ có chừng đó cũng đủ để ta càng thêm giận và càng muốn trừng phạt. Ta muốn trừng phạt người kia vì ta khổ. Những lúc đó thì ta cũng bạo động, cũng sân hận y như người kia. Khi thấy rằng đau khổ và sân hận của ta chẳng khác gì đau khổ và sân hận của người kia ta sẽ hành xử từ bi hơn. Vậy thì hiểu người khác tức là hiểu mình, hiểu mình tức là hiểu người khác. Tất cả đều phải bắt đầu từ chính bản thân.

Muốn tự hiểu mình, ta phải học hỏi và thực tập theo quan điểm bất nhị (non-duality). Không nên đàn áp sân hận bởi vì sân hận chính là ta, là một phần của  ta. Ta phải chăm sóc sân hận, bởi vì sân hận là một hiện tượng hữu cơ mà ta có thể chuyển hóa thành một hiện tượng hữu cơ khác. Rác có thể biến thành phân xanh và từ đó thành rau cải. Cho nên không nên khinh rẻ sân hận. Ta phải học cách chăm sóc, ôm ấp sân hận và chuyển hóa nó thành năng lượng của hiểu biết và thương yêu.

! Từ Bi Là Thông Minh

Hiểu biết và từ bi là hai nguồn năng lượng rất mạnh. Hiểu biết và từ bi ngược lại với u mê và thụ động. Nếu cho rằng từ bi là thụ động, yếu đuối hay hèn nhát tức là không hiểu gì hết về ý nghĩa đích thực của hiểu biết và từ bi. Nếu cho rằng những người có tâm từ bi không bao giờ chống đối và phản ứng với bất công là lầm. Họ là những chiến sĩ, những anh hùng, liệt nữ đã từng thắng trận. Khi hành động với tâm từ bi, với thái độ bất bạo động, khi hành động trên căn bản của quan điểm bất nhị thì ta phải có rất nhiều dũng lực. Ta không hành động vì sân hận. Ta không trừng phạt hay chê trách. Từ bi luôn luôn lớn mạnh trong ta và ta có thể thành công tranh đấu chống bất công. Thánh Gandhi chỉ có một mình. Thánh Gandhi không có bom, không có súng, không có đảng. Thánh Gandhi chỉ hành động với tuệ giác bất nhị, với sức mạnh của từ bi chứ không phải với tâm sân hận.

Con người không phải là kẻ thù. Kẻ thù của ta không phải là người kia. Kẻ thù của ta là bạo động, u mê, bất công trong ta và trong người kia. Khi tranh đấu bằng từ bi và hiểu biết ta không tranh đấu với kẻ khác mà là tranh đấu với ý hướng chiếm đoạt, đàn áp, và bóc lột. Chúng ta không muốn tiêu diệt những người kia, nhưng không để cho họ bóc lột chúng ta và những người khác. Chúng ta phải tự bảo vệ. Chúng ta đâu có ngu ngốc. Chúng ta rất thông minh và chúng ta có tuệ giác. Từ bi không có nghĩa là để cho người khác mặc tình bạo hành chính bản thân họ và bạo hành ta. Từ bi có nghĩa là thông minh. Hành động bất bạo động phát xuất từ tình thương chỉ có thể là một hành động thông minh.

Từ bi không có nghĩa là chịu đau khổ vô ích hoặc đánh mất khôn ngoan. Ví dụ khi bạn hướng dẫn một đoàn người đi thiền hành bạn đi chậm rãi và thật đẹp. Thiền hành có thể tạo nên rất nhiều năng lượng; thiền hành đem yên tịnh, vững chãi, và bình an đến cho mọi người. Nhưng nếu bất thần trời đổ mưa thì chúng ta đâu có để cho ai cũng bị ướt? Như thế là không thông minh. Nếu giỏi thì bạn sẽ đổi qua chạy thiền hành thay vì đi thiền hành. Bạn vẫn giữ được niềm vui của thiền hành. Bạn vẫn có thể cười, bạn vẫn có thể bông đùa, để tỏ ra rằng sự thực tập của bạn không phải là một thực tập ngô nghê. Bạn vẫn có thể giữ chánh niệm trong khi chạy dưới cơn mưa. Phải thực tập cho thông minh. Thiền tập không có nghĩa là nhắm mắt bắt chước làm theo người bên cạnh. Khi thiền tập ta phải khéo léo và sử dụng thông minh cho đúng.

! Xây Dựng Một Lực Lượng Cảnh Sát Có Tâm Từ Bi

Hiền lành, tử tế không có nghĩa là thụ động. Từ bi không có nghĩa là để cho người khác dày đạp, tiêu diệt mình. Phải tự bảo vệ và bảo vệ những người khác. Nếu cần giam một người nào rất nguy hiểm thì phải giam vậy. Nhưng mà phải làm chuyện đó với tâm từ bi. Động lực là ngăn ngừa người ấy tiếp tục phá hoại và tự tưới tẩm tâm sân hận.

Không cần phải là một ông thầy tu mới từ bi. Một cảnh sát, một quan tòa hay một người canh tù cũng có thể từ bi. Cảnh sát, quan tòa hay người canh tù phải là những vị Bồ Tát, có tâm từ bi rộng lớn. Mặc dầu cần phải cứng rắn nhưng luôn luôn giữ sáng tâm từ bi.

Nếu đã thực tập nếp sống chánh niệm thì bạn phải giúp cho những người cảnh sát hành động với tâm từ bi và không sợ hãi. Trong thời đại chúng ta, những người cảnh sát luôn luôn sợ hãi, giận dữ và căng thẳng vì họ đã bị tấn công nhiều lần. Những ai thù ghét và miệt thị cảnh sát là không hiểu họ. Mỗi buổi sáng, khi người cảnh sát mặc bộ sắc phục và đeo súng vào, họ không biết chắc là chiều hôm đó họ có còn sống để về nhà hay không. Người cảnh sát rất đau khổ. Gia đình họ cũng rất đau khổ. Họ không vui gì đánh đập, bắn chết người khác. Nhưng chỉ vì họ không biết cách xử lý sợ hãi, đau khổ, bạo động trong họ cho nên họ cũng có thể trở thành những nạn nhân của xã hội như bất cứ ai khác. Cho nên, là một cảnh sát trưởng, nếu bạn hiểu thấu được tâm tư của những cảnh sát dưới quyền, thì bạn phải thực tập để nuôi lớn từ bi và hiểu biết trong mình. Khi đó bạn mới có khả năng huấn luyện và giúp đỡ nhân viên thuộc quyền hằng ngày, hằng đêm phải thi hành nhiệm vụ khó khăn là gìn giữ an ninh trật tự trong thành phố.

Nước Pháp gọi những người cảnh sát là những người “giữ hòa bình (peace-keeper).” Nhưng nếu không có hòa bình trong tâm thì làm sao có thể giữ được hòa bình cho cả thành phố? Trước phải giữ bình an trong bản thân. Bình an ở đây có nghĩa là không sợ hãi, sáng suốt, và có tuệ giác. Người cảnh sát có được học những kỹ thuật tự vệ. Nhưng kỹ thuật tự vệ không đủ. Phải thông minh, phải hành động không phải vì sợ hãi. Nếu sợ hãi quá thì có thể lầm lổi, sẽ có xu hướng dùng súng và có thể giết người vô tội.

! Không Thể Theo Phe

Tại Los Angles, bốn cảnh sát viên đánh một người da đen gần chết. Báo chí khắp thế giới đua nhau viết về chuyện đó và ai cũng muốn đứng về một phe, hoặc là bênh người bị đánh hoặc là bênh người cảnh sát. Khi bạn phán xét và thiên về một bên là bạn đã hành động như là bạn không can dự vào việc đã xẩy ra, như là bạn không phải là người da đen bị đánh hay bốn người cảnh sát đánh người da đen. Nhưng nếu nhìn cho kỹ thì bạn là người da đen đồng thời cũng là bốn người cảnh sát. Sân hận, sợ hãi, bực bội và bạo động có mặt trong người bị đánh, trong người đánh. Cũng như sân hận, sợ hãi, bực bội và bạo động có mặt trong chính chúng ta.

Muốn hiểu những người cảnh sát và giúp họ bớt đau khổ, hãy tưởng tượng bạn là vợ hay chồng của một người cảnh sát. Có sống chung bạn mới thấy rõ đời sống khó nhọc của người bạn đường. Bạn sẽ cố gắng ngày đêm giúp chồng hay vợ chuyển hóa sân hận, lo sợ và bực dọc. Khi bạn có thể giúp được chồng hay vợ mình như thế thì toàn cả thành phố được lợi lạc. Ngay cả đến những thanh niên hư hỏng cũng được lợi lạc. Đây là cách hay nhất để giúp cộng đồng. Nhờ thông minh, tuệ giác và từ bi bạn có thể giúp tránh được nhiều tai họa.

! Đối Thoại Để Chấm Dứt Sân Hận và Bạo Động

Hình ảnh của một người cảnh sát đầy bạo động, kỳ thị là một hình ảnh không mấy đẹp. Rất nhiều người trẻ coi những người cảnh sát như kẻ thù. Chúng đốt xe cảnh sát, đánh phá cảnh sát, bởi vì cảnh sát là đối tượng của sân hận và bực bội trong chúng. Chúng ta nên tổ chức một cuộc họp mặt hay hội thoại giữa cảnh sát và những thanh niên đã có những hành vi bạo động, hay đang bị giam giữ. Tại sao chúng ta lại không tổ chức những cuộc hội thoại như thế để cho những người cảnh sát có cơ hội nói ra tất cả những uẩn ức, giận dữ hay lo sợ của mình? Tại sao chúng ta lại không để cho những người trẻ đó có cơ hội nói ra tất cả những uẩn ức, giận dữ hay bực bội của mình? Tại sao chúng ta không trình chiếu những cuộc hội thoại như thế trên đài truyền hình cho cả nước đều xem, đều biết?

Đây có thể là một thiền tập đích thực: thiền tập quán chiếu sâu sắc, không phải chỉ trên bình diện cá nhân, mà trên bình diện của cả thành phố, của cả nước. Chúng ta đã không thấy được sự thật. Chúng ta đã coi rất nhiều phim ảnh, đọc truyện trinh thám nhưng chúng ta chưa thấy được sự thật bên trong tâm tư sâu kín của những con người thật. Chúng ta phải tổ chức những cuộc đối thoại như thế để cho sự thật được trình bày cho cả nước coi chung.

! Thả Bom Lên Chính Mình

“Xin Chúa tha tội cho họ, vì họ không biết họ đã làm gì,” Chúa Jesus đã nói như vậy. Một người phạm tội ác hoặc gây đau khổ cho kẻ khác là vì người ấy không biết mình đang làm gì. Nhiều người trẻ đã phạm tội mà không biết, không hiểu rằng sự bạo hành của họ đã gây nên biết bao đau khổ. Mỗi khi bạo hành như vậy họ gây đau khổ cho chính họ và cho người khác. Họ nghĩ rằng hành động tàn bạo, giận dữ như vậy là có thể làm giảm bớt cơn giận. Nhưng sân hận trong họ chỉ lớn thêm mà thôi.

Khi thả bom lên trên kẻ thù, bạn đã thả quả bom ấy lên chính bạn, lên quê hương bạn. Trong cuộc chiến Việt Nam, người dân Hoa Kỳ cũng đã đau khổ như người dân Việt nam. Vết thương chiến tranh tại Hoa Kỳ cũng sâu đậm như vết thương chiến tranh tại Việt nam. Chúng ta phải chấm dứt bạo động. Chúng ta không thể chấm dứt bạo động nếu chúng ta không có được cái tuệ giác rằng những gì chúng ta gây cho một người khác là chúng ta tự gây cho chúng ta. Các thầy giáo phải chỉ cho học sinh biết rằng khi bạo động, chính chúng sẽ chịu đau khổ. Nhưng các thầy giáo không thể chỉ nói suông, mà phải sáng tạo hơn là chỉ nói suông. Khi chia sẻ tuệ giác với người khác không nên quá giáo điều mà phải mềm dẻo, và sử dụng phương tiện thiện xảo. Phương tiện thiện xảo rất quan trọng. Một bậc Đại Nhân cần phải khéo léo khi hành đạo cũng như khi giúp người.

! Chận Đứng Chiến Tranh Trước Khi Chiến Tranh Bùng Nổ

Phần đông chúng ta đợi cho đến khi chiến tranh bùng nổ mới bắt đầu tìm cách chấm dứt. Phần đông chúng ta không biết rằng nguồn gốc của chiến tranh có khắp mọi nơi, cả nơi cách suy nghĩ, nơi nếp sống của chúng ta. Chúng ta không có khả năng nhận ra chiến tranh khi nó còn tiềm ẩn. Chúng ta chỉ bắt đầu chú ý đến chiến tranh khi nó đã bùng nổ, khi mà ai cũng bắt đầu bàn luận về cuộc chiến. Và rồi chúng ta cảm thấy bị tràn ngập trước cuộc chiến tàn khốc. Chúng ta tự cảm thấy bất lực. Chúng ta theo phe này hay phe kia, lên án phe này hay bênh vực phe kia, nhưng không cống hiến được gì cho việc chấm dứt sự tàn phá do chiến tranh.

Là một hành giả thiền tập đích thực, bạn phải thực tập nhìn sâu vào tình thế để thấy được cuộc chiến trước khi nó xẩy ra. Bạn phải bắt tay hành động để chận đứng chiến tranh trước khi nó bùng nổ. Nhờ tuệ giác và ý thức, bạn có thể đánh thức người khác để họ cũng có được ý thức như bạn. Rồi cùng với họ bạn có thể hành động một cách khéo léo để ngăn ngừa chiến tranh.

Các quốc gia của Liên Minh Đại Tây Dương (NATO) nghĩ rằng thả bom Belgrade là giải pháp duy nhất để chấm dứt kỳ thị chủng tộc tại Yugoslavia. Họ tin rằng không có con đường nào khác. Họ không thể thấy và đối phó với gốc rễ của chiến tranh, những gốc rễ đã hiển lộ ngay trước khi chiến tranh bộc phát, bởi vì khả năng nhìn sâu, quán chiếu của họ hạn hẹp. Bạo lực không bao giờ đem lại hòa bình và hiểu biết. Chỉ có nhìn sâu để hiểu rõ gốc rễ của bạo lực mới xây dựng được hòa bình.

Là một hành giả thiền tập giỏi bạn có thể có tuệ giác sâu sắc hơn, và có thể biết cách ngăn ngừa nạn kỳ thị chủng tộc mà không cần phải dùng đến bom đạn hay các phương tiện bạo lực khác. Có nhiều cuộc chiến sắp bùng nổ trên địa cầu này. Nếu quả thật là một người yêu chuộng hòa bình, bạn phải thấy điều đó và phải cố gắng hết sức, cùng với các cộng đồng khác, tìm cách ngăn chặn chiến tranh tàn khốc. Nếu bạn muốn ngăn chặn sự can thiệp tàn bạo như ở Kosovo thì bạn phải đề nghị một giải pháp thay thế. Nếu có một ý kiến hay thì bạn phải đề nghị lên dân biểu hay nghị sĩ yêu cầu họ can thiệp để có được một giải pháp tốt đẹp hơn. Chúng ta phải học cách thiền tập như một quốc gia, chứ không chỉ như một cá nhân, để có thể đạt được tuệ giác khả dĩ chấm dứt chiến tranh và bạo động.

! Tuệ Giác Cộng Đồng

Có một thanh niên ăn chay không phải vì anh ta theo giáo điều hay cuồng tín mà vì có chánh niệm. Anh ta không ăn thịt vì anh ta không đành tâm. Ba anh rất bực mình vì chuyện này và do đó mà gia đình không được vui vẻ, hòa thuận. Chàng thanh niên biết rằng anh ta không thể ngưng ăn chay vì anh sẽ phải khổ sở vô cùng nếu ăn thịt. Anh cũng không muốn ăn thịt để làm vừa lòng ba anh, nhưng anh cũng không muốn không khí  trong gia đình căng thẳng hoài. Anh ta đã sử dụng thông minh của mình và không thụ động.

Một ngày nọ anh ta đem về một băng thâu hình (video), và nói, “Ba ơi, đây là cuốn phim tài liệu rất hay.” Rồi anh ta chiếu cuốn phim súc vật bị làm thịt cho ba anh và cả nhà xem. Xem phim, ba anh đã vô cùng xúc động và khổ tâm. Sau đó ông ta đã quyết định ăn chay. Tuệ giác của người cha là một tuệ giác do kinh nghiệm trực tiếp chứ không phải là một ý niệm. Thay vì giận, thay vì để cho cơn giận tràn ngập chàng thanh niên đã sử dụng từ bi, khôn khéo, và thông minh. Anh ta đã thuyết phục được cả nhà không ăn thịt để cho tâm từ bi được nuôi dưỡng trong mỗi người. Quyết định chiếu cuốn phim tài liệu là một quyết định rất thiện xảo và đầy tình thương. Với phương tiện thiện xảo ta có thể đạt được thắng lợi lớn.

Trên cương vị cá nhân, bạn có thể có một vài tuệ giác. Tuệ giác ấy có thể khơi dậy tâm từ bi và thúc đẩy bạn hành động. Nhưng vì chỉ là một cá nhân bạn không thể thực hiện được nhiều. Nếu những người khác không có cùng tuệ giác với bạn thì bạn nên cố gắng làm cho tuệ giác của bạn trở thành một tuệ giác cộng đồng. Tuy nhiên bạn không nên ép người khác chấp nhận ý kiến của bạn. Bạn có thể áp đặt ý kiến của bạn lên người khác, nhưng khi đó thì ý kiến của bạn chỉ là một ý kiến mà không phải là một tuệ giác. Tuệ giác không phải là một ý kiến. Cách chia sẻ tuệ giác là tạo điều kiện để cho người khác tự mình phát kiến ra tuệ giác ấy – qua kinh nghiệm riêng chứ không phải qua những gì bạn nói ra. Điều này đòi hỏi khéo léo và kiên trì.

! Giúp Cho Tình Yêu Hồi Phục

Tại Làng Mai có một sư cô trẻ chỉ mới hai mươi hai tuổi. Sư cô đã giúp cho một bà mẹ và con gái làm hòa ngay sau khi hai người thề sẽ không bao giờ nhìn mặt nhau. Chỉ trong vòng ba giờ đồng hồ, sư cô đã giúp hòa giải hai mẹ con. Rốt cuộc, hai người đã thực tập thiền ôm. Hai mẹ con ôm nhau trong chánh niệm, theo dõi hơi thở. Họ thực tập, “Thở vào tôi biết tôi đang còn sống. Thở ra tôi biết mẹ tôi đang còn sống và tôi đang ôm mẹ tôi trong vòng tay.” Hai mẹ con thực tập để ý thức sự may mắn về sự có mặt của người kia. Hai mẹ con đã tiếp xúc sâu sắc với giây phút hiện tại và đã ôm nhau trong thương yêu trọn vẹn. Tác dụng chữa trị của sự thực tập quả là mạnh mẽ. Nhờ thực tập mà cả hai mẹ con đã nhận ra rằng họ thương nhau vô cùng. Hai mẹ con đã không biết là họ thương nhau như vậy chỉ vì họ đã không khéo léo trong liên hệ mẹ con, trong cách nói năng và lắng nghe nhau.

Không phải chỉ vì sân hận, thù ghét có mặt mà khả năng thương yêu và chấp nhận nhau không có mặt. Nếu là một hòa giải viên, một tác viên hòa bình khéo léo bạn có thể phục hồi thương yêu và hiểu biết trong bạn và trong những người khác. Xin đừng nghĩ rằng không có thương yêu trong bạn. Điều đó không đúng. Thương yêu luôn luôn có trong bạn. Cũng như ánh nắng mặt trời; dầu trời mưa gió, mặt trời vẫn có đó, nếu bạn đi máy bay lên quá mây một chút. Vậy thì nếu bạn cho rằng bạn không còn tình yêu mà chỉ có hận thù đối với người kia thì bạn rất lầm. Hãy đợi đến khi người kia chết đi, bạn sẽ khóc lóc và cầu mong cho người kia sống lại. Điều này chứng tỏ rằng thương yêu vẫn còn đó. Vậy thì bạn hãy để cho thương yêu có dịp hiển lộ trong khi người kia còn sống. Muốn phục hồi thương yêu bạn phải biết cách xử lý sân hận. Sân hận luôn luôn đi cùng với lầm lẫn, vô minh.

! Vượt Qua Phán Xét

Giả thử bạn là thầy giáo của một em nữ sinh năm tuổi. Khi mẹ em đến đón em bạn nhận thấy bà ta có vẻ dữ dằn, nóng giận và làm cho em nữ sinh khổ sở. Bạn có thể làm gì trong trường hợp này? Bạn có thể làm rất nhiều. Trước hết bạn giúp em nữ sinh hiểu mẹ của em hơn. Bạn tạo cơ hội để em nói ra những ẩn uất trong lòng, những khó khăn của em đối với mẹ, mặc dầu em chỉ có năm tuổi. Bạn có thể đóng vai trò của một người mẹ hiền. Bạn dạy cho em cách hành động, cách phản ứng khi mẹ của em giận dữ, đày đọa em, để cho tình trạng không trở nên tồi tệ. Giúp em nữ sinh như thế rất quan trọng bởi vì khi em thay đổi thì mẹ em cũng thay đổi.

Vì là một thầy giáo dạy em đó bạn cũng có cơ hội gặp gỡ, tiếp xúc với mẹ của em. Nếu có từ bi và hiểu biết thì bạn có thể giúp được. Nếu không thì bạn chỉ có xu hướng phán xét cho rằng người mẹ là sai và em bé nữ sinh kia là đúng. Bạn chỉ buộc tội người mẹ hành hạ con. Bạn không chấp nhận sự bạo hành của bà mẹ, nhưng nói lên sự bất bình của bạn thì cũng chẳng giúp ích được gì. Hành xử của bạn phải phát xuất từ tâm từ bi và hiểu biết, không những để giúp em nữ sinh mà còn để giúp cả mẹ và ba của em. Nếu bạn không thể giúp mẹ hay ba của em thì bạn không thể giúp em nữ sinh đó. Có thể là bạn nghĩ rằng chỉ có em bé là nạn nhân và chỉ có em là cần được giúp đỡ. Nhưng nếu bạn muốn giúp em bé nữ sinh thì bạn phải giúp cha mẹ em, những người mà bạn xem như là kẻ thù. Nếu không giúp được cha mẹ em thì bạn không thể giúp được em. Cha mẹ nhiều khi thiếu trí tuệ, đầy bạo động, sân hận và làm cho con cái khổ. Vì vậy chúng ta cần phải có tâm từ bi với các bậc cha mẹ, phải tìm hiểu nguồn gốc của những khổ đau của họ để giúp đỡ. Những nhà giáo dục cần ý thức điều này và giúp cho tất cả chúng ta chăm sóc các bậc cha mẹ và từ đó có thể chăm sóc con cái.

! Phụng Sự Tổ Quốc

Chính quyền nước Pháp đã cố gắng hết sức để lo cho các người trẻ bạo động. Họ đã có ít nhiều tuệ giác. Họ biết rằng bạo động và khổ đau của những người trẻ có gốc rễ từ xã hội. Để biết rõ cách đối trị, ta phải lắng nghe như một bác sĩ lắng nghe bệnh nhân. Ta phải lắng nghe chăm chú nhịp sống của xã hội để có thể hiểu tại sao mà những người trẻ lại có quá nhiều bạo động, quá nhiều sân hận như vậy. Lắng nghe như thế ta sẽ thấy rằng gốc rễ bạo động và sân hận của những người trẻ bắt nguồn từ gia đình, từ nếp sống hằng ngày của các bậc cha mẹ. Và gốc rễ của bạo động trong gia đình bắt nguồn từ tổ chức, lề lối tiêu thụ của xã hội.

Chính phủ cũng là nhân dân. Chính phủ gồm có những người làm cha, làm mẹ, những con cái. Những người cha, mẹ, con cái đó mang trong mình họ những bạo động của gia đình mình. Vậy nếu vị thủ tướng của nước Pháp không thực tập nhìn sâu, không thấy được tâm sân hận, bạo động, buồn bực, khổ đau trong bản thân thì ông ta không thể hiểu được bạo động, sân hận và tuyệt vọng của thế hệ trẻ. Ông ta cũng còn phải hiểu những nhân viên trong nội các của ông, trong bộ Thanh niên, trong bộ Giáo dục v..v.., và thấy được những khổ đau của họ. Là những công dân, là chính quyền chúng ta phải hành động, nhưng hành động trên nền tảng nào? Trên nền tảng của sự hiểu biết vậy.

Nếu ta thực tập nhìn sâu để có thể thấy được gốc rễ của sân hận và bạo động trong xã hội, thì ta sẽ khởi lòng thương đối với các người trẻ. Chúng ta sẽ biết rằng trừng phạt hay bắt nhốt chẳng giúp ích được gì. Đó là lời của thủ tướng Jospin. Vậy thì thủ tướng Jospin và chính phủ của ông quả đã có một vài tuệ giác. Nhưng với tư cách là công dân chúng ta phải giúp vào một tay. Chúng ta phải giúp phát triển tuệ giác ấy. Là nhà giáo dục, là cha mẹ, là nghệ sĩ, văn sĩ chúng ta phải thực tập để có đủ tuệ giác để giúp chính quyền.

Ngay cả khi không thuộc đảng phái đương quyền, ta cũng phải thực tập. Giúp đảng cầm quyền là giúp tổ quốc. Ta phụng sự tổ quốc chứ không phải giúp đảng chính trị. Nếu bây giờ đương kim thủ tướng nước Pháp có một cơ hội để cải thiện tình trạng của thanh niên nước Pháp thì cách hay nhất để phụng sự quốc gia là đóng góp tuệ giác và sự hỗ trợ của bạn. Điều này không có nghĩa là bạn phản bội nhân dân hay đảng của bạn. Sự có mặt của một đảng chính trị là để phục vụ quốc gia chứ không phải để gây khó dễ cho một đảng khác hay đảng cầm quyền. Vậy thì, là một chính trị gia, bạn phải thực tập nhận thức bất nhị. Bạn phải ý thức rằng thương yêu, từ bi là cao cả hơn lập trường chính trị. Chính trị ở đây là chính trị có thông minh chứ không phải là chính trị phe phái. Chính trị phải có tính chất nhân đạo, mà mục đích là tạo an vui và chuyển hóa cho xã hội, chứ không phải chỉ để có quyền lực.
! Những Nút Thắt Của Sân Hận

Trong tâm thức của chúng ta có những khối của niềm đau, của sân hận, và của bực bội gọi là nội kết. Chúng cũng được gọi là những nút thắt, giây quấn (triền phược), bởi vì chúng trói buộc, không cho ta được tự do.

Khi một người nào đó thóa mạ ta hay đối xử không tử tế với ta thì trong ta sẽ có nội kết. Nếu ta không biết cách tháo gỡ thì nội kết sẽ lưu lại rất lâu. Sau đó nếu có ai lại đối xử không tử tế với ta như vậy thì nội kết đó sẽ lớn thêm. Nội kết hay những khối đau nhức có năng lực thúc đẩy, ép buộc ta trong khi hành xử.

Lâu ngày nội kết càng trở nên khó chuyển hóa, khó tháo gỡ, và chúng ta bị kẹt. Tiếng Sanskrit của danh từ nội kết là samyojana, có nghĩa là “kết tinh, đóng cục.” Tất cả chúng ta đều có nội kết cần được chăm sóc. Chính nhờ thiền tập mà ta tháo gỡ được nội kết và đạt được sự chuyển hóa và chữa trị.

Không phải nội kết nào cũng khó chịu. Có những nội kết êm ái nhưng nội kết êm ái cũng có thể gây nên đau khổ. Khi thấy, nghe, hoặc thưởng thức những gì ta thích, sự ưa thích đó sẽ có thể trở thành một nội kết. Khi những gì ta ưa thích không còn nữa, ta sẽ thèm nhớ và đi tìm. Ta để ra nhiều thì giờ và tâm lực để tìm hưởng lại những khoái lạc đó. Khoái lạc trong khi hút cần sa hay uống rượu sẽ tạo nên nội kết trong thân cũng như trong tâm và rất khó mà giải trừ. Càng ngày ta càng khao khát. Ta sẽ bị sức mạnh của nội kết thúc đẩy, chế ngự, ta không còn tự do.

Tình yêu là một nội kết rất lớn. Khi yêu, bạn chỉ nghĩ đến người yêu. Bạn không còn tự do. Bạn không làm được chi cả, không học bài, không làm việc, không thể thưởng thức một cảnh mặt trời huy hoàng hay một cảnh đẹp thiên nhiên. Bạn chỉ nghĩ tới đối tượng tình yêu của bạn. Vì vậy chúng ta nói tới tình yêu như là một tai nạn, như khi bị té. Khi yêu bạn mất thăng bằng cho nên bạn ‘bị té vì yêu (falling in love)’. Thế cho nên tình yêu có thể là một nội kết.

Êm ái hay không êm ái, cả hai thứ nội kết đều làm cho ta mất tự do. Vì vậy cho nên ta phải cẩn thận bảo vệ thân tâm để cho nội kết không thể phát sinh. Ma túy, rượu, thuốc lá tạo nên nội kết trong thân. Sân hận, thèm khát, ganh tị, thất vọng tạo nên nội kết trong tâm.

! Tập Dượt Hung Hãn

Sân hận là một nội kết, và vì nó gây đau khổ cho nên ta phải tìm mọi cách để diệt trừ. Các nhà tâm lý trị liệu thích dùng câu “tống nó ra khỏi cơ thể (getting it out of your system).” Và họ nói tới phương pháp ‘xả hơi’ (venting), cũng như xả hơi khói ra khỏi nhà bếp. Một vài nhà tâm lý trị liệu nói rằng khi năng lượng của sân hận nổi dậy trong ta thì ta phải ‘xả’ nó đi bằng bằng cách đấm vào gối hay đá vào một cái gì hay đi vô rừng mà la hét.

Khi còn nhỏ chúng ta không được phép chửi thề vì chửi thề có thể xúc phạm, làm mất lòng người khác. Vì vậy thì chúng ta đi vào rừng hay một nơi vắng vẻ để hét lên những tiếng chưởi thề để ‘xả’ ra những ép bức, bực bội trong mình. Đây cũng là ‘xả hơi.’

Những người sử dụng cách ‘xả hơi’ sân hận như là đấm gối, la hét thực ra là đang tập dượt sân hận. Họ tự tạo cho mình một tập khí nguy hiểm: họ luyện tập tánh hung hãn. Trái lại, chúng ta thì chế tác chánh niệm và ôm ấp, chăm sóc sân hận mỗi khi nó phát khởi.

! Nâng Niu Tâm Sân Hận

Chánh niệm không bao giờ đánh phá sân hận hay tuyệt vọng. Chánh niệm chỉ có đó để nhận diện. Chánh niệm về một cái gì là nhận diện sự có mặt của cái đó trong hiện tại. Chánh niệm là khả năng biết được những gì đang xẩy ra trong hiện tại. “Thở vào tôi biết sân hận phát khởi trong tôi; thở ra tôi mỉm cười với sân hận của tôi.” Đây không phải là đàn áp hay đánh phá. Đây chỉ là nhận diện. Mỗi khi ta đã nhận diện được sân hận ta sẽ ôm ấp nó với tất cả tỉnh thức, nâng niu.

Khi trong phòng bị lạnh, bạn mở sưởi và lò sưởi sẽ phát hơi nóng. Khí lạnh trong phòng không cần phải đi ra khỏi phòng thì phòng mới ấm. Hơi lạnh được hơi nóng bao trùm và sẽ ấm lần. Không có chuyện tranh đấu giữa hơi lạnh và hơi nóng.

Thực tập chăm sóc cơn giận cũng như vậy. Chánh niệm nhận diện và chấp nhận sự có mặt của cơn giận. Chánh niệm cũng như một người anh cả. Anh cả không đàn áp đứa em đang đau khổ. Chánh niệm chỉ nói, “Em ơi, có anh giúp em đây.” Bạn ôm đứa em của bạn vào lòng và an ủi vỗ về. Đây chính là là sự thực tập của chúng ta.

Hãy tưởng tượng một bà mẹ giận đứa con thơ của mình và đánh con. Người mẹ ấy không biết rằng mẹ với con là một. Ta là mẹ của cơn giận của ta, và ta phải chăm sóc cơn giận như con ta chứ không phải đánh đập. Cơn giận của ta chính là ta. Thiền tập không có nghĩa là đánh phá. Trong truyền thống đạo Bụt, thiền tập là phép thực tập ôm ấp và chuyển hóa chứ không phải đánh phá.

! Sử Dụng Sân Hận, Sử Dụng Khổ Đau

Muốn trồng cây giác ngộ chúng ta phải sử dụng đau khổ, phiền muộn trong ta. Cũng giống như trồng hoa sen. Hoa sen không thể trồng trên đá, phải có bùn mới trồng được.

Hành giả thiền tập không kỳ thị hay gạt bỏ nội kết của mình. Chúng ta không tự biến thành một bãi chiến, thiện đánh với ác. Ta chăm sóc phiền não, sân hận, ganh tị với tất cả nâng niu, nhẹ nhàng. Khi cơn giận khởi dậy, ta phải bắt đầu thực tập hơi thở chánh niệm ngay tức khắc: “Thở vào, tôi biết cơn giận có trong tôi. Thở ra tôi đang chăm sóc cơn giận của tôi.” Phải làm như một bà mẹ: “Thở vào tôi biết con tôi đang khóc, thở ra tôi chăm sóc con tôi.”  Đây là thực tập từ bi.

Nếu bạn không biết chăm sóc bạn với tâm từ bi thì làm sao mà bạn có thể chăm sóc người khác với tâm từ bi? Khi cơn giận khởi dậy, hãy tiếp tục thực tập hơi thở chánh niệm, bước chân chánh niệm để chế tác năng lượng chánh niệm. Ta tiếp tục ôm ấp nâng niu năng lượng của cơn giận trong ta. Cơn giận có thể sẽ kéo dài một thời gian, nhưng ta sẽ được an toàn, bởi vì Bụt đang có mặt trong ta, giúp ta chăm sóc cơn giận. Năng lượng chánh niệm là năng lượng của Bụt. Khi thực tập hơi thở chánh niệm và ôm ấp cơn giận ta đang được Bụt bảo hộ. Không có chi để nghi ngờ: Bụt đang ôm ấp ta và cơn giận của ta trong từ bi vô lượng.

! Trao Truyền Và Tiếp Nhận Năng Lượng Chánh Niệm

Khi giận hay tuyệt vọng ta thực tập hơi thở chánh niệm, bước chân chánh niệm để chế tác năng lượng chánh niệm. Năng lượng này sẽ giúp ta nhận diện và ôm ấp niềm đau nỗi khổ. Nếu năng lượng của ta không được mạnh lắm thì ta có thể mời một sư anh hay một sư chị hay bạn bè cùng ngồi, cùng thở, cùng đi để nâng đỡ ta bằng năng lượng chánh niệm của chính họ.

Thực tập chánh niệm không phải là phải tự mình làm lấy tất cả. Ta có thể thực tập với sự nâng đỡ của bạn bè. Năng lượng của tăng thân có thể giúp ta khi cảm xúc trong ta quá mạnh.

Ta cũng có thể giúp người khác bằng năng lượng chánh niệm của ta khi họ đang ở trong hoàn cảnh khó khăn. Khi con ta đang bị chìm lấp trong cảm xúc mạnh chúng ta có thể cầm tay mà nói rằng, “Con ơi, thở đi con. Thở vào, thở ra với ba (hay với má) đây.” Ta cũng có thể rủ con cùng đi thiền hành, nắm nhẹ tay con để giúp nó lắng dịu theo từng bước chân. Khi bạn cho con bạn một ít năng lượng của chánh niệm thì con bạn có thể dịu xuống mau chóng và có thể ôm ấp cảm xúc của nó.

! Nhận Diện, Ôm Ấp, Làm Nhẹ Khổ Đau Do Sân Hận Gây Nên

Công năng thứ nhất của chánh niệm là nhận diện chứ không phải là đánh phá. “Thở vào, tôi biết rằng cơn giận có trong tôi, Xin chào em bé sân hận.” Rồi thở ra, “Tôi sẽ chăm sóc em hết lòng.”

Khi bạn đã nhận diện cơn giận, bạn sẽ ôm ấp nó. Đây là công năng thứ hai của chánh niệm. Đây là một thực tập rất dễ chịu. Thay vì đánh phá bạn chăm sóc cảm xúc của bạn. Nếu bạn biết cách săn sóc cơn giận thì sẽ có sự thay đổi.

Chúng ta đã nói nhiều lần là khi nấu một nồi khoai, phải đậy nắp lại, đun cho nước sôi, và đợi ít nhất là hai mươi phút để cho khoai chín. Cơn giận của bạn cũng như củ khoai, khoai sống ăn không được.

Chánh niệm cũng như lửa nấu khoai. Một vài phút đầu khi bạn nhận diện và ôm ấp cơn giận cũng đã có kết quả, đã được vơi bớt phần nào. Cơn giận vẫn còn đó, nhưng bạn không còn đau khổ nhiều bởi vì bạn đã biết cách chăm sóc em bé sân hận của bạn. Đó là công năng thứ ba của chánh niệm, công năng làm vơi nhẹ. Cơn giận có đó nhưng đang được chăm sóc. Tình thế không còn hỗn loạn, em bé không còn bị để cho khóc la một mình. Bà mẹ đã có đó để săn sóc em và tình trạng đã trở nên ổn định.

! Thắp Sáng Chánh Niệm

Bà mẹ đó là ai? Bà mẹ đó là Bụt tự thân, Bụt trong ta. Khả năng chánh niệm, hiểu biết, thương yêu và chăm sóc là Bụt ở trong mỗi chúng ta. Mỗi khi ta chế tác chánh niệm là Bụt trong ta trở thành có thực. Đã có Bụt trong ta thì ta không có gì mà lo nữa. Nếu biết cách giữ cho Bụt tự thân luôn có mặt thì mọi sự đều sẽ êm đẹp.

Điều quan trọng là biết được rằng ta luôn có Bụt trong ta. Ngay cả khi ta giận, tuyệt vọng hay ác độc Bụt vẫn có trong ta. Nghĩa là ta có sẵn khả năng chánh niệm, hiểu biết và thương yêu.

Chúng ta cần thực tập hơi thở chánh niệm, bước chân chánh niệm để có thể tiếp xúc với Bụt trong ta. Khi bạn tiếp xúc với hạt giống chánh niệm trong ý thức bạn thì Bụt sẽ phát hiện lên trong vùng ý thức của bạn và ôm ấp sân hận của bạn. Bạn không phải lo, chỉ cần tiếp tục thực tập hơi thở, bước chân chánh niệm để làm hiển lộ Bụt trong tâm, rồi thì mọi việc sẽ đâu vào đấy. Bụt nhận diện, Bụt ôm ấp, thoa dịu, và Bụt nhìn sâu vào bản chất của cơn giận. Bụt hiểu biết. Và sự hiểu biết đó sẽ đem lại chuyển hóa.

Năng lượng của chánh niệm chứa cả năng lượng của Định và năng lượng của Tuệ. Định giúp ta chú tâm vào một sự việc mà thôi. Nhờ có định mà ta có thể quán chiếu sâu sắc hơn. Nhờ đó mà ta có thể chứng ngộ tuệ giác. Tuệ giác luôn luôn có khả năng giải thoát. Nếu chánh niệm có mặt, và nếu ta giữ cho chánh niệm có mặt lâu thì định cũng sẽ có mặt. Nếu ta giữ cho định bền vững thì tuệ giác sẽ phát sanh. Vậy thì chánh niệm nhận diện, ôm ấp và làm vơi nhẹ. Chánh niệm giúp ta nhìn sâu để có tuệ giác. Tuệ giác có công năng giải thoát, đem lại tự do và chuyển hóa. Đây là phép thực tập chăm sóc sân hận của đạo Bụt.

! Nhà Hầm Và Phòng Khách

Chúng ta hãy lấy cái nhà để ví dụ với tâm thức. Ta có thể phân biệt hai phần: nhà hầm (basement) là phần tàng thức và phòng khách là phần ý thức. Nội kết, như sân hận chẳng hạn, nằm ở dưới tàng thức – nhà hầm – dưới dạng những hạt giống. Hạt giống sân hận khi được tiếp xúc bằng nghe, thấy, suy tư sẽ hiện lên trên phần ý thức – phòng khách. Hạt giống sân hận phát hiện như một vùng năng lượng và làm cho không khí trong phòng khách trở nên nặng nề, khó chịu và chúng ta đau khổ.

Khi sân hận phát hiện, hành giả liền phải lập tức mời năng lượng của chánh niệm cùng lên, bằng cách thực tập hơi thở và bước chân chánh niệm, để tạo ra một vùng năng lượng thứ hai – năng lượng của chánh niệm. Cho nên thực tập hơi thở, bước chân trong chánh niệm, thực tập làm các công việc hằng ngày trong chánh niệm là vô cùng quan trọng. Để khi năng lượng tiêu cực phát hiện thì ta sẽ biết cách để chế tác năng lượng chánh niệm để ôm ấp, chăm sóc năng lượng tiêu cực ấy.

! Tâm Thức Cũng Cần Được Lưu Thông

Cơ thể ta chứa nhiều độc tố. Nếu máu huyết không lưu thông, độc tố sẽ tích tụ. Các độc tố ấy phải được thải ra ngoài, nếu không thì sinh bệnh. Thoa bóp là một trong những phương cách giúp cho máu huyết lưu thông. Khi máu huyết lưu thông thì gan, thận hay phổi sẽ được nuôi dưỡng và có khả năng đào thải độc tố. Vì vậy giữ cho máu huyết lưu thông là rất quan trọng. Khi một nơi trong cơ thể có độc tố ứ đọng thì sờ vào ta sẽ thấy đau. Trường hợp của nội kết cũng vậy. Khi tiếp xúc với nội kết đau buồn ta cảm thấy ‘đau nhức’ trong tâm. Niềm đau nỗi khổ, buồn phiền, tuyệt vọng là những khối độc tố trong tâm thức. Phải thực tập chánh niệm để có thể ôm ấp và chuyển hóa những khối độc tố đó.

Ôm ấp niềm đau nỗi khổ bằng năng lượng của chánh niệm chính là thoa bóp, không phải thoa bóp thân, mà là thoa bóp tâm. Tâm thức chúng ta có thể là đang trong một tình trạng thiếu lưu thông. Khi máu huyết vận hành không lưu thông thì thân ta bị bệnh, khi tâm thức vận hành không lưu thông thì tâm thần ta cũng bị bệnh. Chánh niệm là năng lượng khích thích và thúc đẩy lưu thông để giải tỏa những khối đau nhức trong tâm.

! Chiếm Đầy Phòng Khách

Những khối đau nhức, buồn khổ, sân hận, và tuyệt vọng luôn luôn tìm cách đi lên phần ý thức, phòng khách, bởi vì chúng đã lớn mạnh và mong được ta chú ý. Chúng muốn phát hiện nhưng ta thì không muốn đau khổ vì sự có mặt của chúng. Ta tìm cách chận đứng, ta muốn chúng cứ ở mãi dưới nhà hầm. Vì không muốn đối diện với nội kết cho nên ta có thói quen là mời những người khách khác vào chiếm đầy phòng khách. Khi rảnh năm, mười phút, không có việc làm thì nội kết lại nhảy lên phòng khách gây lộn xộn. Để tránh tình trạng đó, ta đọc sách, xem TiVi, đi dạo phố, làm bất cứ gì để chiếm lấp phòng khách. Bởi vì khi phòng khách chật kín thì nội kết khó chịu không chen lên được.

Tất cả mọi tâm hành đều cần được vận hành lưu thông nhưng ta không muốn chúng đi lên vùng ý thức vì ta không muốn đau khổ. Ta nhốt chúng lại. Ta sợ chúng vì nghĩ rằng nếu mời chúng lên thì sẽ khổ. Đó là lý do tại sao trong ‘phòng khách’ của ta đầy nhóc khách lạ (sách vở, báo chí, vô tuyến truyền hình, chuyện trò) để phong tỏa, ngăn chặn không cho nội kết xuất hiện. Nhưng nếu cứ tiếp tục như thế, tâm thức sẽ không vận hành lưu thông và các triệu chứng của các bệnh tâm thần, của bệnh trầm cảm (depression) sẽ xuất hiện trong tâm cũng như trong thân.

Đôi khi ta nhức đầu, uống aspirin không bớt. Chứng nhức đầu đó có thể là do tâm thần gây nên. Đôi khi ta bị dị ứng. Chứng dị ứng cũng có thể do tâm thần gây nên. Ta uống toa thuốc bác sĩ, và như thế chỉ tiếp tục đè nén nội kết mà thôi và tâm thần ta ngày càng thêm bệnh hoạn.

! Đón Tiếp Thân Mật Những Người Khách Bất Đắc Dĩ

Khi ta chấm dứt phong tỏa những khối nội kết của niềm đau và để chúng đi lên vùng ý thức thì ta phải chấp nhận ít nhiều đau khổ. Không có cách gì tránh khỏi. Vì vậy mà Bụt đã dạy rằng ta phải học cách ôm ấp những niềm đau đó. Đây là lý do tại sao mà thực tập chánh niệm rất quan trọng. Bạn chế tác một nguồn năng lượng tích cực để có thể nhận diện, ôm ấp, chăm sóc năng lượng tiêu cực của nội kết. Bởi vì Bụt có mặt trong ta dưới hình thức của năng lượng chánh niệm cho nên ta mời Bụt giúp ta ôm ấp nội kết.  Nếu những nội kết không phát hiện lên vùng ý thức thì ta cũng phải ép mà mời chúng lên. Sau một thời gian được ôm ấp chúng sẽ lại trở về nhà hầm dưới dạng những hạt giống.

Ví dụ, Bụt nói rằng tất cả chúng ta đều có hạt giống của lo sợ, nhưng phần đông chúng ta đè nén và dấu kín chúng. Để giúp chúng ta nhận diện, ôm ấp và nhìn sâu vào những hạt giống lo sợ, Bụt dạy phương pháp thực tập Năm Quán như sau:

* Tôi thế nào cũng phải già nua, tôi không thể nào tránh thoát được sự già nua.
* Tôi thế nào cũng phải bệnh, tôi không thể nào tránh thoát được cái bệnh.
* Tôi thế nào cũng phải chết, tôi không thể nào tránh thoát được cái chết.
* Tất cả những người tôi thương yêu và tất cả những gì tôi trân quý hôm nay, một mai này tôi đều phải xa lìa và buông bỏ; tôi không thể nào tránh thoát được giờ phút xa lìa và buông bỏ ấy.
* Tôi là kẻ thừa tự những nghiệp quả do thân, miệng và ý của tôi tạo nên, và những nghiệp quả ấy là cái duy nhất tôi có thể mang theo với tôi sau này.

Mỗi ngày chúng ta thực tập như thế. Phải dành thì giờ để quán chiếu từng điều trên trong khi theo dõi hơi thở. Thực tập Năm Quán như thế thì hạt giống lo sợ có cơ hội lưu chuyển. Chúng ta mời chúng lên, nhận diện và ôm ấp rồi sau đó chúng sẽ trở về lại tàng thức và sẽ nhỏ bớt, yếu bớt.

Mời hạt giống lo sợ lên để ôm ấp, nhận diện như vậy giúp ta chăm sóc sân hận dễ dàng hơn. Lo sợ đưa đến sân hận. Khi lo sợ ta sẽ bất an, bất an làm cho sân hận dễ phát sinh. Lo sợ là do vô minh và vô minh cũng chính là gốc rễ của sân hận.

Mỗi khi ta tắm gội nội kết bằng chánh niệm thì nội kết sẽ nhẹ đi và bớt nguy hiểm. Vậy thì hãy để cho sân hận, tuyệt vọng, lo sợ tắm gội trong chánh niệm mỗi ngày. Đó là cách thực tập của chúng ta. Các hạt giống của sân hận, tuyệt vọng, lo sợ sẽ gây phiền não, khổ đau nếu chánh niệm không cùng có mặt. Nhưng nếu biết chế tác năng lượng chánh niệm thì khi mời các nội kết lên vùng ý thức để ôm ấp thì đó là một thực tập có khả năng chữa trị lớn. Nếu mỗi ngày ta đem các nội kết lên vùng ý thức (phòng khách) để quán chiếu rồi đưa chúng xuống tàng thức (nhà hầm) trở lại là ta tạo ra một sự lưu thông trong tâm thức. Sau vài ngày hay vài tuần lễ thực tập như thế các triệu chứng thần kinh hỗn loạn sẽ suy giảm.

Chánh niệm làm công việc thoa bóp nội kết và các khối đau nhức trong tâm. Chúng ta phải giúp chúng vận chuyển lưu thông. Điều này có thể làm được khi ta không e sợ nội kết. Khi đó ta có thể ôm ấp và chuyển hóa nội kết bằng năng lượng chánh niệm.
! Tạo Hạnh Phúc Là Ưu Tiên

Thỉnh thoảng chúng ta phải quyết định và đôi khi sự quyết định rất ư khó khăn. Chúng ta bắt buộc phải chọn lựa. Một sự chọn lựa có thể là rất đau lòng. Nhưng nếu ta biết rõ cái gì là quan trọng nhất, cái gì mà ta khao khát nhất cho cuộc sống của ta thì sự chọn lựa trở nên dễ dàng hơn, ít gây đau khổ hơn.

Lấy ví dụ một người muốn xuất gia. Đây không phải là một quyết định dễ dàng. Nếu sự ước muốn chưa tới mức một trăm phần trăm thì không nên xuất gia. Phải ước muốn hơn một trăm phần trăm mới được. Khi bạn cho rằng đời sống xuất gia đối với bạn là quan trọng hơn bất cứ gì khác thì sự quyết định sẽ dễ dàng hơn.

Tôi có viết ba cuốn đầu của bộ sách Việt Nam Phật Giáo Sữ Luận được độc giả khá hâm mộ. Còn một cuốn thứ tư nữa cần phải viết cho xong. Đây là một cuốn sách quan trọng nói về lịch sử Phật Giáo Việt nam từ năm 1964 cho đến bây giờ. Đối với tôi đây là một dự án rất hào hứng, thích thú. Tôi đã sống trong khoảng thời gian này và đã có được nhiều kinh nghiệm trực tiếp. Nếu tôi không viết thì e rằng không có ai cùng một thời và cùng có kinh nghiệm trực tiếp để viết. Như thế thì lịch sử sẽ rất thiệt thòi. Viết cuốn sách ấy cũng sẽ giúp cho nhiều người hiểu hơn về sự phát triển và hành trì của Phật Giáo.

Trong tôi là một sử gia. Tôi rất vui thích khi làm công việc của một sử gia: khám phá, phơi bày những sự kiện mới mẻ để giúp cho các thế hệ trẻ tìm ra hướng đi nhờ học hỏi được từ những thành công cũng như thất bại của các thế hệ trước. Do đó mà ước muốn viết cuốn sách ấy của tôi rất là mạnh. Nhưng tôi chưa có thể viết được vì còn bao nhiêu chuyện cần kíp khác phải làm, chẳng hạn như giúp đỡ biết bao nhiêu người đang đau khổ gần quanh tôi. Tôi không đành tâm làm một nhà học giả, làm một sử gia mặc dầu tôi biết cuốn sách ấy rất là quan trọng. Tôi đã có đủ tài liệu để viết nhưng phải mất một năm mới viết xong. Nghĩa là trong năm đó tôi không thể điều khiển các khóa tu, không thể nói pháp thoại, không nhận thiền sinh đến tham vấn v..v..

Chúng ta có nhiều việc phải làm trong cuộc sống hằng ngày. Chúng ta phải quyết định việc gì là quan trọng nhất cho mình. Học cho xong bậc đại học để có một bằng cấp có thể mất sáu hay tám năm, một khoảng thời gian khá dài. Có thể là bạn tin rằng bằng cấp rất quan trọng cho hạnh phúc. Có thể là đúng như vậy. Nhưng còn có nhiều yếu tố khác quyết định bình an, hạnh phúc của bạn. Bạn cần để tâm cải thiện liên hệ giữa bạn và cha mẹ anh em, giữa bạn và người bạn đường. Bạn có thì giờ để làm chuyện đó hay không? Bạn có dành đủ thì giờ để làm chuyện đó hay không? Cải thiện liên hệ giữa bạn và những người thương của bạn là quan trọng vô cùng. Bạn sẵn sàng bỏ ra sáu năm để có được một bằng cấp. Liệu bạn có đủ khôn ngoan để dành ra từng đó thì giờ để giải quyết khó khăn trong liên hệ của bạn hay không? Để đối phó với sân hận của bạn hay không? Khoản thời gian đó sẽ đem lại hạnh phúc và vững chãi mà bạn cần để tái lập truyền thông.

! Viết Một Cuốn Sách Về Chính Mình

Gần đây có một giáo sư đại học từ Mỹ đến Làng Mai và ngỏ ý muốn viết một cuốn sách về Thomas Merton và tôi. Tôi đã trả lời ngay: “Tại sao anh không viết một cuốn sách về chính anh? Sao anh không đầu tư một trăm phần trăm để tu tập làm sao cho anh và những người chung quanh anh hạnh phúc? Điều này quan trọng hơn là viết về Thomas Merton và tôi. Đã có nhiều sách viết về Thomaas Merton rồi.” Ông bạn giáo sư, với tất cả thiện chí và lòng cảm mến, trả lời: “Nhưng mà chưa có ai viết về Thầy.” Tôi trả lời, “Tôi không quan tâm lắm về một cuốn sách viết về tôi, nhưng tôi rất quan tâm về việc anh viết một cuốn sách về chính anh. Anh hãy đem hết tâm huyết ra để viết cuốn sách ấy, để tự chuyển hóa thành một người mẫu mực của chánh pháp và hành trì, để trở thành một người có tự do và hạnh phúc. Như thế thì anh có thể giúp cho nhiều người chung quanh cùng được hạnh phúc.”

Điều quan trọng nhất đối với tôi là thiết lập liên hệ tốt đẹp giữa tôi và các đệ tử của tôi. Tôi phải tạo cơ hội cho các đệ tử của tôi tu tập và chuyển hóa. Được như thế thì thật là khích lệ và nuôi dưỡng cho tôi. Khi một thiền sinh có thể chuyển hóa khổ đau và thiết lập liên hệ tốt đẹp với những người chung quanh thì đó là một thắng lợi đáng kể. Một thắng lợi không phải chỉ riêng cho thiền sinh đó mà cho cả tăng thân, cho pháp môn, một thắng lợi có tác dụng nuôi dưỡng cho tất cả chúng ta. Chúng ta đã nghe chuyện một sư cô đã giúp cho hai mẹ con nọ làm hòa với nhau. Đây là một thắng lợi đích thực. Nó làm cho sư cô đó, và ngay cả cho chúng ta, thêm vững tin vào pháp môn tu tập.

Nếu bạn gặp khó khăn với một người nào đó và cứ nghĩ rằng người đó chỉ muốn làm cho bạn khổ, rằng không có cách nào khác hơn để giúp người đó thì đó là vì bạn chưa thực hành những gì đã được chỉ dạy. Nếu bạn cảm thấy không thể thiết lập đối thoại với người ấy thì đó là vì bạn còn thiếu kinh nghiệm trong khi tu tập. Bạn luôn luôn có thể đối thoại với người kia. Rất nhiều người đã đặt câu hỏi: “Nếu người kia không chịu hợp tác, không chịu nghe thì sao bây giờ?” Câu trả lời là chừng nào người kia không chịu nghe bạn nói hay không chịu nói chuyện với bạn, hay bàn thảo để giải quyết vấn đề với bạn thì bạn sẽ còn phải tiếp tục tu tập và chuyển hóa tự thân để một ngày nào đó có thể có sự hòa giải.

Viết một cuốn sách về chính mình là một cách nhìn sâu để nhận diện gốc rễ của khổ đau và tìm cách chuyển hóa. Nó sẽ giúp ta trở thành một người có tự do và được hạnh phúc, và có khả năng làm cho những người khác hạnh phúc.

! Giọt Từ Bi Cam Lộ

Trước khi đến với một người để tìm cách hòa giải bạn phải tự nuôi dưỡng bằng tâm niệm Từ Bi. Từ Bi là giọt nước cam lộ phát sinh từ hiểu biết – hiểu biết rằng người kia cũng đang đau khổ. Chúng ta thường hay quên điều đó. Ta chỉ thấy có mỗi một nỗi khổ của ta, rồi ta phóng đại thêm, “Không có ai đau khổ bằng tôi. Tôi là người duy nhất phải đau khổ như thế này.” Nhưng với sự nâng đỡ của tăng thân, ta sẽ có thể nhìn sâu và thấy rằng người kia cũng đang vô cùng đau khổ.

Có thể rằng người kia không được may mắn có tăng thân nâng đỡ, hay tu tập chưa tiến bộ, hay không được chính bạn giúp đỡ. Và chính bạn, bạn cũng không giúp bạn được gì mấy. Nhưng chính vì vậy mà cần có giáo pháp, cần có tăng thân để nuôi dưỡng ta bằng những giọt cam lộ của từ bi. Chúng ta phải đến với giáo pháp, phải đến với tăng thân để xin giúp đỡ. Giáo pháp có hiệu lực ngay bây giờ và ở đây.

! Vượt Thoát Tù Ngục Của Ý Niệm

Không nên thực tập một cách máy móc mà phải thực tập thông minh. Mổi bước đi, mỗi hơi thở là phải cảm thấy nhẹ nhàng. Mỗi bữa ăn, mỗi tách trà là phải đem lại thảnh thơi. Hãy tiếp xúc với những mầu nhiệm trong ta và chung quanh ta. Hãy để cho những gì tươi mát, lành mạnh thấm vào nuôi dưỡng thân tâm ta. Đó là điều quan trọng nhất.

Những điều ta suy tưởng không thể nuôi dưỡng ta. Thực ra, suy tưởng và ý niệm lắm lúc là chướng ngại. Chúng là ngục tù. Hãy từ bỏ suy tưởng và ý niệm để có thể tiếp xúc với sự sống mầu nhiệm. Hãy noi gương những bạn đồng tu nhiều kinh nghiệm có khả năng sống hạnh phúc và thương yêu. Có nhiều người có khả năng như thế. Họ không có vấn đề với ai trong tăng thân vì họ có thể chấp nhận tất cả mọi người. Họ luôn luôn hài lòng. Chúng ta phải un đúc khả năng sống hạnh phúc như họ. Cùng sống trong một môi trường, cùng chia sẻ những điều kiện để được hạnh phúc như nhau, trong khi những người khác có thể sống hạnh phúc, tại sao ta lại đau  khổ? Có gì đã ngăn trở không cho ta được hạnh phúc như họ?

! Một Bức Thư Tối Ư Quan Hệ

Nếu đã thực tập ái ngữ và nghe sâu giỏi thì bạn có thể giải quyết xung đột bằng cách gặp mặt trực tiếp nói chuyện. Nhưng nếu bạn không chắc có đủ bình an, vững chãi và từ bi để có thể nói chuyện một cách bình tĩnh, tươi mát, dễ thương thì bạn có thể viết thư. Viết thư là một thực tập rất quan trọng. Bởi vì mặc dầu có đầy thiện chí, nhưng nếu thực tập chưa vững bạn có thể còn có bực bội và thiếu khôn khéo khi nói năng, phản ứng và đánh mất cơ hội tốt để hòa giải. Cho nên đôi khi viết thư thì an toàn hơn.

Trong bức thư bạn có thể viết rất thành thực. Bạn có thể nói cho người kia biết những gì người ấy đã làm cho bạn khổ. Hãy nói ra hết những cảm xúc sâu xa của bạn. Trong khi viết, bạn thực tập giữ tâm bình tĩnh, sử dụng lời nói hòa nhã, yêu thương. Hãy cố gắng thiết lập đối thoại. Chẳng hạn bạn có thể viết như sau: “Bạn thân mến, tôi có thể có tri giác sai lầm. Những điều tôi viết ở đây có thể là không trung thực. Tuy nhiên đây là những kinh nghiệm trực tiếp của tôi trong vụ này. Đây là những cảm nhận từ đáy tim tôi. Nếu tôi viết ra có gì sai lầm thì xin hãy ngồi xuống cùng tôi để chúng ta có thể làm sáng tỏ những hiểu lầm.”

Trong truyền thống của chúng tôi tại Làng Mai, đây là ngôn ngữ mà một Thầy hay một Sư Cô sẽ sử dụng khi một thiền sinh đến xin tham vấn. Các Thầy, Cô sử dụng tuệ giác của tăng thân. Điều này không có nghĩa là tuệ giác của tăng thân là toàn hảo, nhưng đó là tuệ giác hay nhất có thể có được. Cho nên các Thầy, các Sư Cô khi trả lời thắc mắc đã xác nhận: “Trong khi tôi nói ra những lời khuyên này, có thể là có nhiều điều mà tôi không được biết. Có thể là có nhiều điều tốt nơi bạn mà tôi chưa thấy. Có thể là tăng thân có nhận xét sai lầm.” Vậy thì khi viết thư bạn cũng nên nói như vậy, “Nếu tôi có tri giác sai lầm thì xin giúp tôi sửa đổi.” Hãy sử dụng ái ngữ khi viết thư. Nếu viết một câu mà chưa được dịu dàng vừa ý thì luôn luôn có thể viết lại câu khác cho dịu dàng hơn.

Trong thư ta phải chứng tỏ là ta có khả năng thấy rõ đau khổ của người kia: “Bạn thân mến, tôi biết rằng bạn đang đau khổ. Và tôi biết rằng bạn không hoàn toàn trách nhiệm về đau khổ của bạn.” Vì đã có tu tập cho nên bạn có thể nhìn thấy những gốc rễ, nguyên nhân gây đau khổ nơi người kia. Bạn có thể nói cho người kia biết những điều đó. Bạn cũng có thể cho người kia biết những đau khổ của bạn, cho người kia biết là bạn đã hiểu vì sao mà người ấy đã nói năng, hành động như vậy.

Hãy để dành ra một, hai, hay ba tuần lễ để viết bức thư ấy, bởi vì đây là một bức thư rất quan trọng, quan trọng hơn cả cuốn thứ tư của bộ sách Việt Nam Phật Giáo Sữ Luận, quan trọng hơn cả cuốn sách về Thích Nhất Hạnh và Thomas Merton. Bức thư đó rất mực quan trọng cho hạnh phúc của bạn. Thời gian để viết bức thư đó quan trọng hơn cả một hay hai năm viết luận án tiến sĩ. Luận án tiến sĩ của bạn đâu có quan trọng bằng bức thư này. Viết một bức thư như thế là điều hay nhất mà bạn có thể làm được để vượt bờ ngăn cách và tái lập truyền thông.

Bạn không cô đơn khi viết bức thư này. Bạn có các sư anh, sư chị soi sáng và giúp bạn. Những người mà bạn cần sự giúp đỡ luôn luôn có đó, ở trong tăng thân. Khi bạn viết một cuốn sách, bạn thường đưa bản thảo cho bạn bè, hay các chuyên gia để hỏi ý kiến. Những người bạn đồng tu cũng là những chuyên gia vì họ đã thực tập nghe sâu, nhìn sâu và ái ngữ.

Bạn phải là vị bác sĩ, là nhà tâm lý trị liệu tài ba nhất của người thương của bạn. Cho nên hãy đưa bức thư của bạn cho một sư anh, hay sư chị để hỏi xem lời lẽ trong thư đã đủ dịu dàng, bình tĩnh chưa, tuệ giác đã sâu sắc chưa. Bạn có thể đưa bức thư ấy cho một sư anh khác, một sư chị khác đọc, cho đến khi bạn tin rằng bức thư của bạn có khả năng chuyển hóa và chữa trị người kia.

Kể gì thời gian và sức lực mà bạn đã để dành ra để viết bức thư? Và ai lại nỡ từ chối giúp bạn trong khi bạn viết bức thư ấy? Phục hồi truyền thông với người thương là quan trọng biết chừng nào! Người thương của bạn có thể là  cha, là mẹ của bạn, là con trai, con gái của bạn. Người ấy có thể đang ngồi ngay bên cạnh bạn.

 ! Phục Hồi Tịnh Độ

Thuở ban đầu người ấy đã thề nguyền là sẽ thương yêu bạn, chăm sóc bạn. Nhưng bây giờ thì người ấy xa cách bạn, người ấy không còn muốn chuyện trò với bạn, không còn nắm tay bạn đi thiền hành, và bạn đau khổ. Thuở ban đầu bạn cảm thấy như đang ở thiên đàng. Người ấy thương yêu bạn, và bạn vô cùng hạnh phúc. Nhưng bây giờ người ấy bỏ bạn mà đi. Có lẽ  người ấy đang đi tìm một ai khác, một thương yêu mới. Thiên đàng của bạn đã biến thành địa ngục, không lối thoát. Địa ngục từ đâu tới? Ai đã xô đẩy bạn vào  địa ngục, ai giam cầm bạn vào địa ngục? Có thể địa ngục đó là do tâm thức bạn tạo ra, do những ý niệm, những tri giác sai lầm của bạn. Vậy thì chỉ có tâm thức bạn mới có thể phá vỡ địa ngục để bạn có thể tự giải thoát.

Thực tập chánh niệm, thực tập nhận diện và ôm ấp sân hận là mở cửa địa ngục, là hóa giải địa ngục để cứu thoát bạn và người kia để cùng nhau trở về vùng đất an lành. Đây là một điều có thể làm được và chính bạn là người phải làm chuyện đó. Lẽ tất nhiên các bạn đồng tu sẽ nâng đỡ bạn bằng tuệ giác, từ bi và năng lượng chánh niệm của họ.

Nếu bạn phục hồi được truyền thông và đem lại hạnh phúc cho người kia thì bạn đã đóng góp lớn lao. Mọi người sẽ vui mừng cho sự thành công đó bởi vì nhờ đó mà ai cũng thêm tin tưởng vào pháp môn tu tập. Nhờ nâng đỡ của tăng thân mà bạn có thể hóa giải địa ngục và phục hồi Tịnh Độ, phục hồi bình an trong cuộc sống hằng ngày. Bạn có thể bắt đầu ngay bây giờ. Bạn có thể bắt đầu viết bức thư ấy ngày hôm nay. Bạn sẽ thấy rằng chỉ cần một tờ giấy và một cây bút là bạn có thể thực tập và chuyển hóa liên hệ của bạn với người thương.

! Viết Bức Thư Của Bạn Suốt Cả Ngày

Suốt ngày, đi, đứng, thiền tọa, làm việc, giặt áo, nấu cơm bạn đừng có suy nghĩ gì về bức thư. Nhưng tất cả mọi hoạt động của bạn đều có liên hệ tới bức thư.

Lúc ngồi xuống bàn viết là để ghi lên giấy những cảm nghĩ chứ không phải là lúc sáng tác ra bức thư. Bạn đã sáng tác bức thư trong khi tưới cây, thiền hành hay nấu ăn cho đại chúng. Tất cả những thực tập đó giúp bạn trở nên vững chãi hơn, bình an hơn. Chánh niệm và thiền định nuôi dưỡng những hạt giống hiểu biết và thương yêu trong bạn cho thêm lớn mạnh. Một bức thư được viết bằng chánh niệm mà bạn chế tác suốt ngày chắc chắn sẽ là một bức thư tuyệt hảo.

! Hãy Sống Đẹp Từng Giây Phút

Cách đây khoảng mười lăm năm, một nữ học giả Phật Học đến thăm tôi và nói: “Thưa Thầy, Thầy đã sáng tác nhiều bài thơ rất hay. Nhưng Thầy đã để ra nhiều thì giờ để trồng rau, trồng cải. Tại sao Thầy không dành tất cả thì giờ của Thầy để sáng tác thêm nhiều bài thơ nữa?” Nữ học giả này có lẽ đã đọc đâu đó rằng tôi thích làm vườn, trồng rau, trồng cải. Bà ta, với ý nghĩ thực tế, có ý muốn khuyên tôi không nên phí thì giờ làm vườn mà chỉ nên dành thì giờ làm thơ.

Tôi trả lời.  “Này bạn, nếu tôi không trồng rau, trồng cải, tôi sẽ không làm được thơ.” Đó là sự thật. Nếu không sống trong chánh niệm, nếu không sống sâu sắc từng giây phút của cuộc sống hằng ngày thì không thể viết được gì, không sáng tác được gì có giá trị để cống hiến.

Một bài thơ là một bông hoa bạn hiến tặng cho người khác. Một cái nhìn từ bi, một nụ cười, một cử chỉ đầy thương yêu, tất cả là những bông hoa mọc ra trên cành cây chánh niệm và thiền định. Mặc dầu ta không hề nghĩ tới bài thơ trong khi nấu một bữa ăn cho gia đình, bài thơ vẫn đang được sáng tác. Khi tôi viết một câu truyện ngắn, một cuốn tiểu thuyết hay một bản kịch, tôi cần nhiều tuần lễ mới hoàn tất. Nhưng câu chuyện hay cuốn tiểu thuyết luôn luôn có mặt ở đó. Cũng vậy, mặc dầu bạn không nghĩ tới bức thư mà bạn muốn viết cho người thương, bức thư vẫn đang được viết ra, từ trong sâu thẳm của tâm thức.

Bạn không thể ngồi xuống bàn và chỉ làm có một việc là viết lên câu chuyện hay cuốn tiểu thuyết. Bạn phải làm công kia việc nọ. Bạn uống trà, nấu ăn, giặt áo, tưới rau. Thời gian mà bạn uống trà, nấu ăn, giặt áo, tưới rau vô cùng quan trọng. Bạn phải làm những việc đó cho đàng hoàng, cho hết lòng. Bạn phải đầu tư một trăm phần trăm vào việc uống trà, nấu ăn, giặt áo, tưới rau. Bạn làm những việc đó trong niềm vui, để hết tâm ý vào công việc. Điều này rất quan trọng cho câu chuyện, cho bức thư mà bạn muốn viết cho người thương hay cho bất cứ gì mà bạn muốn sáng tác.

Giác ngộ không thể tách rời chuyện rửa bát, trồng rau. Vậy thì pháp môn tu tập của chúng ta là sống từng giây phút của cuộc sống hằng ngày trong chánh niệm và thiền định. Một tác phẩm nghệ thuật được thai nghén và hình thành chính trong những lúc như thế của cuộc sống hằng ngày. Lúc bạn bắt đầu viết xuống một bài thơ hay là một bản nhạc chỉ là để bài thơ hay bản nhạc được sinh ra, để cho em bé ra chào đời. Em bé đó phải có sẵn đó trong bạn thì bạn mới có thể đưa em ra chào đời. Nếu em bé không có ở trong bạn thì dầu cho bạn có ngồi đó hằng giờ bạn cũng sẽ không có gì để cống hiến, bạn không thể sáng tác được gì. Tuệ giác, từ bi, khả năng viết nên những gì có thể gây cảm hứng cho người khác là những đóa hoa nở ra trên cành cây thực tập. Hãy sử dụng khéo léo mỗi giây phút của cuộc sống hằng ngày để cho tuệ giác đó, từ bi đó bừng nở.

! Hiến Tặng Chuyển Hóa

Một bà mẹ đang mang thai chắc sẽ rất sung sướng mỗi khi nghĩ tới thai nhi trong bụng. Thai nhi mặc dầu chưa được sinh ra nhưng cho mẹ rất nhiều niềm vui. Bất cứ giờ phút nào trong ngày mẹ cũng nhớ đến sự có mặt của thai nhi trong mình, cho nên nhất cử nhất động lòng mẹ tràn ngập yêu thương. Trong khi ăn cũng như trong khi uống lòng mẹ tràn ngập yêu thương bởi vì mẹ biết rằng không có tình thương của mẹ thì thai nhi không thể khỏe mạnh được. Mẹ luôn luôn cẩn thận, biết rằng một cử chỉ sai lầm, biết rằng hút thuốc, uống rượu thì sẽ gây hại cho em bé thai nhi. Vì vậy một bà mẹ đang mang thai luôn luôn sống rất mực chánh niệm, luôn luôn sống trong tâm niệm yêu thương.

Hành giả thiền tập phải hành xử như một bà mẹ. Ta biết rằng ta muốn sáng tạo, muốn cống hiến cho nhân loại, cho đời một cái gì. Mỗi chúng ta mang trong người một em bé thai nhi – em bé Bụt, và ta có thể hiến tặng cho đời em bé Bụt trong ta. Vì vậy ta phải sống trong chánh niệm để chăm sóc em bé Bụt trong ta.

Chính nhờ năng lượng của Bụt trong ta mà ta có thể viết được bức thư tình đích thực và hòa giải được với người khác. Một bức thư tình đích thực phải được viết bằng tuệ giác, hiểu biết và từ bi. Nếu không thì đó không phải là một bức thư tình. Một bức thư tình có thể chuyển hóa người khác và từ đó chuyển hóa cả thế giới. Nhưng trước khi bức thư ấy có thể chuyển hóa người khác thì nó phải chuyển hóa chính tự thân. Thời gian cần để viết bức thư ấy có thể là cả một đời người.
! Giây Phút Tri Ân, Giây Phút Giác Ngộ

Có những lúc, trong cuộc sống, chúng ta cảm thấy rất biết ơn một người nào đó. Chúng ta trân quý sự có mặt của người đó. Lòng ta tràn đầy yêu kính và biết ơn. Trên đường đời có nhiều lúc ta đã trải qua những phút giây như vậy. Ta cảm ơn hết lòng vì người ấy đang còn sống, người ấy còn đó với ta, người ấy đã giúp ta trong những lúc khó khăn. Tôi đề nghị là bạn nên lợi dụng những lúc như thế.

Để thực sự được lợi lạc, bạn hãy tìm tới một nơi vắng vẻ chỉ có một mình. Đừng có vội đi đến người kia và nói, “Tôi rất biết ơn anh/chị, nhờ có anh/chị…” Nói như thế không đủ. Chuyện đó có thể làm sau. Giờ đây thì tốt hơn hết là bạn vào phòng hay một nơi vắng vẻ và để cho tâm tư tràn ngập cảm xúc của lòng biết ơn đó. Rồi bạn hãy viết xuống những cảm xúc, lòng biết ơn và hạnh phúc của bạn. Hãy trải lòng ra  trên nửa trang hay một trang giấy, hay ghi âm cảm nhận của bạn vào máy.

Giây phút tri ân đó là giây phút của giác ngộ, của chánh niệm, của thông minh. Nó được phát hiện từ chiều sâu tâm thức. Bạn có sự hiểu biết và tuệ giác. Chúng sẵn có trong bạn. Nhưng khi giận thì hình như niềm tri ân đó không có mặt. Bạn có cảm tưởng là hình như nó không bao giờ có mặt. Vì thế cho nên bạn phải ghi xuống và cất giữ kỹ lưỡng, để thỉnh thoảng đem ra đọc lại.

Bất nhã Tâm Kinh, bản kinh mà Phật tử đọc tụng hằng ngày, là tinh yếu giáo pháp Bụt dạy về tuệ giác. Những gì bạn viết xuống cũng là một bản tâm kinh, bởi vì nó phát xuất từ tim của bạn, không phải từ tim của một vị Bồ Tát hay từ tim Bụt mà phát xuất từ tim của  bạn. Nó là Tâm Kinh Của Bạn.

! Hãy Trì Tụng Tâm Kinh Của Bạn Mỗi Ngày

Chúng ta có thể học được từ câu chuyện của người thiếu phụ cất giữ thư tình vào hộp bích-qui trên đây. Khi bạn đọc những bức tâm thư tương tự thì bạn sẽ được cứu rỗi. Kẻ cứu bạn không phải đến từ bên ngoài mà từ bên trong. Bạn có khả năng thương yêu, có khả năng trân quý, có khả năng tri ân. Đây là một phước báu. Bạn biết là bạn may mắn gặp được người bạn đường, may mắn có được một người thương trong cuộc đời. Tai sao bạn lại quên đi sự thật đó? Nó ở trong tâm bạn. Vì vậy bạn phải tụng bản Tâm Kinh của bạn mỗi ngày. Mỗi khi tiếp xúc với thương yêu và quý kính trong bạn thì bạn lại sẽ cảm thấy biết ơn, sẽ lại trân quý sự có mặt của người đó.

Trong cô đơn bạn mới trân quý trọn vẹn sự có mặt của người kia. Nếu luôn luôn có người kia bên cạnh thì bạn có thể xem sự có mặt của người ấy như là một bảo đảm sẵn có và bạn có thể quên đi không thưởng thức những gì đẹp, những gì hay của người đó. Thỉnh thoảng bạn thử đi vắng ba, bảy ngày. Xa vắng sẽ cho bạn cơ hội trân quý người ấy hơn. Mặc dầu bạn đang ở xa nhưng người ấy đang thật có với bạn hơn là khi bạn gần người ấy. Khi xa cách bạn mới biết rằng người kia là quan trọng, là quý hóa cho bạn biết là chừng nào.

Vậy thì xin bạn hãy viết ra hay sáng tác một (có thể là nhiều hơn) bản Tâm Kinh của chính bạn và cất giữ vào nơi linh thiêng. Và cố gắng tụng bản Tâm Kinh của bạn nhiều lần. Rồi khi cơn giận tràn ngập và bạn không có đủ khôn khéo để ôm ấp sân hận thì bản Tâm Kinh sẽ giúp bạn. Bạn lấy Tâm Kinh ra, thực tập hơi thở vào, ra thật sâu và đọc lại. Tức thì bạn sẽ trở về với tự thân và bạn sẽ bớt khổ. Khi bạn đọc Tâm Kinh của bạn thì bạn biết ngay là phải làm gì, phải đối xử như thế nào. Chuyện khó là bạn phải quyết tâm làm chuyện đó. Bạn phải tạo điều kiện, sửa soạn, sắp đặt để thật sự được lợi lạc nhờ thông minh của bạn. Hãy sử dụng tài ba để sắp đặt và chế tác những thực tập như thế.

! Vượt Bờ Sân Hận

Bạn vẫn còn đứng bên bờ này của khổ đau, sân hận. Thì tại sao bạn lại không vượt qua bờ bên kia, bờ của tâm không sân hận, của bình an và giải thoát? Ở đó an vui hơn. Tại sao bạn lại có thể chịu đau khổ cả giờ, cả đêm hay cả ngày?  Có con thuyền có thể đưa bạn vượt qua bờ bên kia nhanh chóng. Đó là con thuyền của thực tập trở về với tự thân, nhờ vào hơi thở chánh niệm mà có thể nhìn sâu vào niềm đau nỗi khổ, vào sân hận, vào tuyệt vọng để có thể mỉm cười. Nhờ đó mà bạn có thể lướt qua nỗi niềm khổ đau và vượt qua bờ bên kia.

Xin đừng đứng mãi ở bờ bên này để là nạn nhân của sân hận. Tâm không sân hận có trong bạn. Không sân hận là chuyện làm được. Chỉ cần qua sông và đến bờ bên kia, bến bờ của tâm không sân hận. Nơi đó là nơi mát mẻ, tươi vui, nơi êm dịu. Đừng để cho sân hận hành hạ. Hãy cởi trói cho mình, hãy tự giải phóng. Hãy vượt sang với sự giúp đỡ của Thầy, của tăng thân và của thực tập. Hãy tin tưởng vào con thuyền ấy để sang sông, để đến bờ bên kia.

Ngay bây giờ có thể là bạn đang còn đứng ở bên bờ của vô minh, của hận thù và nghi kỵ. Xin đừng đứng đó mãi, xin vượt qua bờ bên kia. Cùng với tăng thân, cùng với sư anh, sư chị, nhờ thực tập bước đi chánh niệm, hơi thở chánh niệm, nhờ thực tập nhìn sâu, nhờ đọc tụng Tâm Kinh của bạn, chẳng bao lâu bạn sẽ vượt qua bờ bên kia. Có thể là chỉ trong vài phút. Bạn có quyền được hạnh phúc, bạn có quyền có tâm từ bi, có tâm thương yêu. Hạt giống giác ngộ có sẵn trong bạn. Nhờ thực tập bạn có thể biến đổi hạt giống ấy thành một đóa hoa rất mau. Bạn có thể chấm dứt đau khổ, bởi vì Chánh Pháp đem đến kết quả ngay tức thì. Mau hơn cả viên thuốc aspirin.

! Hãy Trao Tặng Một Món Quà Khi Giận

Có thể có nhiều khi chúng ta đã giận một ai đó và đã làm đủ mọi cách để chuyển hóa cơn giận nhưng không thành công. Trong trường hợp đó Bụt khuyên là nên tặng người ấy một món quà. Coi có vẻ trẻ con, nhưng rất hiệu quả. Mỗi khi giận ai ta thường muốn làm cho người kia khổ. Tặng quà là mong cho người ấy hạnh phúc thay vì đau khổ. Vậy thì khi giận ai bạn hãy gửi tặng người ấy một món quà. Sau khi gửi quà đi bạn sẽ hết giận. Thật là giản dị nhưng luôn luôn có kết quả.

Đừng chờ cho đến khi giận rồi mới đi mua quà. Hãy đi mua quà khi đang cảm thấy tràn đầy thương yêu, và biết ơn. Nhưng đừng gửi quà đi vội. Hãy cất giữ lại đấy. Bạn có thể có nhiều quà như thế cất sẵn trong tủ. Sau này, khi giận thì sẽ gửi quà đi. Hiệu quả vô cùng. Bụt quả là rất thông minh!
! Thực Tập Hạnh Phúc

Theo tôi, hạnh phúc có nghĩa là ít đau khổ. Nếu không chuyển hóa được đau khổ thì không thể nào có hạnh phúc.

Rất nhiều người đã đi tìm hạnh phúc từ bên ngoài, nhưng hạnh phúc thật sự chỉ có thể có được tự bên trong. Theo lối sống bây giờ, người ta cho rằng hạnh phúc là có thật nhiều tiền bạc, nhiều quyền lực và có địa vị cao sang trong xã hội. Nhưng nếu nhìn cho kỹ thì sẽ thấy có rất nhiều người giàu sang hay nổi tiếng mà vẫn đau khổ, mà vẫn tự tử.

Vào thời Bụt, Bụt và Tăng đoàn của Ngài, mỗi vị chẳng có gì ngoài ba chiếc áo và một bình bát thế mà quý Ngài rất mực hạnh phúc bởi vì quý Ngài đã đạt được một điều vô cùng quý báu, đó là tự do.

Theo lời Bụt dạy, điều kiện căn bản của hạnh phúc là tự do. Tự do đây không phải là tự do trong lãnh vực chánh trị mà là tự do khi không còn bị sân hận, kiêu căng, ghen ghét, tuyệt vọng, và si mê ràng buộc. Những tâm hành sân hận, kiêu căng, ghen ghét, tuyệt vọng, và si mê đó Bụt gọi là những chất độc. Khi tâm còn bị những chất độc đó chế ngự thì không thể nào có được hạnh phúc.

Muốn thoát ra khỏi sân hận thì cần phải tu tập, dầu cho bạn là tín đồ Cơ Đốc giáo, Hồi giáo, Phật giáo, Ấn độ giáo hay Do thái giáo. Chúng ta không thể cầu xin Bụt, Jesus, Thượng đế hay Mohammed lấy sân hận ra khỏi tâm thay cho ta được. Có những phương pháp cụ thể giúp diệt trừ tham, giận, si, mê. Nếu thực tập những phương pháp đó và chuyển hóa đau khổ của tự thân thì chúng ta sẽ có thể giúp những người khác chuyển hóa đau khổ của chính họ.

! Chuyển Đổi Tình Trạng

Giả sử trong một gia đình mà hai cha con giận nhau. Giữa cha và con không còn có sự truyền thông. Cả hai cha con đều khổ và cùng mong thoát ra khỏi tình trạng bế tắc do giận hờn gây nên nhưng không biết phải làm thế nào.

Một pháp môn tốt là một pháp môn có thể đem áp dụng vào đời sống hằng ngày và giúp chuyển hóa khổ đau. Khi buồn giận ta đau khổ như bị thiêu đốt trong địa ngục. Những lúc đó ta phải tìm tới những người bạn có tu tập để xin giúp đỡ, để học hỏi cách thức đối trị buồn giận, ganh tị, tuyệt vọng trong ta, hầu mong có thể chuyển đổi tình trạng.

! Lắng Nghe Với Tâm Từ Bi Làm Vơi Bớt Khổ Đau

Một người mà lời nói đầy sân hận, căm hờn là vì người ấy đang vô cùng đau khổ. Vì đau khổ mà người ấy nói ra những lời chua chát, cay đắng, trách móc khiến cho ta khó chịu và tìm cách xa lánh. Muốn thấu hiểu và chuyển hóa cơn giận thì phải học phép thực tập hạnh lắng nghe với tâm từ bi và sử dụng ái ngữ. Có một vị Bồ Tát có khả năng lắng nghe với tâm từ bi rộng lớn, đó là Bồ Tát Quán Thế Âm. Chúng ta phải thực tập hạnh lắng nghe sâu như Ngài thì mới có thể hướng dẫn một cách cụ thể khi một người đầy sân hận tìm đến xin giúp đỡ để  tái lập truyền thông.

Lắng nghe với tâm từ bi có thể làm người khác bớt khổ. Tuy nhiên, mặc dầu có nhiều thiện chí ta cũng khó lắng nghe một cách sâu sắc nếu ta không thực tập lắng nghe với tâm từ bi. Nếu ta có thể ngồi yên và lắng nghe người ấy với tâm từ bi chỉ trong một giờ thì ta có thể làm vơi bớt khổ đau của người ấy rất nhiều. Ta lắng nghe với một mục đích duy nhất là để cho người kia có cơ hội giãi bày tâm tư và nguôi bớt khổ đau.

Phải lắng nghe thật chăm chú. Phải lắng nghe với tai, với mắt, với cả thể xác lẫn tâm hồn. Nếu ta chỉ giả vờ lắng nghe, nếu ta không lắng nghe hết mình thì người kia sẽ nhận ra ngay và khó mà vơi bớt khổ đau. Phải luôn luôn giữ tâm từ bi trong khi lắng nghe. Muốn vậy trong khi lắng nghe ta phải theo dõi hơi thở chánh niệm và duy trì ý hướng muốn giúp người kia.

Lắng nghe với tâm từ bi là một phép thực tập rất sâu sắc. Ta lắng nghe mà không phán xét, không trách móc. Ta lắng nghe chỉ vì ta muốn giúp người kia vơi bớt khổ đau. Người kia có thể là cha, là mẹ, là con trai, con gái, là vợ hay chồng của ta. Thực tập lắng nghe sâu sắc chắc chắn có thể giúp người khác chuyển hóa sân hận và khổ đau của họ.

! Một Quả Bom Sắp Nổ

Tôi có biết một thiếu phụ ở tại Bắc Mỹ. Thiếu phụ này có đạo Cơ Đốc. Bà ta đã rất đau khổ vì hai vợ chồng sống với nhau không được hòa thuận. Cả hai đều có học thức và đều đậu bằng tiến sĩ (Ph.D.). Nhưng người chồng luôn luôn gây gổ với vợ con. Ông không bao giờ có thể nói chuyện với vợ con. Trong gia đình, ai cũng tránh né ông vì khi nào ông ta cũng như một quả bom sắp nổ. Tâm sân hận của ông rất lớn. Ông nghĩ rằng vợ và các con của ông khinh khi ông, bởi vì không ai muốn đến gần ông. Thực ra thì vợ ông và các con ông đâu có khinh ông. Họ chỉ sợ ông thôi. Họ sợ đến gần ông rồi ông nổi tam bành lên thì nguy.

Rồi một ngày kia người vợ không chịu đựng được nữa và có ý muốn tự tử. Nhưng trước khi thực hành ý định bà ta gọi điện thoại cho một bà bạn để thổ lộ tâm tình. Bạn của bà ta, một Phật tử có tu tập, trước đây đã từng mời bà tham dự thiền tập, những mong bà ta bớt khổ đau phần nào nhưng bà ta luôn luôn từ chối, viện lý một tín đồ đạo Chúa như bà không thể tu theo đạo Bụt.

Chiều hôm đó khi bà bạn Phật tử biết được ý định muốn tự tử của bạn mình liền nói với bà ta qua điện thoại: ” Chị nói chị là bạn của tôi mà nay chị muốn chết. Vậy thì trước khi chị thực hành ý định tôi chỉ xin chị một điều là tôi mời chị nghe một bài pháp thoại của Thầy tôi mà chị đã từng từ chối. Bây giờ, nếu quả chị là bạn của tôi, xin chị hãy lấy taxi đến đây và nghe cái băng pháp thoại này rồi sau đó chị muốn gì thì tùy chị.”

Khi người bạn đến, bà bạn Phật tử để cho bà ta ngồi một mình trong phòng khách để nghe bài pháp thoại về Nghệ Thuật Tái Lập Truyền Thông. Suốt thời gian trên một giờ đồng hồ nghe pháp thoại bà ta đã chuyển hóa sâu sắc. Bà đã khám phá ra được nhiều điều. Bà ta đã ý thức rằng chính bà đã có trách nhiệm một phần nào về đau khổ của bà và bà đã làm cho chồng đau khổ rất nhiều. Bà ý thức rằng bà đã không giúp ích gì cho ông. Vì tránh né ông mà bà đã làm ông ngày càng thêm khổ. Qua bài pháp thoại bà đã hiểu rằng muốn giúp chồng thì bà phải biết lắng nghe với tâm từ bi. Điều này trong năm năm qua bà đã không làm được.

! Gỡ Bom
Sau khi nghe bài pháp thoại bà ta rất nao nức. Bà ta muốn về nhà ngay để giúp chồng. Nhưng bà bạn Phật tử nói rằng: “Không được đâu chị. Chị không nên làm chuyện đó ngay ngày hôm nay vì pháp môn lắng nghe là một pháp môn rất sâu. Chị phải thực tập ít nhất là một hay hai tuần lễ để có thể lắng nghe sâu sắc,” và bà ta đã mời bà bạn của mình tham dự một khóa tu.

Trong khóa tu có khoảng hơn bốn trăm người tham dự, cùng ăn, cùng ở, cùng thực tập trong sáu ngày. Trong sáu ngày đó, tất cả mọi người cùng thực tập hơi thở chánh niệm để đem thân tâm về một. Tất cả mọi người thực tập đi, đứng, nằm, ngồi trong chánh niệm, để hết tâm ý vào mỗi bước chân, mỗi cử chỉ đồng thời quán chiếu và ôm ấp tâm tư cũng như khổ đau của chính mình.

Họ không những chỉ nghe pháp thoại mà còn thực tập lắng nghe nhau để tìm hiểu niềm đau, nỗi khổ của người kia và họ chỉ nói với nhau những lời nói dịu dàng dễ thương (ái ngữ). Bà bạn theo Cơ Đốc Giáo đã thực tập hết lòng bởi vì đối với bà đây là một vấn đề sống chết.

Sau khóa tu, khi về nhà, bà rất bình tĩnh, lòng bà tràn ngập thương yêu. Bà quyết tâm muốn giúp chồng gỡ trái bom ra khỏi tim. Bà đi đứng chậm rãi, theo dõi hơi thở để được thêm bình tĩnh và nuôi dưỡng tâm từ bi. Chồng bà đã cảm nhận sự khác lạ nơi bà khi thấy bà đi đứng chánh niệm như vậy. Rồi tối hôm ấy bà đến gần và ngồi yên bên chồng. Đây là một điều mà bà không bao giờ làm được trong năm năm qua.

Bà ngồi yên như vậy khá lâu, có lẽ gần mười phút. Xong rồi bà nhẹ đặt bàn tay lên tay chồng và nói “Anh ơi, em biết trong năm năm qua anh đã đau khổ rất nhiều, em nay rất thông cảm. Em biết em đã là một phần lớn nguyên nhân làm anh khổ. Em đã không an ủi anh mà còn làm cho anh khổ thêm. Em đã làm rất nhiều lầm lỗi. Em rất ân hận. Em xin anh cho em một cơ hội để làm mới lại. Em muốn anh được hạnh phúc, nhưng em đã không biết phải làm thế nào và em đã làm cho tình trạng càng ngày càng đen tối. Em không muốn tình trạng này kéo dài mãi. Xin anh giúp em đi. Em cần anh giúp em để em có thể hiểu anh hơn và thương anh hơn. Anh nói cho em nghe những tâm tư sâu kín trong tim anh. Em biết anh đã rất đau khổ. Xin anh cho em biết những niềm đau nỗi khổ của anh để em không còn tạo thêm khổ đau cho anh như trong quá khứ. Không có anh giúp em thì em không làm gì được. Em chỉ muốn thương yêu anh mà thôi.” Khi bà nói như vậy thì chồng bà đã khóc. Ông ta khóc như một đứa bé.

Đã từ lâu vợ ông luôn luôn chua chát với ông. Bà chỉ có to tiếng, lời nói luôn đầy giận dữ, cay đắng, trách móc, phê phán. Cả hai vợ chồng chỉ biết gây gổ với nhau. Đã bao năm qua, có khi nào mà bà đã nói được với ông những lời thương yêu, ngọt ngào như ngày hôm nay! Khi thấy chồng khóc, bà ta cảm thấy tình thế đã có phần hy vọng. Cánh cửa trái tim của chồng bà lâu nay khép kín nay đã bắt đầu hé mở. Bà biết lúc này bà phải rất cẩn thận, và bà đã tiếp tục thực tập hơi thở chánh niệm, rồi bà nói, “Anh ơi, anh nói ra tất cả những gì sâu kín trong tim anh cho em nghe đi. Em muốn cư xử với anh hay hơn. Em không muốn tạo thêm lỗi lầm gì nữa.”

Bà vợ là một người trí thức, cũng có bằng Ph.D. Nhưng cả hai đã đau khổ vì không biết cách thực tập lắng nghe với tâm từ bi. Nhưng ngày hôm đó, người vợ đã thực tập lắng nghe với tâm từ bi rất thành công. Lắng nghe với tâm từ bi đã có một tác dụng chữa trị mầu nhiệm cho cả hai người. Chỉ vài giờ đồng hồ sau hai vợ chồng đã làm hòa được với nhau.

! Pháp Môn Đúng-Thực Tập Tốt

Nếu một pháp môn là một pháp môn đúng, nếu sự thực tập là một sự thực tập tốt thì không cần phải đợi đến năm hay mười năm mà chỉ cần vài giờ đồng hồ là có thể có chuyển hóa và chữa trị. Tôi biết rõ bà bạn theo Cơ Đốc Giáo đó đã thành công là vì bà ta đã thuyết phục được chồng ghi tên tham dự khóa tu thứ hai tiếp theo sau đó.

Sau một khóa tu sáu ngày tiếp theo, chồng của bà ta cũng đã chuyển hóa sâu sắc. Trong một buổi thiền trà ông ta đã giới thiệu vợ mình cho các bạn tu và nói, “Thưa các bạn, tôi xin giới thiệu với các bạn một vị Bồ Tát. Người  này là vợ tôi nhưng cũng là một vị Đại Bồ Tát. Trong năm năm qua, tôi đã làm cho vợ tôi đau khổ rất nhiều. Tôi đã rất dại dột. Nhưng nhờ tu tập mà vợ tôi đã thay đổi tình trạng, đã cứu sống tôi.” Rồi sau đó hai vợ chồng đã kể lại tình trạng gia đình trong năm năm qua và trong trường hợp nào mà họ đến tham dự khóa tu. Họ chia sẻ với đại chúng nhờ đâu mà họ đã làm hòa với nhau, tái lập tình thương yêu lại với nhau.

Khi một người làm vườn dùng một loại phân bón mà không thấy có kết quả thì người ấy phải thay loại phân bón khác. Điều đó cũng đúng với chúng ta. Nếu sau vài tháng tu tập mà không thấy có chuyển hóa hay chữa trị thì phải xét lại. Phải thay đổi phương cách và tìm cho ra một pháp môn tu tập khả dĩ thay đổi cuộc sống của chính ta và của những người ta thương.

Điều này tất cả chúng ta đều làm được nếu chúng ta có được pháp môn đúng và chúng ta thực tập tốt. Nếu chúng ta hết lòng thực tập, nếu chuyện thực tập là chuyện sống chết như trường hợp bà bạn người Cơ Đốc trên đây, thì không có gì mà ta không chuyển đổi được.

Để Có Được Hạnh Phúc

Chúng ta đang sống trong một thời đại với biết bao phương tiện truyền thông tinh xảo. Tin tức có thể được truyền đi xa vạn dặm trong nháy mắt nhưng đồng thời truyền thông giữa chúng ta, giữa cha và con, giữa chồng và vợ thì lại rất khó khăn. Nếu không thiết lập lại được truyền thông giữa ta và những người khác thì không thể nào có được hạnh phúc. Trong giáo lý của Đạo Bụt pháp môn thực tập lắng nghe với tâm từ bi, thực tập ái ngữ cũng như pháp môn thực tập chăm sóc sân hận đã được diễn bày rất rõ ràng. Chúng ta phải đem ra áp dụng hầu mong có thể thiết lập lại truyền thông và xây dựng hạnh phúc cho gia đình, học đường, cho cộng đồng của riêng chúng ta, rồi từ đó mới có thể giúp ích những người khác trên thế giới.
! Một Cuộc Hội Thảo Hòa Bình

Khi tu tập, chúng ta tu tập với gia đình, với bạn tu. Tu tập một mình khó thành công. Chúng ta cần đồng minh. Trước kia chúng ta họp nhau chỉ để làm khổ nhau, chỉ để giận nhau. Bây giờ chúng ta họp nhau để chăm sóc buồn giận, phiền não cho nhau. Chúng ta muốn bàn thảo về một kế hoạch sống chung an lạc.

Hãy bắt đầu cuộc hội thảo sống chung an lạc với người thương của bạn: “Anh ơi, ngày xưa chúng ta đã làm khổ cho nhau nhiều quá rồi. Cả hai ta đều là nạn nhân của sân hận. Chúng ta đã tạo địa ngục cho nhau. Bây giờ, em muốn thay đổi. Em muốn anh và em là đồng minh để chúng ta có thể bảo vệ cho nhau, tu tập với nhau và cùng nhau chuyển hóa sân hận. Bắt đầu từ hôm nay chúng ta hãy cùng nhau xây dựng một cuộc sống tốt đẹp hơn trên căn bản chánh niệm. Anh ơi, em cần anh giúp, cần anh nâng đỡ và hợp tác. Em không thể thành công được nếu không có anh.” Phải nói câu đó với người bạn đường, với con trai, với con gái của bạn. Đã đến lúc phải nói. Đây gọi là giác ngộ. Đây chính là yêu thương.

Chỉ cần nghe pháp thoại trong năm phút là có thể giác ngộ ngay. Nhưng phải duy trì sự giác ngộ đó thường xuyên để có thể đem về nhà và áp dụng vào đời sống hằng ngày. Nhờ giác ngộ mà si mê sẽ tan biến. Giác ngộ đó sẽ ảnh hưởng không những đến suy tư mà sẽ còn ảnh hưởng đến cơ thể, lối sống. Vậy thì hãy tìm đến với người thương của bạn để cùng nhau bàn thảo một kế hoạch hòa bình, một kế hoạch tiêu thụ, một kế hoạch để tự bảo vệ. Đây là một điều rất quan trọng. Phải sử dụng tất cả tài ba, khéo léo, tất cả những gì có thể giúp bạn thành công để cho không còn gây khổ cho nhau nữa. Bạn muốn làm mới, muốn tự chuyển hóa. Bạn có thuyết phục được người thương của bạn hay không là tùy ở nơi bạn.

 

! Tái Lập Truyền Thông

Có một thanh niên Hoa kỳ không nói với cha một câu trong năm năm. Hai cha con không thể nào nói chuyện được với nhau. Rồi một hôm, chàng thanh niên đó gặp Giáo Pháp của Bụt và đã chuyển hóa sâu đậm. Anh muốn làm mới, muốn thay đổi cuộc sống. Anh quyết định trở thành một ông thầy tu. Anh đến ở tại Làng Mai trong ba tháng, để học hỏi và để chứng tỏ rằng mình có khả năng làm một ông thầy tu. Anh thực tập thiền hành, thiền tọa, ăn uống trong chánh niệm, tham gia vào tất cả các sinh hoạt trong tăng thân.

Anh ta không đòi hỏi gì nơi ba anh. Anh bắt đầu với anh trước. Nhờ sống một cuộc sống mới với tăng thân, nhờ anh có thể thiết lập bình an với chính anh mà anh có thể viết thư cho ba anh mỗi tuần. Anh không mong rằng ba anh sẽ trả lời thơ. Anh viết cho ba anh về cuộc sống tu tập của anh, về những niềm vui nhỏ mỗi ngày trong khi tu tập. Sau sáu tháng, anh tập trung chánh niệm, theo dõi hơi thở, giữ bình tĩnh và gọi điện thoại về nhà. Ba anh trả lời điện thoại. Ba anh biết rằng anh ta đã trở thành một thầy tu và ông ta rất giận. Ông ta hỏi qua điện thoại: “Mày còn ở với cái nhóm đó không? Mày còn là một ông thầy tu đấy hả? Thế thì tương lai của mày ra sao?” Người thanh niên ấy đã trả lời như sau: “Thưa ba, điều mà con lưu tâm hơn hết là lập lại liên hệ tốt giữa ba và con. Được như thế thì con sẽ rất hạnh phúc. Đây là điều quan trọng nhất cho con. Con muốn được gần gũi Ba, liên hệ chuyện trò với ba. Đây là ưu tư duy nhất của con. Điều đó quan trọng hơn tất cả điều chi khác kể cả tương lai.”

Ba anh im lặng rất lâu khi nghe anh nói như thế. Trong khi đó chàng thanh niên, bây giờ là một thầy tu trẻ, tiếp tục thực tập hơi thở chánh niệm. Sau cùng người cha trả lời “Okay! Ba cũng đồng ý như vậy. Điều đó cũng rất quan trọng cho ba.” Rõ ràng là người cha đó đâu chỉ có giận ghét con mình. Trong nhiều bức thư anh đã viết tất cả những gì có thể tưới tẩm những hạt giống tích cực trong ba anh. Kể từ hôm đó người cha đã kêu điện thoại cho con hằng tuần. Truyền thông giữa hai cha con đã được tái lập, và hạnh phúc của hai cha con đã trở thành một sự thật.

! Hòa Bình Bắt Đầu Từ Chính Bạn

Muốn thay đổi sâu sắc cuộc sống trước nhất ta phải xét lại cách ăn uống, tiêu thụ. Phải ngưng tiêu thụ những gì có thể đầu độc ta. Khi đó ta mới có được sức mạnh để nuôi lớn những gì tốt đẹp trong ta và không còn là nạn nhân của sân hận, phiền não.

Khi cánh cửa của truyền thông đã mở rộng thì không có gì mà không làm được. Vì vậy bạn phải nỗ lực khai mở và tái lập truyền thông. Phải nói rõ ước muốn và quyết tâm hòa giải của bạn với người kia. Hãy yêu cầu người kia giúp. Hãy nói với người kia rằng “Sự truyền thông giữa chúng ta là quan trọng bậc nhất cho tôi. Sự liên hệ giữa chúng ta là điều vô cùng quý giá và không có gì quan trọng hơn.’ Hãy nói cho rõ điều ấy và yêu cầu người kia giúp vào một tay.

Phải bắt đầu bàn thảo về một kế hoạch. Không cứ người kia có thể làm được gì, bạn phải làm tất cả những gì mà bạn có thể làm được. Bạn phải đóng góp một trăm phần trăm. Tất cả những gì mà bạn có thể làm cho bạn là bạn làm cho người kia. Đừng chờ đợi. Đừng đặt điều kiện. “Nếu anh không cố gắng hòa giải thì em cũng sẽ không cố gắng làm gì.” Như thế thì sẽ không đi tới đâu cả. Hòa bình, hòa giải và hạnh phúc bắt đầu từ chính bạn.

Nghĩ rằng nếu người kia không thay đổi hay không khá hơn thì không cải thiện được gì là sai lầm. Luôn luôn có cách để tạo ra niềm vui, an lạc, hòa điệu, và chúng ở trong tầm tay bạn. Cách bạn đi đứng, thở cười, phản ứng, tất cả đều rất quan trọng. Bạn phải bắt đầu bằng những cái đó.

Có nhiều cách để truyền thông, và cách hay nhất là tỏ ra rằng bạn không còn hờn giận hay trách móc. Phải chứng tỏ là bạn đã thông cảm và chấp nhận người kia. Thông điệp truyền thông của bạn không phải chỉ ở lời nói mà ở nơi dáng dấp của bạn, với đôi mắt từ bi, với cử chỉ dịu dàng. Nếu bạn tươi mát, thân mật thì bạn cũng đã thay đổi được nhiều lắm rồi. Bạn sẽ là một bóng cây mát, một dòng suối ngọt. Người cũng như vật đều muốn đến gần vì bạn tươi mát, vui vẻ. Bắt đầu từ chính bản thân bạn, bạn sẽ có thể tái lập truyền thông và những người khác sẽ tự nhiên mà thay đổi.

 

! Hiệp Ước Sống Chung An Lạc

Hãy nói với người ta thương như thế này: “Trong quá khứ chúng ta đã gây khổ cho nhau quá nhiều, bởi vì cả hai ta đều không biết xử lý cơn giận. Bây giờ chúng ta phải tìm cho ra một kế hoạch để xử lý, chăm sóc cơn giận của chúng ta.”

Giáo lý Đạo Bụt có thể giúp dập tắt ngọn lửa sân hận, đau khổ. Tuệ giác Đạo Bụt đem lại cho ta an lạc ngay bây giờ và ở đây. Kế hoạch hòa bình và hòa giải của chúng ta phải được căn cứ trên tuệ giác đó.

Khi năng lượng sân hận bừng dậy ta thường có xu hướng bộc lộ cơn giận ra ngoài để trừng phạt người đã làm cho ta khổ. Đây là một tập khí có sẵn trong ta. Khi khổ ta thường trách rằng người kia đã làm cho ta khổ. Ta không bao giờ nghĩ rằng cơn giận trước hết là chuyện của riêng ta. Ta chịu trách nhiệm trước nhất về cơn giận của ta mà lại ngây thơ nghĩ rằng nếu nói được một câu gì hay làm một điều gì để trừng phạt người kia thì ta sẽ bớt khổ. Phải loại bỏ ý nghĩ này ra khỏi đầu óc mới được. Bởi vì khi giận thì bất cứ hành động nào, lời nói nào cũng chỉ tạo nên đổ vỡ mà thôi. Trái lại phải tránh làm bất cứ điều gì hay nói bất cứ lời gì trong khi đang giận.

Khi nói một câu hung dữ hay hành động để trả thù thì cơn giận càng tăng thêm. Ta sẽ làm người kia khổ và người ấy sẽ tìm cách trả đũa để cho bớt giận. Xung đột vì thế sẽ leo thang. Điều này đã từng xẩy ra không biết bao lần. Chúng ta đã chứng kiến quá nhiều vụ leo thang xung đột, hờn giận. Thế mà ta chẳng học được bài học. Phải nhớ rằng tìm cách trừng phạt người kia chỉ làm cho tình trạng trở nên tồi tệ mà thôi.

Trừng phạt người kia chính là tự trừng phạt mình. Điều này đúng trong tất cả mọi trường hợp. Mỗi khi Hoa kỳ trừng phạt Iraq, không những Iraq khổ mà Hoa kỳ cũng khổ. Mỗi khi Iraq trừng phạt Hoa Kỳ, không chỉ Hoa kỳ khổ mà Iraq cũng khổ theo. Bất cứ xứ nào trên thế giới cũng vậy: giữa Do Thái và Palestin, giữa Muslim và Hindu. Giữa chúng ta và bất cứ ai khác cũng vậy. Luôn luôn là như vậy. Vậy thì chúng ta phải thức tỉnh, phải ý thức rằng trừng phạt người khác không phải là một sách lược hay. Bạn và người kia, cả hai đều có đủ thông minh. Hãy sử dụng thông minh của mình. Hãy đến với nhau và thỏa thuận về một kế hoạch để xử lý cơn giận. Trừng phạt lẫn nhau là không khôn ngoan. Hãy hứa với nhau rằng khi giận thì không nên nói gì hết hay làm gì hết. Trái lại chỉ nên trở về với tự thân mà thực tập hơi thở chánh niệm, bước chân chánh niệm.

Hãy lợi dụng những lúc cả hai đang vui vẻ, hạnh phúc với nhau mà ký một bản hiệp ước hoà bình: hiệp ước sống chung an lạc, bản hiệp ước của tình yêu chân thật. Hiệp ước sống chung an lạc (xem phụ bản A) phải được viết và ký hoàn toàn trên căn bản yêu thương, không như các hiệp ước chính trị. Những bản hiệp ước chính trị chỉ chú trọng tới quyền lợi quốc gia vị kỷ, chứa đầy nghi kỵ và căm thù. Hiệp ước hòa bình của bạn phải là một bản hiệp ước của thuần túy yêu thương.

! Ôm Ấp Cơn Giận

Bụt không bao giờ khuyên ta đè nén cơn giận. Bụt dạy chúng ta trở về với tự thân và chăm sóc cơn giận.

Khi cơ thể có bệnh, hoặc bệnh ruột, hoặc bệnh gan, ta phải gác bỏ tất cả mọi chuyện khác để săn sóc bệnh. Cơn giận của ta cũng là một bộ phận trong cơ thể, như ruột, gan vậy. Khi giận ta phải trở về với tự thân và săn sóc cơn giận của ta. Ta không thể nói, “Này cơn giận, mày hãy biến mất đi! Ta không muốn có mày ở đây.” Khi đau bao tử ta có bao giờ bảo cái bao tử: “Này bao tử, mày hãy cút đi! Ta không có muốn có mày ở đây!” Ta chăm sóc bao tử của ta. Cũng vậy, ta phải ôm ấp và chăm sóc cơn giận của ta. Ta nhận diện cơn giận, ôm ấp nó và mỉm cười. Năng lượng giúp ta làm được điều đó là năng lượng của chánh niệm, của bước chân chánh niệm, của hơi thở chánh niệm.

! Hạnh Phúc Không Phải Là Một Vấn Đề Cá Nhân

Nhận diện, ôm ấp và mỉm cười với cơn giận không có nghĩa là phải dấu kín cơn giận. Phải cho người kia biết rằng ta đang giận, đang khổ. Đây là một điều rất quan trọng. Khi giận ai thì đừng giả bộ là không giận, đừng giả bộ là không khổ. Nếu người kia là một người rất thân thiết thì ta phải nói rõ cho người ấy biết là ta đang giận. Nhưng phải nói  một cách bình tĩnh.

Trong tình yêu chân thật không có tự ái. Bạn không thể giả bộ là bạn không khổ, không giận. Giả bộ, che giấu như thế là vì tự ái. “Tôi mà giận à? Tại sao tôi lại phải giận? Tôi có việc gì đâu? “Sự thật là bạn đang ở trong địa ngục. Cơn giận đang thiêu đốt bạn, và bạn phải cho người bạn đường, cho con trai, cho con gái của bạn biết điều đó. Xu hướng của chúng ta là tuyên bố rằng “Ta đâu cần có ai ta mới hạnh phúc, một mình ta cũng chẳng sao.” Làm như thế là phản lại lời nguyện ước của buổi ban đầu.

Buổi ban đầu thì thề thốt gắn bó: “Không có anh chắc em sống không nổi. Anh là nguồn hạnh phúc của em.” Nhưng sau đó, khi giận thì nói điều trái ngược: “Tôi không cần anh đâu! Đừng có tới gần đây làm chi! Đừng có đụng tới tôi” Rồi bỏ đi vào phòng riêng và đóng cửa lại để chứng tỏ rằng ta không cần tới người kia. Tâm lý thường tình là như vậy. Nhưng đó không phải là tuệ giác khôn ngoan. Hạnh phúc không phải là một vấn đề cá nhân. Nếu một trong hai người không hạnh phúc thì người kia chắc chắn sẽ không thể hạnh phúc.

1. “Người thương ơi! Tôi đang giận. Tôi đang khổ.”

Nói lên câu “Anh yêu em” là tốt, là quan trọng. Bày tỏ cảm tình thương yêu, hạnh phúc của mình với người mình thương là một điều tự nhiên thôi. Nhưng bạn cũng phải cho người bạn thương biết khi bạn đang khổ vì người đó, đang giận người đó. Phải nói lên cảm xúc của bạn. Bạn có quyền làm như vậy. Đây là tình yêu chân thật. “Người thương ơi! Tôi đang giận. Tôi đang khổ.” Hãy nói câu đó với tất cả chân tình hòa nhã. Có thể là giọng nói của bạn có chứa ẩn một chút buồn, nhưng không sao. Nhưng đừng nói để trách móc hay để trừng phạt. “Người thương ơi! Tôi đang giận. Tôi đang khổ. Xin biết cho tôi điều đó.” Đây là tiếng nói của tình yêu, bởi vì bạn đã từng long trọng hứa rằng là sẽ nâng đỡ nhau trong cuộc sống chung. Giữa cha mẹ và con cái cũng vậy, giữa anh em, bạn bè cũng vậy, phải nói lên cảm xúc buồn giận, khổ đau của mình.

Mỗi khi khổ bạn có bổn phận nói cho người bạn thương biết. Khi hạnh phúc chia sẻ đã đành, nhưng khi đau khổ cũng phải chia sẻ. Ngay cả khi bạn cho rằng người kia đã gây nên nỗi khổ của bạn, bạn cũng phải nói cho người kia biết. Điều kiện duy nhất là phải nói trong bình tĩnh, phải dùng lời ái ngữ.

Phải làm việc này càng sớm càng tốt. Không nên ôm giữ cái giận trong tâm quá hai mươi bốn giờ. Nếu không thì sẽ khó mà chịu đựng được, và sẽ bị cơn giận đầu độc. Để cho trễ quá là chứng tỏ rằng tình yêu và lòng tin của bạn đối với người kia còn yếu ớt. Vậy thì bạn phải nói lên cho người kia biết là bạn đang khổ, đang giận. Càng sớm càng tốt. Hai mươi bốn giờ là thời hạn chót.

Có thể là bạn cảm thấy chưa sẵn sàng vì chưa được bình tĩnh lắm. Bạn đang còn giận. Vậy thì bạn hãy thực tập hơi thở chánh niệm hay đi thiền hành ngoài trời. Cho đến khi cảm thấy được bình tĩnh rồi sẽ nói. Nhưng nếu sau hai mươi bốn giờ mà vẫn chưa sẵn sàng thì bạn có thể viết xuống một bức thư ngắn, một thông điệp hòa bình. Hãy trao bức thư này trước thời hạn hai mươi bốn giờ. Đây là một điều rất quan trọng. Bạn và người kia đã cam kết sẽ hành xử như vậy khi giận nhau. Nếu không thì bạn đã không giữ đúng những cam kết của thỏa hiệp sống chung an lạc.

2. “Tôi sẽ cố gắng hết lòng”

Nếu quyết tâm muốn cải thiện tình hình thì bạn có thể tiến thêm một bước nữa. Bạn viết thêm câu “Anh sẽ cố gắng hết lòng”. Nghĩa là bạn sẽ tự kiềm chế không hành động hấp tấp, sẽ thực tập hơi thở chánh niệm, thực tập thiền hành để ôm ấp cơn giận trong chánh niệm. Nghĩa là bạn thực tập theo đúng pháp môn đã dạy. Đừng nói câu “Anh sẽ cố gắng hết lòng” trừ khi bạn đang thực tập như vậy. Khi giận mà bạn biết sẽ phải thực tập như thế nào để bạn có quyền nói câu “Anh sẽ cố gắng hết lòng.” Câu nói đó sẽ làm cho người kia tâm phục và tin tưởng.” Tôi sẽ cố gắng hết lòng” có nghĩa là “tôi sẽ giữ đúng cam kết mà trở về với tự thân và chăm sóc cơn giận.”

Khi giận, cơn giận là đứa con của ta và ta phải săn sóc nó. Cũng như khi đau bao tử ta phải trở về với tự thân mà chăm sóc bao tử. Khi đó bao tử là đứa con của ta. Bao tử thuộc phần thân, cơn giận thuộc phần tâm. Ta phải chăm sóc cơn giận cũng như chăm sóc bao tử. Ta không thể nói rằng: “Này sân hận, mày hãy đi đi, mày không phải là của ta!” Vậy thì khi ta nói “Tôi sẽ cố gắng hết lòng” là vì ta đang ôm ấp và chăm sóc cơn giận của ta. Ta đang thực tập hơi thở chánh niệm và bước chân chánh niệm để giải tỏa năng lượng sân hận và biến nó thành một năng lượng tích cực.

Trong khi ôm ấp cơn giận ta thực tập quán chiếu sâu sắc để thấy rõ bản chất của cơn giận bởi vì ta biết rằng có thể ta là nạn nhân của một tri giác sai lầm. Có thể là ta đã hiểu lầm những gì ta nghe hay thấy. Có thể là ta đã có một nhận thức sai lầm về điều người kia đã nói hay đã làm. Cơn giận phát xuất từ nhận thức sai lầm và vô minh. Khi nói câu “Tôi sẽ cố gắng hết lòng” ta ý thức rằng trong quá khứ ta đã từng giận vì đã có tri giác sai lầm như vậy. Cho nên bây giờ ta phải rất cẩn thận và nhớ đừng tin chắc rằng ta là nạn nhân của lời nói hay hành động của người kia. Có thể chính ta đã tự tạo lấy địa ngục.

3. “Xin giúp tôi”

Câu thứ ba tiếp theo hai câu trước một cách tự nhiên. “Xin giúp anh, người thương ơi, anh đang cần em giúp.” Đó là ngôn ngữ của tình yêu chân thật. Khi giận bạn thường hay nói ngược lại: “Đừng đụng tới tôi. Tôi không cần ai cả. Để tôi yên một mình. Có sao đâu!” Nhưng mà đã có lời cam kết săn sóc nhau rồi! Vậy thì khi đau khổ tuy đã biết cách tu tập ta cũng cần đến sự giúp đỡ của người kia trong sự tu tập. “Người thương ơi, anh đang cần em giúp, em giúp anh đi!”

Nói lên được ba câu trên tức là có khả năng yêu thương chân thật. Ba câu đó là tiếng nói đích thực của tình yêu chân thật.

“Người thương ơi! Anh đang giận. Anh đang khổ. Xin biết cho anh điều đó. Anh đang cố gắng. Anh không trách móc ai, kể cả em. Vì chúng ta gần gũi nhau biết chừng nào, vì chúng ta đã có lời cam kết là sẽ chăm sóc cho nhau cho nên anh cần em giúp để thoát ra khỏi tình trạng khổ đau, hờn giận này. “

Cách bạn hành xử khi giận như thế sẽ đem lại sự vững tâm, lòng tin tưởng và tâm khâm phục trong người kia và cả trong chính bạn. Đây là một điều không mấy gì khó khăn.

! Cùng Nhau Chuyển Hóa Sân Hận

Giả sử tôi là người đã làm cho bạn giận. Nếu bạn nói với tôi ba câu trên thì tôi sẽ thấy rằng bạn quả là chung thủy với tôi, thương yêu tôi chân thật. Bạn chia sẻ với tôi không chỉ khi hạnh phúc mà cả khi khổ đau. Khi nghe bạn hứa sẽ cố gắng hết lòng tôi tin tưởng, tâm phục và nghĩ rằng bạn có tu tập thật sự. Bạn đã giữ đúng những gì đã học được, đã trung kiên với giáo pháp và tăng thân. Khi thực tập ba câu trên là bạn đang ôm ấp Thầy, Bạn trong tim.

Vì bạn đang cố gắng hết lòng cho nên tôi cũng phải cố gắng hết lòng. Tôi sẽ trở về với tự thân và tu tập. Để cho xứng đáng với bạn, tôi sẽ quán chiếu sâu sắc và thực tập hết lòng và tự hỏi: “Ta đã nói gì, làm gì mà để cho người thương của ta khổ? Tại sao ta lại hành xử như vậy?” Chỉ cần lắng nghe bạn, chỉ cần đọc thông điệp hòa bình của bạn thôi cũng đủ để tôi thức tỉnh rồi. Giáo pháp đã thâm nhập vào bạn và bây giờ thâm nhập vào tôi, năng lượng của chánh niệm bây giờ đã có mặt trong tôi.

Vậy thì khi người kia nhận được thông điệp của bạn, một thông điệp được trao truyền bằng ái ngữ, người ấy sẽ cảm kích vì tình thương yêu, ngôn từ hòa ái và sự thực tập của bạn. Nhận được thông điệp đó người ấy sẽ tỉnh ngộ và sinh tâm kính phục. Người ấy sẽ trở về với tự thân và xét lại coi mình đã làm gì hay đã nói gì mà có thể làm cho bạn đau khổ. Như thế là bạn đã trao truyền đến người đó sự thực tập của bạn. Người ấy sẽ thấy rằng bạn đã cố gắng hết lòng. Và để đáp lại người ấy cũng sẽ cố gắng hết lòng. Người ấy sẽ tự nhủ: “Người thương ơi, tôi cũng xin cố gắng hết lòng.”

Thật là mầu nhiệm, bạn và người kia đang cùng nhau tu tập. Chánh pháp đang có mặt trong cả bạn và người kia. Bụt đang có mặt thật sự trong cả bạn và người kia. Không còn gì nguy hiểm. Bạn đã trở về tự thân, thực tập quán chiếu để tìm hiểu thực trạng của vấn đề. Nếu thấy được lý do sâu kín của sự bất hòa thì hãy nói cho người kia biết ngay đi.

Có thể bạn đã nhận ra rằng bạn đã nổi giận chỉ vì một tri giác sai lầm. Nếu thấy được như thế bạn có bổn phận đến cho người kia hay ngay. Bạn sẽ phải cho người kia hay là bạn rất lấy làm tiếc vì đã nổi giận không lý do. Người kia đã chẳng làm gì sai quấy. Phải cho người ấy biết ngay bằng điện thoại, Fax hay bằng E-mail bởi vì người ấy đang bận tâm vì nỗi khổ của bạn. Như thế thì tâm tư người ấy sẽ được nhẹ nhàng ngay.

Còn về phần người kia, suy nghiệm lại, người kia khám phá ra rằng chỉ vì một tri giác sai lầm mà đã nói một lời nào đó, làm một việc gì đó làm bạn giận, người kia rất lấy làm tiếc và cũng phải cho bạn hay ngay. “Hôm qua, tôi thiếu chánh niệm. Tôi đã nói một câu chỉ vì có một tri giác sai lầm. Tôi không cố ý nói như vậy, nhưng chỉ vì thiếu khéo léo mà thôi. Tôi xin lỗi và sẽ cố gắng trong lần sau sẽ chánh niệm hơn.” Khi bạn nghe người kia nói như vậy sẽ không còn đau khổ nữa và sẽ kính phục người kia nhiều hơn.  Bạn và người kia bây giờ là bạn đạo. Niềm tương kính giữa người kia và bạn sẽ tăng trưởng. Lòng kính phục đó chính là nền tảng của tình yêu chân thật.

! Người Khách Quý

Trong truyền thống Việt Nam vợ chồng phải đối xử với nhau như khách. Phải kính trọng nhau thật sự. Cho đến thay áo cũng không nên thay trước mặt nhau. Nhất cử nhất động phải tỏ lòng kính nể nhau. Nếu không còn lòng tương kính thì tình yêu chân thật sẽ không lâu bền. Truyền thống tương kính giữa vợ chồng là truyền thống của văn hóa Á châu. Xã hội Tây phương, nhất là xã hội Tây phương thời xưa, chắc cũng có truyền thống này. Thiếu lòng tương kính thì tình yêu sẽ không lâu bền và không bao lâu sẽ bị sân hận và những năng lượng tiêu cực khác trấn ngự.

Trong những đám cưới tại Làng Mai, đôi tân lang và tân giai nhân lạy nhau trong lễ cưới để tỏ lòng tương kính. Bởi vì trong mỗi người đều có Phật tính – khả năng giác ngộ, khả năng phát triển thương yêu lớn, hiểu biết lớn. Khi lạy người hôn phối một cách kính cẩn là chứng tỏ thương yêu. Khi không còn kính trọng nữa thì tình yêu như là đã chết. Vì vậy mà chúng ta phải cẩn trọng nuôi dưỡng lòng tương kính.

Sử dụng ba câu nói của tình yêu chân thật, quán chiếu sâu sắc để thấy rõ trách nhiệm của mình khi có xung đột là cách cụ thể nhất để chứng tỏ lòng kính trọng và nuôi dưỡng tình thương yêu. Xin đừng xem nhẹ ba câu nói của tình yêu chân thật đó.

! Hòn Sỏi Trong Túi Áo

Mỗi một chữ của ba mệnh đề trên chứa đựng tình yêu chân thật. Với tình yêu chúng ta có thể giải quyết được tất cả. Bạn có thể viết ba câu ấy vào một mảnh giấy cỡ credit card và bỏ vào ví. Hãy cất giữ mảnh giấy đó như một bảo vật có năng lực cứu độ bởi vì nó sẽ nhắc nhở bạn lời cam kết ân tình của ngày xưa.

Bạn có thể cất vào túi một hòn sỏi, một hòn sỏi đẹp nhất đã được góp nhặt đâu đó trước vườn. Mỗi khi cho tay vào túi chạm nhẹ vào hòn sỏi, bạn theo dõi hơi thở chánh niệm và sẽ cảm thấy bình an. Khi cơn giận đến với bạn thì hòn sỏi sẽ là Chánh Pháp. Hòn sỏi sẽ nhắc nhở bạn ba câu trên. Chỉ cần cầm lấy hòn sỏi mà thở trong chánh niệm và mỉm cười. Phép thực tập này xem ra có vẻ hơi trẻ con nhưng giúp ích rất nhiều. Khi ở trường, khi làm việc hay khi đi mua sắm, bạn không có gì để nhắc nhở bạn trở về với tự thân. Hòn sỏi trong túi áo bạn thay thế cho Thầy, cho tăng thân – đó là tiếng chuông chánh niệm, nhắc nhở bạn ngưng lại để trở về hơi thở.

Nhiều người sử dụng xâu chuỗi để niệm Bụt A Di Đà hay Chúa Jesus. Hòn sỏi cũng như một xâu chuỗi nhắc nhở ta rằng Thầy luôn có ở bên cạnh ta, các bạn đồng tu luôn có ở bên cạnh ta. Hòn sỏi giúp ta trở về hơi thở, khai mở, giữ gìn tình yêu thương, và thắp sáng giác ngộ trong ta.
! Tiêu Thụ Sân Hận

Tất cả chúng ta cần phải biết cách xử lý và chăm sóc cơn giận. Muốn vậy ta phải chú ý đến khía cạnh sinh-hóa (bio-chemical) của sân hận, bởi vì cơn giận có gốc rễ từ thể chất cũng như từ tinh thần. Phân tích cho sâu sắc ta có thể khám phá ra những yếu tố sinh lý của cơn giận. Vì vậy cần xét kỹ lại cách chúng ta ăn, uống, tiêu thụ cũng như săn sóc thể xác trong đời sống hằng ngày.

! Cơn Giận Không Phải Chỉ Là Một Hiện Tượng Tâm Lý

Theo lời Bụt dạy, thân và tâm không thể tách rời. Thân chính là tâm và đồng thời tâm cũng chính là thân. Vì thân và tâm liên hệ chặt chẽ và không thể tách rời cho nên cơn giận không phải chỉ là một hiện tượng thuần túy tâm lý. Trong Đạo Bụt có danh từ namarupa. Namarupa tương đương với danh từ psycho-soma của khoa học Tây phương. Danh từ Namarupa hay psycho-soma có thể dịch là tâm-sinh-lý, là thân và tâm như một hợp thể. Cùng là  một hiện tượng mà có khi phát hiện ra như thuộc về tâm, có khi phát hiện ra như thuộc về thân.

Quan sát tánh chất của các hạt cơ bản (elementary particle) các nhà khoa học vật lý khám phá ra rằng các hạt cơ bản có khi biểu hiện ra dưới một dạng sóng (wave), có khi biểu hiện ra như một hạt vật chất. Sóng rất khác với vật chất. Sóng chỉ có thể là sóng, nó không thể là vật chất. Nhưng đối với một hạt cơ bản thì sóng và vật chất cùng là một. Vì vậy thay vì gọi các hạt cơ bản là sóng hay vật chất, các nhà khoa học đã phối hợp hai danh từ wave và particle lại với nhau và gọi hạt cơ bản là  ‘wavicle’.

Thân và tâm cũng vậy.  Do nhận thức nhị nguyên (dualistic view) mà ta nghĩ rằng tâm không thể là thân và thân không thể là tâm. Nhưng nếu quán chiếu cho sâu ta sẽ thấy rằng thân tức là tâm và tâm tức là thân. Nếu vượt thoát được lối nhìn nhị nguyên cho rằng thân và tâm là hai thực thể riêng biệt thì có thể đạt đến rất gần chân lý thực tại.

Nhiều người đã bắt đầu ý thức rằng tất cả những gì xẩy đến cho thân thì cũng xẩy đến cho tâm và ngược lại. Y khoa hiện đại đã nhận ra rằng thể xác bị bệnh có thể  do tâm thần gây nên và tâm thần bị bệnh có thể do thể xác gây nên. Thân và tâm không phải là hai thực thể riêng biệt mà chỉ là một.

Muốn chăm sóc cơn giận chúng ta trước phải chăm sóc thân thể. Cách chúng ta ăn uống, tiêu thụ vì vậy rất quan trọng.

! Những Gì Chúng Ta Ăn Quyết Định Con Người Chúng Ta

Sân hận, bực bội, tuyệt vọng tất cả đều có gốc rễ từ thể chất của ta và các thức ăn ta tiêu thụ. Ta phải có một kế hoạch ăn uống, tiêu thụ như thế nào để cho khỏi phải bị sân hận, bạo động xâm chiếm. Ăn uống là một khía cạnh của văn minh xã hội. Cách ta chế tác thức ăn, các loại thực phẩm ta tiêu thụ, cách ta ăn uống tất cả đều có quan hệ tới nền văn minh bởi vì sự lựa chọn của ta trong việc ăn uống có thể đem lại hòa bình và làm vơi bớt khổ đau.

Thức ăn đóng một vai trò rất quan trọng trong sự phát khởi sân hận. Thức ăn có thể chứa đầy sân hận. Khi ăn miếng thịt của một con bò bị bệnh ‘bò điên’ (mad cow disease) thì cái ‘chất điên’ của con bò có sẵn trong miếng thịt. Không những thế, khi ăn một cái trứng hay một miếng thịt gà ta cũng phải biết rằng cái trứng hay miếng thị gà đó cũng có thể chứa đầy ‘chất sân hận’. Chúng ta ăn chất sân hận và sẽ phát khởi sân hận.

Hiện nay người ta nuôi gà theo kiểu sản xuất hàng loạt trong những nông trại tối tân. Trong các nông trại này, gà không được thả rông tìm ăn ngoài vườn mà bị nhốt trong chuồng chật hẹp. Trong các chuồng ấy ngày đêm gà chỉ có thể đứng một chỗ, không thể đi rông tìm ăn như gà thường. Chúng chỉ được người nuôi bằng thức ăn chế sẵn. Hãy tưởng tượng ngày đêm chúng ta bị nhốt đứng yên một chỗ, không được phép đi lại, chắc chắn chúng ta sẽ nổi điên. Gà cũng vậy. Gà bị nhốt như vậy cũng sẽ nổi điên.

Để cho gà đẻ trứng nhiều hơn, người ta dùng ánh sáng nhân tạo trong trại nuôi để tạo ra ngày và đêm ngắn hơn hai mươi bốn giờ khiến cho con gà theo nhịp độ ánh sáng mà đẻ trứng nhiều lần hơn, cung cấp nhiều trứng hơn. Gà được nuôi bằng phương pháp trên đây chắc chắn là bực bội, đau khổ vô cùng cho nên thường hay cắn mổ gà các chuồng bên cạnh có khi đến chết. Vì vậy mà trong các nông trại này người ta phải cắt cụt mỏ nhọn các con gà.

Thế cho nên khi ăn trứng hay thịt các con gà nuôi theo phương pháp trên là ăn căm giận, bực bội của các con gà đó. Vậy ta phải cẩn thận lắm mới được. Nếu ăn sân hận vào thì sẽ phát khởi sân hận. Nếu ăn bực bội, tuyệt vọng vào thì sẽ phát khởi bực bội, tuyệt vọng.

Ta nên ăn trứng do các con gà được nuôi một cách thảnh thơi, hạnh phúc. Không nên uống sữa từ những con bò có mang chất căm giận trong mình, nên uống sữa của các con bò được nuôi bằng thực phẩm và phương pháp tự nhiên. Phải hỗ trợ các nông gia chăn nuôi súc vật bằng những phương pháp nhân đạo, tự nhiên. Nên ăn các loại rau được trồng theo phương pháp hữu cơ. Rau cải hữu cơ có thể mắc tiền hơn, để bù lại ta có thể tập ăn ít đi. Ăn ít là một điều có thể tập được.

! Tiêu Thụ Sân Hận Qua Các Giác Quan Khác

Tâm sân hận được nuôi dưỡng không phải chỉ bằng các thức ăn mà còn bằng những gì ta tiêu thụ qua mắt, tai, và ý thức. Như vậy tiêu thụ những sản phẩm văn hóa cũng có liên hệ tới tâm sân hận. Cho nên hoạch định một đường lối tiêu thụ là rất quan trọng.

Tất cả những gì ta đọc trong báo chí, xem trên truyền hình đều có thể độc hại vì có thể chứa đầy những yếu tố sân hận, bức xúc. Một cuốn phim trên màn ảnh, cũng như một miếng thịt bò, có thể chứa đầy sân hận. Báo chí cũng như chuyện trò cũng có thể chứa đầy sân hận.

Đôi khi vì cảm thấy trống trải mà ta chuyện trò. Nhưng chỉ nội trong một giờ những lời nói của người kia có thể đưa vào tâm thức ta rất nhiều độc tố. Nếu ta tiêu thụ quá nhiều độc tố sân hận thì một ngày nào đó sân hận sẽ phát hiện. Vì vậy cho nên tiêu thụ cho có chánh niệm là một điều rất quan trọng.  Khi nghe tin tức hay đọc một bài báo, khi bàn luận một vấn đề gì với người khác cũng có thể là ta đang tiếp nhận những độc tố như khi ta ăn uống thiếu chánh niệm.

! Ăn Cho Đúng Và Ăn Ít Lại

Có nhiều người ăn thật nhiều để quên đi buồn phiền, trầm cảm. Nhưng ăn nhiều quá sẽ gây hại cho bộ phận tiêu hóa và sân hận dễ phát khởi. Ăn nhiều quá sẽ tạo ra quá nhiều năng lượng. Nếu không biết xử lý thì năng lượng ấy có thể biến thành năng lượng của sân hận, tình dục và bạo động.

Khi ăn đúng thì có thể ăn ít lại. Chúng ta chỉ cần phân nửa số lượng thực phẩm tiêu thụ hằng ngày. Muốn ăn cho đúng thì nên nhai ít nhất là năm mươi lần trước khi nuốt. Khi ăn thật chậm, nhai thật kỹ thì thức ăn trong miệng sẽ nhừ nát và dễ tiêu, các chất bổ dưỡng sẽ dễ thấm vào cơ thể. Như thế tuy ăn ít mà lợi cho cơ thể còn hơn là ăn nhiều mà không tiêu hóa.

Ăn là một thực tập sâu sắc. Khi tôi ăn, tôi tận hưởng từng miếng ăn. Tôi ý thức rõ rệt từng miếng ăn trong miệng tôi, tôi ý thức là tôi đang ăn. Chúng ta thực tập chánh niệm về ăn uống bằng cách ý thức rõ là ta đang nhai thức ăn. Nhai thật cẩn thận, nhai với niềm vui trong lòng, thỉnh thoảng dừng lại để nhìn những người thân, bạn bè, tăng thân đang cùng ngồi ăn. Được ngồi thảnh thơi ăn chung với nhau là một niềm vui lớn. Khi ăn trong chánh niệm chúng ta sẽ không ăn trong buồn, giận, lo lắng, không ăn những dự án tương lai. Ăn những thức ăn do những người khác nấu trong thương yêu là một niềm vui lớn.

Khi miếng ăn được nhai càng nhuyễn thì hương vị của miếng ăn càng đậm đà và sẽ ngon gấp bội. Bạn thử tập ăn như vậy một lần đi. Hãy ý thức mỗi cái nhai. Ngay cả khi chỉ nhai một miếng bánh mì cũng vậy. Không cần phải có bơ hay mức ngọt (jelly) kèm theo mà cũng đã rất ngon. Bạn có thể dùng thêm một ít sữa. Tôi không bao giờ uống sữa. Tôi nhai sữa. Sau khi bỏ miếng bánh vào miệng và nhai trong chánh niệm vài lần tôi múc một muỗng sữa cho vào miệng và tiếp tục nhai cẩn thận. Nên biết rằng chỉ nhai bánh mì với một chút sữa như vậy mà ngon không biết chừng nào!

Bánh mì và sữa khi đã được nghiền nát trong miệng đến loãng ra thì đã được tiêu hóa được phần nửa rồi. Khi vào đến bao tử hay ruột thì sẽ tiêu hóa một cách dễ dàng. Bạn sẽ có được rất nhiều niềm vui và tự do khi nhai thức ăn như thế. Ăn như thế thì tự nhiên không cần ăn nhiều.

Khi lấy thức ăn, nên coi chừng con mắt. Đừng quá tin vào con mắt. Chính con mắt xúi giục ta lấy thật nhiều thức ăn. Chúng ta đâu có cần quá nhiều thức ăn. Nếu biết ăn trong chánh niệm và niềm vui thì chỉ cần phân nửa thức ăn mà mắt chúng ta xúi ta lấy. Xin mời bạn thử đi một lần. Nhai một miếng khoai tây, cà-rốt, hay nhai một miếng bánh mì với sữa đơn sơ như vậy có thể là một bữa ăn ngon nhất, trong đời. Mầu nhiệm vô cùng.

Tại Làng Mai, trung tâm thiền tập của chúng tôi tại Pháp, rất nhiều người trong chúng tôi luôn luôn ăn như vậy, nhai rất chậm rãi trong chánh niệm. Ăn như vậy sẽ giúp ích rất nhiều cho thể xác và từ đó cho phần tâm linh.

“Con mắt lớn hơn bao tử”.Phải biết  tập trung năng lượng chánh niệm vào đôi mắt để ý thức rõ rệt số lượng thức ăn cần dùng. Tiếng Trung Hoa dùng danh từ ‘Ứng lượng khí (đồ dùng đựng vừa đủ)’ để chỉ cái bình bát của các Thầy, Cô trong chùa. Cái bình bát đó giúp giới hạn thức ăn. Lấy thức ăn đầy ngang miệng bình là và đủ ăn. Nếu biết ăn uống trong chánh niệm thì sẽ thấy rằng chỉ cần một phân nửa thức ăn mà mắt đang xúi giục ta gắp vào đĩa. Tập ăn ít lại có thể tiết kiệm tiền để mua các thực phẩm hữu cơ và hỗ trợ các nhà trồng trọt hữu cơ. Điều này mỗi chúng ta, mỗi gia đình đều có thể làm được.

! Thực Tập Chánh Niệm Giới Thứ Năm

Tất cả chúng ta cần có một kế hoạch tiết thực (diet) thông minh, trên căn bản của lý tưởng thương yêu và phụng sự. Năm phép Thực Tập Chánh Niệm (Năm Giới Quý Báu) là con đường thoát khổ cho nhân loại và cho riêng mỗi cá nhân. (xem phụ bản A).

Quán chiếu sâu sắc vào cách tiêu thụ là mục đích của phép Thực Tập Chánh Niệm Giới Thứ Năm. Vì ý thức đau khổ do tiêu thụ thiếu chánh niệm gây nên cho nên chúng ta nguyện

“…xây dựng sức khỏe thân thể và tâm hồn bằng cách thực tập chánh niệm trong việc ăn uống và tiêu thụ. Con nguyện chỉ tiêu thụ những gì có thể đem lại an lạc cho thân tâm con, và cho thân tâm gia đình và xã hội con. Con nguyện không uống rượu, không sử dụng các chất ma túy, không ăn uống hoặc tiêu thụ những sản phẩm có độc tố trong đó có một số sản phẩm truyền thanh, truyền hình, sách báo, phim ảnh và chuyện trò. . .”

Nếu muốn chăm sóc tâm sân hận, bực bội, tuyệt vọng thì phải áp dụng Thực Tập Chánh Niệm Giới Thứ Năm này vào đời sống. Nếu uống rượu mà có chánh niệm thì sẽ thấy rằng rượu tạo ra đau khổ. Rượu gây tật bệnh cho cơ thể và gây nên tai nạn chết người. Chế tạo rượu cũng gây nên đau khổ. Dùng các loại ngũ cốc để chế ra rượu có thể tạo ra nạn thiếu thực phẩm trên thế giới. Ăn uống có chánh niệm đem lại những tuệ giác có khả năng giải phóng như thế.

Hãy bàn thảo với những người thân trong gia đình, kể cả với các cháu còn nhỏ tuổi, về một đường lối tiêu thụ. Các cháu tuy còn nhỏ nhưng có thể hiểu vấn đề này và chúng ta nên cho các cháu tham dự bàn thảo. Cả nhà sẽ cùng nhau quyết định nên ăn gì, uống gì xem những chương trình truyền hình nào, chuyện trò về những đề mục nào. Làm như thế là để tự bảo vệ.

Chúng ta không thể nói tới tâm sân hận, không thể luận về cách thức đối trị tâm sân hận mà không chú ý đến những gì mà chúng ta đang tiêu thụ, bởi vì tâm sân hận có liên hệ chặt chẽ với  những gì mà chúng ta đang tiêu thụ. Hãy thảo luận với cộng đồng về một đường lối tiêu thụ có chánh niệm. Tại Làng Mai chúng tôi nỗ lực để tự bảo vệ. Chúng tôi không tiêu thụ những gì có thể nuôi lớn tâm sân hận, bực bội và sợ hãi. Trong mục đích tiêu thụ cho có chánh niệm, hãy thường xuyên thảo luận về những gì chúng ta ăn, cách thức chúng ta ăn uống, làm sao để bớt mua sắm, làm sao để chỉ tiêu thụ những thức ăn tốt cho cả thân lẫn tâm.
! Truyền Thông Với Tâm Từ Bi

Có thể có khi con cái không thể truyền thông được với cha mẹ. Tuy cùng ở chung một nhà mà con có cảm tưởng như là cha hay mẹ xa cách vạn dặm. Trong trường hợp đó cả hai bên, cha mẹ và con, đều khổ. Mỗi bên đều chỉ còn có hiểu lầm, ghét bỏ và xa cách.  Cha mẹ và con cái không biết rằng họ cũng có rất nhiều điểm giống nhau. Họ không biết rằng họ đều có khả năng hiểu nhau, tha thứ và thương yêu nhau. Do đó, nhận diện những gì tích cực có sẵn trong mỗi chúng ta để cho sân hận và những hạt giống tiêu cực không thể chế ngự là một điều rất quan trọng.

! Mặt Trời Vẫn Còn Đó Sau Đám Mây

Khi trời  mưa, ta nghĩ rằng mặt trời không còn có đó. Nhưng nếu đi phi cơ, bay lên quá lớp mây ta lại thấy mặt trời rạng rỡ. Mặt trời luôn luôn còn đó. Khi giận hay tuyệt vọng tình thương yêu cũng vẫn còn đó. Khả năng truyền thông, tha thứ, thương yêu vẫn còn đó. Phải tin tưởng như vậy. Ta giàu có hơn là sân hận, ta giàu có hơn là đau khổ. Phải công nhận rằng trong ta còn có khả năng thương yêu, hiểu biết và từ bi. Biết được như vậy thì không còn buồn, không còn tuyệt vọng. Biết rằng tuy trời đang mưa, nhưng mặt trời vẫn còn đâu đó trên cao. Mưa sẽ tạnh và trời sẽ nắng. Hãy hy vọng. Nếu bạn còn nhớ được rằng những hạt giống tích cực vẫn còn đó trong bạn và trong người kia thì bạn còn có thể vượt thoát và những gì tốt đẹp nhất trong bạn và người kia sẽ lại phát hiện.

Thực tập là để thể hiện điều đó. Thực tập sẽ giúp ta tiếp xúc với ánh sáng mặt trời, với Bụt, với những gì tốt đẹp trong ta để có thể chuyển đổi tình trạng. Bạn có thể gọi những gì tốt đẹp trong bạn bằng danh từ gì cũng được, danh từ mà bạn quen thuộc trong truyền thống tâm linh của bạn.

Trong chiều sâu tâm thức, phải biết rằng ta có khả năng sống hòa bình, an lạc. Hãy giữ vững lòng tin rằng năng lượng của Bụt có ở trong ta. Điều duy nhất phải làm là tìm đến sự giúp đỡ của nguồn năng lượng ấy, nhờ thực tập theo dõi hơi thở trong chánh niệm, thực tập đi, đứng, nằm, ngồi trong chánh niệm.

! Thực Tập Lắng Nghe Sâu

Truyền thông là một thực tập. Muốn truyền thông thì phải khéo léo. Chỉ có thiện chí thôi thì không đủ. Phải học. Có thể là bạn không có khả năng lắng nghe. Có thể là người kia luôn luôn nói lời đắng cay, lên án, trách móc khiến bạn chán ngán, không thể nghe được nữa và chỉ muốn tránh mặt. Bạn tránh mặt người đó vì sợ. Bạn không muốn khổ. Nhưng làm như thế thì có thể gây hiểu lầm. Người kia có thể nghĩ rằng bạn có thái độ khinh mạn, muốn tẩy chay, không thèm để ý, và càng thêm đau khổ. Bạn không muốn gặp mặt người ấy nhưng đồng thời cũng không thể lánh mặt người ấy. Giải pháp duy nhất là thực tập để có thể thiết lập truyền thông trở lại. Con đường thực tập là lắng nghe sâu.

Chúng ta biết rằng có nhiều người đau khổ vì nghĩ rằng không ai hiểu họ hay hiểu hoàn cảnh của họ. Ai cũng bận rộn và hình như không ai có khả năng lắng nghe. Nhưng chúng ta ai cũng cần có một người có thể lắng nghe mình.

Hiện nay có những nhà tâm lý trị liệu chỉ có việc ngồi đó để nghe bệnh nhân thổ lộ tâm tình. Nhà tâm lý trị liệu biết lắng nghe sâu mới thật là một nhà tâm lý trị liệu giỏi. Một nhà tâm lý trị liệu giỏi có khả năng lắng nghe chăm chú, không kỳ thị, không phán xét.

Tôi không biết những nhà tâm lý trị liệu đã tu luyện như thế nào để có được khả năng lắng nghe sâu ấy. Nhà tâm lý trị liệu chắc cũng đầy đau khổ. Trong khi ngồi nghe bệnh nhân những hạt giống đau khổ trong họ cũng sẽ được tưới  tẩm. Nếu một nhà tâm lý trị liệu bị đau khổ của chính mình tràn ngập thì làm sao họ có thể lắng nghe bệnh nhân một cách đàng hoàng? Muốn học làm một nhà tâm lý trị liệu thì phải học nghệ thuật lắng nghe sâu.

Lắng nghe với tâm từ bi là lắng nghe làm sao mà người kia cảm nhận được là bạn đang lắng nghe thật sự, đang cảm thông thật sự, bạn đang lắng nghe hết lòng với tâm từ bi. Nhưng mấy ai trong chúng ta mà có thể lắng nghe được như vậy? Chúng ta đồng ý theo nguyên tắc rằng chúng ta sẽ lắng nghe với quả tim, để có thể thật sự nghe người kia đang nói gì. Chúng ta đồng ý rằng là chúng ta phải cho người nghe cảm tưởng rằng họ đang được nghe và đang được hiểu. Làm được như vậy người kia mới có thể vơi bớt khổ đau. Nhưng, thật ra, trong chúng ta mấy ai mà có thể lắng nghe như vậy?

! Lắng Nghe Để Làm Vơi Bớt Khổ Đau

Lắng nghe sâu, lắng nghe với tâm từ bi không phải là lắng nghe để phân tích hay để tìm biết chuyện gì đã xẩy ra. Ta lắng nghe trước hết là để cho người kia bớt khổ, để cho người kia có cơ hội bộc bạch tâm tư và cảm nhận rằng ít ra là có người đã hiểu mình. Lắng nghe sâu là lắng nghe mà có thể giúp ta thắp sáng tâm từ bi suốt thời gian người kia đang nói, thời gian này có thể là nửa giờ hay bốn mươi lăm phút. Trong khoảng thời gian đó ta chỉ có một ý muốn duy nhất là lắng nghe để cho người kia có cơ hội nói ra và bớt khổ. Đây là mục đích duy nhất. Phân tích, tìm hiểu những gì đã xẩy ra chỉ là kết quả thứ yếu, chỉ là phó sản (by product), của sự lắng nghe. Trước hết là phải lắng nghe với tâm từ bi.

! Tâm Từ Bi Là Linh Dược Giải Độc Sân Hận

Nếu tâm từ bi được duy trì trong suốt thời gian lắng nghe thì sân hận, bực dọc không thể phát hiện. Nếu không thì những gì người ấy nói ra sẽ khiến cho bạn bực dọc, sân hận và khổ đau.  Chỉ cần tâm từ bi thôi, bạn cũng đã được che chở để khỏi bị bực dọc, sân hận và khổ đau.

Vậy thì bạn muốn hành xử như một Bậc Đại Nhân trong khi lắng nghe vì bạn biết rằng người kia đang vô cùng đau khổ và đang cần bạn giang tay cứu độ. Nhưng bạn phải được trang bị để làm công việc đó.

Khi những người lính cứu hỏa đi chữa cháy họ phải có những dụng cụ thích hợp: thang leo, vòi xịt nước và áo chống hơi nóng. Họ phải biết cách tự phòng vệ và biết cách dập tắt lửa. Khi lắng nghe một người đang đau khổ thì bạn đang bước vào một vùng lửa cháy. Vùng lửa khổ đau, sân hận đang đốt cháy bên trong người mà bạn đang nghe. Nếu bạn không có đầy đủ dụng cụ thì bạn chẳng giúp được gì mà lại có thể là nạn nhân vì lửa giận của người kia. Vì vậy bạn cần phải có dụng cụ.

Dụng cụ của bạn là tâm từ bi được nuôi dưỡng và duy trì bằng hơi thở chánh niệm. Hơi thở chánh niệm chế tác năng lượng chánh niệm. Hơi thở chánh niệm giúp bạn giữ vững ước muốn căn bản là giúp người kia bộc lộ tâm tư. Khi người kia nói, có thể là lời nói của người ấy sẽ đầy chua cay, lên án, và phán xét. Lời nói của người ấy có thể sẽ chạm đến khổ đau của chính bạn. Nhưng nếu bạn giữ sáng tâm từ bi, nếu bạn thực tập hơi thở chánh niệm, bạn sẽ được bảo hộ. Bạn có thể ngồi nghe hàng giờ mà không đau khổ. Tâm từ bi sẽ nuôi dưỡng bạn, bạn biết rằng mình đang giúp cho người kia bớt khổ. Bạn hãy hành xử như một vị Bồ Tát. Bạn sẽ là một nhà tâm lý trị liệu tài ba hạng nhất.

Tâm từ bi phát xuất từ hạnh phúc và hiểu biết. Khi tâm từ bi và hiểu biết được thắp sáng thì bạn sẽ được an toàn. Những gì người ấy nói ra không thể làm cho bạn khổ và bạn có thể lắng nghe sâu sắc. Bạn lắng nghe thật sự. Khi bạn không có khả năng lắng nghe với tâm từ bi thì bạn không nên giả vờ đang lắng nghe. Người kia sẽ nhận ra ngay là bạn chỉ có đầy khái niệm về khổ đau nhưng bạn không thật sự hiểu họ. Khi có hiểu biết thì bạn có thể lắng nghe với tâm từ bi, bạn có thể lắng nghe sâu sắc, và phẩm chất của sự lắng nghe ấy là hoa trái của sự tu tập của bạn.

! Nuôi Dưỡng Tự Thân

Tiếp xúc với đau khổ giúp nuôi dưỡng tâm từ bi và nhận diện hạnh phúc khi hạnh phúc có mặt. Nếu không tiếp xúc được với đau khổ thì không biết hạnh phúc đích thực là gì. Vậy thì sự thực tập của chúng ta là tiếp xúc với đau khổ. Nhưng khả năng của mỗi chúng ta có giới hạn. Chúng ta không thể làm quá sức mình.

Vì vậy cho nên phải biết tự chăm sóc. Nếu lắng nghe quá nhiều nỗi khổ, niềm đau, giận hờn, bực bội của người khác thì sẽ bị ảnh hưởng không tốt, vì ta chỉ tiếp xúc với khổ đau mà không có cơ hội tiếp xúc với những yếu tố tích cực. Như thế sẽ mất thăng bằng. Vậy thì trong cuộc sống hằng ngày ta phải thực tập như thế nào để có thể tiếp xúc với những gì tươi mát như trời xanh, mây trắng, chim hót, em bé, bất cứ gì có thể đem lại tươi mát, chữa trị và nuôi dưỡng ở trong ta và chung quanh ta.

Đôi khi ta bơ vơ lạc hướng trong đau khổ, lo âu. Hãy để cho bạn bè cứu giúp ta. Họ có thể nói, “Này bạn, mời  bạn nhìn bầu trời sáng nay. Tuy sương mù nhưng cảnh đẹp biết bao! Thiên đường ở ngay đây. Sao không trở về với hiện tại để thưởng thức cảnh đẹp trước mắt?” Bạn có tăng thân bao quanh, có sư anh, sư chị, có những người có khả năng sống hạnh phúc bao quanh. Tăng thân cứu bạn, giúp bạn tiếp xúc với những mầu nhiệm của cuộc đời. Đây là thực tập nuôi dưỡng, một thực tập rất quan trọng.

Chúng ta phải sống sâu sắc mỗi ngày trong vui vẻ, bình an, trong tình thương, bởi vì thời gian qua mau. Mỗi buổi sáng tôi thắp một nén hương, dâng lên Bụt và tự hứa rằng tôi sẽ sống sâu sắc từng giây, từng phút trong ngày. Chính nhờ thực tập hơi thở chánh niệm, bước chân chánh niệm mà tôi có thể tận hưởng từng giây, từng phút trong cuộc sống hằng ngày. Hơi thở chánh niệm và bước chân chánh niệm là hai người bạn giúp tôi an trú trong hiện tại, ngay bây giờ và ở đây, để có thể tiếp xúc với những mầu nhiệm sẵn đó của cuộc đời.

Chúng ta cần tiếp nhận sự nuôi dưỡng tươi mát. Nghe chuông là một thực tập nuôi dưỡng và dễ chịu. Tại Làng Mai, mỗi khi có tiếng điện thoại, hay tiếng chuông chúng tôi có cơ hội dừng lại, ngưng làm việc, ngưng nói năng, ngưng suy nghĩ. Đây là những tiếng chuông chánh niệm. Khi nghe chuông ta thư giãn thân tâm và trở về với hơi thở. Chúng ta ý thức rằng mình đang còn sống và có thể tiếp xúc với những mầu nhiệm sẵn có đó cho ta. Chúng ta dừng lại một cách tự nhiên, trong niềm vui, không quan trọng, không gò ép. Thở vào, thở ra ba lần trong niềm vui vì biết là ta đang còn sống. Khi dừng lại, ta phục hồi bình an trong ta và ta có tự do. Công việc ta đang làm trở nên vui thích hơn, bạn bè chung quanh ta trở nên  có thật hơn.

Phép thực tập dừng lại và theo dõi hơi thở theo tiếng chuông là một ví dụ về phương pháp thực tập giúp ta tiếp xúc với gì tươi đẹp, nuôi dưỡng trong cuộc sống hằng ngày. Ta có thể thực tập một mình nhưng nếu có tăng thân thì sự thực tập sẽ dễ hơn. Tăng thân luôn luôn có đó. Mỗi khi ta bị chìm đắm trong đau khổ thì tăng thân có thể cứu ta và giúp ta trở về tiếp xúc với những yếu tố tích cực của cuộc đời.

Sự thực tập là biết rõ giới hạn của sức mình. Mặc dầu bạn là một giáo thọ có khả năng lắng nghe đau khổ của người khác nhưng bạn cũng phải tự biết giới  hạn của sức mình. Bạn cần phải đi thiền hành, cần phải thưởng thức một tách trà. Bạn cần được gần gũi với những người có hạnh phúc để được nuôi dưỡng. Để lắng nghe được người khác đồng thời bạn phải tự chăm sóc. Một mặt mỗi ngày bạn cần được nuôi dưỡng bởi những gì lành mạnh, tươi mát. Một mặt bạn phải thực tập nuôi dưỡng tâm từ bi. Có thế bạn mới có đủ hành trang trong sứ mạng lắng nghe người khác. Bạn phải là một Bậc Đại Nhân, nghĩa là một người tràn đầy hạnh phúc cho nên có khả năng cứu độ chúng sanh đau khổ.

! Bạn Là Con Của Bạn

Là cha, là mẹ chúng ta phải lắng nghe con cái. Điều này rất quan trọng bởi vì con ta chính là ta, là tiếp nối của ta. Quan trọng hơn hết là ta phải tái lập truyền thông với con cái ta. Khi đau tim hay đau bao tử ta không bao giờ cắt bỏ tim, bao tử đi. “Mày đâu phải là tim của ta, tim của ta đâu có vậy. Mày đâu phải là bao tử của ta, bao tử của ta đâu có vậy. Ta không muốn dính dáng chi tới mày.” Như vậy là không khôn ngoan. Có thể là bạn đã nói với con trai, con gái bạn những câu tương tự. Như vậy cũng là không khôn ngoan.

Nếu bạn là một bà mẹ thì khi thai nhi bắt đầu tượng hình trong bạn, bạn cảm nhận ngay là bạn và thai nhi là một. Bạn có thể bắt đầu nói chuyện với em bé trong bụng. “Nằm yên đi con, có mẹ đây.” Bạn nói với em bé với tất cả tình thương yêu. Bạn ý thức rằng bạn ăn gì, uống gì thì em bé cũng ăn, cũng uống những thứ đó. Lo âu, hạnh phúc của bạn cũng là lo âu, hạnh phúc của em bé. Bạn với em bé là một.

Nhưng khi sinh con ra, cuống nhau đã cắt lìa, thì ý thức về sự hợp nhất giữa mẹ và con bắt đầu phai nhạt. Khi con lên mười hai, mười ba có thể bạn đã quên đứt đi rằng con bạn là bạn  Bạn nghĩ rằng con bạn là một thực thể riêng biệt. Rồi mẹ con có vấn đề với nhau. Khi có vấn đề với con bạn tin rằng con bạn là một người nào khác, là một thực thể riêng biệt. Bạn có thể nói với con: “Đi đi! Mày không phải là con tao. Con tao đâu có như mày!” Có vấn đề với con cái cũng như có vấn đề với tim, với bao tử. Nếu bạn không thể nói câu đó với quả tim, với bao tử thì lý nào bạn lại nói câu đó với con? Bụt dạy, “Không có một tự ngã riêng biệt.” Bạn và con trai bạn, bạn và con gái bạn chẳng qua chỉ là tiếp nối của bao thế hệ tổ tiên. Bạn và con bạn là những giọt nước trong cùng một dòng sông của sự sống. Tất cả hành vi của con bạn sẽ ảnh hưởng tới bạn – như khi chúng còn trong bụng. Bất cứ hành vi nào của bạn cũng sẽ ảnh hưởng tới các con bạn, bởi vì chúng không bao giờ tách lìa khỏi bạn. Hạnh phúc hay đau khổ của bạn là hạnh phúc hay đau khổ của các con bạn và ngược lại. Vì thế chúng ta phải dốc toàn lực vào việc tái lập truyền thông.

! Bắt  Đầu Một Cuộc Đối Thoại

Vì lầm lẫn và vô minh mà ta nghĩ rằng chỉ có ta là người đau khổ. Ta tin rằng các con ta không đau khổ. Nhưng sự thật là khi ta khổ thì các con ta cũng khổ. Ta có mặt trong mỗi tế bào của con trai, con gái của ta. Cũng thế, bất cứ cảm xúc nào, bất cứ nhận thức nào của con ta cũng là cảm xúc, nhận thức của ta. Vậy thì chúng ta phải nhớ lấy tuệ giác mà ta đã có từ đầu khi mang thai, đó là: con trai ta, con gái ta với ta là một. Hãy bắt đầu một cuộc đối thoại với con trai, con gái của bạn!

Trong quá khứ có thể là ta đã có nhiều sai lầm. Ta đã làm cho bao tử của ta đau bệnh. Cách ta ăn uống, những lo âu, phiền muộn của ta ảnh hưởng nặng nề bao tử, tim, ruột của ta. Ta chịu trách nhiệm với bao tử, tim, ruột của ta. Cũng thế, ta chịu trách nhiệm với con trai, con gái của ta. Bạn không thể chối bỏ trách nhiệm. Khôn ngoan hơn, bạn đến với con và nói: “Con ơi, ba biết rằng con đã khổ nhiều. Trong những năm qua ba cũng đã khổ. Khi con khổ thì ba cũng khổ. Ba đâu có vui được khi con khổ? Ba đã nhận ra rằng cả hai cha con ta đều khổ. Chúng ta phải làm gì bây giờ? Có thể là cha con ta hãy ngồi lại với nhau mà tìm ra một giải pháp. Chúng ta có thể nói chuyện với nhau được không? Ba rất muốn tái lập lại truyền thông, nhưng một mình ba, ba không làm được gì, ba cần con giúp.”

Là cha, là mẹ, nếu bạn nói được những câu như thế với con cái thì tình thế sẽ thay đổi vì bạn đã sử dụng ngôn ngữ của thương yêu. Lời nói phát xuất từ thương yêu, hiểu biết và giác ngộ. Giác ngộ rằng bạn và con bạn là một, rằng hạnh phúc và an vui không phải là một vấn đề cá nhân. Điều đó liên hệ cho cả hai bên, cho bạn và con bạn. Vậy thì những lời nói của bạn phải được phát xuất từ tình thương yêu, từ sự hiểu biết rằng không thể có một tự ngã riêng biệt. Bạn có thể nói được như thế là vì bạn đã hiểu rõ bản tính chân thật của bạn và con bạn. Con gái bạn là như vậy vì bạn là như vậy, bạn và con bạn tương tức. Con trai bạn là như vậy vì bạn là như vậy, bạn và con bạn không thể tách rời.

Hãy thực tập nghệ thuật sống chánh niệm. Hãy thực tập như thế nào để có đủ khôn khéo mà tái lập truyền thông. “Con thân yêu ơi, Ba biết rằng con cũng là ba. Con là tiếp nối của ba và khi con khổ thì không thể nào ba sung sướng. Hai cha con ta hãy cùng nhau chỉnh đốn lại mọi sự. Con hãy giúp ba.” Người con cũng có thể nói những câu tương tự bởi vì nó đã biết rằng ba nó đang đau khổ thì nó cũng không thể nào có hạnh phúc. Nhờ thực tập chánh niệm mà người con có thể nắm được sự thật là không thể có một tự ngã riêng biệt và sẽ học cách tái lập truyền thông với ba mình. Có khi chính người con là người bắt đầu trước.

Vợ chồng cũng vậy. Vợ chồng đã cam kết sống với nhau như một. Đã từng thề nguyền là sẽ cùng nhau chia sẻ hạnh phúc cũng như đau khổ thì khi nói với người bạn đường rằng mình cần giúp sức để làm mới thì đó cũng chỉ là để tiếp tục lời thề năm xưa. Bất cứ ai trong chúng ta cũng có khả năng nói như thế, nghe như thế.

! Bức Thư Tình

Có một thiếu phụ người Pháp thường cất giữ những bức thư tình của chồng. Ông ta đã viết cho bà những bức thư rất đẹp trước khi hai người cưới nhau. Cứ mỗi lần nhận được thư là bà say mê đọc từng câu, từng chữ, từng dòng thư ngọt ngào, thương yêu. Bà rất quý những bức thư đó và cất giữ vào trong một cái hộp đựng bánh bích-qui.  Một buổi sáng nọ, trong khi dọn dẹp ngăn tủ bà tìm thấy cái hộp bích-qui đựng những bức thư năm xưa. Đã lâu lắm bà không thấy cái hộp bích-qui đó. Cái hộp lưu giữ biết bao kỷ niệm đẹp của những ngày đầu, khi mà cả hai người còn trẻ, còn yêu nhau thắm thiết, khi mà cả hai đều nghĩ rằng nếu không có người kia thì chắc sống không nổi.

Nhưng mấy năm gần đây, cả hai vợ chồng đều rất đau khổ. Họ không còn thiết nhìn nhau. Họ không còn muốn nói chuyện với nhau. Họ không còn viết thư cho nhau. Trước ngày bà tìm thấy cái hộp bích-qui, chồng bà cho hay là ông ta sẽ đi xa vì công chuyện nghề nghiệp. Có lẽ là ông không vui thích gì khi ở nhà. Có thể là ông đi xa để tìm đâu đó một chút hạnh phúc, một ít niềm vui. Bà biết vậy. Khi chồng bà cho bà hay là ông phải đi họp ở NewYork bà trả lời “Nếu cần thì anh cứ đi.” Bà đã quen với cái lệ này rồi. Rồi sau hai ngày, thay về nhà như đã định, ông điện thoại về, “Anh cần ở lại thêm hai ngày nữa vì có việc cần.” Bà chấp nhận dễ dàng chuyện đó, vì dầu cho ông có ở nhà bà cũng chẳng hạnh phúc chi mấy.

Sau khi gác điện thoại bà đi dọn dẹp ngăn tủ và khám phá ra cái hộp. Đó là cái hộp đựng bánh “LU”, một loại bánh bích-qui nổi tiếng bên Pháp. Đã lâu lắm bà không mở hộp. Bà gác cái chổi qua một bên và mở nắp hộp. Một mùi thơm dịu quen thuộc tỏa ra. Bà rút ra một lá thư rồi đứng đó để đọc. Bức thư mới ngọt ngào làm sao, đầy hiểu biết và thương yêu. Bà cảm thấy mát mẻ như một mảnh đất khô cằn vừa được mưa tưới.  Sau đó bà đem cái hộp vào bàn, ngồi xuống đọc hết tất cả các bức thư, cả thảy là ba mươi sáu hay ba mươi bảy bức. Hạt giống của hạnh phúc vẫn còn đó trong bà. Những hạt giống đó lâu nay đã bị vùi lấp trong đau khổ, nhưng vẫn còn đó. Cho nên khi đọc những bức thư đầy thương yêu của chồng viết khi còn trẻ, những hạt giống hạnh phúc chôn vùi trong sâu kín tâm thức bà đã được tưới tẩm.

Trong những năm gần đây, chồng bà đã không sử dụng ngôn ngữ ấy nữa. Nhưng bây giờ, đọc những bức thư, bà nghe như chồng bà đang nói những lời ngọt ngào của năm xưa. Ngày xưa hai người đã thật sự có hạnh phúc. Tại sao mà bây giờ hai người sống như trong địa ngục? Bà hầu như đã quên đi là chồng bà đã từng nói với bà những lời yêu thương như thế nhưng đó đã là sự thật. Ông ta đã từng có khả năng nói những lời như vậy.

! Tưới Tẩm Những Hạt Giống Hạnh Phúc

Trong suốt hơn một giờ ngồi đọc thư bà đã tưới tẩm những hạt giống của hạnh phúc trong bà. Bà nhận ra rằng cả chồng bà và bà đều thiếu khéo léo. Cả hai đã tưới tẩm những hạt giống đau khổ của nhau và không có khả năng tưới tẩm những hạt giống hạnh phúc. Sau khi đọc tất cả những lá thư bà quyết định ngồi xuống và viết cho chồng bà một bức thư để nói cho ông ta biết rằng ngày xưa, lúc mới quen nhau, bà đã hạnh phúc như thế nào. Bà viết rằng bà mong tìm lại được những hạnh phúc của ngày nào. Và bây giờ thì bà lại có thể viết cho ông câu “Anh yêu dấu!” với tất cả chân tình.

Bà đã để ra bốn mươi lăm phút để viết bức thư. Đây là một bức thư tình đích thực – gửi cho chàng thanh niên dễ thương đã viết cho bà những bức thư cất trong hộp bích-qui. Trong thời gian đọc thư và viết thư mất gần ba giờ đồng hồ, bà đang thực tập thiền quán mà không biết là mình đang thực tập thiền quán. Sau khi viết xong bức thư lòng bà cảm thấy rất nhẹ nhàng. Thư chưa được gửi đi, chồng bà chưa đọc nhưng bà cảm thấy khỏe hẳn ra. Những hạt giống hạnh phúc trong bà đã được khơi dậy và tưới tẩm trở lại. Bà lên lầu và đặt bức thư lên bàn ông. Sau đó, suốt ngày bà rất hạnh phúc. Bà hạnh phúc vì những bức thư đã tưới tẩm những hạt giống tích cực trong bà.

Trong khi đọc những bức thư và viết thư cho chồng, bà giác ngộ vài điều. Cả hai người đều đã vụng về. Cả hai không biết cách giữ gìn hạnh phúc mà đáng ra họ vẫn có quyền hưởng. Trong khi nói năng, trong khi hành xử họ đã tạo địa ngục cho nhau. Cả hai chấp nhận sống với nhau như một gia đình, như một cặp vợ chồng nhưng không có chút gì hạnh phúc. Hiểu như thế bà tin tưởng rằng nếu cả hai người cùng cố gắng tu tập thì hạnh phúc có thể phục hồi. Bà tràn đầy hy vọng và không còn đau khổ như những năm qua.

Người chồng về nhà, lên phòng và thấy bức thư trên bàn. Trong bức thư bà đã viết: “Em chịu trách nhiệm một phần về sự đau khổ của chúng ta, về tình trạng chúng ta không được hạnh phúc mà đáng ra chúng ta phải được hưởng. Chúng ta hãy làm mới lại, hãy tái lập truyền thông. Hãy thực hiện bình an, hòa điệu và hạnh phúc cho nhau.”  Ông đọc bức thư rất kỹ và quán chiếu sâu sắc về những điều bà viết. Ông không ngờ rằng ông cũng đang thực tập thiền quán. Nhưng quả thật là ông đang thực tập như bà, bởi vì khi đọc thư của bà, những hạt giống hạnh phúc trong ông cũng được tưới tẩm. Ông ở trên phòng rất lâu. Ông quán chiếu và khám phá ra những tuệ giác như bà đã khám phá ngày hôm qua. Nhờ vậy hai vợ chồng đã có cơ hội làm mới và tái lập hạnh phúc.

Đời bây giờ, thiên hạ và những cặp tình nhân không viết thư cho nhau nữa. Họ chỉ nhắc điện thoại lên và nói, “Tối nay có rãnh không? Chúng ta đi chơi nhé!” Thế thôi!  Còn đâu là những kỷ vật để cất giữ, nâng niu! Thật là tội nghiệp! Bạn phải tập viết thư tình trở lại đi! Viết cho những người thương của bạn. Người thương đây có thể là cha, là mẹ của bạn. Cũng có thể là con trai, con gái, là anh, là chị hay là bạn bè của bạn. Hãy dành thì giờ để viết xuống những ân tình yêu thương.

! Phép Lạ Nho Nhỏ

Có nhiều cách để tái lập truyền thông. Nếu bạn cảm thấy khó khăn khi nói chuyện với con, thì sao bạn không thử thực tập hơi thở chánh niệm, bước chân chánh niệm một, hai ngày, rồi sau đó bạn ngồi xuống và viết cho con bạn một lá thư: “Con ơi, ba biết rằng con đang đau khổ. Ba là ba của con và ba biết rằng ba chịu một phần trách nhiệm bởi vì ba đã không biết cách trao truyền cho con những gì tốt đẹp nhất của ba. Ba biết rằng con không thể nói cho ba biết về những đau khổ của con. Ba muốn rằng tình trạng này được thay đổi. Ba muốn luôn luôn có đó để giúp con. Cha con ta hãy giúp nhau để cải thiện truyền thông giữa cha con ta.” Bạn phải học nói với ngôn ngữ như thế.

Tiếng nói thương yêu sẽ cứu chúng ta. Lắng nghe với tâm từ bi sẽ cứu chúng ta. Đó là một phép lạ mà ta có thể làm được, nhờ tu tập. Ta có khả năng làm chuyện đó. Ta có dư bình an, thương yêu và hiểu biết trong chiều sâu tâm thức. Phải cầu cứu đến khả năng đó của ta, cầu cứu Bụt tự thân. Với sự nâng đỡ của bạn bè và tăng thân chúng ta có thể bắt đầu làm mới và tái lập truyền thông.
<<<
Pháp Bụt cao siêu mầu nhiệm<br/> 
Cơ duyên may được thọ trì<br/> 
Xin nguyện đi vào biển tuệ<br/> 
Tinh thông giáo nghĩa huyền vi.
<<<

! Giới thực tập

* [[5 giới tân tu]]
* [[14 giới tân tu]]
* [[Bốn phép tùy niệm]]
* [[Thi kệ thực tập chánh niệm]]
* [[Nghi thức sám hối - Kệ sám hối]]
* [[Nghi thức sám hối - Tùy hỷ hồi hướng]]
* [[Nghi thức tụng niệm - Quay về nương tựa]]
* [[Nghi thức tụng niệm - Hồi hướng]]

! Thực tập

* [[Dành cho người mới bắt đầu]]
* [[Thiền tập]]

! Phật học căn bản

* [[Trái tim của Bụt (đọc tại đây)|Trái tim của Bụt]] - Tài liệu Phật học căn bản (Thích Nhất Hạnh)
** [[Tải xuống bản PDF đọc trên máy tính|https://thuvienhoasen.org/images/file/7mYuwp1G0QgQAB1y/trai-tim-cua-but.pdf]] (Thư viện Hoa Sen)

! Tàng kinh các

* [[Thư viện sách Làng Mai|https://langmai.org/tang-kinh-cac/vien-sach/]]
* [[Thư viện sách Budsas|https://budsas.net/uni/index.htm]]
* [[Đại Tạng Kinh Tiếng Việt]]

! Thiên Long Hộ Pháp
<<<
Thiên, Long, Tu La và Dược Xoa<br/> 
Đến đây nghe Pháp phải hết lòng<br/> 
Ủng hộ đạo Bụt cho bền lâu<br/> 
Tất cả làm theo lời Bụt dạy.<br/> 

Những ai đã đến đây nghe Pháp<br/> 
Hoặc ở dưới đất hoặc trên không<br/> 
Hãy nhìn mọi loài bằng mắt thương<br/> 
Ngày đêm an trú trong chánh pháp.

Nguyện cho thế giới thường an ổn<br/> 
Thấm nhuần phước trí và từ bi<br/> 
Tất cả tội chướng đều tiêu trừ<br/> 
Lìa xa khổ não, thường an lạc.

Đại chúng nhất tâm trì giới luật<br/> 
Công phu thiền định phải tinh chuyên<br/> 
Đóa hoa tuệ giác nở trang nghiêm<br/> 
Khắp nơi mọi loài đều hạnh phúc.
<<<
<<<
Trang nghiêm Tịnh Độ <br>
Nơi cõi ta bà <br>
Đất tâm thanh tịnh <br>
Hiển lộ ngàn hoa
<<<

Các khu vực sau hoa viên được dành riêng cho các thiền sinh.

* [[Hậu đường]] 
! Main points

* Why practice
* Brief review on the fruits and the obstacles of the path
* Practical tips
* Where to go from here

(To be updated)
(Đang cập nhật)
! Mục lục

# [[Kinh quán niệm hơi thở - Bản dịch]]
# [[Kinh quán niệm hơi thở - Chú thích]]
# [[Kinh quán niệm hơi thở - Đại ý]]
# [[Kinh quán niệm hơi thở - Phân tích nội dung]]
# [[Kinh quán niệm hơi thở - Quan niệm về hành trì]]
# [[Kinh quán niệm hơi thở - Phương pháp hành trì]]

Nguồn: https://langmai.org/tang-kinh-cac/vien-sach/giang-kinh/kinh-quan-niem-hoi-tho-dich-chu-giai/
! A. Bối cảnh thực tập

Tôi nghe như sau:

“Hồi đó, Bụt còn ở tại thành Xá Vệ (1), cư trú trong vườn Kỳ Thọ với nhiều vị đại đệ tử nổi tiếng như Xá Lợi Phất, Mục Kiền Liên, Ca Diếp, Ca Chiên Diên, Câu Thi La, A Nậu Lâu Đà, Ưu Bà Đa, A Nan Đà v.v… Trong cộng đồng các vị khất sĩ, những vị trưởng thượng thì lo chăm sóc dạy dỗ các vị khất sĩ tân học, có vị chăm dạy mười người, có vị bốn mươi người. Các vị khất sĩ tân học được chăm sóc và dạy dỗ như thế dần dần thực hiện được nhiều tiến bộ.

Đêm ấy là một đêm trăng tròn ngày lễ Tự Tứ kết thúc mùa an cư (2). Đức Giác Ngộ ngồi ở ngoài trời và xung quanh người, chúng đệ tử khất sĩ quy tụ. Sau khi đưa mắt lặng lẽ nhìn đại chúng Bụt lên tiếng:

“Quý vị khất sĩ, tôi rất hài ,long về những thành quả mà quý vị đã đạt được trong sự tu học. Quý vị hãy tinh tiến lên nữa. Những gì chưa đạt được, hãy đạt cho được, và những gì chưa thực hiện, hãy thực hiện cho xong. Tôi sẽ ở đây, và đợi tại thành Xá Vệ này cho đến ngày trăng tròn chấm dứt tháng an cư thứ tư (3).”

Nghe tin Đức Thế Tôn bảo người sẽ lưu lại Xá Vệ cho đến ngày trăng tròn của tháng thứ tư, các vị khất sĩ lúc bấy giờ hành đạo rải rác ở những miền quê liền lên đường lục tục tìm đến Xá Vệ thăm người. Vào dịp này, các vị trưởng thượng lại càng chăm chú chỉ dạy các vị tân học, vị thì chỉ dạy mười người, vị thì hai mươi người, vị thì ba mươi người, vị thì bốn mươi người… Các vị khất sĩ tân học nhờ đó lần lượt đạt được nhiều tiến bộ đáng kể.

Bây giờ đây, đã đến ngày trăng tròn tháng tư và Bụt cũng đang ngồi ngoài trời với các khất sĩ. Ngồi đưa mắt lặng lẽ quan sát đại chúng một hồi rồi lên tiếng:

> “Quý vị khất sĩ ! Cộng đồng chúng ta đây quả là thanh tịnh và có thực chất tu học, không mang tính chất phù phiếm và ba hoa, xứng đáng được cúng dường, xứng đáng được gọi là phước điền, xứng đáng được kính nể. Cúng dường cho một đại chúng như thế chắc chắn sẽ có công đức. Một cộng đồng như thế này thật là hiếm có và dù xa xôi mấy ai cũng phát tâm tìm tới để quy kính.”

<<<
“Này quý vị, trong đại chúng đây <br>
có những vị khất sĩ đã chứng quả La Hán (4), đã trừ hết mọi phiền não (5), đã trút bỏ được mọi gánh nặng, đã thành tựu được trí tuệ và giải thoát.  <br>
Lại có những vị đã cắt được năm sợi dây ràng buộc đầu (6), chứng được quả Bất Hoàn (7), sẽ không còn trở lại luân hồi;  <br>
có những vị đã cắt bỏ được ba sợi dây ràng buộc đầu, chứng quả Nhất Hoàn (8), hàng phục được phần thô của các phiền não tham, sân và si, và chỉ cần trở lại một lần;  <br>
có những vị đã cắt bỏ được ba sợi dây ràng buộc đầu, chứng quả Dự Lưu (9), đang vững chãi đi về quả vị giác ngộ;  <br>
có vị đang thực tập tứ niệm xứ,  <br>
có vị đang thực tập tứ chánh cần,  <br>
có vị đang thực tập tứ như ý túc,  <br>
có vị đang thực tập ngũ căn,  <br>
có vị đang thực tập ngũ lực,  <br>
có vị đang thực tập thất bồ đề,  <br>
có vị đang thực tập bát thánh đạo (10),  <br>
có vị đang thực tập Từ, có vị đang thực tập Bi, có vị đang thực tập Hỷ, có vị đang thực tập Xả (11),  <br>
có vị đang thực tập cửu tưởng quán (12),  <br>
có vị đang thực tập vô thường quán.  <br>
Lại có những vị khác đang thực tập quán niệm hơi thở.”
<<<

! B. Phép quán niệm hơi thở

“Quý vị khất sĩ! Phép quán niệm hơi thở, nếu được phát triển và thực hiện liên tục, sẽ đem lại những thành quả và lợi lạc lớn, có thể làm thành tựu bốn lĩnh vực quán niệm (Tứ Niệm Xứ); bốn lĩnh vực quán niệm nếu được phát triển và thực tập liên tục sẽ đưa tới trí tuệ và giải thoát.”

“Làm thế nào để phát triển và thực tập phép Quán Niệm Hơi Thở, để phép này mang lại những thành quả và lợi lạc lớn?”

“Này đây, quý vị khất sĩ, người hành giả đi vào rừng hoặc tới một góc cây, nơi vắng vẻ, ngồi xuống trong tư thế hoa sen, giữ thân cho thẳng, và đặt vững chánh niệm trước mặt mình. Thở vào, người ấy biết rằng mình thở vào; Thở ra, người ấy biết là mình thở ra.”

# Thở vào một hơi dài người ấy biết: ta đang thở vào một hơi dài. Thở ra một hơi dài người ấy biết: ta đang thở ra một hơi dài.
# Thở vào một hơi ngắn người ấy biết: ta đang thở vào một hơi ngắn. Thở ra một hơi ngắn người ấy biết: ta đang thở ra một hơi ngắn.
# Ta đang thở vào và có ý thức về toàn thân thể ta; ta đang thở ra và có ý thức về toàn thân thể ta, người ấy thực tập như thế.
# Ta đang thở vào và làm cho toàn thân an tịnh; ta đang thở ra và làm cho toàn thân an tịnh, người ấy đang thực tập như thế.
# Ta đang thở vào và cảm thấy mừng vui (13); ta đang thở ra và cảm thấy mừng vui, người ấy đang thực tập như thế.
# Ta đang thở vào và cảm thấy an lạc (13); ta đang thở ra và cảm thấy an lạc, người ấy đang thực tập như thế.
# Ta đang thở vào và có ý thức về những hoạt động tâm ý trong ta; ta đang thở ra và có ý thức về những hoạt động tâm ý trong ta, người ấy đang thực tập như thế.
# Ta đang thở vào và làm cho những hoạt động tâm ý trong ta an tịnh; ta đang thở ra và làm cho những hoạt động tâm ý trong ta an tịnh, người ấy đang thực tập như thế.
# Ta đang thở vào và có ý thức về tâm ý ta; ta đang thở ra và có ý thức về tâm ý ta, người ấy đang thực tập như thế.
# Ta đang thở vào và làm cho tâm ý ta hoan lạc; ta đang thở ra và làm cho tâm ý ta hoan lạc, người ấy đang thực tập như thế.
# Ta đang thở vào và thu nhiếp tâm ý ta vào định; ta đang thở ra và thu nhiếp tâm ý ta vào định, người ấy đang thực tập như thế.
# Ta đang thở vào và cởi mở cho tâm ý ta được giải thoát tự do; ta đang thở ra và cởi mở cho tâm ý ta được giải thoát tự do, người ấy đang thực tập như thế.
# Ta đang thở vào và quán chiếu tính vô thường của vạn pháp; ta đang thở ra và quán chiếu tính vô thường của vạn pháp, người ấy đang thực tập như thế.
# Ta đang thở vào và quán chiếu về tính tàn hoại của vạn pháp (14); ta đang thở ra và quán chiếu về tính tàn hoại của vạn pháp, người ấy đang thực tập như thế.
# Ta đang thở vào và quán chiếu về giải thoát (15); ta đang thở ra và quán chiếu về giải thoát, người ấy đang thực tập như thế.
# Ta đang thở vào và quán chiếu về sự buông bỏ (16); ta đang thở ra và quán chiếu về sự buông bỏ, người ấy đang thực tập như thế.

Phép Quán Niệm Hơi Thở, theo những chỉ dẫn trên, nếu được phát triển và thực tập liên tục, sẽ đem đến những thành quả và lợi lạc lớn.

! C. Thành tựu bốn lĩnh vực quán niệm

Phát triển và thực tập liên tục như thế nào để phép quán niệm hơi thở có thể thành tựu được bốn lĩnh vực quán niệm (Tứ Niệm Xứ)?

# Khi hành giả thở vào hoặc thở ra một hơi dài hay một hơi ngắn mà có ý thức về hơi thở và về toàn thân mình, hoặc có ý thức là đang làm cho toàn thân mình an tịnh, thì khi ấy hành giả đang an trú trong phép quán thân trong thân, tinh tiến, tỉnh thức, biết rõ tình trạng, vượt khỏi mọi tham đắm cũng như mọi chán ghét đối với cuộc đời. Hơi thở vào và hơi thở ra có ý thức ở đây thuộc về lĩnh vực quán niệm thứ nhất về thân thể.
# Khi người hành giả thở vào hoặc thở ra mà có ý thức về sự vui thích hoặc về sự an lạc, về những hoạt động của tâm ý, hoặc để làm cho những hoạt đông của tâm ý an tịnh thì khi ấy hành giả đang an trú trong phép quán cảm thọ trong cảm thọ, tinh tiến, tỉnh thức, biết rõ tình trạng, vượt thoát mọi tham đắm cũng như mọi chán ghét đối với cuộc đời. Những cảm thọ được chứng nghiệm trong hơi thở có ý thức ấy thuộc về lĩnh vực quán niệm thứ hai là cảm thọ.
# Khi hành giả thở vào hoặc thở ra mà có ý thức về tâm ý, làm cho tâm ý an tịnh, thu nhiếp tâm ý vào định hoặc cởi mở cho tâm ý được giải thoát tự do, thì khi ấy hành giả đang an trú trong phép quán niệm tâm ý trong tâm ý, tinh tiến, tỉnh thức, biết rõ tình trạng, vượt thoát mọi tham đắm cũng như mọi chán ghét đối với cuộc đời. Không có quán niệm về hơi thở thì sẽ không phát triển được chánh niệm và sự hiểu biết.
# Khi hành giả thở vào hoặc thở ra mà quán chiếu về tính cách vô thường hoặc về tính cách phải tàn hoại của vạn pháp, về giải thoát và về sự buông bỏ, thì khi ấy hành giả đang an trú trong phép quán niệm đối tượng tâm ý trong đối tượng tâm ý, tinh tiến, tỉnh thức, biết rõ tình trạng, vượt thoát mọi tham đắm cũng như mọi chán ghét đối với cuộc đời.

Phép Quán Niệm Hơi Thở nếu được phát triển và thực tập liên tục, sẽ đưa bốn lĩnh vực quán niệm đến chỗ thành tựu viên mãn.

! D. Thành tựu viên mãn bảy yếu tố giác ngộ

Nhưng nếu được phát triển và thực tập liên tục, bốn lĩnh vực quán niệm sẽ đưa bảy yếu tố giác ngộ đến chỗ thành tựu viên mãn. Bằng cách nào?

# Khi hành giả an trú trong phép quán thân trong thân, quán cảm thọ trong cảm thọ, quán tâm ý trong tâm ý, quán đối tượng tâm ý nơi đối tượng tâm ý,tinh tiến, tỉnh thức, biết rõ tình trạng, vượt thoát mọi tham đắm cũng như mọi chán ghét đối với cuộc đời, thì lúc ấy chánh niệm của hành giả được duy trì vững chãi và bền bỉ, và hành giả đạt được yếu tố giác ngộ (giác chi) thứ nhất là niệm. Yếu tố này sẽ tiến dần đến thành tựu viên mãn.
# Khi hành giả an trú trong chánh niệm để quán chiếu và quyết trạch về các pháp, đối tượng của tâm ý, thì yếu  tố giác ngộ thứ hai được sinh khởi và phát triển, đó là yếu tố trạch pháp. Yếu tố này sẽ tiến dần đến sự thành tựu viên mãn.
# Khi hành giả an trú trong quán chiếu và quyết trạch về các pháp một cách bền bỉ, tinh cần, vững chãi thì yếu tố giác ngộ thứ ba được sinh khởi và phát triển đó là yếu tố tinh tấn. Yếu tố này sẽ tiến dần đến sự thành tựu viên mãn.
# Khi mà hành giả đã an trú vững chãi và bền bỉ trong sự hành trì tinh tiến thì yếu tố giải thoát thứ tư được sinh khởi và phát triển, đó là yếu tố hỷ lạc xuất thế (17). Yếu tố này sẽ tiến dần đến sự thành tựu viên mãn.
# Khi hành giả được an trú trong trạng thái hỷ lạc rồi thì hành giả cảm thấy thân và tâm của mình nhẹ nhàng và an tịnh, đó là yếu tố giải thoát thứ năm được sinh khởi và phát triển. Đó là yếu tố khinh an. Yếu tố này sẽ tiến dần đến sự thành tựu viên mãn.
# Khi thân và tâm mình đã nhẹ nhàng và thanh tịnh, hành già có thể đi vào định một cách dễ dàng. Lúc đó yếu tố giải thoát thứ sáu được sinh khởi và phát triển. Đó là yếu tố định. Yếu tố này sẽ tiến dần đến sự thành tựu viên mãn.
# Khi đã thực sự an trú trong định, hành giả không còn duy trì sự phân biệt và so đo (18) nữa. Khi đó yếu tố giải thoát thứ bảy là buông thả được sinh khởi và phát triển. Đó là yếu tố hành xả. Yếu tố này sẽ tiến dần đến sự thành tựu viên mãn.

Bốn lĩnh vực quán niệm (Tứ Niệm Xứ) nếu được phát triển và thực tập liên tục sẽ đưa bảy yếu tố giác ngộ (thất giác chi) đến chỗ thành tựu viên mãn như thế.

! E. Thành tựu viên mãn của trí tuệ và giải thoát

Nhưng bảy yếu tố giác ngộ, nếu được phát triển và thực tập liên tục, làm thế nào để có thể đưa đến sự thành tựu viên mãn của trí tuệ và giải thoát?

Nếu hành giả tu tập theo bảy yếu tố giác ngộ, một mình tịnh cư, chuyên quán chiếu về tính cách phải tàn hoại của vạn pháp, quán chiếu về sự tự do, thì sẽ đạt tới khả năng buông bỏ. Đó là do tu tập bảy yếu tố giác ngộ mà thành tựu viên mãn được trí tuệ và giải thoát.

! F. Kết

Đó là những điều Đức Thế Tôn nói. Đại chúng ai nấy đều tỏ vẻ vui mừng được nghe người dạy.
1. Thành Xá Vệ (Sàvatthi): Thủ đô của Vương Quốc KOSALA nằm về phía tây kinh đô Ca Tỳ La Vệ (Kapilavastu).

2. Lễ tự tứ (Pavàranà) được cử hành vào cuối mùa mưa, tức là mùa an cư ba tháng của các vị khất sĩ. Lễ tự tứ là lễ trong đó mỗi vị tu sĩ có mặt cầu xin đại chúng chỉ bảo cho mình biết những thiếu sót và yếu kém của mình trong mùa tu học ba tháng vừa qua. Ngày trăng tròn là ngày cuối của mỗi tháng. Thường thường lễ tự tứ được tổ chức vào cuối tháng Assayuja – tương đương với tháng mười dương lịch, nhưng vào năm nói kinh này thì Bụt muốn lễ được tổ chức trễ hơn một tháng, tức là vào cuối tháng Kattika – tương đương với tháng mười một dương lịch. Mùa an cư năm ấy như vậy dài tới bốn tháng.

3. ngày trăng tròn tháng tư được gọi là ngày Komudi. Komudi có nghĩa là ngày trăng tròn của tháng Kattika. Kumuda là loại sen trắng thường nở ra vào tiết này cho nên ngày trăng tròn tháng Kattika được gọi là Kumudi.

4. La Hán (arahat, tiếng Phạn: arhat): cũng đọc là lô hán hay a la hán, quả vị cao nhất của tiểu thừa. La Hán có nghĩa là ứng cúng (xứng đáng được cung dưỡng), sát tặc (giết được giặc phiền não) và bất sinh (không còn sinh tử luân hồi).

5. Phiền não: những sợi dây ràng buộc tâm ý như: tham, sân, si, mạn, nghi, tà kiến v.vvv Tiếng Pali là kisela. Phiền não tương đương với lậu hoặc (àsava), những chất độc của tâm ý, nguyên do của sinh tử, như tham dục, tà kiến, vô minh.

6. năm sợi dây ràng buộc đầu: đó là năm thứ đầu trong mười triền sử (samyojana) sau đây: kẹt vào tà niệm bản ngã, nghi hoặc, kẹt vào giới cấm và lễ nghi vô lý, tham dục, hờn giận, tham đắm thế giới hình sắc, tham đắm thế giới vô sắc, kiêu mạn, trạo cử (bất an) và vô minh. Triền sử là trói buộc và sai khiến.

Trong đại thừa, thập sử được kể như sau: tham, sân, si, mạn, nghi, thân kiến, biên kiến, tà kiến, kiến thủ kiến và giới cấm thủ kiến. Năm thứ đầu được gọi là độn sử, năm thứ sau được gọi là lợi sử.

7. quả Bất Hoàn (Anàgami-phala): quả vị tu chứng gần quả vị La Hán nhất. Người đạt được quả vị này không còn trở lại luân hồi.

8. quả Nhất Hoàn (Sakadàgami-phala): quả vị tu chứng thấp hơn Bất Hoàn một bậc. Người đạt quả vị này còn trở lại tái sinh một lần nữa.

9. quả Dự Lưu (Sotàpatti-phala): quả vị tu chứng thấp nhất. Người đạt được quả vị này được xem như là đã gia nhập vào dòng sông giác ngộ, thế nào cũng chảy về biển cả giải thoát.

10. tứ niệm xứ (Satipatthàna): bốn lĩnh vực quán niệm, tức là quán niệm thân trong thân, cảm giác trong cảm giác, tâm ý trong tâm ý và đối tượng tâm ý trong đối tượng tâm ý.

11.tứ chánh cần (padhàna): bốn nổ lực chân chính: điều ác chưa phát sinh đừng để cho chúng có cơ hội phát sinh, điều ác đã phát sinh tìm cách tiêu diệt, điều thiện chưa sinh làm cho phát sinh, điều thiện đã sinh tìm cách duy trì và phát triển.

tứ như ý túc (iddhi-pàda): bốn con đường đi tới sự thực hiện sức mạnh tâm linh: quyết tâm, tinh tiến, tâm niệm và quán tưởng.

ngũ căn (indriyana): năm khả năng là đức tin, tinh tiến, chánh niệm, chánh định và trí tuệ.

ngũ lực (bala): năm sức mạnh.

thất bồ đề phần (bojjhanga): bảy yếu tố giác ngộ, sẽ được đề cập tới trong kinh.

bát chánh đạo phần (atthangika-magga): con đường tu học chân chính gồm tám yếu tố: cái thấy chân chính, nếp tư duy chân chính, ngôn ngữ chân chính, hành động chân chính, phương thức mưu sinh chân chính, tinh cần trong nẻo chính, quán niệm đúng chính pháp và thiền định đúng chính pháp.

Tất cả các phép tu trên đây cộng lại thành ba mươi bảy phép tu, được gọi là tam thập thất trợ đạo phẩm (bodhipakkhiya-dhamma).

11. từ, bi, hỷ, xả (brama-vihàra): bốn tâm trạng đẹp đẽ và quý báu không có biên giới. Thường được gọi là tứ vô lượng tâm. Từ là cho vui, bi là cứu khổ, hỷ là vui và vui cái vui của người, xả là buông bỏ, không tính toán hơn thiệt, không ôm ấp kiến thức và buồn giận.

12. cửu tưởng quán: phép quán tưởng về chín giai đoạn tàn hoại của một tử thi từ khi sình lên cho đến khi thành tro bụi.

13. 13 & 14. mừng vui và an lạc: danh từ pìti thường được dịch là hỷ (vui) trong khi danh từ sukha được dịch là lạc (sung sướng). Ví dụ này thường được đưa ra để so sánh hỷ và lạc: Người đi trong sa mạc thấy một dòng nước mát, đó là hỷ, và khi được uống nước mát, đó là lạc. Ở đây pìti được dịch là mừng vui và sukha được dịch là an lạc.

14. tính tàn hoại (viràga): sự phai lạt và tan rã dần dần của các pháp cũng như sự phai lạt và tan rã dần dần của ham muốn. Ràga nguyên có  nghĩa là màu hay nhuộm màu, bây giờ được dùng với nghĩa ham muốn. Viràga là sự tàn phai của màu sắc và của lòng tham muốn.

15. giải thoát: ở đây có nghĩa là sự biến diệt của lậu hoặc và phiền não.

16. buông bỏ: ở đây là buông bỏ những đối tượng mà mình thấy là ảo vọng, không có thực thể.

17. hỷ lạc xuất thế (niràmisa): một thứ hỷ lạc không nằm trong phạm vi dục vọng thân xác.

18. phân biệt và so đo: phân biệt chủ thể và đối tượng, cái ưa với cái ghét, cái được với cái mất. Danh từ upekkha (hành xả) có khi được dịch là indifference (sự lạnh nhạt, không tha thiết), có khi được dịch là equanimity (coi mọi cái như nhau). Tuy danh từ sau (equanimity) khá hơn danh từ trước (indifference), ý niệm buông bỏ vẫn còn là ý niệm căn bản trong từ upekkha. Buông bỏ ở đây là buông bỏ mọi sự phân biệt về chủ thể / đối tượng, yêu / ghét, được / mất, buông bỏ thành kiến, kiến thức, sở đắc v.v… Phật giáo đại thừa đã khai thác được tới nơi tới chốn ý niệm này.
Then chốt của kinh Quán Niệm Hơi Thở là mười sáu phương pháp thở ra và thở vào, phối hợp bốn lĩnh vực quán niệm. Hơi thở cũng được sử dụng như phương thức duy trì sự chú tâm để hành giả nhìn (nhìn kĩ, nhìn lâu, nhìn sâu), để thấy được bản chất của vạn pháp và đạt tới giải thoát.

Vạn pháp được chia làm bốn lĩnh vực gọi là bốn lĩnh vực quán niệm (tứ niệm xứ):thân thể, cảm giác, tâm ý và đối tượng nhận biết của tâm ý. Đối tượng nhận biết của tâm tức cũng là vạn pháp vậy. Tuy chia làm bốn nhưng kỳ thực chỉ có một, bởi vì tất cả bốn lĩnh vực quán niệm đều là đối tượng nhân thức của tâm. Khi tâm nhận thức tâm thì tâm cũng là đối tượng của tâm

Mười sáu phương pháp thở ra và thở vào được chia làm bốn nhóm, mỗi nhóm bốn hơi thở: nhóm đầu lấy thân thể làm đối tượng quán niệm, nhóm thứ hai lấy cảm giác làm đối tượng, nhóm thứ ba lấy tâm ý làm đối tượng, nhóm thứ tư lấy đối tượng tâm ý làm đối tượng.

Sau đó, khi trình bày mười sáu phép quán niệm hơi thở, Bụt nói đến bốn lĩnh vực quán niệm (tứ niệm xứ) và bảy yếu tố giác ngộ, nhắc nhở thêm rằng  phép quán niệm hơi thở nếu được thực hành liên tục sẽ đến sự thành tựu bốn lĩnh vực quán niệm và nếu bốn lĩnh vực quán niệm nếu được thực hành liên tục sẽ đưa đến sự thành tựu bảy yếu tố giác ngộ. Bốn lĩnh vực quán niệm được Bụt nói tới cặn kẽ hơn trong kinh Niệm Xứ; bảy yếu tố giác ngộ cũng được nhắc tới trong kinh Niệm Xứ và trong các kinh khác. Vì vậy cho nên ta có thể nói then chốt kinh này là phép quán niệm hơi thở phối hợp với bốn lĩnh vực quán niệm.
Kinh này có thể được chia làm sáu phần:

! A. Phần thứ nhất nói về trường hợp trong đó kinh được nói ra.

Phần này cho ta thấy được hình ảnh và phong thái cộng đồng tu học hồi Bụt còn tại thế nơi vườn Kỳ Thọ nước Xá Vệ. Vườn Kỳ Thọ phải là một khu vườn rất rộng và có nhiều vây cối, tọa lạc không phải miền quê mà ngay tại thành Xá Vệ. Số lượng đệ tử xuất gia của Bụt cư trú với người lúc đó có thể trên dưới bốn trăm vị, một vị trưởng thượng có thể được giao cho công việc dạy dỗ mười vị, hai mươi vị, ba mươi vị hoặc bốn mươi vị xuất gia tân học… Mỗi buổi sáng, sau giờ thiền tọa, các vị khất sĩ ôm bát vào thành khất thực. Họ về tới trung tâm tu học trước giờ mặt trời đứng bóng để thọ trai. Có khi cả đại chúng được vua hay một nhà giàu sang thỉnh đến thọ trai. Chỉ những nhà thật giàu mới có thể có đủ chỗ ngồi và thức ăn cúng dường cho  một đại chúng đông đảo như thế. Những nhà nghèo khổ thì phải đợi các vị khất sĩ ôm bát đi ngang mới có dịp cúng dường. Cũng có những vị đàn việt chở thức ăn tới cúng dường đại chúng ngay tại trung tâm tu học. Bụt và đại chúng chỉ ăn một bữa trong một ngày. Buổi chiều và buổi tối hoàn toàn để dành cho sự học hỏi và thực tập. Tại trung tâm tu học không có bếp núc nấu nướng. Đại chúng không có trách nhiệm “ứng phú”như các vị xuất gia ngày nay, nghĩa là không phải đi cúng, làm đám ma, cầu siêu và cầu an cho người cư sĩ. Tuy vậy họ có chú nguyện cho người đàn việt trước và sau bữa ăn của họ. Sức chú nguyện của họ rất có hiệu quả bởi vì họ sống đời sống thanh quý và tu học rất nghiêm chỉnh.

Vào những buổi mát trời Bụt chỉ dạy cho học trò của người ngay ngoài trời, dưới những bóng cây. Có khi người dạy học vào những đêm có trăng, như trong trường hợp kinh này. Bụt đã chỉ dạy phép quán niệm hơi thở nhiều lần trước đó (bởi vì đã có nhiều vị đệ tử thực tập), nhưng đây là lần đầu người chỉ dạy thật cặn kẽ, có thể là vì hôm ấy các vị xuất gia từ miền quê quy tụ về khá đông và trong số đó có nhiều vị khất sĩ tân học. Những vị này sở dĩ được có dịp quy tụ về đây là vì họ đã kết thúc khóa an cư sớm hơn các vị cư trú ở trung tâm Kỳ Thọ một tháng. Mùa an cư năm ấy tại trung tâm Kỳ Thọ của Bụt và chư vị đệ tử kéo dài tới bốn tháng. Ta biết rằng Bụt muốn có dịp cho chư tăng trong xứ quy tụ về. Số lượng chư vị xuất gia có mặt đêm ấy có thể đã lên tới ngàn vị.

Đức Thế Tôn đưa mắt lặng lẽ quan sát số người đông đảo đó và mở lời khen ngợi. Rồi nhân đó, người nói kinh Quán Niệm Hơi Thở.

! B. Phần thứ hai là trái tim của kinh. Phần này nói về mười sáu hơi thở phối hợp với bốn lĩnh vực quán niệm.

!! 1. Bốn hơi thở đầu
Trong hơi thở 1 và 2, đối tượng quán niệm thuần túy là hơi thở. Tâm người thở là chủ thể quán niệm và hơi thở là đối tượng quán niệm. Hơi thở có thể ngắn hay dài, thô kệch hay nhẹ nhàng. Hơi thở ảnh hưởng tới tâm, tâm ảnh hưởng tới hơi thở. Tâm và hơi thở trở nên hợp nhất. Tâm và hơi thở là một. Hơi thở là một phần của của thân, cho nên quán niệm về hơi thở cũng là quán niệm về thân

Trong hơi thở 3, hơi thở được phối hợp với toàn thân, hơi thở không còn là một phần của thân nữa mà là một với toàn thân. Ý thức về hơi thở đồng thời cũng là ý thức về toàn thân. Tâm, hơi thở và toàn thân trở nên hợp nhất.

Trong hơi thở 4, sự vận hành hoạt động của thân bắt đầu trở nên lắng dịu và an tịnh lại. Sự an tịnh của hơi thở đưa tới sự an tịnh của cơ thể và của tâm: tâm, hơi thở và cơ thể đồng nhất trong sự an tịnh.

Ngay trong bốn hơi thở đầu, hành giả đã thực hiện phép “thân tâm nhất như”, nghĩa là thân với tâm không phải là hai thực thể riêng biệt. Hơi thở là môi giới mầu nhiệm tạo thành trạng thái nhất như đó.

!! 2. Bốn hơi thở kế
Hơi thở 5 chuyển về Thọ. Thọ tức là cảm giác, có ba loại: khổ thọ (cảm giác khó chịu), lạc thọ (cảm giác dễ chịu) và xả thọ (cảm giác không dễ chịu cũng không khó chịu). Do điều chỉnh hơi thở, quán niệm hơi thở, và làm cho sự vận hành và hoạt động trong cơ thể (nguyên văn là kàyasamkhàra, thân hành) được êm dịu và vi tế mà cảm thọ vui thích phát sinh. Đây là lạc thọ, và là tiến trình tự nhiên do hơi thở 4 đem đến.

Trong hơi thở 6, cảm giác vui thích biến thành cảm giác an lạc và hành giả ý thức về sự an lạc (lạc: sung sướng) ấy.

Các hơi thở 7 và 8 vẫn chú ý vào cảm thọ, bất cứ cảm thọ nào có mặt, những cảm thọ của thân hành (kaya-samkhàra) và của tâm hành (cittasamkhàra). Tâm hành tức là hoạt động của tâm ý gồm có cảm thọ và tri giác. Cảm thọ có thể từ thân thể phát sinh mà cũng có thể từ tri giác phát sinh. Ý thức về cả thân hành và cả tâm hành tức là bao trùm được toàn bộ nền tảng của cảm giác.

Hơi thở 8 làm cho thân hành và tâm hành lắng đọng và an tịnh lại. Tới đây, hành giả thống nhất được thân, tâm, cảm giác và hơi thở một cách hoàn toàn.

!! 3. Bốn hơi thở áp chót

Bốn hơi thở 9, 10, 11 và 12 chuyển về đối tượng tâm. Tâm (citta) là tất cả những hoạt động của tâm (tâm hành) gồm có cảm giác (thọ), tri giác (tưởng) và mọi trạng thái tâm lý (hành). Tâm lý học Phật giáo nói đến 51 loại tâm hành. Nhưng tâm cũng là nhận thức phân biệt và suy tư. Hơi thở 9 bao trùm tất cả hoạt động của tâm, ý thức được những phát hiện của tâm trong giây phút hiện tại . Những hoạt động của tâm tuy thiên hình vạn trạng, nhưng hành giả chỉ quán chiếu những gì đang phát hiện và hoạt động trong giấy phút hiện tại thôi. Hơi thở 10 có tác dụng làm cho tâm ý hoan lạc, bởi vì trong trạng thái an vui tâm dễ đi vào định hơn là trong trạng thái sầu não   lo lắng. Hành giả ý thức được là mình đang có cơ hội thiền tập, rằng không có giờ phút nào quan trọng bằng giờ phút hiện tại, biết an trú trong giờ phút hiện tại vì vậy cảm thọ hoan lạc phát sinh. Hơi thở 11 đưa hành giả vào sự tập trung tâm ý, lấy tâm nhìn tâm, lúc bấy giờ tâm là hơi thở, tâm là sự hợp nhất của chủ thể và đối tượng quán chiếu, tâm là sự an lạc. Tâm là lĩnh vực của quán chiếu và của định lực.

Hơi thở 12 nhằm cởi mở cho tâm nếu tâm còn bị ràng buộc. Ràng buộc hoặc bởi quá khứ hoặc bởi vị lai, hoặc bởi những tình tiết u uẩn khác. Nhờ quán chiếu hành giả biết đâu là những sợi dây ràng buộc làm cho tâm không được an lạc và giải thoát. Hành giả quán chiếu về bản chất của những ràng buộc ấy, để cởi trói cho tâm. Hơi thở liên tục thổi ánh sáng quán chiếu vào tâm để giải thoát cho tâm.

!! 4. Bốn hơi thở cuối

Tâm không phải biệt lập với cảnh. Tâm là nhận thức, là cảm thọ, là yêu ghét, v.v… Nhận thức bao giờ cũng là nhận thức một cái gì, cảm thọ bao giờ cũng là cảm thọ một cái gì, yêu ghét bao giờ cũng là yêu ghét một cái gì. Cái gì ấy tức là đối tượng của tâm; tâm không thể phát hiện nếu không có đối tượng, tâm không thể hiện hữu nếu đối tượng của tâm không hiện hữu. Vì thế, tâm đồng thời là chủ thể nhận thức và đối tượng nhận thức.

Tất cả các hiện tượng sinh lý (như hơi thở, thần kinh, giác quan), tâm lý (như cảm giác, tri giác, nhận thức) và vật lý (như đất, nước, cỏ, cây, núi, sông) đều là đối tượng của tâm và do đó cũng là tâm. Tất cả đều được gọi là pháp.

Hơi thở 13 quán chiếu về tính chuyển biến vô thường của vạn pháp, tâm lý, sinh lý và vật lý. Chính hơi thở cũng là vô thường. Phép quán này rất quan trọng bởi vì nó khai mở cho ta thấy tính cách tương quan tương duyên của vạn vật cũng như tính cách vô ngã (không có tự ngã riêng biệt) của các pháp. Hơi thở 14 cho ta thấy pháo nào rồi cũng tan rã, tàn hoại, để ta không còn ý định nắm bắt riêng một pháp nào, trong đó kể cả những hiện tượng sinh lý và tâm lý trong ta. Hơi thở 15 cho ta thấy không kẹt vào bất cứ một pháp nào, không bị một pháp nào nắm bắt và sai sử tức là đạt tới một niềm vui lớn, niềm vui của giải thoát, của tự do. Hơi thở 16 chiếu rạng trên thái độ buông bỏ của ta, buông bỏ tất cả mọi gánh nặng của vô minh, của nắm bắt. Buông bỏ được tức là đạt tới giải thoát.

Mười sáu hơi thở trên phải được học hỏi và thực tập một cách thông minh. Tuy được trình bày có thứ lớp, những hơi thở này không nhất thiết là phải được thực tập theo thứ tự trên dưới. Có thể nhiều ngày tháng thực tập ta chỉ chuyên về một loại hơi thở thôi, ví dụ hơi thở 14. Tuy nhiên những hơi thở đầu có hiệu lực lớn cho việc tập trung  tâm ý; mỗi lần thiền tập ta nên đi qua những hơi thở ấy.

Mười sáu hơi thở tuy được trình bày một cách đơn giản, nhưng hiệu lực của chúng thật vô lượng vô biên. Tùy theo trình độ tu học của ta mà ta đi cạn hay đi sâu vào những hơi thở ấy. Bụt đã không muốn đưa ra nhiều lý thuyết sợ loạn tâm người mới học, cho nên đã sử dụng những từ ngữ thật đơn giản như vô thường, tàn hoại, giải thoát, buông bỏ, v.v… Kỳ thực ý niệm về vô thường bao hàm trong nó ý niệm vô ngã, không, duyên sinh, vô tướng và vô tác, rất quan trọng cho tiến trình quán chiếu để đi tới giải thoát.

! C. Phần thứ ba nói về bốn lĩnh vực quán niệm.

Thực ra trong phần thứ hai bốn lĩnh vực quán niệm (tứ niệm xứ) đã được đề cập tới rồi, tuy danh từ tứ niệm xứ chưa được nêu lên. Bốn lĩnh vực quán niệm trong kinh này chỉ được đề cập và giảng giải một cách sơ lược thôi.Hành giả phải tìm đọc kinh Niệm Xứ để biết cặn kẽ hơn về những chi tiết

Bốn lĩnh vực quán niệm là thân thể, cảm giác, tâm và pháp(đối tượng của tâm).Công trình quán niệm ở đây được đặt dưới sự giám sát của hơi thở có ý thức

Ở đây ta nên đề cập tới các từ ngữ “quán thân trong thân”, “quán cảm thọ trong cảm thọ”, “quán tâm ý trong tâm ý”, “quán đối tượng tâm ý trong đối tượng tâm ý”.

Bí quyết của thiền quán là chủ thể quán chiếu với đối tượng quán chiếu trở thành bất nhị (không phải là hai cái riêng biệt). Nhà khoa học thường cho mình là hoàn toàn khác biệt với đối tượng mình quan sát và đo lường. Người thiền giả trái lại phải xóa bỏ ranh giới giữa chủ thể và đối tượng. Khi ta quan sát vật gì, ta là vật ấy. “Quán thân trong thân” có nghĩa là trong khi quán hành giả không đứng bên ngoài như một thực tại biệt lập mà phải đồng nhất mình với đối tượng quan sát. Chỉ có đường lối ấy mới đưa hành giả đến chỗ thâm nhập và chứng nghiệm thực tại một cách trực tiếp. Trong thiền quán,không những thân tâm là  nhất như mà chủ thể và đối tượng cũng nhất như. Trong thiền quán những lưỡi dao chia cắt và những ranh giới phân biệt không cón có mặt. Thiền giả trở nên người tham dự (le participant) mà không còn là người quán sát (l’observateur)

Thiền quán trước hết là ý thức một cách minh mẫn những gì đang xảy ra trong bốn lĩnh vực thân, thọ, tâm và pháp. “Tinh tiến, tỉnh thức, biết rõ tình trạng, vượt thoát khỏi mọi tham đắm cũng như mọi chán ghét đối với cuộc đời”. Cuộc đời tức là vạn pháp. Tham đắm cũng như chán ghét là những lớp màn tâm lí ngăn cản không cho ta thấy được chân tướng của vạn pháp. Cả hai thái độ: một là ôm cứng, hai là ruồng bỏ, đều không có tính cách tỉnh thức và minh mẩn, vì vậy hành giả phải vượt thoát chúng mới có thể thành công trong công phu quán chiếu.

! D. Phần thứ tư

Phần thứ tư nói về sự phát sinh và trưởng thành của bảy yếu tố giác ngộ “thất giác chi”
dưới nổ lực quán chiếu và giám sát của hơi thở có ý thức.

Niệm là yếu tố căn bản. Niệm là ý thức, là sự tỉnh táo. Có duy trì và phát triển niệm thì công phu quán chiếu để thấy rõ được vạn pháp mới đưa hành giả tới thành công. “Công phu quán chiếu để thấy rõ vạn pháp” tức là trạch pháp vậy. Tinh tấn là sự bền bỉ, tinh cần. Hỷ lạc và khinh an là những niềm vui nuôi dưỡng tinh tấn. Định là kết quả tất yếu của niệm. Định làm phát sinh trí tuệ, sự hiểu biết và khi hiểu biết hành giả có thể buông bỏ, vượt thoát mọi so đo, phân biệt và yêu ghét thường tình. Buông bỏ tức là hành xả vậy. Người đạt được hành xả sẽ có một nụ cười vừa chứng tỏ được từ bi vừa chứng tỏ được sự hiểu biết.

! E. Phần thứ năm

Phần thứ năm rất ngắn, nhắc rằng bảy yếu tố giác ngộ nếu được phát sinh và thực tập tinh cần, sẽ đưa đến trí tuệ và giải thoát.

! G. Phần thứ sáu

Phần thứ sáu là câu kết thúc của kinh, được áp dụng cho tất cả các kinh.
Hành trì chỉ quán là để đạt tới giải thoát, tức là đạt tới sự cởi mở những trói buộc. Cái gì trói buộc ta? Trước hết là sự quên lãng mà danh từ Phật học là thất niệm. Ta sống như trong một giấc mơ, ta bị lôi kéo về quá khứ, về tương lai, ta bị ràng buộc bởi những đau buồn, hờn giận, thắc mắc, sợ hãi. Trong hiện tại, giải thoát tức là vượt ra khỏi những trạng thái ấy để sống tỉnh táo, vui tươi, an nhiên và tịnh lạc. Sống như vậy mới là đáng sống. Sống như vậy, ta sẽ nguồn vui cho những người thân thuộc và cho những kẻ sống bên ta cũng như chung quanh ta. Đạo Bụt thường nói đến sự giải thoát tối hậu là giải thoát khỏi sinh tử. Cái chết là một niềm đe dọa lớn. Bao nhiêu thắc mắc và sợ hãi đã được phát sinh từ ý niệm chết. Thiền quán cũng là để cởi cho ta sợi dây thắc mắc và sợ hãi đó. Sau đây là những phương pháp hành trì kinh Quán Niệm Hơi Thở được trình bày một cách đơn giản theo tinh thần của kinh.

Hành giả nên chọn những pháp môn hành trì nào thích hợp với mình trong giai đoạn hiện tại để thực tập trước. Tuy mười sáu phép quán niệm hơi thở có liên hệ mật thiết với nhau, hành giả không nhất thiết phải hành trì theo thứ tự các phép quán niệm này. Thứ tự này không có nghĩa là đi tuần tự từ dễ đến khó. Pháp nào cũng mầu nhiệm như nhau, nếu dễ thì cũng dễ như nhau, khó thì cũng khó như nhau.

Tuy nhiên ta có thể nói những phép đầu chú trọng nhiều tới chỉ, và những phép sau chú trọng nhiều tới quán, tuy rằng chỉ và quán không khi nào tách biệt nhau. Có chỉ tức là đã có ít nhiều quán, và có quán tức nhiên là đã có chỉ. Sau đây là những chủ đề quán niệm được phân ra bảy loại như sau:

# Theo dõi hơi thở trong đời sống hằng ngày: cắt ngang thất niệm và suy tưởng (hơi thở thứ nhất và thứ hai).
# Ý thức về thân thể (hơi thở thứ ba)
# Thực hiện thân tâm nhất như (hơi thở thứ tư)
# Nuôi dưỡng bằng thiền duyệt (hơi thở thứ năm và thứ sáu)
# Quán chiếu cảm thọ (hơi thở thứ bảy và thứ tám)
# Điều phục và giải thoát tâm ý (hơi thở thứ chin, mười, mười một và mười hai)
# Quán chiếu thực tướng vạn hữu (hơi thở thứ mười ba, mười bốn, mười lăm và mười sáu)

Người tại gia cũng như người xuất gia, phải biết thực tập hàng ngày chủ đề 1 (“theo dõi hơi thở trong đời sống hàng ngày”) và chủ đề 4 (“ nuôi dưỡng bằng thiền duyệt”). Mỗi lúc thực tập tọa thiền, nên luôn luôn bắt đầu bằng hai chủ đề ấy, rồi sau mới đi tới những chủ đề quán chiếu khác. Mỗi khi thấy tâm trạng bất an, chán nản, buồn bực v.v…thì nên thực tập chủ đề 5 (“ quán chiếu cảm thọ”). Chủ đề 7 là cửa ngõ thoát ly sinh tử, bậc đại trượng phu phải đi qua cửa ngõ này. Đây là tặng phẩm lớn nhất của Bụt. Sáu chủ đề trước đều có chỉ và quán, chủ đề thứ 7 nặng nhất về quán, hành giả khi đã có khả năng tập trung tâm ý khá vững (định lực) rồi thì nên đi vào chủ đề này.

! 1. Theo dõi hơi thở trong đời sống hàng ngày: cắt ngang thất niệm suy tưởng (hơi thở thứ nhất và thứ hai)

Phần lớn đọc giả không phải là những hành giả sống trong rừng, dưới gốc cây hoặc trong tu viện… Trong đời sống hàng ngày, chúng ta lái xe, làm việc trong sở, chờ buýt, nói điện thoại, đi bộ từ cao ốc này sang cao ốc khác, chùi nhà, nấu bếp, dọn dep, phơi áo quần v.v…ta phải biết thực tập quán niệm hơi thở ngay trong khi chúng ta làm các công việc ấy.

Thường thường trong khi làm các công việc này ta cứ để trí óc suy nghĩ vẩn vơ từ chuyện này sang chuyện khác. Những mừng, vui , buồn, giận, bực tức, v.v…. cứ thay nhau đến rồi đi, thuận theo những dòng suy nghĩ mông lung đó. Như vậy, ta sống mà không nắm được chủ quyền của tâm ý, ta sống trong quên lãng. Vậy ta phải nắm lấy hơi thở ta, ý thức về hơi thở ta và theo dõi hơi thở của ta. Thở vào và thở ra, ta biết là ta thở vào hay thở ra, và ta mỉm miệng cười để chứng tỏ ta là ta, ta có chủ quyền trên ta. Bằng hơi thở có ý thức, ta thiết lập sự tỉnh thức (chánh niệm) trong giờ phút hiện tại. Thở và chỉ để ý đến hơi thở thôi, đó là ta đã thiết lập được chỉ, tức là sự định tâm. Hơi thở có ý thức giúp cho tâm ta khỏi phiêu lưu vào thế giới tạp niệm, nghĩa là thế giới của sự suy nghĩ miên man, vớ vẩn.

Phần lớn các công việc ta làm đều có thể đi đôi với phép theo dõi hơi thở này. Khi nào công việc đòi hỏi một sự chú tâm đặc biệt để tránh sự lầm lẫn hoặc tai nạn, ta cần phối hợp hơi thở ý thức với công việc. Ví dụ khi tôi đang nâng một nồi nước sôi đi từ phòng này sang phòng khác, hoặc là khi tôi đang bắt điện. Tôi ý thức được từng cử chỉ của bàn tay tôi. Tôi nuôi dưỡng ý thức ấy bằng hơi thở. “Tôi đang thở ra và ý thức rằng tay tôi đang nâng nồi nước sôi”. “Tôi đang thở vào và ý thức rằng tay phải tôi đang cầm sợi dây điện”. Khi tôi đang lái xe và sắp sửa qua mặt một chiếc xe khác, “tôi đang thở vào và biết rằng tôi đang qua mặt một chiếc xe khác”. “Tôi đang thở vào và biết rằng tình trạng khá an toàn”.v.v…Tuy nhiên, không phải ta chỉ cần phối hợp hơi thở có ý thức với công việc trong trường hợp công việc đòi hỏi nhiều sự chú ý. Ta cũng có thể phối hợp hơi thở có ý thức với bất cứ động tác nào của thân thể. “Tôi đang thở vào và đang ngồi xuống”, “tôi đang thở ra và đang lau bụi trên bàn”. “Tôi đang thở vào và mỉm cười một mình”. “Tôi đang thở ra và chuẩn bị bắt một ấm nước lên bếp”.

Đình chỉ được loạn tưởng (suy nghĩ miên man) và đình chỉ được thất niệm  (sống buông xuôi theo quên lãng) là một bước rất lớn trong thiền tập, mà bước này ta có thể thực hiện được bằng phương pháp theo dõi hơi thở và phối hợp hơi thở có ý thức với công việc ta làm hàng ngày.

Có những người mất hết an lạc và có thể phát điên chỉ vì không đình chỉ được loạn tưởng. Họ phải uống thuốc an thần để ngủ, mong rằng khi ngủ thì tâm trí được nghỉ ngơi. Nhưng khi ngủ, họ vẫn đi qua nhiều lớp mộng mị và những khổ thọ như lo âu sợ hãi và bực tức vẫn tiếp tục đến công phá. Suy nghĩ nhiều quá, bạn có thể bị đau đầu, bạn có thể sẽ bị tổn thất thần khí, vì vậy thực tập phép theo dõi hơi thở và phối hợp hơi thở ý thức với công việc hằng ngày bạn sẽ có thể cắt ngang dòng loạn tưởng, đồng thời thắp sáng được sự tỉnh thức. Thở ra và thở vào có ý thức, đó là một phép tu rất mầu nhiệm mà cũng là một phép tu thật đơn giản, ai cũng có thể thực tập được.

Đây là phép áp dụng hai hơi thở đầu trong số mười sáu hơi thở được nhắc đến trong kinh. Hành giả nên tìm đọc kinh Bốn Lĩnh Vực Quán Niệm (Niệm Xứ Kinh- Satipatthàna Sutta) để bổ túc cho kiến thức đã thu nhận từ kinh Quán Niệm Hơi Thở.

Những vị sống trong chùa, trong thiền viện hay trong những trung tâm thực tập thiền học cũng phải thực hành theo những điều đã chỉ dẫn ở trên. Tuy trong thiền viện có thời khóa buổi sáng, buổi trưa và buổi chiều, nhưng người sống trong thiền viện vẫn sinh hoạt như bất cứ ai khác: đi, đứng, nằm, ngồi, làm việc… Phối hợp ý thức về hơi thở và ý thức về những động tác của thân thể, đó là pháp môn cơ bản để chấm dứt loạn tưởng, sống trong tỉnh thức và vun trồng định lực.

Trong những phút đầu của giờ thiền tọa, hành giả cũng áp dụng phương pháp này để điều hòa hơi thở và nếu thấy cần thiết thì cũng có thể thực tập việc theo dõi hơi thở có ý thức này trong suốt buổi thiền tọa.

! 2. Ý thức về thân thể (hơi thở thứ ba)

Trong thiền tập, thân thể và tâm ý trở thành một hợp thể. Trong tư thế ngồi, nằm, đứng hay đi, ta có thể thực tập ý thức về thân thể ta, ban đầu từ những bộ phận khác nhau, và sau hết đến toàn thể hình hài của ta. Ta có thể bắt đầu bằng tóc trên đầu và đi tới ngón chân. Ví dụ bạn đang ở trong tư thế ngồi thiền. Sau khi điều chỉnh hơi thở,bạn bắt đầu thở ra và quán tưởng: “Tôi đang thở ra và có ý thức về tóc trên đầu tôi”. “Tôi đang thở vào và có ý thức về não bộ của tôi”. Cứ như thế bạn đi dần tới các ngón chân. Trong quá trình thực tập, có thể có những cảm giác và những nhận định được nảy sinh. Ví dụ khi đi ngang trái tim, tôi chợt thấy nảy sinh ra một cảm giác lo lắng về tình trạng trái tim của một người bạn thân. Tôi không xua đuổi cảm giác lo lắng đó. Tôi ghi nhận nó: “Tôi đang thở vào và ý thức rằng tôi đang có cảm giác lo lắng về tình trạng trái tim của bạn tôi”. Rồi bạn tiếp tục hành trình quán chiếu thân thể bạn dưới hơi thở có ý thức. Tôi thêm một ví dụ: khi đi ngang bộ tiêu hóa, tôi chợt thấy hàng triệu sinh vật vi tế đang cùng chung sống với tôi ngay trong ruột tôi. Tôi không xua đuổi cái thấy ấy. Tôi chỉ ghi nhận nó. “Tôi đang thở vào và có ý thức về những vi sinh vật đang cùng sống với tôi và trong tôi”. Nếu bạn thấy cái ý thức về sự cộng sinh của các vi sinh vật ấy là một đề tài thiền quán giàu có, bạn có thể ghi nhận như thế, tự hẹn sẽ trở về với đề tài thiền quán đó, và tiếp tục cuộc hành trình quán chiếu cơ thể của bạn.

Nên biết là chúng ta rất ít để ý tới các bộ phận của cơ thể ta và ta chỉ chú trọng tới chúng khi chúng đau nhức hay bắt đầu có bệnh tật. Bạn có thể bỏ ra hằng chục năm lên xuống ra vào lợi danh, nhưng chưa bạn chưa từng nắm lấy ngón chân út của bạn trong ý thức. Ngón chân út của bạn quan trọng lắm đấy. Nó đã dễ thương với bạn từ trước tới nay. Giả dụ một ngày mai nó có dấu hiệu ung thư trong nó, thì bạn mới tính sao?

Bạn có thể nghĩ rằng ý thức về thân thể là một việc làm không quan trọng lắm, không phải thế đâu. Hiện tượng sinh lý, tâm lý và vật lý nào cũng là một cửa ngõ đưa ta vào chân lý. Bạn có thể quán ngón chân út của bạn và thành đạo. Bản chất của phép tu là ngưng tụ tâm ý để nhìn trong ý thức các bộ phận của cơ thể. Thực tập như vậy, một ngày kia (có thể là ngày mai hay chính chiều hôm nay) bạn có thề sẽ thấy được điều kỳ lạ và sâu sắc có thể thay đổi được cái nhìn và cách sống của bạn. Tóc trên đầu bạn là một vật rất thường chẳng có gì là đặc biệt? Không phải thế đâu! Tóc trên đầu bạn là một sứ giả của chân lý đó. Bạn hãy tiếp nhận ủy nhiệm thư từ những sợi tóc ấy, nhìn cho kỹ và khám phá cho được sứ điệp mà mỗi sợi tóc mang trong nó. Hai mắt của bạn là những hiện tượng sinh lý tầm thường chẳng có gì là đặc biệt ư? Bạn lầm rồi đấy. Chúng là những cánh cửa mở để cho bạn đi vào cõi chân thể mầu nhiệm. Bạn đừng nên xem thường vật gì hết. Nhìn cho sâu, nhìn cho kĩ, bạn sẽ thấy. Đó là thiền tập

! 3. Thực hiện thân tâm nhất như (hơi thở thứ tư)

Trong một buổi thiền tập khác, bạn hãy quán chiếu toàn thể hình hài bạn mà không phân biệt từng bộ phận như trước. “Tôi đang thở vào và có ý thức toàn thân thể tôi” (hơi thở thứ ba của kinh). Trong trường hợp này bạn để hơi thở, thân thể và tâm quán chiếu phối hợp thành một. Hơi thở và thân thể là một. Hơi thở với tâm là một. Tâm với thân là một. Trong phút quán chiếu, tâm không phải là một thực thể tồn tại độc lập ngoài hơi thở và ngoài cơ thể. Biên giới giữa chủ thể quán niệm và đối tượng quán niệm không còn. Đây tức là “quán thân trong thân”. Tâm ý không “đứng ngoài” để quán chiếu nữa. Tâm ý là một với đối tượng quán chiếu. Đây là nguyên lý năng sở không tịch đã được triển khai rất đầy đủ trong truyền thống đạo Bụt đại thừa.

Thực tập như thế trong khoảng từ mười tới hai mươi phút bạn sẽ cảm thấy sự vận hành của hơi thở và của cơ thể bạn trở nên êm tịnh và vi tế, do đó tâm ý bạn cũng trở nên tĩnh lặng hơn nhiều. Khi bạn mới bắt đầu, cả ba thứ (tâm,hơi thở và than thể đều thô phù như bột xay chưa nhuyễn, như người cưỡi ngựa chưa thuần, như tiếng đại hồng chung mới thỉnh. Dần dần cả ba thứ trở nên thuần thục, êm tịnh và vi tế. Bột dần dần thành nhuyễn, ngựa dần dần phi êm, chuông đã bắt đầu ngân nga dìu dặt. Hơi thở thứ tư đưa bạn về phía ấy. “Tôi đang thở vào và làm cho toàn thân tôi an tịnh” “tôi đang thở ra và và làm cho toàn thân tôi an tịnh”. Giống như khi trời nóng bạn uống vào một ly nước chanh đá và cảm thấy mát ruột mát gan, hơi thở của bạn đi vào cơ thể làm an tịnh mọi tế bào trong đó. Đồng thời mọi  “tế bào” của hơi thở cũng trở nên an tịnh hơn và mọi “tế bào” của tâm ý bạn cũng trở nên an tịnh hơn. Ba là một, một là ba; thiền quán là như thế. Ngựa phi êm thì người cưỡi ngựa cũng êm; người cưỡi ngựa càng êm thì ngựa cũng thấy càng êm. Điều này cũng đúng với âm thanh của chuông, màng nhĩ của người nghe và chính người nghe nữa. Hơi thở này đem lại thiền duyệt cho bạn. Thiền duyệt là niềm vui và sự an lạc do thiền đem tới. Đó là thức ăn. Bạn được nuôi dưỡng bằng thiền duyệt thì bạn sẽ vui tươi, đằm thắm, rộng lượng, và những người sống chung với bạn cũng sẽ được thừa hưởng cái hạnh phúc ấy một phần nào.

Hơi thở thứ tư (thở vào và thở ra làm cho toàn thân an tịnh) tuy nhắm tới mục đích làm cho an tịnh sự vận hành của cơ thể (nguyên văn: an tịnh thân hành) nhưng kì thực cũng nhắm tới mục đích làm cho hơi thở và tâm ý an tịnh. Sự an tịnh của một trong ba yếu tố (tâm ý, hơi thở và cơ thể) kéo theo sự an tịnh của hai yếu tố khác. Trong thiền tập, sự phân biệt giữa tâm và thân không còn nữa, và vì vậy hành giả an trú trong trạng thái thân tâm nhất như và không còn thấy chủ thể quán niệm tồn tại ngoài đối tượng của quán niệm.

! 4. Thiền duyệt là thức ăn (hơi thở thứ năm và thứ sáu)

Người tập thiền phải biết tự nuôi dưỡng bằng thiền duyệt, nghĩa là bằng sự an vui của thiền định, để trưởng thành và để có đủ năng lực hành đạo và giúp đời. Đời vừa khổ đau vừa mầu nhiệm. Truyền thống đạo Bụt Phương Nam nhấn mạnh tới tính chất khổ đau, trong khi truyền thống đạo Bụt Phương Bắc không quên nhắc tới những mầu nhiệm của cuộc đời. Trúc tím, hoa vàng, mây trắng, trăng trong v.v… là những biểu hiện mầu nhiệm của pháp thân. Thân thể con người tuy rằng vô thường, vô ngã và bất tịnh nhưng cũng là vô cùng mầu nhiệm. Khi ngồi dưới gốc cây, nơi vắng vẻ, xa lánh cảnh náo nhiệt của thị thành, người hành giả cảm thấy thoải mái và an lạc. Cảm giác thoải mái và an lạc này ta cũng đạt được khi ta xa lìa được những nhiễu nhương và phiền toái của cuộc sống quanh ta. Mỗi cuối tuần, xa lánh được thị thành náo nhiệt và đầy phiền não và thoát được về miền quê, bạn cảm thấy vui mừng và thoải mái. Qua được một kì thi, bạn cảm thấy đã rũ bỏ được hết lo âu. Chấm dứt một ngày bận rộn, tắt được máy truyền hình, đốt lên một cây nhang cho thơm nhà, ngồi lại trong tư thế hoa sen và bắt đầu thực tập nụ cười và hơi thở, bạn cảm thấy một niềm vui. Đó là cảm giác an lạc thứ nhất của thiền tập. Hơi thở thứ năm (“ta đang thở vào và cảm thấy mừng vui”, “ta đang thở ra và cảm thấy mừng vui”) có nhiệm vụ giúp cho bạn có ý thức về cảm giác an lạc ấy. Dứt bỏ được những bận rộn, những phiền toái và những ưu tư vô ích, bạn đi vào chánh niệm với sự vui mừng. Từ sự vui mừng này bạn đi tới sự an lạc một cách dễ dàng.

Hơi thở thứ sáu thiết lập ý thức về sự an lạc. “Ta đang thở vào và cảm thấy an lạc”. Sự an lạc này phát sinh từ sự thoát ly bận rộn, phiền toái và ưu tư. Sự an lạc này cũng phát sinh từ sự thoải mái của cơ thể và của tâm ý.

Khi đau răng ta thấy rằng không đau răng là một lạc thọ, nghĩa là một cảm giác dễ chịu. Vậy mà phần lớn những người không đau răng chẳng khi nào ý thức được cảm giác dễ chịu ấy. Khi hai mắt bị mù, người ta mới thấy rằng có đôi mắt sáng có thể thấy được mây trắng và trời xanh là một điều mầu nhiệm. Tuy vậy phần lớn những người có mắt sáng chẳng khi nào ý thức được sự mầu nhiệm đó. Thiền tập là để ý thức rằng nếu khổ đau có mặt thì mầu nhiệm cũng có mặt. An lạc là thức ăn đầu của thiền giả, và thiền giả không cần đi tìm kiếm sự an lạc ấy ở bên ngoài. Thiền giả chỉ cần ý thức được sự an lạc là tự khắc có an lạc. Lạc thọ cũng giống như khí trời, ta có thể thọ dụng tùy theo nhu cầu của ta. Ta thường phân biệt ba loại cảm giác(thọ): khổ thọ (cảm giác khó chịu), lạc thọ (cảm giác dễ chịu) và xả thọ (cảm giác trung tính, không khó chịu cũng không dễ chịu). Thiền giả, bằng công phu thiền tập của mình, biết biến những xả thọ thành lạc thọ để nuôi dưỡng mình. Những thứ lạc thọ do xả thọ biến thành đều có tính cách lành mạnh và bền bỉ hơn những loại lạc thọ khác. Khi được nuôi dưỡng thường xuyên bằng thiền duyệt, hành giả trở nên thoải mái, dễ chịu, rộng lượng và từ bi; vì vậy pháp lạc sẽ thấm sang những người bên cạnh. Có an lạc, ta mới chia sẻ được sự an lạc với kẻ khác và mới có đủ nghị lực để tiếp nối công việc độ sinh, vốn là một thứ công việc đòi hỏi nhiều gian khổ và kiên nhẫn.

! 5. Quán chiếu cảm thọ (hơi thở thứ bảy và tám)

Các hơi thở thứ bảy và tám cũng nhắm tới sự quán chiếu về cảm thọ. Cảm thọ tức là cảm giác. Không phải chỉ là những cảm giác an lạc mà cả những cảm giác không an lạc nữa. Những cảm giác như bực bội, giận hờn, bất an, lo âu, mệt mỏi, chán nản v.v… đều là những cảm giác không an lạc. Khi một cảm giác như thế có mặt, thiền giả nhận diện nó, ý thức được sự có mặt của nó, nói một cách khác hơn là thắp lên một mặt trời chánh niệm để soi sáng nó. Đó là công trình quán chiếu. Ví dụ như cảm giác bực bội. Thiền giả tự biết: “Sự bực bội có mặt trong ta. Ta đang là sự bực bội”. Và thiền giả thở vào và thở ra trong ý thức ấy.

Pháp Thiền quán của đạo Bụt được thiết lập trên cơ bản bất nhị, vì vậy hành giả không xem sự bực bội là một kẻ thù từ bên ngoài đột nhập vào mà trái lại còn ý thức được rằng trong giờ phút hiện tại mình chính là sự bực bội nữa. Do nhận thức đó, thiền giả không còn có ý chống đối xô đuổi và đánh phá sự bực bội. Thực tập thiền quán không phải là thiết lập một ranh giới giữa thiện và ác trong bản thân mình và biến bản thân mình thành một bãi chiến trường. Đạo Bụt kỵ nhất là việc ấy. Thiền giả đối xử với sự bực bội mình một cách từ bi và bất bạo động. Thiền giả đối phó với sự bực bội của mình bằng một tấm lòng lân mẫn như là đối phó với chính người em ruột của mình. Thắp sáng ý thức chánh niệm lên duy trì ý thức ấy cùng với hơi thở ra và hơi thở vào. Dưới ánh sáng của sự quán chiếu, niềm bực bội sẽ dần biến chất. Biến chất chứ không phải tiêu tán. Mỗi cảm giác là một vùng năng lượng. Cảm giác an lạc là thứ năng lượng có thể nuôi dưỡng. Cảm giác bất an là thứ năng lượng có thể tàn hại. Dưới ánh sáng của quán niệm, năng lượng bất an có thể biến thành năng lượng nuôi dưỡng.

Cảm giác (thọ) có nguồn gốc hoặc từ thân thể (sắc) hoặc từ tri giác (tưởng). Khi ta thiếu ngủ ta có thể có cảm giác mệt mỏi hoặc cáu kỉnh, và như vậy cảm giác có nguồn gốc từ thân thể. Khi ta có tri giác sai lạc về người hoặc về sự việc thì ta có thể có cảm giác tức giận, chán nản hoặc bực bội:cảm giác ở đây có nguồn gốc ở tri giác. Theo đạo Bụt, tri giác của ta rất dễ bị lầm lạc, vì vậy cho nên ta bị khổ sở nhiều. Thiền quán là nhìn sâu vào sự vật để thấy được chân tướng của sự vật và để vượt thoát những tri giác lầm lạc ấy. Nhận lầm sợi dây là con rắn, ta hoảng sợ la lên. Hoảng sợ là một cảm giác. Nhận lầm sợi dây là con rắn là một tri giác sai lạc.

Sinh hoạt có điều độ, giữ gìn cho cơ thể lành mạnh, ta có thể giảm thiểu những cảm giác khổ đau có nguồn gốc sinh lý. Quán sát vạn vật cho sâu sắc: mở rộng tầm hiểu biết và thương yêu, ta có thể giảm thiểu được phẩm và lượng của những cảm giác khổ đau có nguồn gốc tri giác. Quán chiếu một cảm giác tức là nhận biết được những nguyên do xa gần đã làm phát sinh cảm giác ấy. Đi  sâu vào sự nhận biết ấy tức là khám phá được tự tính (bản chất) của cảm giác.

Khi có một cảm giác như bực tức, lo sợ v.v…hành giả ý thức được sự có mặt của cảm giác này và nuôi dưỡng ý thức ấy bằng hơi thở. Duy trì hơi thở ý thức, hành giả kiên trì nhìn sâu vào bản chất của cảm giác. Hễ thấy được thì có giải thoát. Hơi thở thứ bảy nói về hoạt động tâm ý: “Ta thở vào (thở ra) và có ý thức về những hoạt động tâm ý trong ta”. Hoạt động tâm ý ở đây là sự phát sinh, tồn tại và biến chất của các cảm giác vậy.

Hơi thở thứ tám nhắm đến sự biến cải năng lượng của cảm giác. “Ta đang thở vào (thở ra) và làm cho những hoạt động tâm ý của ta an tịnh”. Nhờ sự quán chiếu về bản chất của cảm giác mà thiền giả biến cải được năng lượng không an lạc của một cảm giác thành năng lượng an lạc. Khi ta hiểu được một người thì ta có thể chấp nhận và thương yêu người đó. Mà đã chấp nhận thì ta không còn trách móc và có cảm giác bực bội với người ấy như trước. Năng lượng của cảm giác bực bội trong trường hợp này, có thể được biến thành năng lượng thương yêu

! 6. Điều phục tâm ý và giải thoát cho tâm ý (hơi thở thứ chín,thứ mười,thứ mười một và thứ mười hai)

Hơi thở thứ chín là hơi thở nhận diện những hoạt động tâm ý ngoài cảm giác. “Ta đang thở vào (thở ra) và có ý thức về tâm ý ta”. Tâm ý (citta) ở đây là tổng thể mọi hiện tượng tâm lý trong đó có tri giác,tư tưởng, suy luận, phân biệt, tưởng tượng và cả tiềm thức nữa.

Bất cứ một hiện tượng tâm lý nào phát  khởi trong ta, ta phải nhận diện nó bằng hơi thở có ý thức. Ta lại còn quán chiếu hiện tượng tâm lý ấy để thấy liên hệ giữa nó với toàn bộ tâm ý ta.

Với bốn hơi thở đầu ta có thể đồng nhất ta với hơi thở và cắt đứt mọi suy tư phân biệt và tưởng tượng. Hơi thở thứ chín này là để nhận diện các hiện tượng tâm ý như suy tư và tưởng tượng khi chúng ta phát khởi. Ta đừng nên quên rằng danh từ tâm (citta) là để chỉ cho mọi hiện tượng tâm lý như cảm giác, tri giác, suy luận v.v… với tất cả đối tượng của chúng chứ không phải là để chỉ một chủ thể tâm lý có tính cách bất biến và đồng nhất có thể tồn tại ngoài đối tượng nhận thức. Tâm là một dòng hiện tượng tâm lý luôn luôn chuyển biến sinh diệt, trong ấy sự phát sinh tồn tại và hoại diệt của một hiện tượng có liên quan đến sự phát sinh, tồn tại và hoại diệt của mọi hiện tượng khác. Biết nhận diện những hiện tượng tâm lý đang phát khởi là một công trình thực tập quan trọng. Những hoạt động của tâm ý ta thường thường là lăng xăng và náo động không khác gì một dòng thác đang chảy qua các khe đá: tâm thường được vì như một con vượn không ngừng chuyền cành này sang cành khác hay một con ngựa đang phi. Thấy được sự vận hành của tâm ý nhờ công trình nhận diện rồi, ta có thể nhiếp thu tâm ý và làm cho tâm ý ta lắng lại và cảm thấy an lạc trong trạng thái tâm ý lắng đọng này. “Ta đang thở vào (thở ra) và làm cho tâm ý ta an lạc”. Bạn hãy so sánh hơi thở này với hơi thở thứ tư và thứ tám. Hơi thở thứ tư nhắm đến sự an tịnh của thân thể. Hơi thở thứ tám nhắm đến sự an tĩnh của cảm giác. Hơi thở thứ mười này nhắm đến sự an tịnh của tâm ý. Ba hơi thở này có công dụng đưa ta vào hoan hỷ địa tức là trạng thái vui mừng an lạc của thiền định. Trạng thái này đem lại cho hành giả nhiều thư thái và an lạc và nuôi dưỡng được định lực của hành giả, nhưng hành giả sẽ không ngừng lại tại đây mà phải tiến tới quán chiếu để đạt tới tuệ giác, bởi vì chỉ có tuệ giác mới thực sự đưa ta tới giải thoát.

Hơi thở thứ mười một nào một nhắm đến sự tập trung ý vào một tượng duy nhất. Chỉ khi nào ta tập trung tâm ý bền bỉ trên đối tượng ta mới có thể quán chiếu được đói tượng ấy một cách hiện hữu. Đối tượng ấy có thể là hơi thở,là một hiện tượng sinh lý, một hiện tượng tâm lý (như cảm giác, tri giác, v.v…) hay một hiện tượng vật lý (như một chiếc lá hay một viên đá cuội). Các hiện tượng vật lý này cũng đều được kinh liệt vào hàng đối tượng của tâm ý, không tồn tại độp lập với tâm ý.

Đối tượng của tâm lý trong định là một vùng đối tượng nằm dưới ánh sáng quán chiếu của tâm ý, cũng như một ca sĩ đứng trong một vùng ánh sáng tròn (spotlight) trên sân khấu vậy. Đối tượng này có thể di chuyển trên không gian và thời gian, bởi vì nó cũng sinh động như tâm ý quán chiếu. Trong định, chủ thể quán chiếu và đối tượng quán chiếu trở nên nhất như. Hơi thở cũng là một đối tượng của tâm lý trong định. Khi ta để hết tâm lý vào hơi thở, tâm ta chỉ theo dõi hơi thở, tâm ta với hơi là một, đó là định. Định là ngừng tụ tâm ý trên một đối tượng duy nhất. Sau khi thực tập với hơi thở, bạn có thể thực tập với những hiện tượng sinh lý, vật lý và tâm lý khác. Có định thì công phu quán chiếu mới thành công.

Hơi thở thứ mười hai nhằm tháo gỡ cho những chổ kẹt của tâm lý: “Ta đang thở vào (thở ra) và cởi mở cho tâm ý ta được giải thoát tự do”. Tâm ý của ta có thể đang bị ràng buộc bởi những đau thương hoặc những kỷ niệm về quá khứ, hoặc đang bị lôi kéo bởi những lo lắng và dự tính về tương lai, hoặc đang nằm dưới ảnh hưởng của những cảm giác bực tức, sợ hãi hay nghi ngờ của hiện tượng hoặc đang bị rối ren mờ mịt vì một tri giác thiếu sót… Có định, ta mới có khả năng quán chiếu và cởi mở những chổ kẹt đó do tâm ý ta. Cũng như khi ta muốn gỡ một nùi chỉ rối, ta phải có đủ thư thái và thì giờ. Quán chiếu tâm ý cho bình tĩnh và cho sâu sắc ta mới gỡ rối được cho tâm ý.

! 7. Quán chiếu về thực tướng vạn hữu (hơi thở thứ mười ba,mười bốn,mười lăm và mười sáu)

Hơi thở thứ mười ba nhằm quán chiếu về tính cách vô thường của vạn hữu. Mọi hiện tượng đều vô thường (“chư hạnh vô thường”), sinh lý, tâm lý cũng như vật lý. Vô thường không chỉ có nghĩa là “nay còn mai mất”. Vô thường quán là một phép quán sâu sắc và mầu nhiệm không cùng. Không có một hiện tượng nào có cá thể riêng biệt và thường còn. Tất cả đều chuyển biến thường xuyên và không có tự ngã. Vì vậy vô thường cũng là vô ngã: đây là nhận thức căn bản của đạo Bụt về thực tính vạn hữu. Vô thường cũng có nghĩa là nhân duyên sinh: vạn vật nương vào nhau mà có mặt, vạn vật làm điều kiện sinh khởi và tồn tại cho nhau. Điều kiện tức là nhân duyên. Kinh (Trung A Hàm) nói: cái này có mặt vì cái kia có mặt, nếu cái này không có mặt thì cái kia cũng không (“nhược thử hữu cố bỉ hữu. nhược thử vô cố bỉ vô). Vô thường cũng có nghĩa là vô tướng: thực tại của vạn hữu thoát ly mọi khái niệm và ngôn từ, ta chỉ quen nắm bắt hiện tượng qua những phạm trù tri giác và tư tưởng, do đó không đi vào bản chất của thực hữu một cách trực tiếp. Những phạm trù ấy tức là tướng vậy. Ví dụ về sóng và nước thường được đưa ra để giúp ta hiểu được tính chất vô hướng của vạn hữu. Sóng thì có cao có thấp có sinh có diệt, nhưng bản thân của sóng (là nước) thì không cao thấp sinh diệt. Những “tướng” cao thấp sinh diệt không động tới được bản thân của nước. Ta khóc cười theo tướng, bởi vì ta chưa thấy được tánh. Tánh (Svabhàva) là tự thân của thực tại vạn hữu, tức là của ta vậy? Vô thường cũng là không: thực tại của vạn hữu là vô tướng, không thể được nắm bắt bằng khái niệm và ngôn từ, cho nên được gọi là không. Không ở đây không thể có nghĩa là không đối với có, mà chỉ có nghĩa là vô tướng, thoát ra ngoài mọi nắm bắt của khái niệm, trong đó có các khái niệm sinh, diệt, có, không, thêm, bớt, nhơ, sạch…(Tâm Kính Bát Nhã:”thể moị pháp là không: không sinh cũng không diệt, không nhơ cũng không sạch, không thêm cũng không bớt”). Vô thường cũng là vô tác: vạn hữu có mặt không phải là nhắm tới một mục đích tối hậu nào cả, và vì thế tính của vạn hữu không có thêm, không có bớt, không có thủy, không có chung, người hành giả không cần phải tìm kiếm một sự tu chứng ở bên ngoài, bởi trong tự thân của các pháp đều đã tròn đầy giác tính.

Hơi thở thứ mười bốn nhắm đến sự quán chiếu về tính cách tàn hoại của vạn pháp. “Ta đang thở vào (thở ra) và quán chiếu tính tàn hoại của vạn pháp”. Vạn pháp đều vô thường vì vậy nên phápnào cũng đang trên con đường đi tới tan rã. Một bông hồng, một đám mây, một thân người, một cây cổ thụ… tất cả đều đang đi tới tàn hoại. Đứng về phương diện tướng trạng mà xét thì tất cả các pháp đều đi qua các giai đoạn sinh, trú, dị và diệt. Sinh là phát sinh, trú là tồn tại, dị là biến hoại, diệt là không còn có mặt. Người hành giả mới thực tập cần quán chiếu cho rõ ràng tính cách vô thường và tàn hoại của vạn pháp trong đó có cả hợp thể ngũ uẩn của mình. Riêng về cơ thể, pháp cửu tướng quán đã dược thiền giả sử dụng ngay từ hồi Bụt còn hiện thế. Cửu tướng quán là quán chiếu về sự tan rữa và tàn hoại của một thể xác chết, từ khi trương phình ra cho đến lúc tan thành tro bụi. Xác chết  naỳ là một xác chết để ở bãi tha ma, nhưng cũng là xác thân của chính thiền giả sau này. Trong tác phẩm  Khóa Hư Lục, vua Trần Thánh Tông đã quán tưởng như sau “ khi xưa má mượt môi hồng, ngày nay tro tàn xương trắng… Công danh cái thế chẳng qua một giấc mộng dài, phú quý kinh người, khó tránh vô thường hai chữ. Tranh nhân chấp ngã rốt cuộc là không, khoe giỏi khoe hay rốt cuộc là không, khoe giỏi khoe hay rốt cuộc chẳng thực. Tứ đại rã rời thôi già trẻ; núi khe mòn mỏi hết anh hùng. Tóc xanh chưa mấy mà màu bạc đã pha, kẻ mừng chưa đi thì người điếu đã tới. Bảy thước xương khô mặc sức sân tham tiền của; một bao máu mủ, bao năm khổ luyện ân tình…” Quán thân như vậy mà quán tâm cũng như vậy. Tâm ý sắc sảo và lanh lợi hôm  nay sẽ có thể trở nên lẩm cẩm và chậm lụt ngày mai. Núi sông, nhà cửa, tài sản, sức khỏe đều được quán như thế.

Bạn có thể mỉm cười cho rằng phép quán này có chủ đích đưa ta tới tâm trạng bi quan, làm tiêu tán sự yêu đời và vui sống của chúng ta. Điều này đúng mà không đúng. Thuốc tuy đắng nhưng có thể chữa được bệnh tật của ta. Sự thật tuy phũ phàng nhưng có cách trị liệu. Sự thực là nền tảng  của giải thoát thực sự.

Sự sống rất mầu nhiệm và không có ngằn mé. Nhựa sống reo vang trong mọi sinh thể, từ khoáng vật qua thực vật đến sinh vật. Chỉ vì ta tự giam hãm ta trong ý niệm của một cái ta nhỏ bé nên ta lâm vào trạng thái mờ ám, hạn hẹp, lo sợ và đau buồn. Theo cái thấy hẹp hòi của ngã chấp, chỉ cơ thể ta, nhà cửa ta, vợ (chồng) con ta, sản nghiệp ta… mới là sự sống. Nhưng nếu thoát ra được những biên giới ta tự tạo cho ta, ta sẽ thấy sự giống nhau của ta có mặt khắp nơi và sự tàn hoại của những hiện tượng không động tới sự sống của ta được, cũng như sự sinh diệt của các làn sóng không  đụng tới sự tàn vong của nước. Quán chiếu về sự tính tàn hoại của vạn pháp như thế, ta có thể mỉm cười trước sinh tử và ta đạt được một niềm an lạc và vui sống rất cao.

Hơi thở thứ mười lăm chính là để đưa ta thoát ra cá thể đi vào đại thể. “Ta đang thở vào (thở ra) và quán chiếu về giải thoát”. Giải thoát ở đây là giải thoát khỏi những ý niệm sinh tử, còn mất, thêm bớt…, những ý niệm làm căn bản cho tham đắm, lo sợ và giận hờn. Giải thoát ở đây là tự do, là niết bạn, là sự vắng mặt của những biên giới thoát ra ngoài sinh diệt.

Hơi thở thứ mười sáu, cũng như hơi thở thứ mười lăm, nhằm giúp ta quán chiếu để buông bỏ tham đắm, lo sợ và giận hờn. Thấy được trong túi mình có viên quý ngọc, ta buông bỏ thái độ quỵ lụy và bỏn xẻn của một người bần cùng. Thấy được mình là con sư tử, ta không còn luyến tiếc chiếc vú của con cừu mẹ. Thấy mình là mặt trời, ta buông bỏ thói quen sợ gió của một cây đèn dầu. Cũng như thế, thấy được sự sống không biên giới, ta buông bỏ tất cả mọi giới ngục tù. Nhìn vào đâu ta cũng thấy ta, ta cũng thấy sự sống của ta, vì vậy ta phục vụ cho mọi hình thức của sự sống, cho mọi loài đang sống với chí nguyện của một vị bồ tát, nghĩa là một người thức tỉnh lớn.

Buông bỏ ở đây không có nghĩa là từ giã một cái để nắm bắt một cái khác. Buông bỏ ở đây là buông bỏ sự phân biệt, thấy được rằng không có gì mất đi cũng không có gì thêm vào, ranh giới giữa ta và người là giả tạo. Người hành giả không từ giã “thân phận con người” để tìm tới địa vị một đức Phật. Hành giả thấy Phật ngay trong thân phận con người của mình, không buông bỏ gì hết, cũng không tìm cầu gì hết. Đó là ý nghĩa của danh từ vô tác (có khi gọi là vô nguyện). Đó cũng là ý niệm về vô đắc mà đạo Bụt đại thừa đã phát triển một cách đầy đủ. Buông bỏ để là tất cả và để được hoàn toàn tự do. Điều này đã có nhiều người làm được, và mỗi người trong chúng ta có thể làm được nếu có ý chí.

Xin nhắc lại: thứ tự của mười sáu hơi thở là thứ tự của bốn lĩnh vực quán niệm: thân thể, cảm thọ, tâm ý và đối tượng tâm ý. Người hành giả thông minh biết điều phục hơi thở và thân tâm để vun bồi định lực trước khi đi sâu vào công trình quán chiếu. Thiền tập vừa nuôi dưỡng thân tâm vừa khơi mở cái thấy. Cái thấy đó làm cho hành giả không tham đắm cũng không chán ghét cuộc đời. Nó làm cho người hành giả an vui, trầm tĩnh, độ lượng và từ bi.

Cũng xin độc giả nhớ tìm đọc kinh Bốn Lĩnh Vực Quán Niệm (Niệm Xứ Kinh- Satipatthàna Sutta) và phối hợp những lời chỉ dạy của Bụt trong kinh này với kinh Quán Niệm Hơi Thở để tạo cho sự hành trì càng thêm có kết quả đẹp.

Trong mùa thủy tiên nở ở Pháp Thân Tạng
Tháng ba năm 1986
Kinh Quán Niệm Hơi Thở và kinh Bốn Lĩnh Vực Quán Niệm (Niệm Xứ) không đề cập đến phép đếm hơi thở, chưa đề cập tới trình tự sổ tức, tùy tức, chỉ, quán, hoàn và tịnh (lục diệu pháp môn), không nói tới tướng (kanisa), không nói tới tứ thiền và tứ vô sắc định. Những pháp môn ấy có thể đã được thiết lập bởi những thế hệ hành giả kế tiếp nhằm phục vụ những căn trí khác nhau của người thực tập. Những pháp môn ấy ta không nên xét đoán và bình phẩm trước khi ta thực tập.

Phép đếm hơi thở (sổ tức) đã được chấp nhận một cách rộng rãi và đã đi vào kinh luận, kinh Tăng Nhất A Hàm trong Hán Tạng (kinh thứ 125 Đại Tạng Tân Tu, Phẩm An Ban, quyển 7 và 8) chưa nói đến phép đếm hơi thở, nhưng đã nói về việc phối hợp hơi thở với tứ thiền. Kinh Tu Hành Đạo Địa (kinh thứ 606 của Đại Tạng Tân Tu,quyển 5) trong phẩm thứ 23 (được gọi là Sổ Tức Phẩm) đã đồng nhất phép quán niệm hơi thở với phép đếm hơi thở. Kinh này cũng nói tới tứ thiền.

Sổ tức là 1 phương pháp mà người mới học nên sử dụng. Thở vào, đếm “1”.Thở ra, đếm “1”. Thở vào, đếm “2”. Thở ra, đếm “2”. Như thế cho đến “10”,rồi bắt đầu trở lại. Nửa chừng nếu quên con số thì hành giả đếm trở lại “1”. Phép đếm giúp hành giả cắt bỏ loạn tưởng và tập trung vào hơi thở và con số. Khi đã đạt được sự chú tâm rồi, việc đếm trở thành nhàm và hành giả bỏ đếm để theo dõi hơi thở. Theo dõi hơi thở tức là Tùy Tức. Các bộ luận danh tiếng như Patisambhidà Magga (Vô Ngại Đạo Luận) Vimutti Magga (Giải Thoát Đạo Luận) và Visuddhi Magga (Thanh Tịnh Đạo Luận) đều dạy rằng trong khi thở nên chú tâm ở đầu mũi tức là nơi không khí đi vào và đi ra khỏi thân thể. Hình ảnh lưỡi cưa được đưa ra làm ví dụ. Khi ta cưa 1 cây gỗ, ta hay nhìn vào chỗ răng cưa bắt đầu đi vào cây gỗ. Ta không theo dõi răng cưa đi vào trong cây gỗ, ta chỉ nhận thức chỗ những răng cưa bắt đầu đi vào cây gỗ mà thôi. Ta không theo không khí đi vào cơ thể. Ta chỉ chú tâm ở đầu mũi nơi không khí ra vào. Nhiều vị luận gia cho rằng nếu theo dõi hơi thở đi vào cơ thể thì đối tượng chú tâm sẽ không thuần nhất và do đó khó đạt được định. Cũng vì vậy họ hiểu rằng chữ toàn thân của hơi thở (the entire breath body) chứ không phải là toàn bộ thân thể của hành giả. Theo sát văn mạch của kinh, ta thấy lối giải thích này không được ổn. Hơi thở thứ 3 là hơi thở trong đó đối tượng của sự chú ý (định) không phải chỉ là hơi thở mà còn là cả thân thể của hành giả, cũng như hơi thở thứ bảy bao gồm cả những cảm giác và hơi thở thứ chin bao gồm tất cả tâm ý.

Trong hơi thở thứ tư (“ta đang thở vào (thở ra) và làm cho toàn thân an tịnh”) chữ  toàn thân không còn có thể được hiểu là toàn thân của hơi thở được nữa. Tất cả bốn hơi thở đầu, đều lấy hình hài làm đối tượng, vì thân thể là lĩnh vực quán niệm thứ nhất trong tứ niệm xứ. Tuy trong hai hơi thở đầu đối tượng chỉ là thuần hơi thở, nhưng hơi thở cũng là một phần của hình hài. Sang tới hai hơi thở kế tiếp, trọn vẹn hình hài đã được lấy làm đối tượng.

Sở dĩ các tác phẩm Patisambhidà (Vô Ngại Đạo Luận, của Mahànàma), Vimuttimagga Giải Thoát Đạo Luận, của Upatissa) và Visudhimagga (Thanh Tịnh Đạo Luận, của Buddhghosa) đều khuyên hành giả để tâm ở chót mũi mà đừng theo hơi thở đi vào cơ thể là vì các tác giả cho rằng đi theo hơi thở vào thân thể thì tâm lý sẽ bị phân tán và không đi vào tứ thiền được. Giải Thoát Đạo Luận ra đời vào khoảng cuối thế kỉ thứ tư dương lịch, Vô Ngại Đạo Luận vào đầu thế kỉ thứ năm và Giải Thoát Đạo Luận sau đó không lâu. Các tác phẩm này đều nhấn mạnh đến sự cần thiết của chỉ (Samàtha ) như điều kiện căn bản của quán (vipassana). Chỉ đây là tứ thiền và tứ vô sắc định. Để tâm ở đầu chót mũi và ý thức về sự sinh khởi và xúc chạm của không khí ở nơi cửa ngõ của thân thể này thì cũng như người thợ cưa chỉ nhìn vào sự xúc chạm của những chiếc răng cưa với cây gỗ chứ không theo dõi những chiếc răng cưa mà đi vào đi ra cây gỗ. Dần dần hơi thở từ thô kệch trở nên tế nhị và cuối cùng không còn được phân biệt nữa. Lúc ấy một dấu hiệu tướng (kasina) sẽ hiện lên, có thể như là một nhúm bông gòn trắng, cho hành giả một  cảm giác mát mẻ và dễ chịu như gió mát. Nếu hành giả chú tâm vào tướng này thì sẽ đi vào định, vào sơ thiền. Sơ thiền là bước đầu. Sau đó có nhị thiền, tam thiền và tứ thiền. Trong các trạng thái thiền định, năm giác quan không còn hoạt động nữa, nhưng tâm ý hành giả vẫn hoàn toàn sáng suốt và tỉnh táo. Sau tứ thiền còn có tứ vô sắc định: cõi không gian vô biên, cõi tâm thức vô biên, cõi vật thể toàn không và cõi không phải tri giác cũng không phải không tri giác.

Thích Ca Mâu Ni  hồi chưa thành đạo đã có đến thụ giáo với các đạo sĩ Du già Bà La Môn và cũng đã thực tập tứ thiền và tứ vô sắc định với họ. Sau đó người đã nói rằng các trạng thái thiền định như  “vô sở hữu xứ” (cõi vật thể toàn không) và “phi tưởng phi phi tưởng xứ”(cõi không phải tri giác cũng không phải không tri giác) của đạo sĩ Uddaka không đưa con người tới nơi giải thoát được. Chính trong các kinh căn bản về thiền tập như kinh Quán Niệm Hơi Thở và kinh Bốn Lĩnh Vực Quán Niệm, người cũng không nói đến tứ thiền và tứ vô sắc định. Vậy ta phải đặt vấn đề về ảnh hưởng của các hệ thống Du Già –Ưu Bà Ni Sa Đàm (Upanishadic-Yogic) trên lĩnh vực thiền tập của đạo Bụt. Điều mà ta nên nhấn mạnh ở đây là phép tứ thiền và tứ vô sắc định không phải là những điều kiện cần thiết để đạt tới vị giác ngộ,trong khi các phép quán niệm mà Bụt dạy trong kinh Bốn Lĩnh Vực Quán Niệm được xem như là “con đường duy nhất” để đi tới giải thoát. Có những hành giả lâu ngày thực tập không đi vào tứ thiền bèn nghĩ rằng mình không có khả năng tu tập giác ngộ. Có những hành giả chỉ vì ao ước đi vào tứ thiền mà lạc vào thiền bệnh, trở thành bất an. Thực tập đúng theo lời Bụt dạy trong kinh Quán Niệm Hơi Thở và Bốn Đối Tượng Quán Niệm thì sẽ không bị lạc vào những trường hợp đáng tiếc ấy.

Tại nước ta, vào đầu thế kỉ thứ ba, thiền sư Tăng Hội trong lúc đề tựa cho kinh An Ban Thủ Ý cũng đã nói đến tứ thiền rồi, nhưng tứ thiền của Tăng Hội được phối hợp với các phép quán: quán thân, quán trời đất, quán thịnh suy, tồn vong v.v… để đi tới giải thoát. Thiền Sư Tăng Hội cũng đã nói tới sáu pháp môn mầu nhiệm liên hệ tới phép quán niệm hơi thở (lục diệu pháp môn): đếm hơi thở (sổ tức) theo hơi thở (tùy tức), đình chỉ tâm ý (chỉ), quán chiếu vạn pháp (quán), trở lại nguồn tâm (hoàn) và vượt thoát ý niệm chủ thể và đối tượng (tịnh), Tăng Hội cũng đã nói tới phương pháp tập trung tâm vào chót mũi. Kinh Tu Hành Đạo Địa (Kinh thứ 606 của Đại Tạng Tân Tu) trong phẩm Sổ Tức (phẩm số 23) cũng nói đến tứ thiền, đến pháp sổ tức, đến lục diệu pháp môn và đến phương pháp tập trung vào chót mũi, nhưng chưa nói đến pháp Sổ Tức và đến lục diệu pháp môn.

Ta nên biết là các kinh điển đã được truyền khẩu hàng mấy trăm năm trước khi được chép xuống. Những ảnh hưởng bên ngoài có thể len vào trong bất cứ thời gian nào. Kinh Quán Niệm Hơi Thở (An Ban Thủ Ý Kinh) và Kinh Bốn Đối Tượng Quán Niệm (Niệm Xứ Kinh) được xem như là những bảo bối của sự tu tập hàng ngày đã được các vị xuất gia truyền lại từ thế hệ này sang thế hệ khác một cách cẩn trọng, vì vậy những sai lầm thất thoát và những ảnh hưởng bên ngoài đã có thể có rất ít. Trong lịch sử đạo Bụt, có những kinh điển đã được kết tập về sau,trong Nam Tông cũng như ở Bắc Tông, nhất là ở Bắc Tông. Cách thức truyền thừa hiểu biết và hành trì có thể làm biến dạng và khô cứng kinh điển. Các kinh điển đại thừa giúp ta nhìn trở lại và khám phá chiều sâu của những kinh điển nguyên thủy. Những tư tưởng lớn của các kinh điển Đại Thừa đều đã có hàm chứa trong các kinh điển nguyên thủy. Khi ta trở về với các kinh điển nguyên thủy, ta sẽ có một cái nhìn có gốc rễ và vững chãi hơn về kinh điển đại thừa. Nếu chỉ ngồi trên hai cánh của con chim Đại Thừa, có thể là ta sẽ bay quá xa, và đánh mất sự liên lạc với nguồn gốc của con chim ấy.

Tuy các kinh Quán Niệm Hơi Thở (An Ban Thủ Ý) và Bốn Lĩnh Vực Quán Niệm (Niệm Xứ Kinh) tuy không nói đến tứ thiền và tứ vô sắc định, nhưng không phải vì thế mà không nhấn mạnh tới sự cần thiết của định lực, nghĩa là đến công dụng và sức mạnh của sựn tập trung tâm ý. Thiền quán có hai mặt: ngưng lại (chỉ), để nhìn thấy (quán). Ngưng lại là định, và nhìn thấy là tuệ. Quán niệm hơi thở hay quán niệm về những đối tượng khác như thân thể, cảm giác, tâm thức, đối tượng tâm thức v.v…đều là nhằm mục đích tập trung tâm ý trên một đối tượng để rồi có thể nhìn thấy được đối tượng ấy trong chiều sâu của nó. Tập trung tâm ý tức là ngưng (chỉ) sự rong ruổi của tâm ý từ đối tượng này sang đối tượng khác để chỉ dừng lại trên một đối tượng. Dừng lại trên một đối tượng để nhìn (quán) đối tượng ấy, và nhìn sâu vào đối tượng ấy. Chỉ và Quán do đó đi đôi với nhau. Nhờ có dừng lại ( chỉ) ta mới có thể nhìn (quán). Càng nhìn sâu (quán) thì sự tập trung ý (chỉ) càng lớn. Ngưng tụ tâm ý (chỉ) thì tự nhiên thấy (quán). Thấy (quán) thì tâm ý càng thêm ngưng tụ (chỉ). Ta có thể nói không có chỉ thì không có quán và không có quán thì chỉ không vững vàng. Điều ta cần nhớ tới ở đây là tuy các kinh Quán Niệm Hơi Thở và Bốn Đối Tượng Quán Niệm không nói đến tứ thiền và tứ vô sắc định, nhưng bản chất của kinh vẫn là sự tập trung tâm ý (chỉ) để mà quán chiếu (quán). Vậy ta không cần đi tìm đâu xa nữa, và hãy chỉ nắm lấy phương pháp đơn giản do Bụt chỉ dạy trong các kinh này.
! Early Buddhism Meditation

!! Guide

* [[With Each & Every Breath: A Guide to Meditation|https://www.dhammatalks.org/books/WithEachAndEveryBreath/Contents.html]] (Ṭhānissaro Bhikkhu) ([[Download|https://www.dhammatalks.org/ebook_index.html#eachandeverybreath]])
* [[Keeping the Breath in Mind & Lessons in Samadhi|https://www.dhammatalks.org/books/KeepingTheBreath/Section0000.html]] (Ajaan Lee Dhammadharo) ([[Download|https://www.dhammatalks.org/ebook_index.html#keepingthebreath]])
*  Mindfulness, Bliss, and Beyond: A Meditator's Handbook (Ajahn Brahm) ([[Information|https://www.goodreads.com/book/show/206625.Mindfulness_Bliss_and_Beyond]])

!! Sutta
* [MN118] [[Mindfulness of breathing]] (Ānāpānasati Sutta)
* [MN10] [[The Establishing of Mindfulness Discourse]] (Satipaṭṭhāna Sutta)

! Zen

* [[Zen Mind, Beginner's Mind|https://en.wikipedia.org/wiki/Zen_Mind%2C_Beginner's_Mind]] (Shunryu Suzuki)
* 101 Zen Stories ([[Read online|https://www.101zenstories.info/]])

! Tibetan Tradition Meditation

* [[The Attention Revolution: Unlocking the Power of the Focused Mind|https://www.goodreads.com/book/show/64084.The_Attention_Revolution]] (B. Alan Wallace)

! Others

* [[Metta Bhavana - Cultivation of Loving-kindness|https://www.buddhanet.net/pdf_file/scrn_metta.pdf]] by Venerable Dhammarakkhita
* [[Right Concentration: A Practical Guide to the Jhanas|https://www.goodreads.com/book/show/25241895-right-concentration]] by Leigh Brasington
* [[Understanding Our Mind - 50 Verses on Buddhist Psychology|https://plumvillage.org/books/understanding-our-mind/]] by Zen Master Thich Nhat Hanh

! Related sites

* [[DhammaTalks]]
** https://www.dhammatalks.org/
* SuttaCentral
** [[Reading sutta - getting started|https://suttacentral.net/start]]
** https://suttacentral.net/pitaka/sutta
Source: https://www.dhammatalks.org/suttas/MN/MN118.html

I have heard that on one occasion the Blessed One was staying near Sāvatthī in the Eastern Monastery, the palace of Migāra’s mother, together with many well-known elder disciples—Ven. Sāriputta, Ven. Mahā Moggallāna, Ven. Mahā Kassapa, Ven. Mahā Kaccāna, Ven. Mahā Koṭṭhita, Ven. Mahā Kappina, Ven. Mahā Cunda, Ven. Revata, Ven. Ānanda, and other well-known elder disciples. On that occasion the elder monks were teaching & instructing. Some elder monks were teaching & instructing ten monks, some were teaching & instructing twenty monks, some were teaching & instructing thirty monks, some were teaching & instructing forty monks. The new monks, being taught & instructed by the elder monks, were discerning grand, successive distinctions.

Now on that occasion—the uposatha day of the fifteenth, the full-moon night of the Pavāraṇā ceremony—the Blessed One was seated in the open air surrounded by the Saṅgha of monks. Surveying the silent Saṅgha of monks, he addressed them:

“Monks, I am content with this practice. I am content at heart with this practice. So arouse even more intense persistence for the attaining of the as-yet-unattained, the reaching of the as-yet-unreached, the realization of the as-yet-unrealized. I will remain right here at Sāvatthī (for another month) through the ‘White Water-lily’ Month, the fourth month of the rains.”

The monks in the countryside heard, “The Blessed One, they say, will remain right there at Sāvatthī through the White Water-lily Month, the fourth month of the rains.” So they left for Sāvatthī to see the Blessed One.

Then the elder monks taught & instructed the new monks even more intensely. Some elder monks were teaching & instructing ten monks, some were teaching & instructing twenty monks, some were teaching & instructing thirty monks, some were teaching & instructing forty monks. The new monks, being taught & instructed by the elder monks, were discerning grand, successive distinctions.

Now on that occasion—the uposatha day of the fifteenth, the full-moon night of the White Water-lily Month, the fourth month of the rains—the Blessed One was seated in the open air surrounded by the Saṅgha of monks. Surveying the silent Saṅgha of monks, he addressed them:

“Monks, this assembly is free from idle chatter, devoid of idle chatter, and is established on pure heartwood: Such is this Saṅgha of monks, such is this assembly. The sort of assembly that is deserving of gifts, deserving of hospitality, deserving of offerings, deserving of respect, an incomparable field of merit for the world: Such is this Saṅgha of monks, such is this assembly. The sort of assembly to which a small gift, when given, becomes great, and a great gift greater: Such is this Saṅgha of monks, such is this assembly. The sort of assembly that is rare to see in the world: Such is this Saṅgha of monks, such is this assembly—the sort of assembly that it would be worth traveling for leagues, taking along provisions, in order to see.

“In this Saṅgha of monks there are monks who are arahants, whose effluents are ended, who have reached fulfillment, done the task, laid down the burden, attained the true goal, laid to waste the fetter of becoming, and who are released through right gnosis: Such are the monks in this Saṅgha of monks.

“In this Saṅgha of monks there are monks who, with the wasting away of the five lower fetters, are due to arise spontaneously (in the Pure Abodes), there to be totally unbound, destined never again to return from that world: Such are the monks in this Saṅgha of monks.

“In this Saṅgha of monks there are monks who, with the wasting away of (the first) three fetters, and with the attenuation of passion, aversion, & delusion, are once-returners, who—on returning only once more to this world—will make an ending to stress: Such are the monks in this Saṅgha of monks.

“In this Saṅgha of monks there are monks who, with the wasting away of (the first) three fetters, are stream-enterers, certain, never again destined for the lower realms, headed for self-awakening: Such are the monks in this Saṅgha of monks.

“In this Saṅgha of monks there are monks who remain devoted to the development of the four establishings of mindfulness… the four right exertions… the four bases of power… the five faculties… the five strengths… the seven factors for awakening… the noble eightfold path: Such are the monks in this Saṅgha of monks.

“In this Saṅgha of monks there are monks who remain devoted to the development of good will… compassion… empathetic joy… equanimity… (the perception of the) unattractiveness (of the body)… the perception of inconstancy: Such are the monks in this Saṅgha of monks.

“In this Saṅgha of monks there are monks who remain devoted to mindfulness of in-&-out breathing.

“Mindfulness of in-&-out breathing, when developed & pursued, is of great fruit, of great benefit. Mindfulness of in-&-out breathing, when developed & pursued, brings the four establishings of mindfulness to their culmination. The four establishings of mindfulness, when developed & pursued, bring the seven factors for awakening to their culmination. The seven factors for awakening, when developed & pursued, bring clear knowing & release to their culmination. Mindfulness of in-&-Out Breathing

“Now how is mindfulness of in-&-out breathing developed & pursued so as to be of great fruit, of great benefit?

“There is the case where a monk, having gone to the wilderness, to the shade of a tree, or to an empty building, sits down folding his legs crosswise, holding his body erect, and establishing mindfulness to the fore.1 Always mindful, he breathes in; mindful he breathes out.

“[1] Breathing in long, he discerns, ‘I am breathing in long’; or breathing out long, he discerns, ‘I am breathing out long.’ [2] Or breathing in short, he discerns, ‘I am breathing in short’; or breathing out short, he discerns, ‘I am breathing out short.’ [3] He trains himself, ‘I will breathe in sensitive to the entire body.’2 He trains himself, ‘I will breathe out sensitive to the entire body.’ [4] He trains himself, ‘I will breathe in calming bodily fabrication.’3 He trains himself, ‘I will breathe out calming bodily fabrication.’

“[5] He trains himself, ‘I will breathe in sensitive to rapture.’ He trains himself, ‘I will breathe out sensitive to rapture.’ [6] He trains himself, ‘I will breathe in sensitive to pleasure.’ He trains himself, ‘I will breathe out sensitive to pleasure.’ [7] He trains himself, ‘I will breathe in sensitive to mental fabrication.’4 He trains himself, ‘I will breathe out sensitive to mental fabrication.’ [8] He trains himself, ‘I will breathe in calming mental fabrication.’ He trains himself, ‘I will breathe out calming mental fabrication.’

“[9] He trains himself, ‘I will breathe in sensitive to the mind.’ He trains himself, ‘I will breathe out sensitive to the mind.’ [10] He trains himself, ‘I will breathe in gladdening the mind.’ He trains himself, ‘I will breathe out gladdening the mind.’ [11] He trains himself, ‘I will breathe in steadying the mind.’ He trains himself, ‘I will breathe out steadying the mind.’ [12] He trains himself, ‘I will breathe in releasing the mind.’5 He trains himself, ‘I will breathe out releasing the mind.’

“[13] He trains himself, ‘I will breathe in focusing on inconstancy.’ He trains himself, ‘I will breathe out focusing on inconstancy.’ [14] He trains himself, ‘I will breathe in focusing on dispassion [or: fading].’ He trains himself, ‘I will breathe out focusing on dispassion.’ [15] He trains himself, ‘I will breathe in focusing on cessation.’ He trains himself, ‘I will breathe out focusing on cessation.’ [16] He trains himself, ‘I will breathe in focusing on relinquishing.’ He trains himself, ‘I will breathe out focusing on relinquishing.’

“This is how mindfulness of in-&-out breathing is developed & pursued so as to be of great fruit, of great benefit. The Four Establishings of Mindfulness

“And how is mindfulness of in-&-out breathing developed & pursued so as to bring the four establishings of mindfulness to their culmination?

“[1] On whatever occasion a monk breathing in long discerns, ‘I am breathing in long’; or breathing out long, discerns, ‘I am breathing out long’; or breathing in short, discerns, ‘I am breathing in short’; or breathing out short, discerns, ‘I am breathing out short’; trains himself, ‘I will breathe in…&… out sensitive to the entire body’; trains himself, ‘I will breathe in…&…out calming bodily fabrication’: On that occasion the monk remains focused on the body in & of itself—ardent, alert, & mindful—subduing greed & distress with reference to the world. I tell you, monks, that this—the in-&-out breath—is classed as a body among bodies, which is why the monk on that occasion remains focused on the body in & of itself—ardent, alert, & mindful—subduing greed & distress with reference to the world.

“[2] On whatever occasion a monk trains himself, ‘I will breathe in…&…out sensitive to rapture’; trains himself, ‘I will breathe in…&…out sensitive to pleasure’; trains himself, ‘I will breathe in…&…out sensitive to mental fabrication’; trains himself, ‘I will breathe in…&…out calming mental fabrication’: On that occasion the monk remains focused on feelings in & of themselves—ardent, alert, & mindful—subduing greed & distress with reference to the world. I tell you, monks, that this—careful attention to in-&-out breaths—is classed as a feeling among feelings,6 which is why the monk on that occasion remains focused on feelings in & of themselves—ardent, alert, & mindful—subduing greed & distress with reference to the world.

“[3] On whatever occasion a monk trains himself, ‘I will breathe in…&…out sensitive to the mind’; trains himself, ‘I will breathe in…&…out gladdening the mind’; trains himself, ‘I will breathe in…&…out steadying the mind’; trains himself, ‘I will breathe in…&…out releasing the mind’: On that occasion the monk remains focused on the mind in & of itself—ardent, alert, & mindful—subduing greed & distress with reference to the world. I don’t say that there is mindfulness of in-&-out breathing in one of lapsed mindfulness and no alertness, which is why the monk on that occasion remains focused on the mind in & of itself—ardent, alert, & mindful—subduing greed & distress with reference to the world.

“[4] On whatever occasion a monk trains himself, ‘I will breathe in…&…out focusing on inconstancy’; trains himself, ‘I will breathe in…&…out focusing on dispassion’; trains himself, ‘I will breathe in…&…out focusing on cessation’; trains himself, ‘I will breathe in…&…out focusing on relinquishing’: On that occasion the monk remains focused on mental qualities in & of themselves—ardent, alert, & mindful—subduing greed & distress with reference to the world. He who sees with discernment the abandoning of greed & distress is one who watches carefully with equanimity, which is why the monk on that occasion remains focused on mental qualities in & of themselves—ardent, alert, & mindful—subduing greed & distress with reference to the world.

“This is how mindfulness of in-&-out breathing is developed & pursued so as to bring the four establishings of mindfulness to their culmination. The Seven Factors for awakening

“And how are the four establishings of mindfulness developed & pursued so as to bring the seven factors for awakening to their culmination?

“[1] On whatever occasion the monk remains focused on the body in & of itself—ardent, alert, & mindful—subduing greed & distress with reference to the world, on that occasion his mindfulness is steady & without lapse. When his mindfulness is steady & without lapse, then mindfulness as a factor for awakening becomes aroused. He develops it, and for him it goes to the culmination of its development.

“[2] Remaining mindful in this way, he examines, analyzes, & comes to a comprehension of that quality with discernment. When he remains mindful in this way, examining, analyzing, & coming to a comprehension of that quality with discernment, then analysis of qualities as a factor for awakening becomes aroused. He develops it, and for him it goes to the culmination of its development.

“[3] In one who examines, analyzes, & comes to a comprehension of that quality with discernment, persistence is aroused unflaggingly. When persistence is aroused unflaggingly in one who examines, analyzes, & comes to a comprehension of that quality with discernment, then persistence as a factor for awakening becomes aroused. He develops it, and for him it goes to the culmination of its development.

“[4] In one whose persistence is aroused, a rapture not of the flesh arises. When a rapture not of the flesh arises in one whose persistence is aroused, then rapture as a factor for awakening becomes aroused. He develops it, and for him it goes to the culmination of its development.

“[5] For one enraptured at heart, the body grows calm and the mind grows calm. When the body & mind of a monk enraptured at heart grow calm, then calm as a factor for awakening becomes aroused. He develops it, and for him it goes to the culmination of its development.

“[6] For one who is at ease—his body calmed—the mind becomes concentrated. When the mind of one who is at ease—his body calmed—becomes concentrated, then concentration as a factor for awakening becomes aroused. He develops it, and for him it goes to the culmination of its development.

“[7] He carefully watches the mind thus concentrated with equanimity. When he carefully watches the mind thus concentrated with equanimity, equanimity as a factor for awakening becomes aroused. He develops it, and for him it goes to the culmination of its development.

[Similarly with the other three establishings of mindfulness: feelings, mind, & mental qualities.]

“This is how the four establishings of mindfulness are developed & pursued so as to bring the seven factors for awakening to their culmination. Clear Knowing & Release

“And how are the seven factors for awakening developed & pursued so as to bring clear knowing & release to their culmination? There is the case where a monk develops mindfulness as a factor for awakening dependent on seclusion, dependent on dispassion, dependent on cessation, resulting in relinquishment. He develops analysis of qualities as a factor for awakening… persistence as a factor for awakening… rapture as a factor for awakening… calm as a factor for awakening… concentration as a factor for awakening… equanimity as a factor for awakening dependent on seclusion, dependent on dispassion, dependent on cessation, resulting in relinquishment.

“This is how the seven factors for awakening are developed & pursued so as to bring clear knowing & release to their culmination.”

That is what the Blessed One said. Gratified, the monks delighted in the Blessed One’s words.
Con đã gây ra bao lầm lỡ<br/>
Khi nói, khi làm, khi tư duy <br/>
Đam mê, hờn giận và ngu si<br/>
Nay con cúi đầu xin sám hối<br/>
Một lòng con cầu Bụt chứng tri<br/>
Bắt đầu hôm nay nguyền làm mới<br/>
Nguyền sống đêm ngày trong chánh niệm<br/>
Nguyền không lặp lại lỗi lầm xưa.

Nam mô Bồ Tát Cầu Sám Hối. (ba lần) (C)

Bao nhiêu lầm lỗi cũng do tâm<br/>
Tâm tịnh còn đâu dấu lỗi lầm<br/>
Sám hối xong rồi lòng nhẹ nhõm<br/>
Ngàn xưa mây bạc vẫn thong dong. (C)

- Nghi thức tụng niệm đại toàn - Thích Nhất Hạnh -

[[Nghi thức sám hối - Tùy hỷ hồi hướng]]
Các đức Thế Tôn<br/>
Thường trú trên đời<br/>
Xin thương xót con:<br/>
Vì ngay trong kiếp này<br/>
Và những kiếp xa xưa<br/>
Từ đời vô thỉ<br/>
Con đã từng lầm lẫn<br/>
Đã gây khổ đau<br/>
Cho chính bản thân<br/>
Và cho kẻ khác.

Tự mình gây ra lầm lỗi<br/>
Hoặc xúi người khác<br/>
Làm nên lầm lỗi<br/>
Hoặc tán đồng theo<br/>
Giết hại, trộm cắp<br/>
Dối trá, tà dâm<br/>
Với những tà nghiệp khác<br/>
Trong mười nghiệp bất thiện<br/>
Hoặc có che dấu<br/>
Hoặc không che dấu<br/>
Những tội lỗi ấy<br/>
Đưa về địa ngục<br/>
Ngạ quỷ, súc sinh<br/>
Làm cho kiếp sau<br/>
Sinh nơi biên địa<br/>
Sáu căn khiếm khuyết<br/>
Không có điều kiện<br/>
Lớn lên thành người<br/>
Những tội chướng ấy<br/>
Hôm nay con nguyền nhất tâm<br/>
Cầu xin sám hối.

Xin chư Bụt Thế Tôn<br/>
Chứng biết cho con<br/>
Thương tưởng đến con<br/>
Con phủ phục trước mặt các ngài<br/>
Phát lời nguyện rằng:<br/>
Nếu trong vô lượng kiếp xa xưa,<br/>
Cũng như trong đời này<br/>
Nếu con đã từng bố thí<br/>
Dù chỉ một nắm cơm<br/>
Hoặc một manh áo,<br/>
Nếu con đã từng nói lời ái ngữ<br/>
Dù chỉ một vài câu,<br/>
Nếu con đã từng biết nhìn với con mắt từ bi<br/>
Dù chỉ trong chốc lát,<br/>
Nếu con đã từng có cử chỉ an ủi vỗ về<br/>
Dù chỉ một vài lần,<br/>
Nếu con đã từng lắng nghe diệu pháp<br/>
Dù chỉ một buổi,<br/>
Nếu con đã từng cúng dường trai tăng<br/>
Dù chỉ một lần,<br/>
Nếu con đã từng cứu mạng chúng sanh<br/>
Dù chỉ là vài con sâu con kiến,<br/>
Nếu con đã từng tụng đọc kinh văn<br/>
Dù chỉ một vài câu,<br/>
Nếu con đã từng xuất gia<br/>
Dù chỉ trong một kiếp,<br/>
Nếu con đã từng nâng đỡ kẻ khác trên đường tu học<br/>
Dù chỉ giúp được vài người,<br/>
Nếu con đã từng tu tập tịnh giới<br/>
Dù chưa được hoàn toàn thanh tịnh,<br/>
Tất cả những công đức ấy<br/>
Đều là những thiện căn con đã gieo trồng<br/>
Hôm nay xin gồm thâu tất cả lại<br/>
Kính dâng lên chư Bụt<br/>
Như một tràng hoa ngát hương<br/>
Và xin hồi hướng tất cả các công đức ấy<br/>
Về quả vị Bồ Đề. (C)

Con xin mở lòng rộng lớn<br/>
Hướng về Vô Thượng Chánh Giác,<br/>
Nguyện đạt tới hiểu biết lớn<br/>
Nguyện thành tựu thương yêu sâu<br/>
Nguyện tu tập chuyên cần<br/>
Chuyển hóa khổ đau<br/>
Cho con và cho tất cả mọi loài<br/>
Tất cả mọi động tác của thân miệng ý<br/>
Đều xin hướng về<br/>
Làm hạnh phúc cho mọi người mọi loài.

Đó là ước mong sâu sắc nhất của con<br/>
Ngoài tâm Bồ Đề<br/>
Ngoài khao khát hiểu biết lớn<br/>
Ngoài nguyện ước thương yêu sâu<br/>
Con không còn ước mong nào nữa cả. (C)

Chư Bụt trong mười phương và ba đời<br/>
Đều đã từng hồi hướng như thế<br/>
Hôm nay con cũng xin hồi hướng như thế.

Bao nhiêu lầm lỗi đều xin sám hối<br/>
Bao nhiêu công đức đều xin tùy hỉ<br/>
Biển công đức vô lượng<br/>
Cũng là núi trí tuệ cao vòi vọi<br/>
Chư Bụt và thầy tổ<br/>
Là ánh sáng soi chiếu cho con<br/>
Trong giờ phút trang nghiêm<br/>
Xin đem thân mạng này<br/>
Quay về và đảnh lễ. (CC)

- Nghi thức tụng niệm đại toàn - Thích Nhất Hạnh -

[[Nghi thức tụng niệm - Quay về nương tựa]]
Trì tụng kinh thâm diệu<br/>
Tạo công đức vô biên<br/>
Đệ tử xin hồi hướng<br/>
Cho chúng sinh mọi miền. (C)

Pháp môn xin nguyện học<br/>
Ân nghĩa xin nguyện đền<br/>
Phiền não xin nguyện đoạn<br/>
Quả Bụt xin chứng nên. (CCC)

- Nghi thức tụng niệm đại toàn - Thích Nhất Hạnh -
Con về nương tựa Bụt, người đưa đường chỉ lối cho con trong cuộc đời.<br/>
Con về nương tựa Pháp, con đường của tình thương và sự hiểu biết.<br/>
Con về nương tựa Tăng, đoàn thể của những người nguyện sống cuộc đời tỉnh thức. (C)

Đã về nương tựa Bụt, con đang có hướng đi sáng đẹp trong cuộc đời.<br/>
Đã về nương tựa Pháp, con đang được học hỏi và tu tập các pháp môn chuyển hóa.<br/>
Đã về nương tựa Tăng, con đang được tăng thân soi sáng,<br/>
dìu dắt và nâng đỡ trên con đường thực tập. (C)

Về nương Bụt trong con, xin nguyện cho mọi người, thể nhận được giác tính, sớm mở lòng Bồ Đề.<br/>
Về nương Pháp trong con, xin nguyện cho mọi người, nắm vững các pháp môn, cùng lên đường chuyển hóa.<br/>
Về nương Tăng trong con, xin nguyện cho mọi người, xây dựng nên bốn chúng, nhiếp hóa được muôn loài. (CC)

- Nghi thức tụng niệm đại toàn - Thích Nhất Hạnh -

[[Nghi thức tụng niệm - Hồi hướng]]
[To be updated]
There are many meditation techniques that can be used by secular for their own benefits without being a Buddhist or belonging to a religious group. 

Meditation in a nutshell is an umbrella term for mind training techniques. For example: 

* Mindfulness (sati): We learn how to be aware of phenomena around us.
* Stillness (samādhi) You learn how to calm your mind to lucid quiet states without being disturbed or controlled by surrounding phenomena. 
* etc

None of these has anything inherently "Buddhist" or "religious". Meditation, in this understanding, can be done by anyone anywhere without applying a label to practitioners. 

In this page we'll review some of the useful mind training techniques that are suitable for secular uses.

[To be updated]
<<<
SuttaCentral contains early Buddhist texts, known as the Tipiṭaka or “Three Baskets”. This is a large collection of teachings attributed to the Buddha or his earliest disciples, who were teaching in India around 2500 years ago. They are regarded as sacred canon in all schools of Buddhism.

There are several Buddhist traditions, and each has passed down a set of scriptures from ancient times. SuttaCentral is specially focused on the scriptures of the earliest period of Buddhism, and hosts texts in over thirty languages. We believe this is the largest collection of early Buddhist texts ever made.

SuttaCentral hosts the texts in orginal languages, translations in modern languages, and extensive sets of parallels that show the relationship between them all.
<<<

* Quick links
** https://suttacentral.net/pitaka/vinaya
** https://suttacentral.net/pitaka/sutta
** https://suttacentral.net/pitaka/abhidhamma
Source: https://www.dhammatalks.org/suttas/MN/MN10.html

I have heard that on one occasion the Blessed One was staying among the Kurus. Now there is a town of the Kurus called Kammāsadhamma. There the Blessed One addressed the monks, “Monks.”

“Lord,” the monks responded to him.

The Blessed One said: “This is the direct path1 for the purification of beings, for the overcoming of sorrow & lamentation, for the disappearance of pain & distress, for the attainment of the right method, & for the realization of unbinding—in other words, the four establishings of mindfulness. Which four?

“There is the case where a monk remains focused on the body in & of itself—ardent, alert, & mindful—subduing greed & distress with reference to the world. He remains focused on feelings… mind… mental qualities in & of themselves—ardent,2 alert,3 & mindful4—subduing greed & distress with reference to the world.5 A. Body

“And how does a monk remain focused on the body in & of itself?

[1] “There is the case where a monk—having gone to the wilderness, to the shade of a tree, or to an empty building—sits down folding his legs crosswise, holding his body erect and establishing mindfulness to the fore.6 Always mindful, he breathes in; mindful he breathes out.

“Breathing in long, he discerns, ‘I am breathing in long’; or breathing out long, he discerns, ‘I am breathing out long.’ Or breathing in short, he discerns, ‘I am breathing in short’; or breathing out short, he discerns, ‘I am breathing out short.’ He trains himself, ‘I will breathe in sensitive to the entire body’;7 he trains himself, ‘I will breathe out sensitive to the entire body.’ He trains himself, ‘I will breathe in calming bodily fabrication’;8 he trains himself, ‘I will breathe out calming bodily fabrication.’ Just as a dexterous turner or his apprentice, when making a long turn, discerns, ‘I am making a long turn,’ or when making a short turn discerns, ‘I am making a short turn’; in the same way the monk, when breathing in long, discerns, ‘I am breathing in long’; or breathing out long, he discerns, ‘I am breathing out long.’ … He trains himself, ‘I will breathe in calming bodily fabrication’; he trains himself, ‘I will breathe out calming bodily fabrication.’

“In this way he remains focused internally on the body in & of itself, or externally on the body in & of itself, or both internally & externally on the body in & of itself. Or he remains focused on the phenomenon of origination with regard to the body, on the phenomenon of passing away with regard to the body, or on the phenomenon of origination & passing away with regard to the body. Or his mindfulness that ‘There is a body’ is maintained to the extent of knowledge & remembrance. And he remains independent, unsustained by [not clinging to] anything in the world. This is how a monk remains focused on the body in & of itself.

[2] “And further, when walking, the monk discerns, ‘I am walking.’ When standing, he discerns, ‘I am standing.’ When sitting, he discerns, ‘I am sitting.’ When lying down, he discerns, ‘I am lying down.’ Or however his body is disposed, that is how he discerns it.

“In this way he remains focused internally on the body in & of itself, or externally on the body in & of itself, or both internally & externally on the body in & of itself. Or he remains focused on the phenomenon of origination with regard to the body, on the phenomenon of passing away with regard to the body, or on the phenomenon of origination & passing away with regard to the body. Or his mindfulness that ‘There is a body’ is maintained to the extent of knowledge & remembrance. And he remains independent, unsustained by [not clinging to] anything in the world. This is how a monk remains focused on the body in & of itself.

[3] “And further, when going forward & returning, he makes himself fully alert; when looking toward & looking away… when flexing & extending his limbs… when carrying his outer cloak, his upper robe, & his bowl… when eating, drinking, chewing, & savoring… when urinating & defecating… when walking, standing, sitting, falling asleep, waking up, talking, & remaining silent, he makes himself fully alert.

“In this way he remains focused internally on the body in & of itself, or externally on the body in & of itself, or both internally & externally on the body in & of itself. Or he remains focused on the phenomenon of origination with regard to the body, on the phenomenon of passing away with regard to the body, or on the phenomenon of origination & passing away with regard to the body. Or his mindfulness that ‘There is a body’ is maintained to the extent of knowledge & remembrance. And he remains independent, unsustained by [not clinging to] anything in the world. This is how a monk remains focused on the body in & of itself.

[4] “And further… just as if a sack with openings at both ends were full of various kinds of grain—wheat, rice, mung beans, kidney beans, sesame seeds, husked rice—and a man with good eyesight, pouring it out, were to reflect, ‘This is wheat. This is rice. These are mung beans. These are kidney beans. These are sesame seeds. This is husked rice,’ in the same way, the monk reflects on this very body from the soles of the feet on up, from the crown of the head on down, surrounded by skin and full of various kinds of unclean things: ‘In this body there are head hairs, body hairs, nails, teeth, skin, flesh, tendons, bones, bone marrow, kidneys, heart, liver, pleura, spleen, lungs, large intestines, small intestines, gorge, feces, bile, phlegm, pus, blood, sweat, fat, tears, skin-oil, saliva, mucus, fluid in the joints, urine.’

“In this way he remains focused internally on the body in & of itself, or externally on the body in & of itself, or both internally & externally on the body in & of itself. Or he remains focused on the phenomenon of origination with regard to the body, on the phenomenon of passing away with regard to the body, or on the phenomenon of origination & passing away with regard to the body. Or his mindfulness that ‘There is a body’ is maintained to the extent of knowledge & remembrance. And he remains independent, unsustained by [not clinging to] anything in the world. This is how a monk remains focused on the body in & of itself.

[5] “And further… just as a dexterous butcher or his apprentice, having killed a cow, would sit at a crossroads cutting it up into pieces, the monk reflects on this very body—however it stands, however it is disposed—in terms of properties: ‘In this body there is the earth property, the liquid property, the fire property, & the wind property.’9

“In this way he remains focused internally on the body in & of itself, or externally on the body in & of itself, or both internally & externally on the body in & of itself. Or he remains focused on the phenomenon of origination with regard to the body, on the phenomenon of passing away with regard to the body, or on the phenomenon of origination & passing away with regard to the body. Or his mindfulness that ‘There is a body’ is maintained to the extent of knowledge & remembrance. And he remains independent, unsustained by [not clinging to] anything in the world. This is how a monk remains focused on the body in & of itself.

[6] “And further, as if he were to see a corpse cast away in a charnel ground—one day, two days, three days dead—bloated, livid, & festering, he applies it to this very body, ‘This body, too: Such is its nature, such is its future, such its unavoidable fate.’

“In this way he remains focused internally on the body in & of itself, or externally on the body in & of itself, or both internally & externally on the body in & of itself. Or he remains focused on the phenomenon of origination with regard to the body, on the phenomenon of passing away with regard to the body, or on the phenomenon of origination & passing away with regard to the body. Or his mindfulness that ‘There is a body’ is maintained to the extent of knowledge & remembrance. And he remains independent, unsustained by [not clinging to] anything in the world. This is how a monk remains focused on the body in & of itself.

“Or again, as if he were to see a corpse cast away in a charnel ground, being chewed by crows, being chewed by vultures, being chewed by hawks, being chewed by dogs, being chewed by hyenas, being chewed by various other creatures… a skeleton smeared with flesh & blood, connected with tendons… a fleshless skeleton smeared with blood, connected with tendons… a skeleton without flesh or blood, connected with tendons… bones detached from their tendons, scattered in all directions—here a hand bone, there a foot bone, here a shin bone, there a thigh bone, here a hip bone, there a back bone, here a rib, there a chest bone, here a shoulder bone, there a neck bone, here a jaw bone, there a tooth, here a skull… the bones whitened, somewhat like the color of shells… the bones piled up, more than a year old… the bones decomposed into a powder: He applies it to this very body, ‘This body, too: Such is its nature, such is its future, such its unavoidable fate.’

“In this way he remains focused internally on the body in & of itself, or externally on the body in & of itself, or both internally & externally on the body in & of itself. Or he remains focused on the phenomenon of origination with regard to the body, on the phenomenon of passing away with regard to the body, or on the phenomenon of origination & passing away with regard to the body. Or his mindfulness that ‘There is a body’ is maintained to the extent of knowledge & remembrance. And he remains independent, unsustained by [not clinging to] anything in the world. This is how a monk remains focused on the body in & of itself. B. Feelings

“And how does a monk remain focused on feelings in & of themselves? There is the case where a monk, when feeling a painful feeling, discerns, ‘I am feeling a painful feeling.’ When feeling a pleasant feeling, he discerns, ‘I am feeling a pleasant feeling.’ When feeling a neither-painful-nor-pleasant feeling, he discerns, ‘I am feeling a neither-painful-nor-pleasant feeling.’

“When feeling a painful feeling of the flesh, he discerns, ‘I am feeling a painful feeling of the flesh.’ When feeling a painful feeling not of the flesh, he discerns, ‘I am feeling a painful feeling not of the flesh.’ When feeling a pleasant feeling of the flesh, he discerns, ‘I am feeling a pleasant feeling of the flesh.’ When feeling a pleasant feeling not of the flesh, he discerns, ‘I am feeling a pleasant feeling not of the flesh.’ When feeling a neither-painful-nor-pleasant feeling of the flesh, he discerns, ‘I am feeling a neither-painful-nor-pleasant feeling of the flesh.’ When feeling a neither-painful-nor-pleasant feeling not of the flesh, he discerns, ‘I am feeling a neither-painful-nor-pleasant feeling not of the flesh.’10

“In this way he remains focused internally on feelings in & of themselves, or externally on feelings in & of themselves, or both internally & externally on feelings in & of themselves. Or he remains focused on the phenomenon of origination with regard to feelings, on the phenomenon of passing away with regard to feelings, or on the phenomenon of origination & passing away with regard to feelings. Or his mindfulness that ‘There are feelings’ is maintained to the extent of knowledge & remembrance. And he remains independent, unsustained by [not clinging to] anything in the world. This is how a monk remains focused on feelings in & of themselves. C. Mind

“And how does a monk remain focused on the mind in & of itself? There is the case where a monk, when the mind has passion, discerns, ‘The mind has passion.’ When the mind is without passion, he discerns, ‘The mind is without passion.’ When the mind has aversion, he discerns, ‘The mind has aversion.’ When the mind is without aversion, he discerns, ‘The mind is without aversion.’ When the mind has delusion, he discerns, ‘The mind has delusion.’ When the mind is without delusion, he discerns, ‘The mind is without delusion.’11

“When the mind is constricted, he discerns, ‘The mind is constricted.’ When the mind is scattered, he discerns, ‘The mind is scattered.’12 When the mind is enlarged,13 he discerns, ‘The mind is enlarged.’ When the mind is not enlarged, he discerns, ‘The mind is not enlarged.’ When the mind is surpassed, he discerns, ‘The mind is surpassed.’ When the mind is unsurpassed, he discerns, ‘The mind is unsurpassed.’ When the mind is concentrated, he discerns, ‘The mind is concentrated.’ When the mind is not concentrated, he discerns, ‘The mind is not concentrated.’ When the mind is released,14 he discerns, ‘The mind is released.’ When the mind is not released, he discerns, ‘The mind is not released.’

“In this way he remains focused internally on the mind in & of itself, or externally on the mind in & of itself, or both internally & externally on the mind in & of itself. Or he remains focused on the phenomenon of origination with regard to the mind, on the phenomenon of passing away with regard to the mind, or on the phenomenon of origination & passing away with regard to the mind. Or his mindfulness that ‘There is a mind’ is maintained to the extent of knowledge & remembrance. And he remains independent, unsustained by [not clinging to] anything in the world. This is how a monk remains focused on the mind in & of itself. D. Mental Qualities

“And how does a monk remain focused on mental qualities in & of themselves?

[1] “There is the case where a monk remains focused on mental qualities in & of themselves with reference to the five hindrances. And how does a monk remain focused on mental qualities in & of themselves with reference to the five hindrances? There is the case where, there being sensual desire present within, a monk discerns, ‘There is sensual desire present within me.’ Or, there being no sensual desire present within, he discerns, ‘There is no sensual desire present within me.’ He discerns how there is the arising of unarisen sensual desire. And he discerns how there is the abandoning of sensual desire once it has arisen.15 And he discerns how there is no further appearance in the future of sensual desire that has been abandoned. [The same formula is repeated for the remaining hindrances: ill will, sloth & drowsiness, restlessness & anxiety, and uncertainty.]

“In this way he remains focused internally on mental qualities in & of themselves, or externally on mental qualities in & of themselves, or both internally & externally on mental qualities in & of themselves. Or he remains focused on the phenomenon of origination with regard to mental qualities, on the phenomenon of passing away with regard to mental qualities, or on the phenomenon of origination & passing away with regard to mental qualities. Or his mindfulness that ‘There are mental qualities’ is maintained to the extent of knowledge & remembrance. And he remains independent, unsustained by [not clinging to] anything in the world. This is how a monk remains focused on mental qualities in & of themselves with reference to the five hindrances.

[2] “And further, the monk remains focused on mental qualities in & of themselves with reference to the five clinging-aggregates. And how does a monk remain focused on mental qualities in & of themselves with reference to the five clinging-aggregates? There is the case where a monk [discerns]: ‘Such is form, such its origination, such its disappearance. Such is feeling… Such is perception… Such are fabrications… Such is consciousness, such its origination, such its disappearance.’16

“In this way he remains focused internally on mental qualities in & of themselves, or externally on mental qualities in & of themselves, or both internally & externally on mental qualities in & of themselves. Or he remains focused on the phenomenon of origination with regard to mental qualities, on the phenomenon of passing away with regard to mental qualities, or on the phenomenon of origination & passing away with regard to mental qualities. Or his mindfulness that ‘There are mental qualities’ is maintained to the extent of knowledge & remembrance. And he remains independent, unsustained by [not clinging to] anything in the world. This is how a monk remains focused on mental qualities in & of themselves with reference to the five clinging-aggregates.

[3] “And further, the monk remains focused on mental qualities in & of themselves with reference to the sixfold internal & external sense media. And how does a monk remain focused on mental qualities in & of themselves with reference to the sixfold internal & external sense media? There is the case where he discerns the eye, he discerns forms, he discerns the fetter that arises dependent on both.17 He discerns how there is the arising of an unarisen fetter. And he discerns how there is the abandoning of a fetter once it has arisen. And he discerns how there is no further appearance in the future of a fetter that has been abandoned. [The same formula is repeated for the remaining sense media: ear, nose, tongue, body, & intellect.]

“In this way he remains focused internally on mental qualities in & of themselves, or externally on mental qualities in & of themselves, or both internally & externally on mental qualities in & of themselves. Or he remains focused on the phenomenon of origination with regard to mental qualities, on the phenomenon of passing away with regard to mental qualities, or on the phenomenon of origination & passing away with regard to mental qualities. Or his mindfulness that ‘There are mental qualities’ is maintained to the extent of knowledge & remembrance. And he remains independent, unsustained by [not clinging to] anything in the world. This is how a monk remains focused on mental qualities in & of themselves with reference to the sixfold internal & external sense media.

[4] “And further, the monk remains focused on mental qualities in & of themselves with reference to the seven factors for awakening. And how does a monk remain focused on mental qualities in & of themselves with reference to the seven factors for awakening? There is the case where, there being mindfulness as a factor for awakening present within, he discerns, ‘Mindfulness as a factor for awakening is present within me.’ Or, there being no mindfulness as a factor for awakening present within, he discerns, ‘Mindfulness as a factor for awakening is not present within me.’ He discerns how there is the arising of unarisen mindfulness as a factor for awakening. And he discerns how there is the culmination of the development of mindfulness as a factor for awakening once it has arisen.18 [The same formula is repeated for the remaining factors for awakening: analysis of qualities, persistence, rapture, calm, concentration, & equanimity.]

“In this way he remains focused internally on mental qualities in & of themselves, or externally on mental qualities in & of themselves, or both internally & externally on mental qualities in & of themselves. Or he remains focused on the phenomenon of origination with regard to mental qualities, on the phenomenon of passing away with regard to mental qualities, or on the phenomenon of origination & passing away with regard to mental qualities. Or his mindfulness that ‘There are mental qualities’ is maintained to the extent of knowledge & remembrance. And he remains independent, unsustained by [not clinging to] anything in the world. This is how a monk remains focused on mental qualities in & of themselves with reference to the seven factors for awakening.

[5] “And further, the monk remains focused on mental qualities in & of themselves with reference to the four noble truths. And how does a monk remain focused on mental qualities in & of themselves with reference to the four noble truths? There is the case where he discerns, as it has come to be, that ‘This is stress…This is the origination of stress…This is the cessation of stress…This is the way leading to the cessation of stress.’19

“In this way he remains focused internally on mental qualities in & of themselves, or externally on mental qualities in & of themselves, or both internally & externally on mental qualities in & of themselves. Or he remains focused on the phenomenon of origination with regard to mental qualities, on the phenomenon of passing away with regard to mental qualities, or on the phenomenon of origination & passing away with regard to mental qualities. Or his mindfulness that ‘There are mental qualities’ is maintained to the extent of knowledge & remembrance. And he remains independent, unsustained by [not clinging to] anything in the world. This is how a monk remains focused on mental qualities in & of themselves with reference to the four noble truths. E. Conclusion

“Now, if anyone would develop these four establishings of mindfulness in this way for seven years, one of two fruits can be expected for him: either gnosis right here & now, or—if there be any remnant of clinging-sustenance—non-return.

“Let alone seven years. If anyone would develop these four establishings of mindfulness in this way for six years… five… four… three… two years… one year… seven months… six months… five… four… three… two months… one month… half a month, one of two fruits can be expected for him: either gnosis right here & now, or—if there be any remnant of clinging-sustenance—non-return.

“Let alone half a month. If anyone would develop these four establishings of mindfulness in this way for seven days, one of two fruits can be expected for him: either gnosis right here & now, or—if there be any remnant of clinging-sustenance—non-return.

“‘This is the direct path for the purification of beings, for the overcoming of sorrow & lamentation, for the disappearance of pain & distress, for the attainment of the right method, & for the realization of unbinding—in other words, the four establishings of mindfulness.’ Thus was it said, and in reference to this was it said.”

That is what the Blessed One said. Gratified, the monks delighted in the Blessed One’s words.
A brief introduction the paths, the obstacles that you may encounter on your walk, and how to overcome them.
Nguồn: https://langmai.org/thien-duong/thi-ke/

Thi kệ là những bài thơ ngắn mà bạn có thể đọc thuộc lòng trong những sinh hoạt hàng ngày của mình để giúp trở về giây phút hiện tại và an trú trong chánh niệm. Đây là sự hòa quyện giữa thiền tập và thi ca, thi kệ cũng là một phần thiết yếu và đã có lâu đời trong truyền thống thiền tập đạo Bụt. Sử dụng một thi kệ không yêu cầu bất kỳ kiến ​​thức đặc biệt hay một sự thực hành tôn giáo nào. Bắt đầu bạn có thể ghi nhớ một câu mà mình tìm thấy và ưa thích để thực tập. Hay bạn viết những bài thi kệ này xuống một nơi có thể nhìn thấy thường xuyên.

Thi kệ được áp dụng khi chúng ta thức dậy, rửa mặt, trong bữa ăn, rửa bát, uống trà… Bạn có thể thực tập thi kệ trong suốt ngày để giúp bạn thật sự có mặt trong giây phút hiện tại. Trong một khóa tu mùa hè, để giúp các trẻ em và cả người lớn đến Làng Mai thực tập chánh niệm, tôi đã bắt đầu soạn thảo những thi kệ cho những sinh hoạt thiết yếu của đời sống hiện đại ngày nay.

Chúng ta thường trở nên quá bận rộn mà quên đi những gì chúng ta đang làm, chúng ta là ai, thậm chí quên thở! Chúng ta quên nhìn những người mà chúng ta yêu thương và quên lãng sự có mặt trân quý của họ cho đến khi có thể là quá muộn và hối tiếc. Ngay cả khi chúng ta có một ít thời gian rảnh rỗi, chúng ta cũng không biết làm thế nào để có được sựu liên hệ và tiếp xúc một cách sâu sắc với những gì đang xảy ra trong ta và xung quanh ta. Ta xem truyền hình, nhận điện thoại, dùng internet… vì sợ phải đối diện với sự trống trải của chính mình.

Thiền tập là ý thức về những gì đang xảy ra cho thân thể, cảm xúc, tâm trí và thế giới. Khi bạn có mặt trong hiện tại, bạn sẽ thấy vẻ đẹp và sự kỳ diệu của những gì ngay trước mắt mình, đôi mắt của trẻ thơ, ánh mặt trời buổi ban mai, nét mặt của người thương… Bạn có thể rất hạnh phúc chỉ bằng cách ý thức về những gì đang ở trước mặt mình. Thực tập thi kệ là một trong những cách để giúp bạn sống tỉnh thức và thưởng thức được một cách sâu sắc nhất những gì trong giây phút hiện tại, đó chính là nhu yếu thâm sâu nhất của con người.

Khi bạn đã thuộc một bài thi kệ, nó sẽ đến với bạn hoàn toàn tự nhiên, như khi nâng chén trà lên, nếu bạn có chánh niệm thì tự khắc bài kệ sau đây sẽ đến với bạn:

<<<
Chén trà trong hai <br>
Chánh niệm nâng tròn <br>
Thân và tâm an trú<br>
Bây giờ và ở đây
<<<

Bạn không cần học thuộc lòng một lần tất cả các bài kệ. Bạn có thể bắt đầu với vài bài mà bạn ưa thích, rồi từ từ học thêm một bài, rồi một bài khác.

Những bài thi kệ này có công năng nuôi dưỡng sự tỉnh thức, nuôi dưỡng chánh niệm. Xử dụng chúng trong một thời gian bạn sẽ thấy có sự biến đổi trong cuộc đời của bạn. Bạn sẽ có chánh niệm, điềm tĩnh, bình an và niềm vui trong mỗi tư thế và động tác hằng ngày.

Bạn hãy sáng tác thêm những thi kệ cho riêng mình để phù hợp với hoàn cảnh cụ thể mình đang sống. Những bài thi kệ sẽ là những người bạn đồng hành vững chãi và thú vị.

! THỨC DẬY

Thức dậy mỉm miệng cười<br>
Hăm bốn giờ tinh khôi<br>
Xin nguyện sống trọn vẹn<br>
Mắt thương nhìn cuộc đời

! QUƠ DÉP

Đặt chân trên mặt đất<br>
Là thể hiện thần thông<br>
Từng bước chân tỉnh thức<br>
Làm hiển lộ pháp thân

XUỐNG GIƯỜNG

Sáng, trưa, chiều và tối<br>
Mọi loài hãy giữ gìn<br>
Nếu dưới chân lỡ đạp<br>
Xin nguyện chóng siêu sinh

> Nam mô Bồ Tát Siêu Lạc Địa

! BẬT ĐÈN

Thất niệm là bóng đêm<br>
Chánh niệm là ánh sáng<br>
Đưa tỉnh thức trở về<br>
Cho thế gian tỏ rạng

! XẾP MỀN

Xếp mền cho niềm vui<br>
Sống ngăn nắp cuộc đời<br>
Thân và tâm thúc liễm<br>
Phiền não phải rụng rơi

! MỞ CỬA SỔ

Mở cửa nhìn pháp thân<br>
Đời mầu nhiệm không cùng<br>
Lòng dặn lòng tỉnh thức<br>
Dòng nước tâm trong ngần

! VẶN NƯỚC

Nước từ nguồn suối cao<br>
Nước từ lòng đất sâu<br>
Nước mầu nhiệm tuôn chảy<br>
Ơn nước luôn tràn đầy

! ĐÁNH RĂNG

Đánh răng và súc miệng<br>
Cho sạch nghiệp nói năng<br>
Miệng thơm lời chánh ngữ<br>
Hoa nở tự vườn tâm

! SÚC MIỆNG

Súc miệng lòng cũng sạch<br>
Vũ trụ ngát hoa hương<br>
Ba nghiệp thường thanh tịnh<br>
Cùng Bụt chơi Tây phương

! RỬA MẶT

Rửa mặt là rửa tâm<br>
Sạch hết mọi cấu trần<br>
Để cho nguồn an lạc<br>
Đi vào cả châu thân

! VÀO NHÀ CẦU

Không nhơ cũng không sạch<br>
Không bớt cũng không thêm<br>
Trí tuệ Ba La Mật<br>
Không có pháp nào trên

! ĐI TIỂU

Đi tiểu trong bản môn<br>
Đổi trao nào kỳ diệu<br>
Ta và ngươi không hai<br>
Không dư mà không thiếu

! RỬA TAY

Múc nước để rửa tay<br>
Xin nguyện cho mọi người<br>
Có đôi bàn tay khéo<br>
Gìn giữ trái đất này

! TẮM

Không sinh cũng không diệt<br>
Không trước cũng không sau<br>
Trao truyền và tiếp thọ<br>
Pháp giới tính nhiệm mầu

! CẠO TÓC

Cạo sạch mái tóc<br>
Nguyện cho mọi người<br>
Dứt hết phiền não<br>
Độ thoát cho đời

! RỬA CHÂN

Sự an lạc<br>
của ngón chân<br>
Niềm an lạc<br>
của thân tâm

! SOI GƯƠNG

Chánh niệm là đài gương<br>
Gương soi hình tứ đại<br>
Đẹp nhất là tình thương<br>
Và cái nhìn rộng rãi

! MẶC ÁO

Mặc áo trong tích môn<br>
Trang nghiêm y chánh báo<br>
Tịnh độ trong tầm tay<br>
Nước non cùng sáng tạo

! MẶC ÁO NHẬT BÌNH

Mang áo của người tu<br>
Tâm tư thường khỏe nhẹ<br>
Nguyện sống đời thảnh thơi<br>
Đem vui cho trần thế

! KHOÁC ÁO CA SA

> (nâng ngang trán)

Đẹp thay áo giải thoát<br>
Áo ruộng phước nhiệm mầu<br>
Con cúi đầu tiếp nhận<br>
Đời đời nguyện mang theo

! LÊN XUỐNG CẦU THANG

Lên hay xuống cầu thang<br>
Bước chân thường nhẹ nhàng<br>
Nếu nghe tiếng lộp cộp<br>
Là biết lòng chưa an

! KỆ CHUÔNG (1)

Ba nghiệp lắng thanh tịnh<br>
Gửi lòng theo tiếng chuông<br>
Nguyện người nghe tỉnh thức<br>
Vượt thoát nẻo đau buồn

! KỆ CHUÔNG (2)

Nguyện tiếng chuông này vang pháp giới<br>
Xa xôi tăm tối cũng đều nghe<br>
Những ai lạc bước mau dừng lại<br>
Tỉnh giấc hôn mê thấy nẻo về

> Nam mô đức bổn sư Bụt Thích Ca Mâu Ni

! KỆ CHUÔNG (3)

Nguyện tiếng chuông này vang pháp giới<br>
Khắp nơi u tối mọi loài nghe<br>
Siêu nhiên vượt thoát vòng sinh tử<br>
Giác ngộ tâm tư một hướng về

> Nam mô đức bổn sư Bụt Thích Ca Mâu Ni

! NGHE CHUÔNG (1)

Lắng lòng nghe, lắng lòng nghe<br>
Tiếng chuông huyền diệu đưa về nhất tâm

! NGHE CHUÔNG (2)

Nghe chuông phiền não tan mây khói<br>
Ý lặng, thân an, miệng mỉm cười<br>
Hơi thở nương chuông về chánh niệm<br>
Vườn tâm hoa tuệ nở muôn nơi

> Nam mô đức bổn sư Bụt Thích Ca Mâu Ni

! NGHE CHUÔNG (3)

Nghe tiếng chuông<br>
Lòng nhẹ buông<br>
Tâm tĩnh lặng<br>
Hết sầu thương<br>
Tập buông thả<br>
Thôi vấn vương<br>
Lắng nghe thấu<br>
Tận nguồn cơn<br>
Học nhìn lại<br>
Hiểu và thương

! XẾP GIÀY DÉP

Đặt dép giày ngay ngắn<br>
Xin nguyện cho mọi người<br>
Đôi chân thường chánh niệm<br>
Vào ra luôn thảnh thơi

! VÀO THIỀN ĐƯỜNG

Vào thiền đường<br>
Thấy chân tâm<br>
Một ngồi xuống<br>
Dứt trầm luân

! ĐỐT LÒ

Đốt lò trong bản môn<br>
Gửi mây về mùa Hạ<br>
Cất mặt trời để dành<br>
Cho những ngày Đông giá

! ĐỐT NẾN

Thắp lên một ngọn đèn<br>
Cúng dường vô lượng Bụt<br>
Một tâm niệm an lành<br>
Làm rạng ngời mặt đất

! QUÁN TƯỞNG TRƯỚC KHI LỄ BỤT

Trong thể tính chân như<br>
Không chủ thể đối tượng<br>
Đệ tử kính lạy Bụt<br>
Trong tương cảm nhiệm mầu<br>
Biểu hiện khắp mười phương<br>
Như Đế châu ảnh chiếu<br>
Nơi nào cũng có Bụt<br>
Và có con kính lạy

! XƯNG TÁN BỤT

Phật bảo sáng vô cùng<br>
Đã từng vô lượng kiếp thành công<br>
Đoan nghiêm thiền tọa giữa non sông<br>
Sáng rực đỉnh Linh Phong<br>
Trên trán phóng hào quang rực rỡ<br>
Chiếu soi sáu nẻo hôn mông<br>
Long Hoa hội lớn nguyện tương phùng<br>
Tiếp nối Pháp chánh tông<br>
Xin quy y thường trú Phật đà gia!

! XƯNG TÁN PHÁP

Pháp bảo đẹp vô cùng<br>
Lời vàng do chính Bụt tuyên dương<br>
Chư thiên trỗi nhạc tán hoa hương<br>
Pháp mầu nhiệm tỏ tường<br>
Ghi chép rõ ràng thành ba Tạng<br>
Lưu truyền hậu thế mười phương<br>
Chúng con nay thấy được con đường<br>
Nguyện hết sức tuyên dương<br>
Xin quy y thường trú Đạt ma gia!

! XƯNG TÁN TĂNG

Tăng bảo quý vô cùng<br>
Phước điền hạt tốt đã đơm bông<br>
Ba y một bát bước thong dong<br>
Giới định tuệ dung thông<br>
An trú đêm ngày trong chánh niệm<br>
Thiền cơ chứng đạt nên công<br>
Chúng con tất cả nguyện một lòng<br>
Trở lại với tăng thân<br>
Xin quy y thường trú Tăng già gia!

! NGỒI THIỀN SÁNG

Pháp thân tỏa sáng buổi ban mai<br>
Tĩnh tọa lòng an miệng mỉm cười<br>
Ngày mới nguyện đi trong tỉnh thức<br>
Mặt trời trí tuệ rạng muôn nơi<br>
Ngưỡng mong đại chúng tinh tiến nhiếp tâm thiền tập

> Nam mô Bụt Thích Ca Mâu Ni (3 lần)

! NGỒI THIỀN TỐI

Vững thân ngồi dưới cội bồ đề<br>
Ba nghiệp lắng rồi hết thị phi<br>
Thu nhiếp thân tâm vào chánh niệm<br>
Rõ soi diện mục thoát bờ mê<br>
Ngưỡng mong đại chúng tinh tiến nhiếp tâm thiền tập

> Nam mô Bụt Thích Ca Mâu Ni (3 lần)

! NGỒI XUỐNG

Ngồi đây ngồi cội Bồ Đề<br>
Vững thân chánh niệm không hề lãng xao

! ĐIỀU THÂN

Trong tư thế kiết già<br>
Đóa hoa nhân phẩm nở<br>
Ưu Đàm Hoa muôn thuở<br>
Vẫn tỏa ngát hương thơm

! ĐIỀU CHỈNH HƠI THỞ

Thở vào tâm tĩnh lặng<br>
Thở ra miệng mỉm cười<br>
An trú trong hiện tại<br>
Giờ phút đẹp tuyệt vời

! THỞ (1)

Quay về nương tựa<br>
Hải đảo tự thân<br>
Chánh niệm là Bụt<br>
Soi sáng xa gần<br>
Hơi thở là Pháp<br>
Bảo hộ thân tâm<br>
Năm uẩn là Tăng<br>
Phối hợp tinh cần<br>
Thở vào thở ra<br>
Là hoa tươi mát<br>
Là núi vững vàng<br>
Nước tĩnh lặng chiếu<br>
Không gian thênh thang

! THỞ (2)

Thở vào biết thở vào<br>
Thở ra biết thở ra<br>
Hơi thở vào đã sâu<br>
Hơi thở ra đã chậm<br>
Thở vào tôi thấy khỏe<br>
Thở ra tôi thấy nhẹ<br>
Thở vào tâm tĩnh lặng<br>
Thở ra miệng mỉm cười<br>
An trú trong hiện tại<br>
Giây phút đẹp tuyệt vời

! THỞ (3)

Đã về<br>
Đã tới<br>
Bây giờ<br>
Ở đây<br>
Vững chãi<br>
Thảnh thơi<br>
Quay về<br>
Nương tựa<br>
Nay tôi đã về<br>
Nay tôi đã tới<br>
An trú bây giờ<br>
An trú ở đây<br>
Vững chãi như núi xanh<br>
Thảnh thơi dường mây trắng<br>
Cửa vô sinh mở rồi<br>
Trạm nhiên và bất động

! NGỒI THIỀN (1)

Ngồi thiền trong tích môn<br>
Nơi nào không thành đạo?<br>
Sinh tử trải bao lần<br>
Phút giây nào độc đáo

! NGỒI THIỀN (2)

Ngồi thiền trong bản môn<br>
Giây nào cũng thành đạo<br>
Cội nào cũng bồ đề<br>
Tòa nào cũng Đa bảo

! TÊ CHÂN ĐỔI CÁCH NGỒI

Khổ thọ và lạc thọ<br>
Như mây trời theo gió<br>
Hơi thở là giây neo<br>
Thuyền về nơi bến cũ

! THIỀN HÀNH

Ý về muôn vạn nẻo<br>
Thiền lộ tâm an nhiên<br>
Từng bước gió mát dậy<br>
Từng bước nở hoa sen

! CHẮP TAY CHÀO

Sen búp xin tặng người<br>
Một vị Bụt tương lai

! NÂNG BÌNH BÁT (1)

Bình bát của Như Lai<br>
Nay được nâng trên tay<br>
Nguyện hết lòng thực tập<br>
Pháp tam luân không tịch

! NÂNG BÌNH BÁT (2)

Bình bát của Như Lai<br>
Dùng làm ứng lượng khí<br>
Xin giữ để nuôi thân<br>
Và nuôi lớn chánh trí

! NÂNG BÁT KHÔNG

Tay nâng chiếc bát không<br>
Tôi biết rằng trưa nay<br>
Tôi có đủ may mắn<br>
Để có bát cơm đầy

! NÂNG BÁT ĐẦY

Tay nâng bát cơm đầy<br>
Tôi thấy rõ vạn vật<br>
Đang dang tay góp mặt<br>
Để cùng nuôi dưỡng tôi

! CHÚ NGUYỆN

Pháp Bụt thật phi thường<br>
Bảy hạt đầy mười phương<br>
Cúng dường khắp pháp giới<br>
Từ bi không biên cương

> Án độ lợi ích tóa ha (3 lần)

! XUẤT SANH

Đại bàng Garuda<br>
Quỷ thần nơi khoáng dã<br>
Mẹ con quỷ La Sát<br>
Cam lồ đều no đủ

> Án mục đế tóa ha (3 lần)

! QUÁN NIỆM TRƯỚC KHI ĂN

Bụt dạy ta khi ăn<br>
Nên duy trì chánh niệm<br>
Đại chúng khi nghe chuông<br>
Xin thực hành năm quán:

* Thức ăn này là tặng phẩm của đất trời, của muôn loài và công phu lao tác.
* Xin nguyện ăn trong chánh niệm và với lòng biết ơn để xứng đáng thọ nhận thức ăn này.
* Xin nhớ nhận diện và chuyển hóa những tật xấu, nhất là tật ăn uống không có chừng mực.
* Chỉ xin ăn những thức có tác dụng nuôi dưỡng và ngăn ngừa tật bệnh.
* Vì muốn nuôi dưỡng tình huynh đệ, xây dựng tăng thân, và chí nguyện độ đời nên thọ nhận thức ăn này.

! TRƯỚC KHI ĂN

Vạn vật tranh sống<br>
Trên quả đất này<br>
Nguyện cho tất cả<br>
Có bát cơm đầy

! BỐN ĐŨA ĐẦU

Đũa thứ nhất, học hiến tặng niềm vui<br>
Đũa thứ hai, học làm vơi nỗi khổ<br>
Đũa thứ ba, học giữ lòng hoan hỷ<br>
Đũa thứ tư, học thực tập thả buông

! ĂN CƠM (1)

Ăn cơm nơi tích môn
Nuôi sống cả tổ tiên
Mở đường cho con cháu
Cùng tìm hướng đi lên
ĂN CƠM (2)

Ăn cơm nơi tích môn<br>
Nhai đều như nhịp thở<br>
Nhiệm mầu ta nuôi nhau<br>
Từ bi nguyền cứu độ

! NHÌN BÁT CƠM ĐÃ SẠCH THỨC ĂN

Bát cơm đã vơi<br>
Bụng đã no rồi<br>
Bốn ơn xin nhớ<br>
Nguyện sẽ đền bồi

! NÂNG CHÉN TRÀ LÊN

Chén trà trong hai tay<br>
Chánh niệm nâng tròn đầy<br>
Thân và tâm an trú<br>
Nơi này và ở đây

! RỬA BÁT (1)

Rửa bát trong tích môn<br>
Ta rửa bát ngàn đời<br>
Bát dơ rồi bát sạch<br>
Đều trên đường rong chơi

! RỬA BÁT (2)

Rửa bát trong tích môn<br>
Ta nhìn ta mỉm cười<br>
Ta làm chi đó vậy<br>
Kìa nụ hồng đang tươi

! RỬA BÁT (3)

Rửa bát nơi tích môn<br>
Chồng lên ba vạn cái<br>
Nhìn qua cửa bản môn<br>
Bát rửa hoài không ngại

! QUÉT TƯỚC

Siêng năng quét đất Bụt<br>
Cây tuệ nẩy mầm xanh

! QUÉT LÁ (1)

Quét lá nơi bản môn<br>
Lá nào cũng thị hiện<br>
Chơi đi trốn đi tìm<br>
Chẳng đi mà chẳng đến

! QUÉT LÁ (2)

Quét lá nơi bản môn<br>
Ta cùng Người thị hiện<br>
Đi về phía mặt trời<br>
Hẹn nhau cùng lên tiếng

! TƯỚI CÂY TRONG CHẬU

Đừng thấy mình riêng lẻ cây ơi<br>
Nước này tuôn chảy từ mạch đất trời<br>
Nước này là đại địa<br>
Ta có nhau tự muôn đời

! DỌN THIỀN ĐƯỜNG

Nơi thiền đường im mát<br>
Quét dọn không thấy mệt

! CẮT HOA

Xin cắt một cành hoa<br>
Tặng phẩm của đất trời<br>
Hoa là vị Bồ Tát<br>
Làm đẹp cho cuộc đời

! CẮM HOA

Trang nghiêm Tịnh Độ<br>
Nơi cõi ta bà<br>
Đất tâm thanh tịnh<br>
Hiển lộ ngàn hoa

! THAY NƯỚC BÌNH HOA

Nước giữ hoa tươi<br>
Hoa nở cho người<br>
Hoa thở tôi thở<br>
Hoa cười tôi cười

! TẮM BỤT

Hôm nay được tắm cho Như Lai<br>
Trí tuệ quang minh công đức lớn<br>
Chúng sanh ba cõi đang chìm đắm<br>
Được thấy trần gian hiện pháp thân

! CHÙI CẦU TIÊU

Đẹp thay sự quét dọn<br>
Tịnh nghiệp ngày thêm lớn

! ĐỔ RÁC (1)

Một thùng rác bẩn<br>
Một bông hồng thơm<br>
Muôn vật chuyển hóa<br>
Thường trong vô thường

! ĐỔ RÁC (2)

Đổ rác chốn bản môn<br>
Nhìn cái nhìn bất nhị<br>
Gửi gắm về tương lai<br>
Bông hoa đầu thế kỷ

! LÀM VƯỜN

Đất đưa ta ra đời<br>
Rồi đất ôm ấp ta<br>
Sinh diệt trong hơi thở<br>
Sinh diệt như hằng sa

! TRỒNG CÂY

Tôi gửi tôi cho đất<br>
Đất gửi đất cho tôi<br>
Tôi gửi tôi nơi Bụt<br>
Bụt gửi Bụt nơi tôi

! NHỔ CỎ (1)

Nhổ cỏ nơi tích môn<br>
Nhớ đến Lý Huệ Tông<br>
Ta nhổ cỏ dùm vua<br>
Hiến tặng đời sự sống

! NHỔ CỎ (2)

Nhổ cỏ nơi tích môn<br>
Nhớ đến Trần Thái Tông<br>
Nhổ cỏ dùm Chiêu Hoàng<br>
Cho sông dài biển rộng

! NHỔ CỎ (3)

Nhổ cỏ nơi tích môn<br>
Nhớ nhìn bản môn cười<br>
Bản môn không che mặt<br>
Tích môn liền thảnh thơi

! NHỔ CỎ (4)

Nhổ cỏ nơi bản môn<br>
Ta nhớ chú điệu xưa<br>
Bụt che chở ngàn đời<br>
Cho muôn ngàn cậu bé

! TƯỚI CÂY (1)

Nước mát và mặt trời<br>
Cùng làm nên màu xanh<br>
Cam lộ của Bồ Tát<br>
Rưới xuống nơi sa mạc<br>
Thành biển xanh<br>
Mông mênh

! TƯỚI CÂY (2)

Tưới cây trong bản môn<br>
Tham dự vào sự sống<br>
Mây tuyết cùng một dòng<br>
Núi cao về biển rộng

! TƯỚI CÂY (3)

Tưới cây trong tích môn<br>
Tham dự vào sự sống<br>
Mây tuyết cùng một dòng<br>
Núi cao về biển rộng

! LẶT RAU

Mặt trời xanh rờn một rổ rau tươi<br>
Vạn pháp nương nhau làm nên cuộc đời

! MỞ MÁY VI TÍNH

Thắp lên máy vi tính<br>
Ý tiếp xúc với Tàng<br>
Tập khí nguyện chuyển hóa<br>
Nuôi lớn Hiểu và Thương

! NHẤC ĐIỆN THOẠI

Tiếng đi ngoài ngàn dặm<br>
Xây dựng niềm tin yêu<br>
Mỗi lời là châu ngọc<br>
Mỗi lời là gấm thêu

! GẮN DÂY AN TOÀN

Hai phần ba tai nạn<br>
Xảy ra tại gần nhà<br>
Biết vậy tôi cẩn trọng<br>
Dù không đi đâu xa

! CHÍT KHĂN

Mái tóc đẹp ngày nào<br>
Nay thành chiếc khăn nâu<br>
Giúp tôi luôn ý thức<br>
Tự do là người tu

! ĐI XE ĐẠP

Ngồi thẳng trên xe đạp<br>
Vững chãi giữ thăng bằng<br>
Phúc xin tu cùng Tuệ<br>
Hành và Giải song song

! TRƯỚC KHI RỒ MÁY XE

Trước khi cho máy nổ<br>
Tôi biết tôi đi đâu<br>
Xe với tôi là một<br>
Xe mau tôi cũng mau

! GIẬN (1)

Cái giận làm tôi xấu<br>
Biết vậy tôi mỉm cười<br>
Quay về thủ hộ ý<br>
Từ quán không buông lơi

! GIẬN (2)

Giận nhau trong tích môn<br>
Thở nhìn bản môn cười<br>
Trò ghét thương đắp đổi<br>
Sông nước cứ đầy vơi

! GIẬN (3)

Giận nhau trong tích môn<br>
Nhắm mắt nhìn mai sau<br>
Trong ba trăm năm nữa<br>
Người đâu và ta đâu?

! NHÌN BÀN TAY

Bàn tay là của ai<br>
Chưa từng một lần chết<br>
Ai ngày qua đã sinh<br>
Ai ngày mai sẽ diệt

! KHÂU ÁO

Khâu áo chốn tích môn<br>
Cho đời lành lặn lại<br>
Mũi kim sợi chỉ này<br>
Là công phu gặt hái

! KỆ VÔ THƯỜNG

Ngày nay đã qua<br>
Đời sống ngắn lại<br>
Hãy nhìn cho kỹ<br>
Ta đã làm gì?<br>
Đại chúng hãy cùng tinh tấn<br>
Thiền tập hết lòng<br>
Sống cho sâu sắc và thảnh thơi<br>
Đừng để tháng ngày trôi đi oan uổng.
<<<
Thở vào tâm tĩnh lặng <br>
Thở ra miệng mỉm cười <br>
An trú trong hiện tại <br>
Giờ phút đẹp tuyệt vời
<<<

! Thực tập

* [[Dành cho người mới bắt đầu]]
* [[Thiền tập cho người bận rộn]]
* [[Thiền tập cho các thiền sinh|Thiền tập]]

! Lối sau

* [[Hoa viên]]
! Tài liệu tham khảo

* [[Kinh quán niệm hơi thở (đọc tại đây)|Kinh quán niệm hơi thở]] (Dịch & chú giải: Thiền sư Thích Nhất Hạnh)
** [[Tải xuống bản PDF đọc trên máy tính|https://thuvienhoasen.org/images/file/wYonv51G0QgQAA5h/kinh-quan-niem-hoi-tho.pdf]]  (Thư viện Hoa Sen)
* [[Thiền sư Tăng Hội - Phương pháp đạt thiền & kinh An Ban Thủ Ý|https://langmai.org/tang-kinh-cac/vien-sach/giang-kinh/thien-su-tang-hoi/thien-hoc-cua-thien-su-tang-hoi/]] (Dịch & chú giải: Thiền sư Thích Nhất Hạnh)
** [[Tải xuống bản PDF đọc trên máy tính|https://thuvienhoasen.org/images/file/bNLTwZ1G0QgQAI9b/thien-su-tang-hoi.pdf]] (Thư viện Hoa Sen)
* [[Trái Tim của Trúc Lâm Đại Sĩ - đọc trực tuyến|https://hoavouu.com/a29378/trai-tim-cua-truc-lam-dai-si]] (Thiền sư Thích Nhất Hạnh bình giảng 10 hội Cư Trần Lạc Đạo Phú) 
** [[Tải xuống bản PDF đọc trên máy tính|https://thuvienhoasen.org/images/file/uQVLwp1G0QgQAD8E/trai-tim-cua-truc-lam-dai-si.pdf]] (Thư viện Hoa Sen)

!! Các tài liệu khác

* [[Thi kệ thực tập chánh niệm (đọc tại đây)|Thi kệ thực tập chánh niệm]]
* [[Sách thiền tập Làng Mai|https://langmai.org/tang-kinh-cac/vien-sach/thien-tap/]] 
<<<
1. Thở vào, tôi thấy tôi là em bé năm tuổi            / ''Thấy em bé''

Thở ra, tôi cười với em bé năm tuổi là tôi           / ''Cười với em bé''

2. Thở vào, tôi thấy em bé năm tuổi là tôi rất mong manh, rất dễ bị thương tích    / ''Em bé rất mong manh, rất dễ bị thương tích''

Thở ra, tôi cười với em bé trong tôi với nụ cười hiểu biết và xót thương        / ''Cười hiểu biết và xót thương''

3. Thở vào, tôi thấy cha tôi là một em bé năm tuổi        / ''Cha như em bé năm tuổi''

Thở ra, tôi cười với cha tôi  như một em bé năm tuổi     / ''Cười với cha như em bé năm tuổi''

4. Thở vào, tôi thấy em bé năm tuổi là cha tôi
rất mong manh rất dễ bị thương tích,  /'' Em bé là cha rất mong manh, rất dễ bị thương tích''

Thở ra, tôi cười với em bé là cha tôi
với nụ cười hiểu biết và xót thương     / ''Cười với cha với nụ cười hiểu biết và xót thương''

5. Thở vào, tôi thấy mẹ tôi là một em bé năm tuổi         / ''Mẹ như em bé năm tuổi''

Thở ra, tôi cười  với mẹ tôi như một em bé năm tuổi    / ''Cười với mẹ như em bé năm tuổi''

6. Thở vào, tôi thấy em bé năm tuổi là mẹ tôi
rất mong manh rất dễ bị thương tích    / ''Em bé là mẹ rất mong manh, rất dễ bị thương tích''

Thở ra, tôi cười với em bé là mẹ tôi
với nụ cười hiểu biết và xót thương       / ''Cười với mẹ với nụ cười hiểu biết và xót thương''

7. Thở vào, tôi thấy những nỗi khổ của cha tôi hồi năm tuổi   / ''Cha khổ hồi năm tuổi''

Thở ra, tôi thấy những  nỗi khổ của mẹ tôi hồi năm tuổi       / ''Mẹ khổ hồi năm tuổi''

8. Thở vào, tôi thấy cha tôi trong tôi           / ''Cha trong tôi''

Thở ra, tôi cười  với cha tôi trong tôi     / ''Cười với cha trong tôi''

9. Thở vào, tôi thấy mẹ tôi trong tôi      / ''Mẹ trong tôi''

Thở ra, tôi cười với mẹ trong tôi          / ''Cười với mẹ trong tôi''

10. Thở vào, tôi hiểu được những nỗi khó khăn của cha tôi trong tôi    / ''Khó khăn của cha trong tôi''

Thở ra, tôi nguyện chuyển hóa cho cả cha tôi và tôi      / ''Chuyển hóa cả hai cha con''

11. Thở vào, tôi hiểu được những nỗi khó khăn của mẹ tôi trong tôi  / ''Khó khăn của mẹ trong tôi''

Thở ra, tôi nguyện chuyển hóa cho cả mẹ tôi và tôi     /'' Chuyển hóa cả hai mẹ con''
<<<


Bài tập này đã giúp cho nhiều người trẻ thiết lập lại được liên lạc tốt đẹp giữa bản thân và cha mẹ, đồng thời chuyển hóa được những nội kết được hun đúc từ tấm bé. Có những người không thể nghĩ đến cha hoặc mẹ mà không có niềm oán hận và sầu khổ trong lòng. Hạt giống thương yêu luôn luôn có sẵn trong lòng cha mẹ và trong lòng những người con, nhưng vì không biết tưới tẩm những hạt giống ấy và nhất là vì không biết hóa giải những nội kết đã được gieo trồng và không ngừng phát triển trong tâm cho nên cả hai thế hệ đều thấy khó khăn trong việc chấp nhận lẫn nhau.

Trong bước đầu, hành giả quán tưởng mình là một em bé năm tuổi. Vào tuổi đó, ta rất dễ bị thương tích. Một cái trừng mắt nghiêm khắc, một tiếng nạt, hoặc một tiếng chê cũng có thể gây thương tích và mặc cảm trong ta. Khi cha làm khổ mẹ hoặc mẹ làm khổ cha hoặc khi cha mẹ làm khổ nhau, hạt giống khổ đau được gieo vào và được tưới tẩm trong lòng em bé. Cứ như thế lớn lên, em bé sẽ mang nhiều nội kết khổ đau và sống với sự oán trách cha hoặc mẹ hoặc cả hai. Thấy được mình là một em bé dễ bị thương tích như thế, ta sẽ thấy tội nghiệp cho ta, ta sẽ thấy xót thương dâng lên thấm vào con người của mình. Ta cười với em bé năm tuổi bằng nụ cười của từ bi, của xót thương.

Sau đó, hành giả quán tưởng cha hoặc mẹ mình là em bé năm tuổi. Thường thì ta chỉ có thể thấy cha ta là một người lớn, nghiêm khắc, khó tính, chỉ biết sử dụng uy quyền để giải quyết mọi việc. Nhưng ta biết rằng trước khi thành người lớn, ông cũng đã từng là một chú bé con năm tuổi, cũng mong manh dễ bị thương tích như ta. Ta thấy cậu bé ấy cũng đã từng khép nép, nín im thin thít mỗi khi cha cậu nổi trận lôi đình. Ta thấy cậu bé ấy cũng đã là nạn nhân của sự nóng nảy, cau có và gắt gỏng của cha cậu ấy, tức là ông nội của ta. Nếu cần, ta có thể tìm tập ảnh gia đình ngày trước để khám phá lại hình ảnh của cậu bé năm tuổi ngày xưa tức là cha ta, hay cô bé năm tuổi ngày xưa tức là mẹ ta. Trong thiền quán ta hãy làm quen và mỉm cười thân thiện với cậu bé hoặc cô bé ấy, ta thấy được tính cách mong manh và dễ bị thương tích của họ. Và ta cũng sẽ thấy xót thương trào lên. Khi chất liệu xót thương được ứa ra từ trái tim ta, ta biết rằng sự quán chiếu bắt đầu có kết quả. Thấy được và hiểu được thì thế nào ta cũng sẽ thương được. Nội kết của ta sẽ được chuyển hóa dần với sự thực tập này. Với sự hiểu biết, ta bắt đầu chấp nhận. Và ta sẽ có thể dùng hiểu biết và tình thương của ta để trở về giúp cha hoặc mẹ để chuyển hóa. Ta biết ta có thể làm được việc này bởi vì sự hiểu biết và lòng xót thương đã chuyển hóa ta và ta đã trở nên dễ chịu, ngọt ngào, có thêm nhiều bình tĩnh và kiên nhẫn.

Kiên nhẫn và bình tĩnh là dấu hiệu của sự có mặt đích thực của tình thương.
> Thở vào, tâm tĩnh lặng.       / ''Tĩnh lặng''
> Thở ra, miệng mỉm cười.   /  ''Mỉm cười''
>
> Thở vào, an trú trong hiện tại        /  ''Hiện tại''
> Thở ra, giây phút đẹp tuyệt vời     /  ''Tuyệt vời''

Nhiều người bắt đầu thực tập thiền bằng bài tập này. Có nhiều người dù đã thực tập bài tập này trong nhiều năm vẫn còn tiếp tục thực tập, bởi vì nó tiếp tục đem tới nhiều lợi lạc cho hành giả.

Thở vào, ta chú tâm tới hơi thở: hơi thở vào tới đâu ta cảm thấy tĩnh lặng tới đó, giống như khi ta uống nước mát; nước đi tới đâu thì ruột gan ta mát tới đó. Trong thiền tập, hễ tâm tĩnh lặng thì thân cũng tĩnh lặng, bởi vì hơi thở có ý thức đem thân và tâm về một mối. Khi thở ra ta mỉm cười, để thư giãn tất cả các bắp thịt trên mặt (có khoảng 300 bắp thịt trên mặt ta). Thần kinh ta cũng được thư giãn khi ta mỉm cười. Nụ cười vừa là kết quả của sự tĩnh lặng do hơi thở vào đem lại, mà cũng vừa là nguyên nhân giúp ta trở nên thư thái và cảm thấy sự an lạc phát hiện rõ ràng thêm.

Hơi thở thứ hai đem ta về giây phút hiện tại, cắt đứt mọi ràng buộc với quá khứ và mọi lo lắng về tương lai, để ta có thể an trú trong giây phút hiện tại. Sự sống chỉ mặt trong giây phút hiện tại, vì vậy ta phải trở về giây phút ấy để tiếp xúc với sự sống. Hơi thở này giúp ta trở về sự sống chân thật. Biết mình đang sống và biết mình có thể tiếp xúc với tất cả mọi mầu nhiệm của sự sống trong ta và xung quanh ta, đó là một phép lạ. Chỉ cần mở mắt hoặc lắng nghe là ta tiếp nhận được những mầu nhiệm của sự sống. Vì vậy cho nên giây phút hiện tại có thể là giây phút đẹp nhất và tuyệt vời nhất, nếu ta thực tập sống tỉnh thức bằng hơi thở. Ta có thể thực tập hơi thở thứ nhất nhiều lần trước khi đi sang hơi thở thứ hai.

Bài này có thể thực tập bất cứ ở đâu: trong thiền đường, trên xe lửa, trong nhà bếp, ngoài bờ sông, trong công viên, trong các tư thế đi, đứng, nằm, ngồi và ngay cả lúc đang làm việc.
> 1. Thở vào, biết thở vào        / ''Vào''
> Thở ra, biết thở ra           / ''Ra''

> 2. Hơi thở vào càng sâu       / ''Sâu''
> Hơi thở ra càng chậm     / ''Chậm''

> 3. Thở vào, tôi thấy khỏe       / ''Khỏe''
> Thở ra, tôi thấy nhẹ          / ''Nhẹ''

> 4. Thở vào, tâm tĩnh lặng        / ''Lặng''
> Thở ra, miệng mỉm cười     / ''Cười''

> 5. An trú trong hiện tại           / ''Hiện tại''
> Giây phút đẹp tuyệt vời     / ''Tuyệt vời''

Bài này có thể thực tập bất cứ ở đâu, trong thiền đường, ngoài phòng khách, ở dưới bếp hay trong toa xe lửa. Hơi thở đầu là để đưa thân và tâm về hợp nhất, đồng thời giúp ta trở về an trú trong giây phút hiện tại, tiếp xúc với sự sống mầu nhiệm đang xảy ra trong phút giây ấy. Sau khi ta thở như thế trong vài ba phút, tự nhiên hơi thở ta trở nên nhẹ nhàng, khoan thai, êm hơn, chậm hơn, sâu hơn và cố nhiên ta cảm thấy rất dễ chịu trong thân cũng như trong tâm. Đó là hơi thở sâu, chậm thứ hai. Ta có thể an trú với hơi thở ấy lâu bao nhiêu cũng được. Rồi ta đi qua hơi thở khỏe, nhẹ. Ở đây ta ý thức được tính cách nhẹ nhàng (khinh an) và khỏe khoắn (tịnh lạc) của thân tâm, và thiền duyệt tiếp tục nuôi dưỡng ta. Thiền duyệt là cái vui của thiền định, thường được ví dụ cho thức ăn. Hơi thở tiếp theo là lặng, cười và hiện tại, tuyệt vời mà ta đã thực tập trong bài thứ nhất.
> Thở vào, tôi biết tôi thở vào     –  ''vào''
> Thở ra, tôi biết tôi thở ra        –     ''ra''

Đây là bài tập nhận diện hơi thở. Nếu đó là hơi thở vào thì ta biết đó là hơi thở vào. Nếu đó là hơi thở ra thì ta biết đó là hơi thở ra. Thực tập như thế vài lần tự khắc ta sẽ ngưng được sự suy nghĩ về quá khứ, về tương lai và chấm dứt mọi tạp niệm. Sở dĩ được như thế là vì tâm đã để hết vào hơi thở để nhận diện hơi thở, và do đó tâm trở thành một với hơi thở. Tâm bây giờ không phải là tâm lo lắng hoặc tâm tưởng nhớ mà chỉ là tâm hơi thở


> Thở vào, tôi thấy tôi là bông hoa       – ''Là hoa''
> Thở ra, tôi cảm thấy tươi mát          – ''Tươi mát''

Bài tập này đem lại sự tươi mát. Con người đáng lý phải tươi mát như một bông hoa, bởi chính con người là một bông hoa trong vườn hoa vạn vật. Chúng ta chỉ cần nhìn các em bé xinh xắn là thấy điều đó. Hai mắt trong là những bông hoa. Khuôn mặt sáng với vầng trán hiền lành là một bông hoa. Hai bàn tay là bông hoa… Chỉ vì lo lắng nhiều mà trán ta nhăn, chỉ vì khóc nhiều và trải qua nhiều đêm không ngủ nên mắt ta đục… Thở vào để phục hồi tính cách bông hoa của tự thân. Hơi thở vào làm sống dậy bông hoa của tự thân. Hơi thở ra giúp ta ý thức là ta có thể và đang tươi mát như một bông hoa. Đó là tự tưới hoa cho mình, đó là từ bi quán thực tập cho bản thân.

 
> Thở vào, tôi thấy tôi là trái núi      –  ''Là núi''
> Thở ra, tôi cảm thấy vững vàng      –  ''Vững vàng''

“Là núi vững vàng” giúp ta đứng vững những lúc ta bị điêu đứng vì những cảm thọ quá mãnh liệt. Mỗi khi ta lâm vào các trạng thái thất vọng, lo lắng, sợ hãi hoặc giận dữ, ta có cảm tưởng đang đi ngang qua một cơn bão tố. Dưới sự trấn ngự của cảm xúc, ta có cảm tưởng mong manh, dễ vỡ, ta nghĩ ta có thể đánh mất sự sống của ta. Ta như một thân cây đang đứng trong cơn lốc. Nhìn lên ngọn, ta thấy cành lá oằn oại như có thể bị gẫy ngã hoặc cuốn theo cơn lốc bất cứ lúc nào. Nhưng nếu nhìn xuống thân cây và nhất là cội cây, biết rằng rễ cây đang bám chặt vững vàng trong lòng đất, ta sẽ thấy cây vững chãi hơn và ta sẽ an tâm hơn. Thân tâm ta cũng thế. Trong cơn lốc của cảm xúc, nếu ta biết dời khỏi vùng bão tố (tức là vùng não bộ) mà di chuyển sự chú ý xuống bụng dưới, nơi huyệt đan điền và thở thật sâu thật chậm theo bài tập là núi vững vàng ta sẽ thấy rất khác. Ta sẽ thấy ta không phải chỉ là cảm xúc. Nếu biết ngồi xuống trong tư thế hoa sen thực tập hơi thở là núi vững vàng ta sẽ vượt thoát được những giai đoạn khó khăn ấy.

 

> Thở vào, tôi trở nên mặt nước tĩnh                     – ''Nước tĩnh''
> Thở ra, tôi im lặng phản chiếu trời mây đồi núi    – ''Lặng chiếu''

“Nước tĩnh lặng chiếu” có mục đích làm tĩnh lặng thân tâm. Mỗi khi tâm ta không tĩnh lặng, tri giác ta thường sai lầm: những điều ta thấy, nghe và suy nghĩ không phản chiếu được sự thật, cũng như mặt hồ khi có sóng không thể nào phản chiếu được trung thực những đám mây trên trời. Bụt là vầng trăng mát, đi ngang trời thái không, hồ tâm chúng sanh lặng, trăng hiện bóng trong ngần là ý ấy. Những buồn khổ và giận hờn của ta phát sinh từ tri giác sai lầm, vì vậy để tránh tri giác sai lầm, ta phải tập luyện cho tâm được bình thản như mặt hồ thu buổi sáng. Hơi thở là để làm việc ấy.

 
> Thở vào, tôi trở nên không gian mênh mông      –  ''Không gian''
> Thở ra, tôi cảm thấy tự do thênh thang             –  ''Thênh thang''

“Không gian thênh thang” đem không gian về cho chúng ta, không gian trong lòng và không gian chung quanh ta. Nếu ta có nhiều lo toan và dự án quá thì ta nên bỏ bớt. Những đau buồn oán giận trong ta cũng vậy, ta phải tập buông bỏ. Những loại hành lý ấy chỉ làm cho cuộc đời thêm nặng, liệng bỏ được chúng thì ta có hạnh phúc.

 
> Thở vào
> Thở ra
> Là hoa tươi mát
> Là núi vững vàng
> Nước tĩnh lặng chiếu
> Không gian thênh thang.
! Được ngồi yên là một đặc ân

Khi Tổng thống Nelson Mandela đến thăm nước Pháp lần đầu sau thời gian bị giam cầm, một nhà báo đã hỏi: “Ngài mong muốn điều gì nhất?” Thủ tướng Nelson Mandela trả lời: “Được ngồi yên và không phải làm gì cả. Từ khi ra khỏi tù, tôi không có được cái may mắn đó. Tôi quá bận, cho nên điều mà tôi mong muốn nhất là ngồi yên và không làm gì cả.” Có cơ hội được ngồi yên và thưởng thức hơi thở vào ra là điều rất tuyệt vời. Thở vào, thở ra, không có gì khó khăn. Mời bạn ngồi cho Nelson Mandela, ngồi cho tất cả những ai đang rong ruổi, cho tất cả những ai không có thì giờ trở về với chính mình để thực sự sống. Trong thời đại này, được ngồi yên là một sự xa xỉ mà cũng là điều hết sức cần thiết cho việc chữa trị và nuôi dưỡng thân tâm.

Chọn một tư thế mà bạn cảm thấy thoải mái nhất, ngồi trên tọa cụ hay trên ghế. Nếu ngồi trên ghế thì đặt cả hai lòng bàn chân xuống sàn nhà. Lưng thẳng, nhưng không cứng. Buông thư hoàn toàn, ngồi thật tự nhiên trên ghế hoặc tọa cụ, bụng mềm, miệng mỉm cười. Chú tâm hoàn toàn vào hơi thở vào, ra. Khoảng một vài phút, tâm bắt đầu bị xao lãng, khi ấy ta mỉm cười và nhẹ nhàng đưa chánh niệm trở về hơi thở. Nếu có quá nhiều suy nghĩ khởi lên trong khi ngồi thiền, bạn đừng lo lắng, bực bội, chỉ cần mỉm cười, dịu dàng kéo ý thức trở về hơi thở mỗi khi bị xao lãng. Trong một buổi ngồi thiền sẽ có nhiều lần bạn bị thất niệm, nhưng thực tập tinh tấn một thời gian số lần đó sẽ giảm đi.

Ngồi thiền trước hết là để không phải làm gì hết và để được buông thư. Khi nắm vững nghệ thuật theo dõi hơi thở và mỉm cười thì càng ngồi thiền càng thấy thích thú. Rồi, nhờ năng lượng của niệm và định, ta sẽ bắt đầu quán chiếu sâu sắc vào thân thể, tâm thức và hoàn cảnh. Khi thấy mọi sự, mọi việc một cách rõ ràng, ta có thể tránh được rất nhiều lầm lỗi. Ta sẽ có cơ hội làm những việc nên làm, để đem lại an lạc, hạnh phúc cho ta và những người ta thương. Đó là lợi ích của ngồi thiền.

! Ngồi Đâu Cũng Là Ngồi Thiền

Khi muốn dừng lại để trở về với chính mình, bạn không cần phải chạy nhanh về nhà, vào thiền phòng, hay đến một trung tâm thiền thì mới thực tập hơi thở chánh niệm được. Ở đâu bạn cũng tập thở được, khi ngồi tại văn phòng hay trong xe hơi. Ngay cả khi đi mua sắm tại một siêu thị đông người hay đứng chờ hàng dài trước nhà băng, nếu bạn cảm thấy bực dọc hay mệt mỏi, bạn có thể tập thở và mỉm cười để đừng đánh mất mình và giữ gìn sự thăng bằng cho thân tâm.

Giữa bao phiền toái của cuộc đời, để đủ khả năng đối diện chúng, ta cần trở về với chính mình, và hơi thở chánh niệm giúp ta làm việc đó. Ở đâu, trong tư thế nào, đi, đứng, nằm, ngồi, ta cũng tập thở được. Dù sao, tư thế ngồi vẩn là tư thế vững chải nhất. Một hôm, tôi đang ngồi chờ máy bay tại phi trường Kenedy, thành phố New – York. Máy bay trể bốn tiếng đồng hồ. Tôi liền xếp hai chân lại và ngồi thiền ngay trong phòng đợi. Tôi cuộn tròn áo ấm lại để làm gối ngồi thiền. Mọi người đi qua đi lại nhìn tôi có vẻ tò mò, nhưng sau một lúc, họ không để ý đế tôi nữa và tôi ngồi thiền một cách yên ổn. Phi trường đầy nghẹt cả người, không có một chổ nào để đặt lưng, chỉ còn cách ngồi cho an ổn thảnh thơi ngay tại chổ của mình. Dĩ nhiên không ai muốn ngồi thiền giữa chốn đông người, kẻ qua người lại chú ý tới, nhưng dù ở đâu và trong tư thế nào, mình biết theo dõi hơi thở thì mình sẽ phục hồi được con người của mình một cách nhanh chóng.

! Thiền tọa

Cách ngồi thiền vững chãi nhất là ngồi xếp bằng hai chân trên một cái gối dày vừa đủ để giữ vững toàn thân. Tốt nhất là ngồi trong tư thế kiết già hay bán già, chân phải đặt trên bắp vế trái và chân trái trên bắp vế phải.
Nếu ngồi kiết già quá khó thì có thể ngồi xếp hai chân lại cũng được, hoặc muốn ngồi như thế nào cũng được miễn là cảm thấy thoải mái. Bạn cũng có thể ngồi trên ghế, hai bàn chân đặt trên sàn nhà và hai tay xếp trên lòng. Bạn cũng có thể nằm dài trên sàn nhà, lưng chạm đất, hai chân duổi thẳng cách nhau vài tấc, hai tay duổi thẳng hai bên thân, lòng bàn tay ngửa lên trời.

Nếu chân bạn bị tê trong khi ngồi, bạn có thể tự động sửa lại thế ngồi cho thoải mái hoặc đổi chân dưới lên trên. Bạn vừa làm một cách nhẹ nhàng chậm rãi, vừa theo dõi hơi thở và từng cử động của thân thể thì tâm bạn vẩn an trú trong định. Nếu chân vẫn không hết đau làm bạn chịu hết nổi thì bạn có thể đứng dậy, đi thiền hành từng bước chậm rãi, đến lúc bạn thấy có thể ngồi lại được thì bạn ngồi xuống.

Tại một vài thiền viện, thiền sinh không được nhúc nhích động đậy trong khi ngồi thiền. Dù chân bị tê nhức thế nào họ cũng phải cố gắng chịu đựng. Tôi thấy điều này hơi quá đáng. Chúng ta ngồi thiền là để có an lạc và hạnh phúc, nếu một phần nào của thân thể bị đau nhức tức là thân thể muốn báo động ta điều gì, ta phải biết lắng nghe, ta không nên bắt nó chịu đựng quá sức, vì làm thế có thể nó bị tổn thương. khi chân bị tê trong khi ngồi, ta có thể thay đổi chân hoặc đứng dậy đi thiền hành, điều này không đến nổi gây trở ngại cho ta mà lại giúp ta rất nhiều.

Đôi khi chúng ta ngồi thiền là để chạy trốn cuộc đời và chạy trốn chính mình ta, giống như con thỏ chạy về cái hang của nó. Làm như vậy, chúng ta có thể tạm yên ổn trong một thời gian ngắn, nhưng khi ló đầu ra khỏi hang, chúng ta vẫn phải đối diện với những vấn đề thường nhật của chúng ta như thường. Giống như khi chúng ta tu hành xác, chúng ta mệt nhoài và có ảo tưởng là chúng ta chẳng còn vấn đề gì nữa hết. Nhưng khi cơ thể được phục hồi và sinh khí trở lại thì những vấn đề kia cũng trở về theo.

Chúng ta không cần tu rục, chúng ta cần tu cho thảnh thơi, đều đặn, và tinh tấn, mỗi ngày đều quán chiếu nhìn sâu vào lòng mọi sự mọi việc đang xảy ra. Thực tập như thế chúng ta mới có thể tiếp xúc được sâu sắc với cuộc sống muôn hình vạn trạng và biến đổi vô thường.
1.

> Thở vào, biết thở vào   / ''Vào''
> Thở ra, biết thở ra        / ''Ra'' 

2.

> Hơi thở vào càng sâu        / ''Sâu''
> Hơi thở ra càng chậm       / ''Chậm''

3.

> Thở vào, ý thức toàn thân          / ''Ý thức''
> Thở ra, buông thư toàn thân      / ''Buông thư''

4.

>  Thở vào an tịnh toàn thân      / ''An tịnh''
> Thở ra, lân mẫn toàn thân     / ''Lân mẫn''

5.

> Thở vào, cười với toàn thân    / ''Cười''
> Thở ra, thanh thản toàn thân      / ''Thanh thản''

6.

> Thở vào, cười với toàn thân     / ''Cười''
> Thở ra, buông thả nhẹ nhàng       / ''Buông thả''

7. 

> Thở vào, cảm thấy mừng vui    / ''Mừng vui''
> Thở ra, nếm nguồn an lạc            / ''An lạc''

8.

> Thở vào, an trú hiện tại    / ''Hiện tại''
> Thở ra, hiện tại tuyệt vời     / ''Tuyệt vời''

9.

>Thở vào, thế ngồi vững chãi      / ''Vững chãi''
> Thở ra, an ổn vững vàng              / ''An ổn''

Bài này tuy dễ thực tập nhưng hiệu quả thì to lớn vô cùng. Những người mới bắt đầu thiền tập nhờ bài này mà nếm ngay được sự tịnh lạc của thiền tập. Tuy nhiên những người đã thiền tập lâu năm cũng vẫn cần thực tập bài này để tiếp tục nuôi dưỡng thân tâm, để có thể đi xa.

''Hơi thở đầu (vào, ra)'' là để nhận diện hơi thở. Nếu đó là hơi thở vào thì hành giả biết đó là hơi thở vào. Nếu đó là hơi thở ra thì hành giả biết đó là hơi thở ra. Thực tập như thế vài lần tự khắc hành giả ngưng được sự suy nghĩ về quá khứ, về tương lai và chấm dứt mọi tạp niệm. Sở dĩ được như thế là vì tâm hành giả đã để hết vào hơi thở để nhận diện hơi thở, và do đó tâm trở thành một với hơi thở. Tâm bây giờ không phải là tâm lo lắng hoặc tâm tưởng nhớ mà chỉ là tâm hơi thở (the mind of breathing).

''Hơi thở thứ hai (sâu, chậm)'' là để thấy được rằng hơi thở vào đã sâu thêm và hơi thở ra đã chậm lại. Điều này xảy ra một cách tự nhiên mà không cần sự cố ý của hành giả. Thở và ý thức mình đang thở (như trong hơi thở đầu) thì tự nhiên hơi thở trở nên sâu hơn, chậm hơn, điều hòa hơn, nghĩa là có phẩm chất hơn. Mà khi hơi thở đã trở nên điều hòa, an tịnh và nhịp nhàng thì hành giả bắt đầu có cảm giác an lạc trong thân và trong tâm. Sự an tịnh của hơi thở kéo theo sự an tịnh của thân và tâm. Lúc bấy giờ hành giả đã bắt đầu có pháp lạc, tức là có thiền duyệt.

''Hơi thở thứ ba (ý thức toàn thân, buông thư toàn thân)'': hơi thở vào đem tâm về với thân và làm quen lại với thân. Hơi thở là cây cầu bắc từ thân sang tâm và từ tâm sang thân. Hơi thở ra có công dụng buông thư (relaxing) toàn thân. Trong khi thở ra hành giả làm cho các bắp thịt trên vai, trong cánh tay và trong toàn thân thư giãn ra để cho cảm giác thư thái đi vào trong toàn thân. Nên thực tập hơi thở này ít nhất là mười lần.

''Hơi thở thứ tư (an tịnh toàn thân, lân mẫn toàn thân)'': bằng hơi thở vào, hành giả làm cho an tịnh lại sự vận hành của cơ thể (Kinh Niệm Xứ gọi là an tịnh thân hành); bằng hơi thở ra, hành giả tỏ lòng lân mẫn săn sóc toàn thân. Tiếp tục hơi thở thứ ba, hơi thở này làm cho toàn thân lắng dịu và giúp hành giả thực tập đem lòng tư bi mà tiếp xử với chính thân thể của mình.

''Hơi thở thứ năm (cười với toàn thân, thanh tịnh toàn thân)'': nụ cười làm thư giãn tất cả các bắp thịt trên mặt. Hành giả gởi nụ cười ấy đến với toàn thân như một giòng suối mát. Thanh thản là làm cho nhẹ nhàng và thư thái (easing). Hơi thở này cũng có mục đích nuôi dưỡng toàn thân bằng lòng lân mẫn của chính hành giả.

''Hơi thở thứ sáu (cười với toàn thân, buông thả nhẹ nhàng)'': tiếp nối hơi thở thứ năm, hơi thở này làm cho tan biến tất cả những gì căng thẳng (tensions) còn lại trong cơ thể.

''Hơi thở thứ bảy (cảm thấy mừng vui, nếm nguồn an lạc)'': trong khi thở vào, hành giả cảm nhận nỗi mừng vui thấy mình còn sống, khỏe mạnh, có cơ hội săn sóc và nuôi dưỡng cơ thể lẫn tinh thần mình. Hơi thở ra đi với cảm giác hạnh phúc. Hạnh phúc luôn luôn đơn sơ và giản dị. Ngồi yên và thở có ý thức đó có thể là một thứ hạnh phúc rồi. Biết bao nhiêu người đang xoay như một chiếc chong chóng trong đời sống bận rộn hàng ngày và không có cơ hội nếm được pháp lạc này.

''Hơi thở thứ tám (an trú hiện tại, hiện tại tuyệt vời)'': hơi thở vào đưa hành giả về an trú trong giây phút hiện tại. Bụt dạy rằng quá khứ đã đi mất, tương lai thì chưa tới, sự sống chỉ có mặt trong giây phút hiện tại. Trở về an trú trong hiện tại là thực sự trở về với sự sống, và chính trong giây phút hiện tại mà hành giả tiếp xúc được với tất cả những mầu nhiệm của cuộc đời. An lạc, giải thoát, Phật tính và niết bàn… tất cả đều chỉ có thể tìm thấy trong giây phút hiện tại. Hạnh phúc nằm trong giây phút hiện tại. Hơi thở vào giúp hành giả tiếp xúc với những mầu nhiệm ấy. Hơi thở ra đem lại rất nhiều hạnh phúc cho hành giả, vì vậy hành giả nói: hiện tại tuyệt vời.

''Hơi thở thứ chín (thế ngồi vững chãi, an ổn vững vàng)'': hơi thở này giúp hành giả thấy được thế ngồi vững chãi của mình. Nếu thế ngồi chưa được thẳng và đẹp thì sẽ trở nên thẳng và đẹp. Thế ngồi vững chãi đưa đến cảm giác an ổn vững vàng trong tâm ý. Chính trong lúc ngồi như vậy mà hành giả làm chủ được thân tâm mình, không bị lôi kéo theo những thân nghiệp, khẩu nghiệp và ý nghiệp có tác dụng làm đắm chìm.
Nguồn: https://langmai.org/thien-duong/thien-tap-cho-nguoi-ban-ron/

! Thức dậy vào mỗi buổi sáng

Ngay khi mới thức dậy, bạn có thể mỉm cười liền lập tức, nụ cười này mang tính giác ngộ: bạn ý thức là một ngày mới được bắt đầu và hăm bốn giờ tinh khôi là món quà mà sự sống đang hiến tặng cho bạn. Đó là tặng phẩm quý giá nhất. Bạn có thể đọc thầm hoặc đọc lớn tiếng bài thơ này:

> Thức dậy miệng mỉm cười
> Hăm bốn giờ tinh khôi
> Xin nguyện sống trọn vẹn
> Mắt thương nhìn cuộc đời.

Bạn có thể vẫn nằm yên trên giường, buông thẳng hai tay và hai chân một cách thoải mái trong khi đọc bài thi kệ ấy. Thở vào, đọc thầm câu đầu. Thở ra, đọc thầm câu thứ hai. Thở vào, đọc câu thứ ba. Thở ra, đọc câu thứ tư. Và với nụ cười, bạn ngồi dậy, quơ dép và đi vào phòng rửa mặt.

! Múc nước đổ vào chậu, thau hay vặn nước máy để rửa mặt

Bạn có thể có nhiều hạnh phúc trong thời gian rửa mặt, súc miệng. chải đầu, cạo râu hay tắm, nếu bạn biết đem ý thức chiếu rọi vào những gì bạn đang làm. Ví dụ khi mở nước, bạn biết là nước bắt đầu chảy ra từ vòi nước và bạn cũng biết được là nước từ đâu chảy tới tận phòng rửa mặt của bạn. Bạn có thể thầm đọc bài thi kệ sau đây:

> Nước từ nguồn suối cao
> Nước từ lòng đất sâu
> Nước mầu nhiệm tuôn chảy
> Ơn nước luôn tràn đầy.

Bài thi kệ này giúp bạn thấy được nước từ đâu tới, biết được nước từ đâu tới. Cái thấy đó đã là thiền quán. Bạn cũng biết rằng bạn đang may mắn, vì nước không bị cúp. Cái biết đó đem lại cho bạn hạnh phúc. Cái biết đó là chánh niệm. Chánh niệm là ý thức, là khả năng nhận diện được cái gì đang xảy ra ở đây trong giây phút này. Cái đang xảy ra là bạn đang mở nước và có nước đang chảy ra. Ở làng Mai bên Pháp thỉnh thoảng cũng bị cúp nước. Mỗi lần như thế mình biết được cái khổ khi không có nước và hạnh phúc khi có nước. Cái hạnh phúc chỉ được nhận diện khi mình nhớ tới cái đau khổ! Tôi thường mở nước nhẹ thôi và lấy bàn tay hứng nước mát lạnh phải vào hai mắt. Bên này mùa Đông nước lạnh lạnh lắm! Cái cảm giác do nước lạnh gây nên trên ngón tay, trên hai mắt và trên gò má rấtdễ chịu. Bạn hãy nhận diện cảm giác đó. Bạn tỉnh hẳn ra do cảm giác đó. Bạn hãy tận hưởng cái cảm giác đó. Bạn hạnh phúc cũng nhờ bạn biết trân quý nước và nhờ tâm niệm biết ơn của bạn.

Lấy gáo múc nước trong chum hay trong vại để đổ vào thau rửa mặt cũng thế, bạn hãy để tâm ý vào từng động tác, đừng suy nghĩ đến những chuyện khác và quan trọng nhất là phải thấy có niềm vui trong từng động tác, đừng làm hấp tấp cho mau xong. Thiền là như thế ! Thiền là có mặt thực sự cho mình trong từng giây phút của sự sống, và khả năng nhận diện rằng mỗi giây phút của sự sống là một tặng phẩm của sự sống, một tặng phẩm của đất trời. Cái hạnh phúc này được gọi là thiền duyệt (The joy of meditation).

! Chải răng

Đây là một thử thách cho bạn. Bạn có một tới hai phút để chải răng. Làm sao để bạn có hạnh phúc trong thời gian ngắn ngủi ấy? Đừng hấp tấp, đừng cố chải răng cho mau xong. Phải đem hết tâm ý đặt vào việc chải răng. Bạn có thì giờ để chải răng. Bạn có bàn chải, có kem và có răng để chải. Tôi đã trên tám mươi tuổi, vậy mà mỗi khi chải răng tôi đều có hạnh phúc: tôi thấy đến tuổi này mà còn có mấy mươi cái răng để chải là cũng mầu nhiệm lắm. Đây là sự thách thức: chải răng như thế nào để bạn có được thảnh thơi và hạnh phúc trong thời gian từ một phút đến hai phút chải răng. Làm được như thế là có thiền, là thành công rồi đấy.
Đây là một bài kệ bạn có thể sử dụng trong khi chải răng:

> Chải răng và súc miệng
> Cho sạch nghiệp nói năng
> Miệng thơm lời chánh ngữ
> Hoa nở tự vườn tâm.

Những bài thi kệ giúp ta đưa ý thức trở về với những gì trong giây phút hiện tại. Ta đừng bị kẹt vào những bài thi kệ, nếu ta có niệm, có định, nếu ta an trú được trong hiện tại thì ta cũng không cần đến những bài thi kệ ấy lắm đâu.

! Tắm dưới gương sen, gội đầu, chải đầu, cạo râu, mặc áo

Trong khi kỳ cọ, xoa xà phòng, cạo râu, chải đầu, mặc áo, ta đều có thể thực tập như khi ta chải răng. Ta để tâm ý hoàn toàn vào cái ta đang làm. Ta làm cho thong dong, cho hạnh phúc, như thể cạo râu, chải tóc, cạo đầu là việc quan trọng nhất trên đời. Đừng để suy tư kéo ta đi về quá khứ, đi về tương lai hay làm ta kẹt vào những lo lắng, sầu khổ, giận hờn. Bạn tập đi, vài ba ngày sẽ thấy tiến bộ, giống như tập đàn, chơi bóng bàn, tập hát… Bạn hãy tập sống sâu sắc và thảnh thơi mỗi giây phút của đời sống hàng ngày. Mà muốn được như vậy, tâm ý phải rời bỏ quá khứ, rời bỏ tương lai và rời bỏ ưu tư để trở về với giây phút hiện tại. Giây phút hiện tại là giây phút duy nhất chứa đựng sự sống với tất cả những mầu nhiệm của nó.

! Ngồi thở

Có người ngồi thiền mỗi lần nửa giờ, bốn mươi lăm phút hoặc nhiều hơn. Ở đây tôi chỉ xin bạn ngồi hai hoặc ba phút. Nếu sau này thấy ngồi thiền dễ chịu, bạn cứ việc ngồi thêm, ngồi bao lâu cũng được.

Nếu trong nhà bạn có bàn thờ Phật thì bạn có thể ngồi trước bàn Phật. Nếu không, bạn chọn một nơi nào thích hợp, có thể là trước cửa sổ, ngồi nhìn ra ngoài trời. Sắm một cái gối nhỏ, dày chừng mười tới mười lăm phân, kê dưới mông; hai bàn chân xếp lại đầu gối đặt xuống bên ngoài chiếc gối nhỏ, như vậy mông và đầu gối trở thành thế ba chân vạc, ngồi rất vững, không kẹt, có thể ngồi lâu không tê chân. Chọn chiếc gối nhỏ có chiều dày thích hợp với bạn. Bạn cũng có thể đốt một cây nhang cho khung cảnh được thanh thoát hơn. Tay cầm cây nhang cho khoan thai, tập trung tâm ý vào việc đốt nhang và cắm nhang vào bình. Làm sao cho có chú tâm (niệm) và tập trung (định) trong khi đốt nhang. Tâm ý hoàn toàn có mặt trong khi đốt nhang. Ngồi xuống, để lưng và đầu thành một đường thật thẳng, thẳng mà không cứng. Thở vào và chú ý tới tác động của hơi thở vào nơi bụng và nơi ngực. Thở ra và chú ý tới tác động của hơi thở ra nơi bụng và nơi ngực.

> “Thở vào, tôi để ý tới tác động của hơi thở vào nơi bụng tôi và ngực tôi.
> Thở ra, tôi để ý tới tác động của hơi thở ra nơi bụng tôi và ngực tôi.”
>
> “Thở vào, tôi ý thức được sự có mặt của toàn thân tôi.
> Thở ra, tôi mỉm cười với toàn thân tôi.”
>
> “Thở vào, tôi ý thức về sự có mặt của những căng thẳng và đau nhức trong toàn thân tôi.
> Thở ra, tôi buông thả những căng thẳng và đau nhức trong toàn thân tôi.”
>
> “Thở vào, tôi thấy dễ chịu trong khi thở vào.
> Thở ra, tôi thấy thoải mái trong khi thở ra.”

Bài tập này nếu muốn, bạn có thể thực tập nhiều lần trong ngày, ngay cả ở sở làm, để có thể dừng lại, thư giãn, và nhiều tươi mát hơn.

! Đi cầu, đi tiểu

Bạn cũng có thể tập thiền khi đi cầu hay đi tiểu. Đi cầu và đi tiểu cũng quan trọng như thở, như đi, như ngồi, như ăn, như uống, như thắp hương. Phải có sự sống, phải có niềm vui trong khi đi cầu hay đi tiểu. Phải sống sâu sắc trong giờ phút đi cầu hay đi tiểu. Để hết tâm ý vào việc đi cầu và đi tiểu. Buông thư, có mặt hoàn toàn, và cảm thấy thoải mái, thích thú khi đi cầu hay đi tiểu. Nghĩ đến những trường hợp táo bón, nhiễm trùng đường tiểu, đi cầu đi tiểu không được, hoặc rất đau, bạn mới thấy đi cầu đi tiểu không có vấn đề là một lạc thú. Bạn có cần một bài thi kệ không? Nó đây:

> Không dơ cũng không sạch
> Không bớt cũng không thêm,
> Bát Nhã Ba La Mật
> Không có pháp nào trên.

Trong khi đi cầu hoặc đi tiểu, cũng như trong khi chải răng hoặc bước đi, bạn có thể đầu tư 100% thân tâm của bạn vào những việc ấy. Đó là Thiền!

! Làm thức ăn sáng

Làm thức ăn sáng cũng là thiền tập! Nấu nước sôi, pha trà, lọc cà-phê, nấu cháo trắng, nướng bánh mì, chiên cơm nguội, sắp đặt bàn… tất cả những việc đó đều có thể được làm trong chánh niệm, nghĩa là trong ý thức sáng tỏ rằng bạn đang làm cái đó, bạn đang vui khi làm cái đó, cái đó đang xảy ra trong giây phút hiện tại. Chánh niệm là năng lượng thắp sáng ý thức chiếu rọi vào những gì đang xảy ra bây giờ và ở đây. Chánh niệm là trái tim của thiền tập. Khi pha trà mà bạn ý thức rằng mình đang pha trà, không nghĩ tới quá khứ, không nghĩ về tương lai, tâm mình đặt hết vào việc pha trà, như thế là bạn đang có chánh niệm. Chánh niệm giúp ta sống sâu sắc từng giây phút của cuộc sống hằng ngày! Ai cũng có khả năng chánh niệm, nhưng với người thực tập chánh niệm hùng hậu hơn, và người ấy có khả năng an trú trong hiện tại nhiều hơn.

Thời gian làm thức ăn sáng có thể được biến thành một buổi thiền tập, vui lắm. Nếu có người khác đã xuống bếp rồi và đang chuẩn bị làm thức ăn sáng, bạn cũng nên đi xuống bếp và giúp người ấy, mời người ấy cùng làm trong chánh niệm, cả hai thực tập sống trong giây phút hiện tại, biến thời gian làm thức ăn sáng thành một niềm vui.

! Ăn sáng

Bạn có thể sắp đặt để buổi ăn sáng được thảnh thơi và yên vui. Đừng đọc báo, đừng mở máy truyền hình, đừng nghe đài phát thanh. Ngồi thẳng, nhìn thức ăn trên bàn, nhìn mọi người, thở và mỉm cười, để nhận diện và trân quý. Bạn có thể nói một câu gì đó với người ngồi trước mặt bạn. Ví dụ: Có mẹ đang ngồi ăn sáng với con, con hạnh phúc quá! Hoặc: Hôm nay trời nắng đẹp, bố nhớ ra thăm vườn và nằm võng cho con nhé. Hoặc: Hôm nay anh sẽ thu xếp về sớm một chút để có dịp giúp em làm cơm chiều, v.v… Những câu nói như thế là để công nhận sự có mặt quý giá của những người thương, đó là sự thực tập chánh niệm. Có chánh niệm thì tất cả những trao đổi trong bữa ăn sáng đều có công năng giúp bạn và những người khác nhận diện và trân quý những điều kiện hạnh phúc mình đang có. Rửa bát, dọn bàn sau khi ăn sáng có thể trở thành niềm vui như vào một ngày đẹp trời.

! Đối trị tập khí

Tập khí là thói quen, và đây là thói quen xấu, được lặp lại rất nhiều lần. Thói quen đầu tiên mà ta phải nhận diện là chạy về tương lai. Có thể thói quen (tập khí) này đã được truyền xuống từ tổ tiên và cha mẹ. Ta mải lo lắng cho tương lai nên không có khả năng sống sâu sắc và an lạc trong hiện tại. Ta có niềm tin âm ỉ trong lòng là hiện giờ ta chưa thể có hạnh phúc được và ta còn cần một số điều kiện khác, thì mới thực sự có hạnh phúc. Ta suy đoán, dự kiến, chuẩn bị, mơ ước về những “điều kiện hạnh phúc” ấy mà ta sẽ có trong tương lai. Và ta chạy về tương lai, cả trong những giấc ngủ. Hoặc ta có quá nhiều lo lắng, sợ hãi về tương lai, không biết tương lai của mình sẽ ra sao, và những lo lắng, bồn chồn ấy cũng không cho phép ta an trú được trong hiện tại. Phép thiền tập của bạn là đem tâm về hiện tại. Làm thế nào để bạn nhận diện được tập khí ấy mỗi khi bạn bị nó lôi đi. Bạn chỉ cần chú ý tới hơi thở và mỉm cười với tập khí ấy: Ô hay, mình lại bị tập khí kéo đi rồi. Nhận diện được tập khí, thì tập khí buông bỏ bạn, bạn có tự do để sống an vui trong hiện tại. Mới bắt đầu thiền tập, bạn sẽ phải nhận diện nó mỗi ngày nhiều lần. Biết sống an lạc trong hiện tại cũng là một tập khí, một thói quen tốt. Những thói quen này, bạn cần phải tập luyện mới có được.

Chải răng, mặc áo, tắm gội, lái xe, đi bộ… bạn hãy để hết tâm ý vào việc bạn đang làm, tìm an lạc và hạnh phúc ngay trong những giây phút ấy. Nếu bạn có thực tập hơi thở ý thức, thì bạn có cơ hội nhận diện tập khí bạn nhiều hơn và mỗi lần nhận diện, thì tập khí kia sẽ không kéo bạn đi theo nữa. Đây đã là bắt đầu của thảnh thơi, của giải thoát, của an lạc. Phép tu này gọi là nhận diện đơn thuần. Tập khí của ta ơi, ta biết mi đang biểu hiện. Bạn không cần vật lộn với nó, không cần đàn áp nó, chỉ cần nhận diện. Chánh niệm là năng lượng có khả năng nhận diện bất cứ cái gì đang xảy ra, trong đó có tập khí của bạn.

! Phá bỏ ngục tù quá khứ

Có những người luôn bị quá khứ ám ảnh, tiếc thương, hờn oán, hối hận và khổ đau làm cho họ suốt ngày bị giam hãn trong ngục tù quá khứ, và do đó cũng không thể sống thảnh thơi trong giây phút hiện tại.

Quá khứ thật ra không còn nữa, chỉ có những ấn tượng, những hình ảnh còn lại trong chiều sâu tâm thức. Những cái đó có thể ám ảnh ta, phong tỏa ta, ảnh hưởng đến cách hành xử của ta trong giây phút hiện tại. Những cái ta nói và ta làm có thể do bị chúng thúc đẩy. Như vậy là ta mất tự do.
Hơi thở chánh niệm cho ta biết rằng trong giờ phút hiện tại những đe dọa đó, những đau thương đó, những tàn ác đó không còn có mặt và ta có thể an trú được một cách an toàn trong giây phút hiện tại. Hơi thở chánh niệm cho ta biết là những ấn tượng ấy, những hình ảnh ấy không phải là thực tại và cái ý thức ấy giúp cho ta thoát khỏi vòng ảnh hưởng của những ám ảnh và ấn tượng kia. Cũng như khi Tôn Ngộ Không trước khi đi cầu cứu với Phật Bà Quan Âm đã vẽ một vòng tròn và dặn Tam Tạng đừng bước ra khỏi vòng tròn đó, thì yêu quái sẽ không thể làm gì được Tam Tạng trong khi Tôn Ngộ Không vắng mặt. Nhưng trong khi Tôn Ngộ Không đi rồi, yêu quái hiện hình thành một phụ nữ lâm nguy cầu Tam Tạng tới cứu giúp, và khi Tam Tạng bị lừa, bước ra khỏi vòng tròn thì yêu quái bắt đầu nắm được Tam Tạng. Cái vòng tròn đó tượng trưng cho sự sống có thật trong giây phút hiện tại. Nếu ta biết thở, biết ngồi yên, biết đi trong chánh niệm thì ta còn ở trong vòng tròn, và ta tiếp xúc được với sự sống đang có mặt mà không còm bị ma quỷ của đau thương, của hiểm nguy quá khứ điều khiển ta nữa. Nếu trong quá khứ, bạn đã từng bị đối xử độc ác, lợi dụng tình dục, trải nghiệm khổ đau, bạn phải biết cách thực tập để trong mỗi phút giây có thể thấy được là những cái ấy đã chỉ xảy ra trong quá khứ, còn trong giây phút hiện tại thì bạn an toàn, không có những hiểm nguy và ác độc nào cả. Nhận diện bóng ma quá khứ, nói với chúng rằng chúng chỉ là bóng ma không có thật, là cách tự giải phóng mình ra khỏi ngục tù quá khứ. Thực tập thở, đi, ngồi, và làm việc trong chánh niệm trong vài tuần lễ, bạn sẽ thành công và những cảm xúc đau buồn sẽ không còn trở lại.

! Thiền đi

Thiền đi là một phép tu mầu nhiệm giúp cho ta có mặt từng giây phút trong giờ phút hiện tại. Mỗi bước chân có ý thức giúp ta tiếp xúc với những mầu nhiệm của sự sống đang có mặt. Bạn có thể phối hợp hơi thở và bước chân và đi một cách bình thường dù là trên hè phố, trước sân ga hay bên bờ sông. Thở vào bạn có thể bước hai bước, và quán chiếu đã về, đã tới. Đã về tức là đã về với sự sống trong giây phút hiện tại, đã tới tức là gặp sự sống rồi, không cần vội vã, bôn ba, tìm kiếm gì nữa. Quê hương của mình là sự sống nằm trong giây phút hiện tại. Chỉ giây phút hiện tại mới có thật, trong khi đó quá khứ và tương lai chỉ là những bóng ma. Những bóng ma này có thể tác dụng đưa tới tiếc nuối, khổ đau, lo lắng, và sợ hãi. Nếu mỗi bước chân của bạn đưa bạn về được với hiện tại thì những bóng ma này không còn có quyền hành gì trên bạn nữa cả.

Thở ra, bạn bước ba bước và nói thầm ta đã về, ta đã tới. Hoặc con đã về, con đã tới. Con đã về tới quê hương đích thực của con là sự sống mầu nhiệm đang có mặt, con không còn lang thang đi tìm kiếm gì nữa. Đi như vậy tức là đã dừng lại. Dừng lại, đó là thiền chỉ, samatha. Ta dừng lại được thì tổ tiên, ông bà và cha mẹ trong ta cũng dừng lại được. Ta bước được một bước thảnh thơi thì tất cả tổ tiên có mặt trong từng tế bào cơ thể ta đều cũng bước được một bước thảnh thơi như ta. Bạn là người có hiếu nhất trên trần gian nếu bạn dừng lại được và bước được những bước thảnh thơi như thế cho tổ tiên và cho cha mẹ.

> Đã về
> Đã tới
> Bây giờ
> Ở đây
> Vững chãi
> Thảnh thơi
> Quay về
> Nương tựa.

Bài kệ trên đây là những lời thiền ngữ để giúp cho bạn an trú được vững chãi trong giây phút hiện tại, nắm lấy những lời thiền ngữ này cho vững thì bạn sẽ thiết lập được sự có mặt của bạn một cách vững chãi trong hiện tại, cũng như lên cầu thang bạn nắm vững thành vịn cầu thang thì sẽ không bao giờ té.

“Bây giờ, ở đây” là địa chỉ của sự sống, là nơi ta về, nơi ta tới, nơi ta có quê hương, có bình an, có hạnh phúc, nơi ta gặp gỡ được tổ tiên, bạn bè và con cháu của ta. Thiền tập là để ta luôn luôn trở về nơi chốn ấy. Mỗi bước chân của bạn đưa bạn về với sự sống trong giây phút hiện tại. Bạn hãy thử thực tập thiền đi chậm xem. Bước một bước, thở vào trong khi bước, và nói: “Con đã về”. Mình phải đầu tư một trăm phần trăm thân thể và tâm trí mình vào bước chân và hơi thở mình thì mình mới thực sự đã về, đã tới. Nếu ý thức (Niệm) và sự tập trung (Định) của bạn vững vàng thì bạn có thể về được 100%, tới được 100%. Nếu chưa thực sự về tới 100% nơi địa chỉ “bây giờ và ở đây” thì bạn đừng bước thêm bước nào nữa cả. Cứ để mình trong tư thế ấy mà thở cho đến khi bạn dừng lại được sự rong ruổi của tâm ý, cho đến khi bạn đã thực sự đã về đã tới một trăm phần trăm trong giây phút hiện tại. Lúc ấy, bạn sẽ mỉm cười, nụ cười của thành công, chiến thắng, và bạn bước thêm một bước nữa, với thiền ngữ “Đã tới”. Bước chân vững chãi như dấu ấn của vị quốc vương trên một sắc lệnh. Bàn chân bạn ghi dấu ấn đã về đã tới trên mặt đất. Đi như thế thì chế tác được năng lượng thảnh thơi và vững chãi. Đi như thế thì tiếp xúc được với những mầu nhiệm của sự sống. Đi như thế thì được nuôi dưỡng, được trị liệu. Có những người chỉ nhờ thiền đi mà chữa được bệnh của mình.

“Vững chãi, thảnh thơi” nghĩa là bạn không bị quá khứ lôi kéo, không bị tương lai lôi kéo, bạn có tự do. Đây không phải là tự kỷ ám thị, đây không phải là sự mong cầu, bởi vì nếu bạn an trú được trong hiện tại thì bạn đang có vững chãi và đang có tự do. Thảnh thơi là không bị những con ma quá khứ và tương lai lôi kéo. Thảnh thơi là không còn hấp tấp chạy về tương lai. Vững chãi và thảnh thơi là nền tảng của hạnh phúc đích thực.

“Quay về nương tựa” là một bài tập mà đức Thế Tôn trao truyền cho các vị đệ tử trong những ngày gặp gỡ cuối trước khi Ngài qua đời.

! Quay về nương tựa

Bụt nói rằng có một nơi rất an toàn mà mình có thể trở về bất cứ lúc nào mình muốn: đó là hải đảo tự thân. Trong tự thân bạn có một hải đảo an toàn, nếu trở về đấy thì bạn sẽ không còn bị sóng gió cuộc đời kéo đi nữa. Attadipasaranam có nghĩa là quay về nương tựa (saranam) nơi hải đảo (dìpa) của tự thân. Khi bạn trở về với hơi thở ý thức, bạn trở về với chính bạn, bạn tiếp xúc với hải đảo an toàn nơi tự thân bạn, nơi ấy có tổ tiên, quê hương và tam bảo là Bụt, Pháp và Tăng. Thở và để ý tới hơi thở là bắt đầu quay về. Quay về với hơi thở, với thân thể, với cảm thọ, với tri giác, tâm tư và với tâm thức mình. Đó là năm yếu tố làm nên tự thân: thân thể (sắc), cảm giác (thọ), tri giác (tưởng), tâm tư (hành), và nhận thức (thức) của mình. Năm yếu tố ấy được gọi là năm uẩn (skandha). Hơi thở có ý thức đem thân tâm về một mối, trong khi thở, tất cả thân thể, cảm giác, tri giác, tâm tư và nhận thức của bạn đều trở về tiếp xúc với hơi thở ấy, như khi bạn cất lwn tiếng hát thì mọi người trong gia đình đều im lặng lắng nghe! Hơi thở sẽ làm lắng dịu thân và tâm, đưa thân và tâm về một mối và tạo ra được sự hài hòa giữa năm uẩn. Chính lúc ấy, hải đảo tự thân biểu hiện làm chỗ nương tựa an toàn cho tất cả năm uẩn.

Bài kệ đầy đủ như sau:

> Quay về nương tựa hải đảo tự thân
> Chánh niệm là Bụt soi sáng xa gần
> Hơi thở là pháp bảo hộ thân tâm
> Năm uẩn là Tăng, phối hợp tinh cần.
> Thở vào, thở ra
> Là hoa tươi mát
> Là núi vững vàng
> Nước tĩnh lặng chiếu
> Không gian thênh thang.

Bài kệ này bạn có thể thực tập trong những lúc gặp khó khăn, hiểm nguy, lúc bạn cần phải có đủ bình tĩnh để biết được mình nên làm gì và không nên làm gì trong giây phút ấy. Ví dụ ngồi trên máy bay nghe báo có không tặc đang đe dọa phi hành đoàn, thay vì cuống cuồng lo sợ và có những hành động làm cho tình thế trở thành nguy hiểm hơn, thì bạn trở về với hơi thở và thực tập phần đầu của bài kệ này. Sự có mặt của chánh niệm là sự có mặt của Bụt, đang soi sáng cho mình để mình biết nên làm gì và không nên làm gì. Hơi thở chánh niệm là sự có mặt của chánh pháp đang bảo hộ cho thân và tâm. Và năm uẩn của bạn đang nương tựa vào Bụt và Pháp, đang được đặt trong sự che chở của Bụt và Pháp, và đại diện cho Tăng, có hòa hợp, có trầm tĩnh, có lắng dịu, được hơi thở điều hợp thành một thực tại, năm uẩn đó là ngôi báu thứ ba, đó là Tăng. Có Bụt, Pháp và Tăng bảo hộ, bạn không cần phải lo lắng gì nữa cả. Trong trạng thái trầm tĩnh ấy, bạn sẽ hành xử đúng pháp để giúp cho tình trạng trở nên an toàn.

Vào những lúc bình thường, thực tập bài kệ này đem lại nhiều vững chãi và an lạc; đây là thực tập quy y (quay về nương tựa) nơi tam bảo một cách đích thực, vì trong khi thực tập, năng lượng của Bụt, Pháp và Tăng đang thực sự có mặt cho bạn. Không thể có sự an toàn nào lớn hơn nữa. Dù có chết ta cũng chết trong sự bình an.

!! Là Hoa Tươi Mát

Ta chỉ có hạnh phúc khi ta có đủ yếu tố tươi mát. Với yếu tố tươi mát, ta có thể làm cho người khác hạnh phúc. Ta phải là một đóa hoa thật sự trong khu vườn nhân loại. Một em bé đang chơi, đang ngủ; nhìn em bé ta thấy quả thật nó là một bông hoa. Cái mặt nó là một bông hoa, bàn tay nó là một bông hoa, bàn chân nó là một bông hoa, cái miệng nó là một bông hoa. a cũng đã từng là một bông hoa như nó, nhưng những phiền tạp của cuộc đời đã làm cho ta mất bớt rất nhiều tính chất tươi mát của ta. Khóc nhiều quá thì hai mắt bạn đâu còn trong được nữa? Nguyễn Bính viết:

> Em không khóc nữa, không than nữa
> Đây một bài thơ hận cuối cùng
> Không than chắc hẳn hồn tươi lại
> Không khóc tha hồ đôi mắt trong.

Bạn hãy thở vào đi, buông thư thân thể và mỉm cười. Nét nhăn trên mặt bạn không còn nữa, nụ cười trên môi bạn giúp bạn phục hồi lại đóa hoa tươi mát. Các nhà điêu khắc trong quá khứ đã cố diễn tả nụ cười tươi mát trầm tĩnh và từ bi trên mặt các tượng Bụt. Trên mặt bạn có gần ba trăm cơ bắp; mỗi khi lo lắng, buồn giận hoặc sợ hãi, những cơ bắp ấy co rúm lại hoặc căng thẳng ra, người khác nhìn và thấy sợ. Nếu bạn thở vào có ý thức về sự căng thẳng đó thì khi bạn thở ra, bạn có thể buông thư và mỉm cười. Như thế thì những căng thẳng đó sẽ biến mất và bạn phục hồi được tính tươi mát của bông hoa nhân loại sẵn có trong bạn. Lắng dịu, thư giãn, phục hồi sự tươi mát, đó là sự thực tập thiền chỉ. Chỉ là dừng lại, là làm cho lắng dịu, cho tươi mát. Thở vào, tôi thấy tôi là một bông hoa; thở ra, tôi cảm thấy sự tươi mát của bông hoa là tôi.

!! Là Núi Vững Vàng

Hạnh phúc và bình an không thể có mặt nếu ta không có yếu tố vững chãi. Thiếu sự ổn định trong thân và tâm, ta trở nên bất an, và kẻ khác không thể nương tựa và trông cậy nơi ta. Cho nên, tu tập để đem lại sự vững chãi và ổn định nơi thân và tâm là việc rất thiết yếu. Với hơi thở chánh niệm, với thế ngồi vững chãi, ta có thể thiết lập lại sự vững vàng trong ta. Trong tư thế kiết già hay bán già (gọi là tư thế hoa sen), thân tâm bạn dễ có được sự vững chãi, nhất là khi bạn biết điều phục hơi thở để đem năm uẩn về một mối. (Năm uẩn: hình hài, cảm giác, tri giác, tâm hành và nhận thức). Nếu bạn nắm vững được hơi thở, nhận diện được những cảm giác và cảm xúc trong bạn, biết chấp nhận và ôm ấp chúng, thì bạn sẽ có nhiều niềm tin nơi khả năng của bạn và điều này sẽ làm tăng tiến tính cách vững chãi nơi bạn. Biết sử dụng thông minh và tình thương, bạn có thể giải quyết được những khó khăn trong sự sống hằng ngày, đức tự tin này cũng sẽ làm tăng tiến tính cách vững chãi nơi bạn. Thở vào, tôi ngồi vững như một trái núi; thở ra, tôi cảm thấy sự vững chãi và ổn định trong tôi. Thực tập quay về nương tựa nơi hải đảo của tự thân giúp bạn chế tác được thêm tính vững chãi của bạn. Có một con đường thực tập tâm linh, biết mình đang đi trên con đường ấy, bạn sẽ không còn e ngại, sợ hãi, điều này cũng giúp nhiều cho sự vững chãi của bạn. “Đã có đường đi rồi, con không còn lo sợ.” Con đường này là con đường Niệm Định Tuệ, con đường của sự thực tập năm giới: bảo vệ sự sống, chia sẻ thì giờ và tài vật của mình với những kẻ thiếu thốn, tự bảo hộ và bảo hộ cho mọi người được an toàn không bị nạn tà dâm và sự lạm dụng tình dục tàn hại, thực tập ái ngữ và lắng nghe, và tiêu thụ trong chánh niệm để đừng làm bại hoại thân tâm.

!! Nước Tĩnh Lặng Chiếu

Nước tĩnh lặng chiếu là hình ảnh của tâm bình lặng. Tâm bình lặng là khi tâm không bị những tâm hành giận hờn, ghen tị, sợ hãi và lo lắng làm cho xao động. Bạn cứ hình dung một mặt hồ nước tĩnh trên núi, phản chiếu mây trời và các đỉnh núi rõ nét cho đến nỗi ta có thể chụp hình mây trời và đỉnh núi khi đưa ống kính hướng về mặt hồ. Tâm ta tĩnh lặng thì ta cũng phản chiếu được sự thực một cách trung thực, không làm cho sự thực méo mó. Hơi thở và thế ngồi cũng như bước chân chánh niệm có thể làm lắng dịu lại được những tâm hành như giận hờn, sợ hãi, tuyệt vọng… Trong kinh Quán Niệm Hơi Thở, Bụt có đưa ra một bài tập gọi là An tịnh tâm hành, làm cho tâm hành an tịnh. Tâm hành đây là những trạng thái giận hờn, sợ hãi, lo lắng, v.v… “Thở vào, tôi nhận diện được tâm hành đang có mặt trong tôi.” Bạn có thể gọi tên tâm hành ấy. Nó là sự bực bội. Nó là sự lo lắng, v.v… Ta không cần phải đàn áp nó, chê trách nó, xua đuổi nó. Ta chỉ cần nhận diện sự có mặt của nó là đủ. Đó là phép nhận diện đơn thuần, không tìm cách níu kéo cũng không tìm cách xua đuổi. “Thở ra, tôi làm lắng dịu tâm hành trong tôi.” Hơi thở chánh niệm khi nhận diện và ôm ấp tâm hành có khả năng làm lắng dịu tâm hành. Bài tập này cũng giống như bài tập mà bạn đã học để làm lắng dịu thân hành, nghĩa là lắng dịu những căng thẳng và đau nhức trong thân. Bài này cũng là của Bụt dạy trong kinh Quán Niệm Hơi Thở. Bạn là người hành giả, nghĩa là người thực tập thiền quán, chứ không phải chỉ là một học giả hay một lý thuyết gia về thiền. Vì vậy, bạn nên luyện tập để làm lắng dịu những tâm hành, những cảm xúc của mình khi chúng bắt đầu phát hiện. Như vậy bạn mới có thể làm chủ được thân tâm và không gây đổ vỡ trong bạn cũng như người khác, kể cả người thương của bạn.

! Đi qua cơn bão

Có những cái bạn ôm đồm cất giữ, nhưng những cái ấy đã không có ích gì cho bạn mà còn làm cho bạn mất thảnh thơi. Phải có can đảm buông bỏ những cái ấy. Chiếc thuyền của bạn chở khẳm quá, dễ bị sóng gió làm lật nhào. Phải bỏ bớt để cho thuyền nhẹ. Thuyền sẽ đi mau và sẽ an toàn hơn. Bạn có thể hiến tặng cho người thương sự thảnh thơi ấy, và bạn chỉ có thể làm như vậy khi chính bạn có sự thảnh thơi ấy trong lòng.

Có những người trẻ không có khả năng đối phó với các cơn cảm xúc lớn như: uất ức, giận hờn, chán nản, tuyệt vọng, v.v… cho nên đã đi tự tử. Đối với họ, tự tử là phương cách duy nhất để chấm dứt khổ đau. Nhưng nếu ta có dịp cho họ phương pháp đối trị cảm xúc, họ sẽ có cơ hội làm lắng dịu và vượt thắng được những cảm xúc ấy. Ta phải nắm được bí quyết trước khi ta chỉ bày cho họ. Ở Pháp, mỗi ngày có khoảng 33 người trẻ tự tử. Trong trường học, không ai dạy cho người trẻ cách thức đối trị cảm xúc. Bạn đừng để khi cảm xúc trào dâng mới bắt đầu thực tập. Cứ bắt đầu thực tập ngay bây giờ đi. Mai mốt, khi cảm xúc trào dâng, bạn sẽ nhớ thực tập.

Trước hết, bạn phải biết rằng, một cảm xúc chỉ là một cảm xúc, dù đó là một cảm xúc mạnh. Lãnh thổ con người bạn rất bao la: thân thể, cảm giác, tri giác, tâm hành và nhận thức. Cảm xúc chỉ là một trong số 51 tâm hành. Nó đến, nó ở lại một thời gian rồi nó đi, tại sao ta phải chết vì nó? Ta hãy xem nó như một cơn bão tố. Nếu ta biết cách chống đỡ, ta sẽ được an toàn trong khi cơn bão xảy ra. Cơn bão có thể kéo dài một giờ, vài giờ hay một ngày. Nếu ta nắm được phương pháp thực tập thì ta sẽ đi ngang qua cơn bão dễ dàng. Trong tư thế hoa sen, hoặc trong tư thế nằm ngửa, bạn có thể bắt đầu bằng cách thở bụng. Đặt hết tâm ý vào bụng, thấy được bụng phồng ra khi ta thở vào và xẹp xuống trong khi ta thở ra. Bạn có thể thở thật sâu và hoàn toàn chú ý tới bụng. Đừng suy nghĩ gì hết. Chấm dứt mọi suy nghĩ, chỉ nhớ tới chuyện thở. Trong cơn bão, đọt cây là chỗ dễ bị gãy đổ nhất. Thân cây vững chãi hơn, có nhiều rễ bám sâu vào lòng đất. Đọt cây tượng trưng cho cái đầu hay suy nghĩ của bạn. Bạn hãy rời đọt cây, đi xuống gốc cây cho vững chãi hơn. Gốc cây là ở bụng dưới, dưới rốn một chút, ở huyệt đan điền. Để hết tâm ý vào bụng dưới và thở thật sâu. Đừng suy nghĩ gì hết và bạn sẽ an toàn trong khi cơn bão tố cảm xúc đang diễn ra. Mỗi ngày, thực tập năm phút, sau ba tuần lễ, bạn đã có thói quen và khi cảm xúc tới, bạn sẽ nhớ để mà thực tập.

Đi qua được cơn bão rồi, bạn sẽ có niềm tin. Bạn tự bảo: kỳ sau, nếu cơn bão cảm xúc trở lại, bạn không còn sợ hãi nó, vì bạn đã biết cách xử lý nó. Bạn cũng có thể dạy cho con bạn, em bạn, để chúng biết phương pháp thở bụng. Nắm tay em bé, bạn bảo em bé cùng thở với bạn, đặt hết tâm ý vào bụng dưới. Tuy là một em bé, nó cũng đã có thể có cảm xúc mạnh rồi, và nó có thể học thở để vượt thắng cảm xúc. Ban đầu, nó cần sự yểm trợ của bạn, nhưng sau này, nó có thể tự làm một mình. Nếu bạn là cô giáo, hay thầy giáo, bạn có thể dạy cho tất cả các học sinh trong lớp cách thức thở bụng. Có thể trong số học sinh của bạn có những đứa sẽ thực tập, sau này khi cơn lốc cảm xúc đi tới với chúng và chúng sẽ không đi tự tử. Như vậy là bạn đã cứu mạng được cho những đứa ấy.

Thực tập trong tư thế ngồi là tốt nhất. Trong tư thế nằm, bạn có thể để trên bụng một túi nước nóng.

! Hiểu và Thương

Có một phép tu gọi là từ bi quán, có công năng đem lại cho bạn nhiều thảnh thơi và hạnh phúc. Từ có nghĩa là đem lại hạnh phúc cho người; Bi có nghĩa là làm cho người bớt khổ. Chìa khóa để mở cánh cửa từ bi là khả năng hiểu biết của mình về chính những khổ đau và khó khăn của mình, cũng như về những khổ đau và khó khăn của kẻ kia. Thấy và hiểu được những khổ đau và khó khăn của mình thì mình có thể dễ dàng thấy và hiểu được những khó khăn và khổ đau của người kia. Thấy và hiểu được những khổ đau và khó khăn của người kia thì mình cũng có thể dễ dàng thấy và hiểu được những khổ đau và khó khăn của chính mình. Đó là sự thực tập nhìn sâu vào sự thật thứ nhất và sự thật thứ hai của Tứ Diệu Đế. Tứ Diệu Đế là bốn sự thực mầu nhiệm và thánh thiện. Chính là nhờ ở cái thấy của chúng ta về khổ đau và khó khăn mà ta thấy được con đường thoát khổ. Con đường thoát khổ là sự thực tập thứ tư, gọi là Đạo Đế. Sự chuyển hóa và chấm dứt khổ đau là sự thực thứ ba, gọi là Diệt Đế. Diệt là sự không có mặt của khổ đau.

Đây là một ví dụ của sự thực tập: một người cha đang làm khổ đau một người con. Người cha không thấy được rằng mình đang làm khổ con và làm khổ chính mình. Người cha ngỡ rằng, đối xử với con như thế thì mình bớt khổ. Sự thật thì không như thế.

Sự thật là người cha có nhiều khổ đau và khó khăn nhưng không ý thức được những khổ đau và khó khăn đó (sự thật thứ nhất, khổ đế), và không thấy được những nguyên cớ của những đau khổ và khó khăn ấy (sự thật thứ hai, tập đế). Mình không có khả năng xử lý những khổ đau của mình và mình làm khổ người khác, cho rằng người khác ấy là gốc rễ của niềm đau, nỗi khổ của mình.

Có thể là từ lúc ấu thơ, người cha đã phải hứng chịu khổ đau, đã được đối xử tàn nhẫn bởi người ông. Người ông đã trút hết giận dữ và đau khổ xuống người cha, và người cha bây giờ đang làm như người ông, trút hết giận dữ và đau khổ xuống người con. Khổ đau đi luân hồi, khổ đau truyền xuống từ thế hệ này tới thế hệ khác. Người cha không biết gốc rễ của khổ đau mình (tập đế). Bây giờ người con có thể thực tập như sau:

> Thở vào, tôi thấy tôi là một cậu bé năm tuổi,
> Thở ra, tôi mỉm cười với cậu bé năm tuổi vẫn còn trong tôi.
> Thở vào, tôi thấy cậu bé năm tuổi trong tôi mong manh, dễ bị thương tích, mình đầy thương tích,
> Thở ra, tôi ôm lấy cậu bé năm tuổi trong tôi với tất cả hiểu biết và tình thương.

Đó là giai đoạn đầu của sự thực tập. Bạn trở về nhận diện và ôm ấp em bé trong bạn. Lâu nay, bạn quá bận rộn, không có cơ hội làm công việc đó. Bây giờ, bạn trở về nói chuyện với em bé và ôm lấy em bé. Quá trình trị liệu đã có thể bắt đầu.

!! Cha tôi trong tôi

Thực tập thành công rồi, người con đi vào phần thứ hai:

> Thở vào, tôi thấy cha tôi là một cậu bé năm tuổi,
> Thở ra, tôi mỉm cười với cậu bé năm tuổi là cha tôi.

Có thể bạn chưa bao giờ hình dung được là ông thân sinh của bạn là một em bé trai bốn năm tuổi. Sự thật là hồi ấy ông cũng mong manh, dễ bị thương tích như bất cứ cậu bé hay cô bé nào.

> Thở vào, tôi thấy cậu bé năm tuổi là cha tôi, mong manh, dễ bị thương tích, mình đầy thương tích,
> Thở ra, tôi nhìn cậu bé năm tuổi đầy thương tích ấy với tất cả hiểu biết và thương yêu.

Có một điều bạn chưa biết là cậu bé năm tuổi đã trở thành ông thân sinh của bạn cũng đang có mặt trong bạn, chứ không phải chỉ đang có trong mặt trong ông ta mà thôi. Và cậu bé năm tuổi đầy thương tích ấy cùng với cậu bé năm tuổi đầy thương tích ngày xưa đã trở thành bạn hôm nay. Hai cậu bé ấy không hẳn là hai cậu bé khác nhau, tuy rằng hai cậu bé ấy không phải chỉ là một cậu bé duy nhất. Cái thấy mầu nhiệm này được gọi là cái thấy Phi nhất phi nhị (Không phải là một mà không phải là khác nhau). Bạn ôm được cậu bé này thì bạn cũng ôm được cậu bé kia. Mà một khi bạn đã ôm được cậu bé kia thì quá trình chuyển hóa sẽ xảy ra thật nhanh. Nếu ông thân sinh của bạn ngày xưa đã gặp người chỉ dẫn phép tu này thì ông đã không tự làm khổ và làm khổ bạn. Nhưng ông đã không có may mắn ấy. Vì vậy, bạn phải thực tập cho bạn và cho cả ông thân sinh của bạn trong bạn. Chuyển hóa được ông thân sinh của bạn trong bạn rồi thì giúp chuyển hóa cho ông thân sinh của bạn ngoài bạn sẽ trở thành dễ dàng hơn nhiều. Có người đã có khó khăn với bố, có người đã có khó khăn với mẹ. Tập như thế là chuyển hóa được cho cả mình và bố mẹ, và mình sẽ chắc chắn không lặp lại cách đối xử ấy với các con của mình. Và như thế là “vòng luân hồi” chấm dứt. Cái thấy, cái hiểu về khổ đau và nguồn gốc của khổ đau đem tới cái thương và cái chấp nhận. Thương và chấp nhận được rồi mình sẽ khỏe ra và mình sẽ có khả năng giúp được người kia chuyển hóa. Người kia có thể là: chú, bác, cô, dì, anh, chị, em hoặc bạn bè. Trong bạn có một tâm hành gọi là Tuệ. Tuệ tức là cái hiểu. Đem tâm hành Tuệ vào can thiệp thì tình trạng đổi khác liền lập tức. Tuệ (Prajñà) trước hết là cái thấy và cái hiểu về khổ đau và bản chất của khổ đau. Thực tập nhìn sâu, như trong bài tập vừa rồi, ta làm lớn Tuệ trong ta. Tuệ phải tham dự vào mọi sinh hoạt tâm ý. Nhưng có khi ta quên, không chịu hoặc không muốn sử dụng Tuệ, nhất là những lúc ta có đam mê. Lúc bấy giờ, ta phải cần đến Niệm can thiệp. Niệm là một tâm hành cần thiết vào bậc nhất cho sự thực tập. Ta phải nhờ Niệm đưa Tuệ tới. Có Tuệ thì ta đi tới chấp nhận, tha thứ, yêu thương, và hạnh phúc. Thiếu Tuệ thì ta đi tới giận dữ, ganh ghét, khổ đau và hận thù.
! Mục lục

# [[Trái tim của Bụt - Tu phật học phật]]
# [[Trái tim của Bụt - Học Phật phải thấy lòng nhẹ nhàng]]
# [[Trái tim của Bụt - Pháp thoại đầu]]
# [[Trái tim của Bụt - Niềm vui tương đối]]
# [[Trái tim của Bụt - Đạo đế, bát chánh đạo]]
# [[Trái tim của Bụt - Quá trình văn tư tu]]
# [[Trái tim của Bụt - Bát chánh đạo tương sinh tương tức]]
# [[Trái tim của Bụt - Ái ngữ]]
# [[Trái tim của Bụt - Chánh niệm và 51 tâm hành]]
# [[Trái tim của Bụt - Sống giây phút hiện tại]]
# [[Trái tim của Bụt - Chánh niệm là tự làm chủ]]
# [[Trái tim của Bụt - Tiếp xúc với sự sống nhiệm mầu]]
# [[Trái tim của Bụt - Như lý tác ý]]
# [[Trái tim của Bụt - Quán chiếu cảm thọ]]
# [[Trái tim của Bụt - Quán pháp trong pháp]]
# [[Trái tim của Bụt - Chánh định]]
# [[Trái tim của Bụt - Pháp ấn]]
# [[Trái tim của Bụt - Chuyển hóa tập khí]]
# [[Trái tim của Bụt - Quán không trong năm lễ]]
# [[Trái tim của Bụt - Quán vô tác vô nguyện]]
# [[Trái tim của Bụt - Bốn duyên và sáu nhân]]
# [[Trái tim của Bụt - Hộ trì sáu căn bằng chánh niệm]]
# [[Trái tim của Bụt - Tu tập từ quán]]
# [[Trái tim của Bụt - Niềm tin thể hiện trong đời sống]]
# [[Trái tim của Bụt - Bài kết thúc]]

Nguồn: https://langmai.org/tang-kinh-cac/vien-sach/giang-kinh/trai-tim-cua-but/
! Bài 08 Ái ngữ

Hôm nay là ngày 16 tháng 12 năm 1993, chúng ta ở tại Xóm Thượng và học tiếp về tứ diệu đế. Hôm nay chúng ta nói đến phần chánh ngữ.

Chánh ngữ tức là lời nói chân chính. Đây là một phép thực tập rất quan trọng. Chúng ta biết rằng chánh tư duy cũng là một hình thức của chánh ngữ, tư duy là loại ngôn ngữ thầm ở trong tâm. Tuy người khác không nghe thấy nhưng trong tâm, ta thường thường vẫn đang nói. Tầm và từ là hai hình thức ngữ ngôn ở trong tâm. Như có một cuốn bặng ghi âm phát thanh ở trong đầu mình một cách liên tục, ta nghĩ cái này rồi nghĩ qua cái khác. Tư duy ở trong ta, như con tầm tự giam mình trong kén, lúc nào cũng tự nói mình nghe. Nếu có chánh tư duy thì tầm và từ sẽ soi sáng cho ngôn ngữ và cho hành động, và làm giàu cho chánh kiến. Ngược lại, tà tư duy sẽ làm giảm bớt chánh kiến, đánh mất chánh ngữ, chánh nghiệp, chánh mạng, v.v.. Có những tư duy bị che dấu, thỉnh thoảng tự nhiên ta bật nói ra. Bởi vậy chánh tư duy sẽ đưa đến chánh ngữ. Về tư duy có tầm và từ, còn về chánh ngữ có ngôn và luận. Ngôn tương đương với tầm (vitarka), còn luận tương đương với từ (vicara). Ngôn chỉ là nói, còn luận là có phân tích, chứng minh, mổ xẻ.

!! Ái ngữ

Kinh Tạp A Hàm số 785 định nghĩa chánh ngữ bằng cách nêu ra bốn đặc tính: không nói dối, không nói hai lưỡi, không ác khẩu và không nói thêu dệt. Đây là một định nghĩa phổ thông, thấy trong tất cả các kinh điển. Thứ nhất là không vọng ngữ, nghĩa là không nói dối. Vọng là sai. Có nói là không, không nói là có, trắng nói đen, đen nói trắng, nói không đúng sự thật, là vọng ngữ.

Thứ hai là không lưỡng thiệt. Lưỡng thiệt tức là hai lưỡi (double tongues), với người này nói thế này, với người khác thì nói khác. Đôi khi nói cho vừa ý một người, rồi lại nói khác đi để làm vừa ý một người khác, kết quả là nói lời không đúng sự thật. Cố nhiên cách nói có thể thay đổi cho người ta dễ tiếp nhận, nhưng chánh ngữ là phải nói đúng sự thật.

Thứ ba là không ác khẩu. ác khẩu tức là nói to tiếng, thô tục, quát mắng, chửi thề, nói lời tạo đau khổ, bực tức, hận thù cho người khác. Có những người tâm rất tốt, không muốn làm hại ai, nhưng khi nói ra thì như châm trích và tàn hại người ta vậy. Đó là khẩu xà tâm Phật. Tuy gọi là tâm Phật, nhưng thực sự bên trong còn có quá nhiều nội kết cho nên cái miệng mới nói lời ác. Nếu có thói quen ái ngữ thì ta sẽ không nói như vậy. Dầu là tâm ta không có ý hại ai nhưng nếu ta bị tập khí ác ngữ miệng ta vẫn gây ra những đổ vỡ. Lời nói có thể làm cho người khác thêm mặc cảm, lời nói có thể làm cho người ta mất hết ý chí, và có khi lời nói có thể làm cho người khác đi tự tử. Khi cha mẹ mắng con: ‘‘Mày là đồ vô dụng, không ra cái tích sự gì cả!ì nói như vậy cũng là ác khẩu, vì câu nói đó tiêu diệt niềm tin của em bé, làm cho nó có mặc cảm tự ti. Cho nên tu tập chánh ngữ rất quan trọng.

Thứ tư là không ỷ ngữ. ỷ ngữ tức là nói những lời thêu dệt. Thêu dệt là vẽ vời ra cho sự việc thêm đẹp đẽ hơn gấp bội, hoặc xấu xa hơn gấp bội. Như nói thế nào làm cho mọi chuyện thê lương hơn, hay mơy miều hơn, giật gân hơn hoặc hấp dẫn hơn mà không cần đúng với sự thật.

Nhiều kinh điển định nghĩa chánh ngữ là không nói dối mà phải nói lời chân thật, không nói hai lưỡi mà chỉ nói một lời thôi, không ác khẩu mà chỉ nói những lời dịu dàng, không ỷ ngữ, chỉ nói sự thật không thêm không bớt. Trong Trung Bộ (Majjhima nikaya), kinh số 117, cũng có định nghĩa giống như vậy. Khi nói về chánh ngữ, chúng ta trở về với giới thứ tư trong năm giới: không được nói dối, không được nói để mưu cầu tài lợi và sự kính phục, không được nói lời gây chia rẽ căm thù, không loan truyền những tin mà mình không biết chắc là có thật, không phê bình và lên án những điều mình không biết rõ. Phải có can đảm nói ra sự thật về những điều bất công, và phải dùng lời nói của mình để thực hiện hòa giải và thương yêu. Giới thứ tư nhằm duy trì chánh ngữ.

Khi dùng điện thoại, chúng ta có thể thực tập chánh ngữ. Thiền điện thoại không những là phép thực tập chánh ngữ, mà còn thực tập chánh tư duy. Trước khi bấm số, chúng ta thở theo một bài kệ:

Tiếng đi ngoài ngàn dặm, Xây dựng niềm tin yêu, Mỗi lời là châu ngọc, Mỗi lời là gấm thêu.

Lúc bắt đầu thực tập, chưa thuộc những câu kệ, chúng ta viết kệ xuống một mảnh giấy, dán vào chỗ điện thoại. Mỗi khi ta dùng điện thoại ta lại nhìn thấy bài kệ, và bắt đầu tập hơi thở chánh niệm: thở vào đọc câu đầu (tiếng đi ngoài ngàn dặm), thở ra đọc câu thứ hai (xây dựng niềm tin yêu). Thở vào đọc câu thứ ba (mỗi lời là châu ngọc), thở ra đọc câu thứ tư (mỗi lời là gấm thêu). Trong khi thực tập thở ra và thở vào, ta lặp lại lời nguyện ái ngữ, nguyện sẽ nói những lời xây dựng, bồi đắp thương yêu và hiểu biết. Trong lúc đó, ta cũng đang thực tập chánh tư duy, nhờ vậy lòng ta an tĩnh hơn, ta nhìn thấy mọi chuyện sáng rõ hơn. Người bên kia cầm ống điện thoại lên sẽ được tiếp xúc với một con người tươi mát, nghe những lời xây dựng, êm đẹp, không làm họ đau khổ, có thể giúp họ đạt được an tịnh trong giây lát.

Dùng ái ngữ, chúng ta có thể tạo hạnh phúc cho người khác. Lời nói của mình có thể khơi dậy những hạt giống của niềm tin và an vui nơi người khác. Đó là một hành động phát xuất từ tình thương yêu.

Khi thấy hai người không hòa hợp với nhau, ta có thể dùng lời nói hòa giải để đưa họ tới gần nhau. Quán chiếu vào tâm trạng, hoàn cảnh và nỗi đau khổ của mỗi người, ta có thể luôn luôn tìm ra những điểm tích cực. Nói những sự thật tích cực về người này cho người khác nghe sẽ giúp họ hiểu lẫn nhau. Chỉ cần nói sự thật thôi, khi hai bên hiểu nhau hơn họ sẽ sẵn sàng tha thứ cho nhau, sẽ dễ dàng hoà giải với nhau hơn. Như ở Nam Phi, có một cộng đồng da trắng, một cộng đồng da đen thường thù ghét, kỳ thị và chống đối nhau từ lâu. Ta biết rất rõ là cả hai cộng đồng, dù đen hay trắng đều đau khổ, vì cả hai đều sống trong sợ hãi, lo lắng. Người thực tập chánh ngữ trình bày những nỗi khổ đau, sợ hãi, mặc cảm, những ước vọng của cộng đồng này cho người trong cộng đồng kia nghe. Mỗi bên bắt đầu thấy an ninh và hạnh phúc của mình liên hệ tới hạnh phúc của bên kia. Nhờ vậy lòng họ có thể chuyển hóa. Nếu ta đứng về một phe thì sẽ chỉ làm cho tình trạng càng cặng thẳng, càng khó khăn hơn.

Muốn thành công trong việc hòa giải ta cần biết nói năng khéo léo. Nhưng bản chất nội tâm của con người hoà giải rất quan trọng. Con người đó cần chứa đựng sự hiểu biết, thương yêu, cần được cả hai bên tin cậy, thì lời nói mới có ảnh hưởng lớn lao hơn. Vì lời nói phát xuất từ chánh tư duy, chánh ngữ, chứ không phải là do mưu mẹo, và những khéo léo bên ngoài mà thôi.

Chánh ngữ là nói sự thật, nhưng sự thật nhiều khi cũng có thể cũng gây ra đau khổ. Cho nên sự thật phải được diễn tả bằng ngôn ngữ khôn ngoan để giúp cho người nghe dễ chấp nhận. Nói một sự thật mà gây tan vỡ và hư hại thì không phải là chánh ngữ. Khi nói phải biết tâm lý, dùng thứ ngôn ngữ thích hợp với người nghe, chọn thời gian và hoàn cảnh thuận tiện, và diễn tả cách nào để họ hiểu được, chấp nhận được, thì mới nên nói.

Kinh Pháp Hoa có nói về một vị bồ tát hiệu là Diệu Âm. Bồ tát Diệu Âm thành tựu một tam muội gọi là hiện nhất thiết ngữ ngôn tam muội, nghĩa là thể hiện được, hiểu và sử dụng được tất cả các loại ngôn ngữ. Ngài có thể đối thoại với bất cứ loài chúng sinh nào, vì ngài hiểu tâm ý của chúng sinh, và nói ngôn ngữ nào thích hợp với họ. Vì vậy chánh ngữ cần chất liệu của chánh tư duy, lại cần chất liệu của nghệ thuật nói năng khôn ngoan. Chúng ta phải học hỏi nghệ thuật truyền thông và diễn đạt. Nhưng hình thức khéo léo có nghệ thuật phải chứa đựng chánh tư duy. Nịnh nọt, tán dương, tâng bốc sai sự thật, hoặc chỉ làm tăng thêm ngã mạn của người, đều là tà ngữ.

!! Hạt giống của Chánh Ngữ

Không thể hiểu được chánh kiến, chánh tư duy và chánh ngữ nếu không biết rằng tất cả chúng ta đều có hạt giống của những chánh đạo này trong tâm thức. Hạt giống của ngôn ngữ căn cứ trên tưởng. Tưởng là tri giác.

Nhắc lại, năm yếu tố tạo thành con người là Sắc, Thọ, Tưởng, Hành và Thức. Sắc là phần sinh lý. Thọ là cảm giác. Tưởng là tri giác (perceptions). Tri giác gồm có hai phần: năng tưởng và sở tưởng. Một là chủ thể của tri giác, hai là đối tượng của tri giác. Chúng ta thấy một cái bàn, cái bàn mà chúng ta đang thấy và đang sờ vào là đối tượng của tri giác, của tưởng. Còn tự thân cái bàn có thể rất khác. Đối với một con mọt đang ăn cái bàn thì đó là một kho thức ăn. Cũng một dòng sông, đối với con cá là nhà cửa, lâu đài của nó mà đối với chúng ta đó là cái chỗ để lấy nước tắm và giặt. Khi hai người ghét nhau, thì trước hết họ ghét cái đối tượng tri giác, cái tưởng của họ về người kia. Nhưng tự thân người kia so với ý niệm mình có về người kia thường rất khác nhau. Hai kẻ yêu nhau cũng vậy. Người được yêu khác với hình ảnh trong tri giác người đang yêu. (Cưới về ba, bốn năm sau mới thấy được một phần sự thật!). Vậy tri giác có thể rất sai lầm, rất khác với cái sở duyên duyên đã giúp tạo ra đối tượng của tri giác. Ví dụ như ta chụp ảnh cây bồ đề. Nhìn hình ảnh ta thấy cây bồ đề, nhưng đó chỉ là hình ảnh cây bồ đề thôi. Cây bồ đề thật ở ngoài không phải là cây bồ đề in trên phim ảnh. Chánh kiến tùy thuộc vào tưởng. Vì thế luôn luôn ta phải dùng chánh niệm, phải trở về khám phá những thiếu sót, sai lầm của tưởng. Đó là phương pháp duy nhất để cho cái thấy của ta bớt sai lầm, để tăng thêm phần chánh kiến. Chánh kiến mạnh thì tư duy mới vững vàng được.

Uẩn thứ tư là hành (mental formations). Hành tức là những hiện tượng tâm lý phát khởi trong ta. Vui, buồn, giận, ghen, thương, ghét, đều là hành. Chữ PHạn là cittasamskara. Giáo lý duy thức của đạo Bụt Bắc Truyền nói tới 51 loại tâm hành. Năm tâm hành phổ biến nhất là xúc, tác ý, thọ, tưởng, tư, trong đó có thọ và tưởng. Thọ và Tưởng là những tâm hành rất quan trọng trong số năm tâm sở biến hành, nên được tách ra liệt kê thành hai uẩn. đạo Bụt Nam Truyền, hệ phái Theravada cũng nói có 50 tâm hành.

Uẩn thứ năm là thức (vijnana). Tất cả những cảm thọ và tri giác của chúng ta đều có hạt giống chứa ở trong thức. Thức ở đây phải hiểu là tâm địa, là đất tâm, tức là mảnh vườn trong đó có sẵn tất cả những hạt giống của tâm hành, gọi là chủng tử. Chúng ta có chủng tử của tình thương, của sự ghét bỏ, chúng ta có hạt giống của sự trung kiên, hạt giống của sự phản bội. Chúng ta có đủ các loại hạt giống, tốt cũng như xấu. Thức ở đây còn gọi là nhất thiết chủng thức. Nhất thiết chủng (sarva bijaka) là tất cả các hạt giống. Phật giáo Nam Truyền, hệ phái Đồng Diệp Bộ (Theravada, Tamrasatiyah), có nói về Hữu phần thức (bhava anga citta). Đây là cái tương đương với nhất thiết chủng thức. Còn Hữu Bộ thì gọi là căn bản thức. Tất cả chúng ta đều có hạt giống của chánh kiến. Có chánh kiến, không phải tại vì Bụt trao cho ta, thầy trao cho ta, mà vì chúng ta có sẵn hạt giống chánh kiến trong tâm rồi. Khi chúng ta nói ‘‘Phật tại tâmì là nghĩa như vậy. Tuệ giác đó đã có sẵn ở trong tâm thức của ta. Tuệ giác ấy chỉ cần người hay hoàn cảnh giúp khơi mở ra thôi. Có thể đó là Bụt, là thầy, là bạn, có thể là một nỗi đau khổ cùng cực của ta. Khi ta đau khổ nhiều tự ta cũng có thể khơi mở được chánh kiến.

Ngày Bụt thành đạo, Ngài ngồi thiền suốt đêm. Và buổi sáng tinh sương, nhìn lên thấy ngôi sao mai mọc, Ngài đạt được quả vị vô thượng chánh đẳng chánh giác (giác ngộ hoàn toàn). Những lời đầu tiên mà Bụt thốt ra chứa đựng một chút ngạc nhiên. Ngài nói: ‘‘Lạ quá, tất cả mọi người đều có tuệ giác trong lòng. Vậy mà đời này sang đời khác, kiếp này sang kiếp khác, con người cứ trôi lặn trong biển trầm luân, khổ ải. ì Câu nói của Ngài có nghĩa rằng tuệ giác Ngài đạt tới không phải được từ bên ngoài mang vào mà đã từ trong chiều sâu tâm thức phát hiện lên. Hạt giống của trí tuệ, hạt giống của từ bi đều có sẵn trong tâm thức mỗi người.

Hạt giống chánh kiến ở trong tâm thức ta gọi là giác tánh. Tất cả chúng sinh đều có sẵn giác tánh, nên ta vẫn nói rằng Bụt ở trong lòng. Phật tức tâm là một sự thật có thể chứng nghiệm được, chứ không phải là lý thuyết. Vì nếu không sẵn hạt giống giác tánh thì có tu, có học gì chúng ta cũng sẽ không thành công. Tu học có nghĩa là tạo những điều kiện tưới tẩm cho hạt giống tuệ giác nở ra. Khi hạt giống của chánh kiến nẩy mầm rồi, tự nhiên tư duy sẽ đi vào đường chánh. Càng thực tập chánh tư duy, chúng ta lại càng giúp cho những hạt giống chánh kiến khác nẩy nở thêm. Chánh kiến nuôi dưỡng chánh tư duy và chánh tư duy khơi mở thêm chánh kiến. Rồi nhờ sự phát triển của chánh kiến và chánh tư duy mà chánh ngữ biểu hiện. Bởi vậy khi lời nói của chúng ta còn gây ra đau khổ thì ta phải biết là cái thấy của chúng ta chưa sáng, và tư duy của chúng ta chưa đúng.

Ngôn ngữ có hạt giống trong đất tâm. Những lời nói, kho ngữ vựng, những hình thức diễn tả trong ngôn ngữ đều có hạt giống ở đấy cả. Tu tập chánh ngữ bắt đầu từ tâm, bắt đầu từ tưởng, tức là tri giác. Tri giác sai lầm sẽ sinh nhiều tà kiến. Tri giác càng đúng thì càng thêm chánh kiến. Tri giác sai lầm, tư duy chúng ta sẽ sai lầm. Chúng ta thấy mối liên hệ rất mật thiết giữa chánh ngữ, chánh kiến và chánh tư duy. Cho nên nếu chúng ta muốn tu tập chánh ngữ thật vững chãi thì chúng ta phải dựa trên chánh kiến và chánh tư duy.

Vì vậy các vị bồ tát sau khi tu tập chánh kiến và chánh tư duy thì đạt tới biện tài. ‘‘Trí tuệ hoằng thâm đại biện tài. ì Biện tài ở đây không phải là nói khéo. Biện tài chính là ‘‘nhất thiết ngữ ngôn tam muội, ì phát hiện khi bồ tát có chánh kiến và chánh tư duy vững chãi. Biện tài ở đây là khả năng nhiếp phục được người khác, khả năng khai thông cho tâm ý, làm cho người ta bỏ con đường mê tối mà hướng tới con đường sáng. Đôi khi chỉ cần nói một hai câu mà có thể đưa người khác trở về với con đường an lạc. Trí tuệ hoằng thâm đại biện tài nghĩa là nhờ trí tuệ sâu rộng, nên bồ tát đã đạt tới biện tài vô ngại để thuyết pháp độ sinh.

Sự tu tập chánh ngữ phải căn cứ trên chánh kiến và chánh tư duy. Những hạt giống của tri giác nằm sâu trong tâm thức, những hạt giống của tư duy cũng ở sâu trong tâm thức, những hạt giống ngữ ngôn cũng vậy, ba loại hạt giống đó có dính líu với nhau. Trong tương giao giữa mọi người, chúng ta cần tập nhìn đúng, nghĩ đúng về người khác. Muốn tập chánh ngữ, ta phải bắt đầu bằng sự quán chiếu về người và về mình. Xung đột giữa vợ chồng, cha con hay bạn bè có khi xảy ra chỉ vì lời nói. Tu tập chánh ngữ trở thành một yếu tố rất quan trọng để gây niềm thông cảm.

!! Bài thực tập Chánh Ngữ

Ta hãy lấy một ví dụ thực tập về chánh ngữ để giải toả những nội kết gây xung đột giữa hai người bạn. Cũng có thể áp dụng cho hai người thân yêu, như anh em, vợ chồng, v.v.. Có một người tên là A và có một người tên là B, liên hệ giữa A và B không tốt đẹp. Mỗi khi A nói thì B khó chịu và mỗi khi B nói thì A khó chịu. Có thể A có lòng tốt không muốn làm khổ B, và B có lòng tốt không muốn làm khổ A, nhưng hai người vẫn làm khổ nhau hoài. Có thể là A vụng về trong khi nói hay B vụng về trong khi nói. Muốn giải quyết, chúng ta không thể chỉ tuyên bố rằng cả hai bên đều có lòng tốt cả, không sao. Nói như vậy không đủ. Chúng ta phải quán chiếu sâu xa để thấy nguồn gốc ở nơi tưởng, nơi tri giác của mỗi người.

Ở làng Hồng các thiền sinh đã thực tập viết thư gửi Bụt. Chúng ta thử bắt chước phương pháp đó trong trường hợp này. Mời hai người cùng đại chúng vào ngồi trong một căn phòng, hai người ngồi hai bàn khác nhau. Đưa cho A và B mỗi người một tờ giấy trắng, A sẽ viết cho B một lá thư, và B viết cho A một lá thư. Viết xong hai người trao thư cho nhau. Mỗi người nhận rồi đem thư ra đốt, không cần đọc. Trong đại chúng không ai biết trong thư nói gì cả.

Trước khi thực tập, hai người được hướng dẫn riêng về ‘‘mẫu viết thưì. Mục đích của lá thư là cho mỗi người có dịp quán chiếu về tánh tình, phản ứng và hành động của mình và của người kia. Thí dụ lá thư của A viết như sau:

Phần 1- A biết tánh của B như thế này (… . . ) Mấy dấu chấm trong ngoặc này là nơi A quán chiếu về B. Nhìn vào người kia, ta thấy tánh khí và tâm trạng của người đó, các thói quen, tập khí của người đó, quá khứ thời thơ ấu lớn lên trong gia đình, trong học đường như thế nào, v.v.. Như thế gọi là quán chiếu.

Phần 2- Cho nên mỗi khi B nói hay làm như vậy (như vậy là làm sao, phải nhớ rõ về các hành động của B đã gây đau khổ cho mình), thì để tránh gây ra xích mích, A phải biết không nên có những phản ứng như mình thường vẫn có (kể rõ những phản ứng thường xẩy ra của chính mình).

Phần 3- A cũng biết rằng tánh A như thế này (tự nói về mình) và hay phản ứng như thế này (là phản ứng ra sao, tự mình kể ra cho rõ), nên A đã khổ, A cũng đã làm cho B khổ và không giúp gì được cho B.

Phần 4- Vậy từ nay để phá vỡ vòng luẩn quẩn và tạo cơ hội cho cả hai chuyển hóa, A sẽ thực tập những cách sau đây (ghi những ý kiến về cách thực tập của mình). Tới đây cần viết một câu quan trọng: ‘‘Sự chuyển hóa của A chắc chắn thế nào cũng đưa tới sự chuyển hóa của B ì, Câu này nên lặp đi lặp lại hoài. Tại vì thường thường chúng ta hay nghĩ: ‘‘người kia không thay đổi tại sao mình tôi phải thay đổi?ì

Đây chỉ là mới là phần thực tập của A thôi, còn phần của B là khác. Chúng ta hãy thử đọc lại và chiêm nghiệm thêm về mẫu thư trên một lần nữa.

1- A biết rằng tánh của B như thế này (… ) Mỗi người phải nhìn vào người kia, dù đó là cha mình, thầy mình, anh, em của mình. Ba dấu chấm trong ngoặc đơn đó quan trọng lắm. Nên viết càng nhiều càng tốt. Mỗi người phải tìm hiểu về người kia. Có thể là B sanh ra trong một gia đình mà bố mẹ có tánh tình như thế, không khí gia đình như thế. Rồi lớn lên học ở trường có ông thầy thế nào, và được đào tạo theo mẫu mực, lề thói thế nào. Chìa khóa là ở chỗ ta nhìn thấy như vậy. Phải thấy được, mà thấy rồi thì chúng ta sẽ dễ chấp nhận nhau hơn. Mới chỉ quán chiếu thôi, chưa đòi hỏi người kia phải thay đổi mà ta đã thấy khỏe hơn rồi. Lá thư không bắt đầu bằng những câu như ‘‘Nếu anh mà muốn em thương anh thì phải sửa cái tánh đó đi. ì Mình bắt đầu nghĩ lại là anh mình sở dĩ nói năng như vậy (… ), hành xử như vậy (… ), có lề thói phản ứng như vậy (… ) là vì đã có quá trình sinh ra, lớn lên và được đào tạo như vậy. Hiểu được rồi tự nhiên ta cười xòa, không còn bực tức nữa. Phản ứng của ta thay đổi. Mà ta thay đổi cách phản ứng của ta thì ta sẽ giúp được anh của ta thay đổi.

2- Cho nên mỗi khi B nói hay làm như vậy (… ) thì A phải biết không nên có những phản ứng như mình thường có (… ) Phần giữa hai ngoặc đơn này cũng rất quan trọng. Phải quán chiếu rất lâu. Đoạn này liên hệ hành động của hai người: vì B như thế đó (… ), cho nên A nói hay làm như thế này (… ). Chỉ trong ba chấm đó thôi nhưng chúng ta phải thiền hành, thiền tọa rất lâu để tĩnh tâm mà tìm cho ra rõ nguồn cơn, ‘‘Lắng nghe thấu tận nguồn cơn, học nhìn lại hiểu và thương. ì Chìa khóa là quán chiếu. Cho nên mỗi khi B nói hay làm như vậy (… ) thường thường A bực bội, chống lại, không chịu nổi. Khi mà thấy được và hiểu được tại sao rồi thì dù người kia vẫn còn nói, vẫn còn làm như cũ, A vẫn có khả năng ngưng những phản ứng như trong quá khứ. Sự chuyển hóa bắt đầu từ trong tâm mỗi người, chứ ta không đòi hỏi người kia chuyển hóa trước thì ta mới chịu thay đổi (peace begins with me!).

3- A cũng biết rằng tánh A như thế đó (… ) Trong đoạn này ta tự tìm hiểu để tự thấy mình. Ta được sinh ra ở một hoàn cảnh khác, được lớn lên, dạy dỗ và đào tạo trong hoàn cảnh khác. Ta rất khác B cho nên ta hay có phản ứng như vậy. Do những phản ứng đó chính ta làm cho ta khổ và cũng làm cho người kia khổ. Thấy được điều đó cho nên A mới tìm và thử có phản ứng khác. Mình tự thay đổi mình trước, biết rằng người kia sẽ thay đổi sau. Không có nghĩa là mình phải chấp nhận người kia như vậy hoài. Hiểu và thương tức là chấp nhận người kia và hy vọng với sự tu học, với phản ứng mới của mình, người kia sẽ thay đổi. Điều đó sẽ xảy ra. Người nào trong chúng ta cũng biết là khi mình thay đổi thì người kia sớm muộn cũng sẽ thay đổi.

A cũng biết rằng tính tình của mình như thế đó (… ) – ‘‘Như thế đóì là như thế nào? Phải nói ra, phải dám soi gương để nhìn rõ tính khí của mình. Mình cũng có thể nhờ các bạn thân của mình soi sáng cho mình, chỉ bảo cho mình. Mình cũng có lúc nóng nảy, cũng có lúc vội vã, sai lầm. Và mình hay phản ứng như thế này, cho nên mình đã khổ và làm cho người kia khổ. Cho nên A quyết lòng tu tập để phá vỡ vòng lẩn quẩn. Trong quá khứ, mỗi khi bên này nói một câu gì là bên kia nổi điên ngay, vì thế bên này lại giận hơn nữa, và nội kết của hai bên lôi cuốn lẫn nhau. Bẻ gãy cái vòng lẩn quẩn đó là thoát khỏi một vòng luân hồi.

Như thế chúng ta tạo cơ hội cho cả hai chuyển hóa. Và đây công thức của sự tu tập trong một tăng thân: sự chuyển hóa của người này sẽ đưa tới sự chuyển hóa của người khác. Có một thiếu nữ đến tu tập ở Làng Hồng, sáu tháng rồi trở về Hoa Kỳ. Tự nhiên cô cảm thấy có thể bắt đầu nói chuyện được với một người mà từ năm, bảy năm nay cô không thể nào nói chuyện được. Cô cảm thấy một điều rất lạ. Trước kia cô không thể nói chuyện, không muốn nhìn mặt người kia; thế mà sau khi tu tập ở Làng Hồng sáu tháng trở về, tự nhiên cô thấy mình có thể nói chuyện được dễ dàng. Ngay trong lần gặp gỡ và chuyện trò, cô đã thấy người kia thay đổi. Và sau đó gặp lại nhau trong mấy tuần lễ kế tiếp thì sự thay đổi càng rõ rệt. Tình thân ái lại nẩy nở, khi chia tay thì bịn rịn. Sự thay đổi của hai người không xảy ra cùng một lúc, vì đã chỉ có một người bắt đầu. Sự hòa giải nào cũng vậy. Ta tự hòa giải trong tâm ta trước, không cần người kia biết. Khi trong lòng mình có sự hòa giải rồi thì tâm bình an của mình tỏa chiếu ra, người kia sẽ tiếp nhận và đến lượt người kia sẽ được chuyển hóa.

Khi hai bên thực tập viết thư và trao cho nhau xong, có thể phép lạ sẽ xảy ra trong những ngày kế tiếp. Mỗi người đã xét mình và đã quán chiếu để hiểu người kia. Mỗi người tự phát nguyện là sẽ thay đổi, sẽ không làm, không nói theo tập khí của những ngày trước. Nói và cư xử cách nào phù hợp để người kia có thể chấp nhận được, có thể hiểu được. Sau khi quán chiếu, mình sẽ thấy nhiều điều lâu nay mình tưởng là đúng, mà quả thực là sai. Có khi điều mình nói là sự thật, nhưng cách mình nói ra vụng về và nóng nảy cũng có thể tạo ra sự tan vỡ, vì người kia không tiếp nhận được. Vì vậy ta phải học phương pháp thực tập chánh ngữ. Vì chánh ngữ bao gồm chánh kiến, chánh tư duy, nhưng cũng gồm cả nghệ thuật diễn tả. Cách ngôn Trung Hoa có câu là một lời mà nói ra bốn con ngựa chạy theo cũng không kịp (nhất ngôn ký xuất, tứ mã nan truy). Phải tu tập ngay từ chánh kiến và chánh tư duy mới có thể thành công được về chánh ngữ.

Phương pháp thực tập chánh ngữ này rất cụ thể, ai cũng có thể thực hành ngay. Nếu thực tập cho đàng hoàng trong một vài tuần, ta sẽ thấy kết quả. Tu tập là chúng ta tu tập trong một tăng thân. Hạnh phúc của một người tùy thuộc hạnh phúc của người khác. Đừng nghĩ người nào tu riêng người đó, ông tu ông đắc, bà tu bà đắc. Nghĩ như thế là thất bại. Phải làm cho người khác có hạnh phúc thì mình mới thật sự có hạnh phúc. Luôn luôn bắt đầu bằng sự thay đổi trong tâm mình. Khi ngồi thiền, thay vì quán chiếu về cây tùng trước sân hay là tiếng vỗ của một bàn tay, chúng ta hãy quán chiếu về một đề tài thiết thực. Đó là làm thế nào để thiết lập được chánh ngữ, chánh kiến và chánh tư duy ngày hôm nay. Viết lên giấy trắng mực đen có thể giúp cho sự tu học. Ngồi xuống, cây viết trên tay, quán chiếu về tánh khí của người kia và của mình, do môi trường, hoàn cảnh, tập quán nào gây ra. Thấy được rồi ta mới hiểu tại sao ta hay phản ứng như thế này, mà người kia hay nói, hay làm như thế kia. Ta đi tới kết luận là từ bây giờ ta muốn áp dụng phương cách mới trong cách nói và cách làm. Ta nói và làm hai hoặc ba lần theo phương thức mới thì người kia sẽ bắt đầu thấy và cũng tự chuyển hóa. Nếu hai người cùng thực tập thì mỗi người đều làm như vậy cả. Hai người sẽ trao cho nhau tuệ giác của mình, giúp nhau tu tập, và họ là anh em, chị em thực sự. Giữa hai anh em, giữa vợ chồng, giữa cha con phương pháp này đều có thể làm được, trong cách cư xử tương kính và thật sự bình đẳng.

Trong truyền thống đạo Bụt, tăng thân được tổ chức như một gia đình. Vì vậy chúng ta thường gọi nhau là sư ông, sư chú, sư bác, sư anh, sư chị, sư em. Khi sống chung, chúng ta phải hoà hợp những cá tính lại thành một cọng tính. Không người nào giống người nào, sở thích cũng khác nhau. Nhưng tính chất đa dạng đó đem lại những dáng sắc rất đẹp cho cộng đồng. Tăng thân sống hòa hợp, nhường nhịn nhau được cũng nhờ ở sự thực tập chánh ngữ.

!! Hạnh lắng nghe

Trong giới thứ tư của năm giới, chúng ta học: ‘‘Biết rằng lời nói có thể đem lại khổ đau hay là hạnh phúc cho nên tôi thực tập chánh ngữ để có thể làm vơi bớt khổ đau và mang lại hạnh phúc cho người.’’ Và một điều thực tập cần thiết là hạnh lắng nghe. Cái nói liên hệ tới cái nghe. Nói mà không biết nghe tức là chưa có chánh ngữ. Muốn cho lời nói của ta là chánh ngữ thì ta phải lắng nghe người khác. Cho nên tập lắng nghe là một phần của sự thực tập chánh ngữ. Điều này là một ý kiến mới bổ túc cho giới thứ tư. Từ nay nói về chánh ngữ ta phải nói cả về chánh thính (right listening). Trong kinh ta vẫn đọc: ‘‘Chúng con xin học hạnh lắng nghe’’, tức là hạnh của bồ tát Quán Thế Âm. Nếu không nghe, thì ta sẽ không hiểu và chánh ngữ sẽ không vững vàng. Trong Kinh có danh từ đế thính: Nhữ đẳng tỳ kheo đương đế thính, này các tỳ kheo, các thầy lắng nghe tôi nói đây. Đế thính là lắng nghe cho kỹ. Chữ đế này giống như trong tứ đế. Đế thính là nghe với tất cả tấm lòng của mình, nghe với một tâm hồn lắng dịu, không sôi động, không thành kiến. Đế thính là một nghệ thuật; nếu tâm hồn còn xao động, còn đầy dẫy tư duy và thành kiến, nếu chỉ dùng trí năng (intellect) của mình để nghe, đó chưa phải là đế thính. Có một Kinh về Bát chánh đạo, thay vì dùng từ chánh ngữ đã dùng từ đế ngữ và chánh định thì gọi là đế định. Đế thính cần cho đế ngữ. Vậy khi nghe, ta đừng nghe với thành kiến. Ta phải nghe bằng cả trái tim của mình. Phải nghe bằng cái tâm trống không, nghe như vậy mới có thể hiểu được. Nghệ thuật nghe là không phải chỉ nghe bằng tai. Mắt theo dõi người nói, nét mặt tự nhiên biến đổi theo những lời phát biểu, ta nghe bằng toàn thể thân tâm ta. Nhiều khi chỉ cần lắng nghe thôi ta đã giúp cho người bớt khổ rồi.

Có những lúc ta chỉ nghe bằng tai, còn tâm ta không nghe, trong tâm ta vẫn đang nói. Tuy không nói thành lời, nhưng ở trong lòng ta tầm và từ đầy ắp, không còn chỗ để ta nghe nữa. Nghe một câu, trong lòng ta có phản ứng. Tuy không nói ra nhưng trong tâm ta đã bắt đầu phê bình, lên án, bắt bẻ, v.v.. Như vậy không phải là đế thính. Nghe lời dạy của Bụt ta phải đế thính, mà nghe lời của những người khổ đau ta cũng phải đế thính. Nghe lời của bạn hay của thù cũng phải đế thính. Trong tâm lý học Tây phương có phương pháp nghe gọi là emphatic listening, tức là vừa nghe vừa đồng nhất mình với người nói, không lên Đn, không chê bai, không có thành kiến. Empathic listening, dịch tiếng Việt là nghe thẩm thấu, nghe và để lời nói thấm vào. Khi lắng nghe những người khổ đau, như bác sĩ tâm lý trị liệu, thì ta phải nghe với tất cả tâm hồn. Lắng nghe như vậy người nói cảm thấy rằng họ có thể nói sự thật và họ sẽ nói sự thật. Muốn nghe như vậy trong lòng phải đạt một trình độ tĩnh lặng, một mức độ từ bi. Người bác sĩ tâm lý trị liệu phải có từ bi và tĩnh lặng, phải có tuệ giác ở trong lòng thì phẩm chất của sự trị liệu mới cao. Cho nên người bác sĩ tâm lý trị liệu nào cũng phải thực tập chánh kiến, phải thực tập đế thính, phải thực tập từ bi. Khi ta nghe mà mắt ta biểu lộ hiểu biết và thương yêu thì người nói mới có can đảm nói những điều họ chưa bao giờ nói. Chỉ ngồi nghe không thôi đã làm sứ giả của Như Lai rồi. Ở Làng Hồng đại chúng có Hiệp Ước Sống Chung An Lạc, một phương pháp rất mầu nhiệm. Thực tập Hiệp Ước Sống Chung An Lạc phải quán chiếu, nhìn sâu sắc vào chính ta và vào người khác, đó là phép thực tập căn bản. Không phải cứ họp nhau, nói qua nói lại là có thể giải quyết các vấn đề. Cần thực tập chánh ngữ, căn cứ trên sự thực tập chánh kiến và chánh tư duy. Có chánh kiến và chánh tư duy thì tự nhiên có tình thương. Khi tất cả mọi người đều đã nắm được nghệ thuật đế thính và chánh ngữ, những lời nói ra đều mang chất liệu của sự hiểu biết, của lòng tha thứ và thương yêu. Danh từ đế thính (sravana) ta đọc thấy trong Kinh Trường A Hàm, cũng có thể tìm thấy ở Thắng Thiên Vương Bát Nhã Kinh. Sau này mỗi khi nói đến chánh ngữ thì chúng ta phải nói tới đế thính, tại vì nghe là một phần quan trọng của nói. Nếu không biết nghe thì ta sẽ không biết nói.

Một vài điều ta cần nói thêm để kết luận về phần thế gian, tức là phần tục đế, của chánh ngữ. Chúng ta biết, cũng như khi thực tập chánh tư duy, muốn thực tập chánh ngữ ta phải liên hệ với sự thực tập quán chiếu về tưởng (perception). Thực tập Chánh ngữ, ta phải thấy sự liên hệ với chánh niệm hoặc thất niệm. Nếu sống trong thất niệm mãi thì chúng ta không có hy vọng tiến bộ trên con đường thực tập chánh ngữ. Nói phải biết rằng mình đang nói gì. Trước khi nói ta biết ta sẽ nói gì, chứ đừng có để lời nói chạy ra trước rồi mình chạy theo sau. Tu tập chánh niệm giúp ta nắm được thân, tâm và ngôn ngữ của ta.

Thực tập chánh ngữ phải quan tâm đến tập khí. Ta có những tập khí, những thói quen, cho nên đôi khi lời nói ta chỉ là phản ứng rất máy móc. Nghe một điều, ta tự nhiên có những phản ứng tự động và bật nói ra. Đó là do tập khí. Chúng ta phải nhận diện các tập khí, mỉm cười mỗi khi chúng xuất hiện, và nói: ‘‘tập khí ơi, chào mi!’’ Rồi thực tập chánh ngữ, tình thương và bồ đề tâm. Cần quán chiếu, cần thấy nỗi khổ của người, cần thấy hạt giống của niềm vui nơi người, nhờ đó ta có thể tạo hạnh phúc cho những người xung quanh ta. Ta có thể ban phát rất nhiều hạnh phúc, chỉ cần nhờ thực tập chánh ngữ. Và cố nhiên khi tạo nên hạnh phúc cho người thì chính ta không thể nào không có hạnh phúc.
! Bài 25 Bài kết thúc

Hôm nay là ngày 20 tháng hai năm 1994, chúng ta kết thúc khóa tu mùa Đông tại Làng Mai.

Chúng ta đã bắt đầu khóa tu bằng kinh Chuyển Pháp Luân. Trong bài pháp thoại này Bụt nói đến Bốn Sự Thật và con đường của Tám Sự Hành Trì Chân Chính. Trong suốt ba tháng qua chúng ta đã học và thực hành giáo lý của Bốn Sự Thật và con đường Tám Sự Hành Trì Chân Chính. Hôm trước chúng ta có học một câu trong Luận Ngữ, đức Khổng Tử nói: Học nhi thời tập chi, bất diệt lạc hồ, nghĩa là học mà được thực tập hằng ngày, đó chẳng phải là niềm vui hay sao? Câu đó rất hay. Chúng ta được học kinh, được nghe pháp thoại, chúng ta lại có vô số cơ hội để đem các điều đó ra thực tập trong đời sống hằng ngày. Học nhi thời tập chi bất diệc duyệt hồ, câu này ta cũng nên viết lên để treo ở thiền viện.

Ai tu học mà không nắm vững được nguyên tắc Tứ Diệu Đế, không biết cách áp dụng Bát Chánh Đạo để giải quyết những khổ đau trong đời sống hằng ngày thì cũng như người muốn làm đậu hũ nhưng chưa có tay nghề, hễ nói sắp làm đậu hũ là cảm thấy lúng túng. Các sư chú và các sư cô nào đã nắm vững nghệ thuật làm đậu hũ thì khi nghe nói tới việc làm đậu hũ trong lòng sẽ có sự bình an vô úy. Biết rằng ta có thể làm được việc đó, thành ra ta không sợ. Cũng vậy, chúng ta chỉ sợ hãi cảnh khổ đau, chỉ sợ hãi nỗi khó khăn, khi chúng ta chưa nắm vững được nguyên lý Bốn Sự Thật, và chưa nắm vững được phương pháp áp dụng tám chi phần của Bát Chánh Đạo vào đời sống.

Nguyên tắc Tứ Diệu Đế là nguyên tắc trị liệu trong y học. Người y sĩ trước hết phải nhận diện chứng bệnh. Phải biết bệnh đó là bệnh gì, phải thấy được bản chất và hành tướng của bệnh, rồi tìm hiểu căn do của chứng bệnh để khám phá phương pháp làm cho bệnh ngưng lại. Ngưng lại tức là Diệt Đế, Sự Thật thứ ba. Và những phương pháp để làm bệnh ngưng lại là Sự Thật thứ tư, Đạo Đế. Người thầy thuốc cũng thực tập Tứ Diệu Đế trong phạm vi y khoa. Trong cuộc đời, niềm đau khổ của ta là một chứng bệnh.

Lo âu là một chứng bệnh. Sợ hãi là một chứng bệnh. Cô đơn là một chứng bệnh. Phải nhận diện, phải thấy được hành tướng, thấy những nguyên do xa gần của bệnh. Chấm dứt bệnh bằng con đường của Tám Sự Hành Trì Chân Chánh. Trong kinh Tương Ưng Bộ (Sammyutta Nikaya), nhiều thầy đã nói về nội dung tương tức của giáo lý Bốn Sự Thật. Như thầy Gamvapatti đã nói rằng nếu ta thấy được Khổ Đế thì ta thấy được ba Đế khác là Tập Đế, Diệt Đế, và Đạo Đế.

Nỗi khổ của ta là nỗi khổ nào? Nỗi khổ đó có phải là tâm trạng ưu uất (depression), xao xuyến lo âu (anxiety), hay là sự sợ hãi thiếu an ninh thường trực? Nỗi khổ đó có thể là nỗi thất vọng vì cảm tưởng bị cuộc đời ruồng bỏ, ngược đãi, đầy đọa là cảm tưởng một mình mình đang gánh chịu mọi bất công của xã hội. Ta phải trực tiếp nhìn vào nỗi khổ ấy để tìm thấy được bản chất của nó. Do đó phải tu tập chi phần đầu tiên của Bát Chánh Đạo là Chánh Kiến.

Ta phải có Chánh Kiến về nỗi khổ của chúng ta. Phải sử dụng niệm lực, sức mạnh của chánh niệm để tạo nên hào quang chiếu vào sự thật thứ nhất, để nhìn thấy rõ ràng những hành tướng và bản chất của cái khổ. Thường thường chúng ta không làm như thế, vì ai cũng có khuynh hướng tự nhiên là chạy trốn nỗi khổ. Cái khổ có mặt ở đó nhưng ta đã quen tìm cách che phủ, ngụy trang, làm như nó không có. Giống như một con đà điểu trước mối nguy thì chúi đầu vào trong cát. Chúng ta phải có Chánh Kiến về Khổ, phải dám đối diện trực tiếp với cái khổ của chính mình.

Việc đầu tiên phải làm là dùng Chánh niệm và Chánh định để can đảm nhìn thẳng vào nỗi khổ của mình. Sự quán chiếu cho chúng ta thấy rõ ràng bản chất của khổ, đó là Chánh Kiến. Ta tìm hiểu những nguyên do gần xa nào đã đem tới khổ đau trong hiện tại. Thường thường ta chỉ quy tội cho một nguyên do nào đó. Chúng ta nói vì người này, hay là vì hoàn cảnh đó mà ta khổ. Thường thường ta tìm một nguyên do ở ngoài ta. Đó không phải là quán chiếu. Quán chiếu là phải can đảm sử dụng chánh niệm và chánh định, chuyên cần không ngừng nghỉ, tức là phải có chánh tinh tấn. Quý vị sống trong thời đại mới, có bút mực, có máy vi tính, quý vị có thể dùng những dụng cụ đó để ghi lại rõ ràng những nguyên do xa gần đã đưa tới nỗi khổ đau của quý vị và để quán chiếu về từng đề mục trong đó. Có những nguyên do trong ta, bắt nguồn từ thân thể, tâm lý, cách sống, hay cách tiếp xử với xã hội. Nguyên do có thể bắt đầu từ cha mẹ, từ ông bà, tổ tiên, từ những người bạn của mình, từ tình trạng đất nước… Ta liệt kê tất cả các nguyên do gần xa đã đem đến khổ đau cho ta. Với chánh kiến ta sẽ thấy những nguyên do ấy trùng trùng vô tận. Bây giờ đến phương pháp thực tập giải bớt khổ đau. Nếu biết rằng nỗi khổ kia đã được nuôi dưỡng bằng những chất liệu nào thì chúng ta tìm cách cắt đứt nguồn thực phẩm tạo khổ đó đi. Bụt nói tới bốn nguồn thực phẩm. Trước hết là đoàn thực, thức ăn đưa vào cơ thể bằng đường miệng, thứ hai là xúc thực, đi vào bằng sáu giác quan. Nó đã mang theo những độc tố gây ra bệnh khổ. Thứ ba là tư niệm thực, tức là những mơ ước, tham vọng, lý tưởng làm mình tham đắm. Và thứ tư là thức thực tức là chính tâm ta đã tạo tác ra thực phẩm ở trong tàng thức. Tâm ta đã nấu nướng, đã tự nuôi dưỡng mình và tự đầu độc mình bằng các món ăn khiến cho chứng bệnh đã phát xuất.

Người thầy thuốc bao giờ cũng phải tin là có cách trị bệnh. Tín lực là sức mạnh đầu tiên trong ngũ lực. Người khổ đâu cũng phải tin rằng có những phương pháp chấm dứt khổ đau bằng sự hành trì với thầy và bạn, gọi là chánh pháp. Không tin thì không có năng lực chữa trị. Nhận diện được những nguồn thực phẩm nào đã gây đau khổ hay tiếp tục nuôi dưỡng khổ đau, ta quyết định cắt đứt. Đó là sự thực tập các giới, trong phạm vi chánh ngữ, chánh nghiệp, và chánh mạng. Chánh ngữ là lời nói chân chánh, chánh ngữ cũng là chánh thính, tức là biết lắng nghe. Hàng ngày chúng ta nói những câu không từ ái, làm ung hoại khung cảnh chung quanh. Và hoàn cảnh bị ung hoại sẽ truyền lại cho ta những chất độc khác. Cho nên tà ngữ và ác ngữ là một loại thực phẩm cần phải trừ bỏ. Thực tập chánh ngữ là để thay thế dần ác ngữ và trừ bỏ ác ngữ đi. Chánh nghiệp tức là hành động chân chánh. Bằng lời nói và hành động của mình ta có thể làm ung hoại khung cảnh cuộc sống. Nếu một dòng sựông bị ô nhiễm thì cá trong dòng sông sẽ chết. Nếu hoàn cảnh gia đình và hoàn cảnh xã hội của chúng ta đã bị nhiễm độc thì chúng ta cũng sẽ bệnh, sẽ khổ. Vì vậy ta phải thực tập chánh nghiệp.

Trong Bát Chánh Đạo còn có chánh mạng, tức là những phương tiện sinh nhai chân chánh. Phương thức mưu sinh của ta có thể gây độc hại cho đời sống xung quanh. Những độc tố đó sẽ trở lại tác hại thân và tâm ta. Có những nghề bắt buộc phải sát sanh, bắt buộc làm hư hỏng và ô nhiễm sinh môi, có những nghề thất đức. Nếu ta làm một nghề có tác dụng gây khổ đau cho chúng sanh và áp bức người khác thì trái tim và tâm thức của ta cũng sẽ bị nhiễm độc. Có những người làm giàu bằng những nghề không chính đáng, rồi họ đi chùa, đi nhà thờ và cúng những món tiền rất lớn. Sự cúng dường phát xuất từ sợ hãi, từ mặc cảm tội lỗi, mà không phải từ ý chí muốn đem lại hạnh phúc và muốn làm vơi bớt khổ đau. Khi nhà thờ hoặc nhà chùa nhận những số tiền lớn như vậy, thì phải thấy động cơ nào đã khiến cho những đại thí chủ đó đến cúng dường. Phải làm thế nào để cứu chuộc họ, mở con đường để họ thoát khỏi vòng nghiệp chướng. Những người đó là những người cần được cứu giúp, cần được giáo hóa nhiều hơn hết.

Tất cả những hành động và lời nói của chúng ta luôn luôn trở về ảnh hưởng lại chúng ta. Hành trì giới luật có nghĩa là nói có chánh niệm, hành động có chánh niệm, mưu sinh có chánh niệm. Trong khi thực tập chánh ngữ, chánh nghiệp, chánh mạng, chúng ta sử dụng chánh niệm. Chánh niệm là bó đuốc soi sáng, là tiếng chuông nhắc nhở. Để mỗi khi chúng ta nói một lời không phải là chánh ngữ thì chúng ta biết rằng đó là một lời không chánh ngữ. Khi ta hành động không chân chánh thì chánh niệm báo cho biết rằng đó không phải là chánh niệm. Cũng nhờ chánh niệm mà ta biết phương tiện sinh sống của ta là chánh mạng hay tà mạng. Thực tập chánh niệm từng giây phút không ngơi, đó gọi là chánh tinh tấn. Chánh tinh tấn là làm mọi cách để cho những hạt giống thiện, hạt giống của hạnh phúc và của từ bi được tưới tẩm mỗi ngày. Có chánh niệm ta sẽ đạt tới chánh định. Và niệm, định đi với tinh tấn sẽ đưa tới chánh kiến, tức là cái thấy rõ ràng, là tuệ giác.

Các tổ xưa khi nói rằng khi thấy được một sự thật trong bốn sự thật thì chúng ta thấy được ba sự thật khác. Điều này chúng ta phải chiêm nghiệm, phải thực tập. Can đảm đối diện với khổ đau thì ta có can đảm đi tìm những gốc rễ của khổ đau, có thể nắm được sự thật thứ hai là tập đế. Như thế là đã đi được nửa đường. Nhận diện được những nguyên do gây khổ đau rồi, ta biết cần cắt đứt những nguồn thực phẩm đưa tới khổ đau. Trong lúc thực tập, ta cần tới anh, tới chị, tới em, cần tới bạn, cần tới tăng thân. Không thể thực tập như sống trên một hải đảo lẻ loi được. Chúng ta nhờ vào người khác, rồi cũng yểm trợ cho những người khác thực tập. Nắm được nguyên tắc Tứ Diệu Đế là nắm được nguyên tắc của hành động. Trong thời đại mới chúng ta có thể dùng bút, mực để thiền quán. Chúng ta ghi trên giấy những hành tướng, những nguyên do của các niềm đau nỗi khổ. Chúng ta hỏi bạn bè, hỏi sư anh, sư chị, nhờ thế chiếu rõ hơn vào tình trạng của mình. Và nhờ sự soi chiếu của tăng thân mà chánh kiến ta càng sáng. Tu không có nghĩa là chỉ sử dụng niệm, định, tuệ của mình. Phải biết dùng niệm, định, tuệ của thầy, của bạn. Có những điều sờ sờ trước mắt mà ta không thấy, trong khi ấy, một em bé có thể trông thấy. Đứa bé không chủ quan, không bị giam hãm trong những thành kiến, và tập khí. Ý kiến, nhận thức, tri giác là một nhà tù để mình tự giam mình. Có người mang tri giác sai lầm mười năm, hai mươi năm mà không thấy được nhiều điều rất đơn giản, những điều mà một em bé năm bảy tuổi cũng có thể thấy được.

Cho nên trong công trình quán chiếu ta phải có can đảm đặt câu hỏi. Và sẽ có những câu trả lời tới rất bất ngờ. Nỗi khổ của chúng ta có thể từ bên ngoài đi tới, từ ông bà từ tổ tiên, từ hoàn cảnh xã hội gây ra, hay chỉ vì ta không may mắn. Nhưng cũng chính tại chúng ta mà một căn nguyên nhỏ có thể trở thành một đầu mối lớn gây nên đau khổ. Có những người mang căn nguyên như vậy, nhưng nhờ hiểu biết và tu tập nên không làm cho nỗi khổ lớn thêm và nặng nề thêm. Đó là quán chiếu về tập, về nguồn gốc của khổ đau. Ngồi trong rừng, trong núi một mình, ngồi trong thiền đường một mình để quán chiếu ta cũng có thể thấy. Nhưng ngồi nói chuyện với tăng thân, giải bày tâm trạng thao thức với một người bạn, đôi khi ta thấy rõ hơn là ngồi một mình ở trong thiền đường.

Và khi biết được nguyên do đã đưa tới đau khổ thì ta áp dụng những chi phần khác của Bát Chánh Đạo để làm thuyên giảm niềm đau khổ. Chỉ khi nào ta đóng cửa tâm thức lại, khư khư ôm lấy nỗi đau khổ, không chịu chữa trị, thì nỗi khổ mới tồn tại và sẽ càng ngày càng lớn. Đã có ý nguyện chữa trị, đã có đức tin nơi con đường chữa trị thì thế nào niềm đau khổ cũng sẽ giảm bớt. Mà theo ánh sáng của đạo Bụt thì tới tám, chín mươi phần trăm nguyên ủy gây khổ đau nằm ở tự thân. Tại sao người khác cũng sống trong hoàn cảnh đó, mà không đau khổ? Vì phương pháp thụ nhận và tiếp xử với hoàn cảnh của họ khác ta.

Học giáo lý Tứ Diệu Đế ta có một niềm tin rằng nếu có khổ đau thì có sự chấm dứt khổ đau. Chúng ta cần diệt khổ, nhưng phải gọi đúng tên nỗi khổ. Nói mơ hồ rằng đời là bể khổ thì không ích lợi gì mà còn có hại. Thường cái khổ của mình tác hại đến những người xung quanh. Khi ta đối trị được cái khổ của mình thì ta cũng giúp được những người xung quanh.

Nếu ta thấy được sự thật thứ nhất và sự thực thứ hai, thì ta sẽ thấy được sự thực thứ tư. Ta sẽ áp dụng Bát Chánh Đạo vào cuộc sống hàng ngày để cắt đứt những nguồn thực phẩm tạo nên khổ đau, thay vào đó những loại thực phẩm lành mạnh, ta trị liệu cái khổ trong ta bằng sự nuôi dưỡng lành mạnh. Tưới tẩm những hạt giống lành mạnh, thương yêu, hiểu biết, vui sống và cắt đứt các nguồn thực phẩm độc hại.

Các vị giác ngộ như Bụt hay bồ tát cũng có vấn đề như chúng ta nhưng họ không sợ hãi vì họ biết phương cách giải thoát. Thánh nhân cũng có thân và có tâm, và trong thân trong tâm cũng có hoa và có rác. Không thể nào có hoa mà không có rác. Điều khác biệt là ở chỗ các vị biết chuyển rác thành hoa một cách dễ dàng. Còn chúng ta thì ôm lấy cái rác mà chịu đựng. Vì chúng ta chưa nắm vững được phương pháp thực tập bốn sự thật và con đường của tám sự hành trì chân chánh. Nếu ‘‘học nhi thời tập chi’’, ngày ngày áp dụng Bát Chánh Đạo thì chúng ta sẽ vững chãi nắm được phương pháp đó. Mà khi đã nắm được thì pháp với Bụt là một. Ta luôn luôn an trú với Tam Bảo. Quý vị về làng và thực tập những điều rất đơn giản như bước chân chánh niệm và tiếng chuông tỉnh thức. Có vị đã sống ba tuần tại làng rồi mà đến khi về nhà không mang bước chân tỉnh thức về được, không đem theo tiếng chuông chánh niệm về được. Vì trong ba tuần ấy, quý vị không ‘‘học nhi thời tập chi’’ Bước chân của quý vị còn lao đao, còn run rẩy lắm. Tiếng chuông tỉnh thức của quý vị không ngân dài, chỉ cần một cử động, một âm thanh nào đó là tan biến như làn sưÒng mỏng. Bước chân đó và tiếng chuông đó làm sao đem về thành phố được? Bước chân rất vững, tiếng chuông rền vang mà về nhà còn bị đánh tan bởi hoàn cảnh xã hội. Huống hồ là bước chân ngập ngừng, và tiếng chuông yếu ớt. Học nhi thời tập chi, mỗi ngày chúng ta có cơ hội hai mươi bốn giờ để thực tập cho vững chãi. Bài thực tập Tứ Đế và những chi phần của Bát Chánh Đạo là bài thực tập hàng ngày của chúng ta. Khựựông nên để những bài học đó nằm dưới hình thức giáo lý. Khựựông nên chỉ nói về giáo lý.

Giáo lý đạo Bụt nói đến ba mươi bảy phẩm trợ đạo. Trước hết có Tứ Niệm Xứ (bốn lãnh vực quán niệm), Tứ Chánh Cần, Tứ Như Ý Túc. Rồi tới Ngũ Cặn, tức là năm căn cứ để phát xuất ra Ngũ Lực, những sức mạnh hùng hậu của sự thực tập. Tiếp đến là Thất Bồ Đề Phần, và Bát Thánh Đạo Phần.

Về Tứ Như Ý Túc, chúng ta chưa học trong khóa này. Như Ý có nghĩa là thể hiện được như lòng mình mong mõi như là phép lạ. Phép lạ đó được thực hiện bằng bốn yếu tố. Thứ nhất là ước muốn của mình, ý chí của mình gọi là dục như ý túc. Thứ hai là cần như ý túc, tức là sự siêng năng. Thứ ba là tâm như ý túc, tức là tâm có khả năng biến hiện ra mọi thứ như ý. Và thứ tư là quán (định) như ý túc.

Như ý túc là những phép lạ mà chúng ta có thể thực hiện được trong đời sống. Trong đó phép lạ lớn nhất là giáo hóa. Giáo hóa như ý túc có nghĩa là một hoàn cảnh khổ đau, tuyệt vọng mà nhờ sự giáo hóa đã trở thành một hoàn cảnh có hy vọng, có niềm tin, có an lạc và giải thoát. Ta tu tập như thế nào để có khả năng giáo hóa chuyển đổi một hoàn cảnh tối tặm tuyệt vọng thành một hoàn cảnh tươi sáng đó là thần thông lớn nhất trong tất cả các thứ thần thông.

Ba Mươi Bảy Phẩm Trợ Đạo gồm mười yếu tố căn bản là : Tín, Giới, Tư Duy, Tấn, Niệm, Định, Tuệ, Khinh An, Hỷ và Xả.

Thứ nhất là Tín. Tín là năng lượng của niềm tin và được kể trong Ngũ Cặn và Ngũ Lực. Thứ hai là Giới. Giới được thể hiện trong Chánh Ngữ, Chánh Nghiệp, Chánh Mạng. Yếu tố thứ ba là Chánh Tư Duy, tức là suy nghĩ đúng theo chánh pháp, đúng theo chánh kiến. Thứ tư là Tấn. Tấn là một trong Tứ Chánh Cần, cũng là Tấn Căn, Tấn Lực, là Tấn Giác Chi và cũng là một chi phần của Bát Chánh Đạo, là Chánh Tin Tấn. Yếu tố thứ năm là Niệm, có trong Ngũ Căn, Ngũ Lực, Thất Giác Chi và Bát Chánh Đạo. Yếu tố thứ sáu là Định. Định có trong tứ Thần Túc, tức là Định Như Ý Túc, và cũng có trong Ngũ Căn, Ngũ Lực, Thất Giác Chi và Bát Chánh Đạo. Tuệ là yếu tố thứ bảy, thấy trong Tứ Niệm Xứ, Ngũ Cặn, và Ngũ Lực. Trong Thất Giác Chi thì Tuệ là Trạch Pháp Giác Chi, trong Bát Chánh Đạo Tuệ là Chánh Kiến. Yếu tố thứ tám là Khinh An, một trong Thất Giác Chi. Yếu tố thứ chín là Hỷ, cũng là một trong Thất Giác Chi. Và yếu tố thứ mười là Xả, nằm trong Thất Bồ Đề Phần. Khi làm lại một bản tổng kết thì Ba Mươi Bảy Phẩm Trợ Đạo góp lại thành mười yếu tố ấy thôi. Ba Mươi Bảy Phẩm Trợ Đạo là những phép thực tập căn bản của Đạo Bụt Nguyên Thủy.

Để kết thúc khóa tu, chúng ta nên nhớ giáo lý Bốn Sự Thật như nguyên tắc hành động và giáo lý Con Đường của Tám Sự Hành Trì Chân Chánh được trao truyền như các phương pháp cụ thể để giải quyết những vấn đề trong đời sống hàng ngày. Nếu chúng ta tiếp nhận mà không thực tập thì chúng ta phụ công ơn của Đức Thế Tôn, của các Tổ đã trao truyền cho ta những giáo lý cụ thể và thực tiễn đó. Chúng ta phải biết rằng người nào cũng có niềm đau nỗi khổ. Để giải quyết niềm đau nỗi khổ đó chúng ta cần tới Chánh Pháp. Mà Pháp tức là Tứ Đế và Bát Chánh Đạo. Những giáo lý khác có thể giúp chúng ta trong sự thực tập Bát Chánh Đạo. Nhưng Bát Chánh Đạo là phương pháp đầy đủ để giải quyết những khổ đau. Đừng nói rằng chúng ta chưa học đủ. Chỉ cần học Tứ Đế và Bát Chánh Đạo là ta đã có thể hành trì và giải quyết những khổ đau của ta rồi. Phải nương vào tăng thân để thực tập. Chắc chắn chúng ta có thể giải quyết được vấn đề khổ đau. Khóa tu đến hôm nay là chấm dứt. Có thể nhiều người còn cơ hội gặp nhau trong khóa tu khác. Có thể một vài người sẽ không có cơ hội để gặp lại tăng thân này. Nhưng nếu chúng ta tiếp nhận Tứ Đế và Bát Chánh Đạo trong tinh thần học nhi thời tập chi của Đức Khổng Tử thì như vậy cũng đủ để chúng ta có thể đem Pháp Bảo áp dụng trong suốt cuộc đời mình. Chỉ cần nhắc nhở thêm một lần nữa là sự tu tập Tứ Đế và Bát Chánh Đạo sẽ dễ dàng hơn mười lần hoặc hơn cả trăm lần nếu chúng ta thực tập trong khung cảnh của một tăng thân.
! Bài 07 Bát chánh đạo tương sinh tương tức

Hôm nay là ngày 12 tháng 12 năm 1993, chúng ta ở Xóm Hạ và học tiếp về tứ diệu đế. Lần trước ta đã học về chánh kiến, hôm nay chúng ta sẽ học về chánh tư duy. Trong khi học về chánh kiến, chúng ta đã thấy rằng trong quá trình tu học, chánh kiến có thể là nhân và cũng có thể là quả. Bất cứ một hiện tượng nào trong vũ trụ, dù là vật lý, tâm lý hay sinh lý, đều phải được nhìn thấy đồng thời là nhân và là quả. Không có một hiện tượng nào chỉ đóng vai trò nhân hay quả mà thôi. Theo lý duyên khởi, chúng ta biết rằng tự tính của chúng ta là nhân mà cũng là quả.

Do đó dù trong Kinh nói chánh kiến đứng hàng đầu, nhưng chúng ta không nên hiểu chánh kiến là nguyên nhân đầu tiên từ đó phát khởi ra các chánh đạo khác. Theo đạo lý duyên khởi thì không có nguyên nhân đầu tiên, không có một cái gì thuần túy là nhân hay là thuần túy là quả. Một nhân không bao giờ đủ đưa tới quả mà phải có rất nhiều nhân để tạo nên một quả. Mỗi hiện tượng đều do tất cả những hiện tượng khác phối hợp và biểu hiện ra và mỗi vật có mặt trong tất cả các vật khác.

!! Bát chánh đạo tương sinh tương tức

Vậy chánh kiến không phải là nguyên nhân đầu tiên của các chánh đạo. Tám sự hành trì chân chánh tương sinh tương tức, mỗi phần đều là nhân và quả của các phần kia. Bảy sự hành trì kia cũng là nguyên nhân đưa tới chánh kiến. Bát chánh đạo còn được gọi bằng một từ khác là bát thánh đạo phận. Bát Thánh đạo Phận là tám thành phần của con đường cao quí. Trong tiếng Phạn, thánh đạo phận là arya marga anga, thánh đạo có tất cả tám chi phần. Thứ nhất là Chánh kiến mà chúng ta đã bàn. Rồi tới Chánh tư duy (right thinking) là sự tư duy đúng đắn. Chánh ngữ (right speech) là lời nói có tác dụng chuyển hóa, tháo gỡ, đem lại hạnh phúc và đánh tan mê lầm. Chánh nghiệp (right action) là hành động không tạo khổ đau, đưa lại hạnh phúc. Chữ nghiệp ở đây chỉ thân nghiệp, là hành động do thân thể ta làm. Còn khẩu nghiệp thuộc về chánh ngữ và ý nghiệp thuộc về chánh tư duy. Tiếp theo là Chánh mạng (right livelihood). Mạng tức là phương tiện sinh sống. Chánh mạng là nghề nghiệp, là phương cách sinh sống không gây đau khổ và mê lầm cho con người, không tàn hại thiên nhiên. Chi phần thứ sáu là chánh tinh tấn (right energy). Tinh tấn là sự siêng năng. Thứ bẩy là Chánh niệm (right mindfulness) và sau cùng là Chánh định (right concentration).

Về sự phát triển của tuệ giác, giáo lý luôn luôn nói tới niệm, định và tuệ. Tu tập chánh niệm dẫn tới chánh định và có chánh định thì đạt tới tuệ giác. Tại sao trong bát chánh đạo không nói chánh tuệ mà lại nói chánh kiến? Suy nghĩ về điều này giúp chúng ta phân biệt rõ hơn ý nghĩa chữ chánh kiến trong phạm vi tục đế và phạm vi chân đế. Đồng thời ta cũng thấy rõ hơn bảy chánh đạo khác góp phần vào sự chuyển hóa chánh kiến từ phạm vi thế gian sang phạm vi xuất thế gian như thế nào.

Chánh kiến bắt đầu bằng những giáo lý, chưa phải là tuệ giác. Hiểu biết về tứ diệu đế, về bát chánh đạo, về lý nhân quả mới chỉ là những hiểu biết có tính cách lý thuyết mà thôi. Nhờ có văn, tư và tu mà những ý niệm và ngôn từ đó trở nên tuệ giác chân thật. Trong quá trình văn, tư, tu chúng ta phải thực tập chánh tư duy, chánh ngữ, chánh mạng, v.v.. mà nếu không thực hành bảy thánh đạo kia thì những lý thuyết trong kinh sách không bao giờ biến được thành tuệ giác cả, mãi mãi chúng sẽ chỉ là một mớ ý niệm trong đầu, hoặc để nói cho vui thôi. Những điều ta học hỏi bằng khái niệm và ngôn từ có chứa chất những hạt giống của chánh kiến, của tuệ giác; nhưng không có văn, tư, tu thì chúng chưa thể trở thành tuệ giác được. Người học đạo bắt đầu tiếp nhận những kiến thức, ngôn từ và khái niệm từ trong kinh sách, từ thầy và từ các bạn tu. Sau đó người ấy phải thực tập bát chánh đạo để biến cái vốn liếng nghèo nàn đó thành tuệ giác đích thật, phát sinh từ nội tâm của mình.

Bụt nói tất cả chúng sinh đều có sẵn giác tánh, tức là hạt giống của chánh kiến, của tuệ giác. Giác tánh đó bị che lấp vì vô minh, buồn khổ và sầu hận, cho nên không phát triển được. Được nghe pháp, được gần gũi bạn lành và được học hỏi thì chánh kiến có cơ hội nẩy mầm và nở hoa: Hạt đậu năm xưa hé miệng cười. Cho nên chánh kiến là nhân nhưng cũng là quả, và khi chánh kiến thành kết quả đó chính là tuệ trong bộ ba niệm, định, tuệ (smrti, samadhi, prajna). Nhờ tu tập bảy chi phần khác của bát chánh đạo nên tuệ nẩy nở. Sau đó, tuệ giác lại nuôi dưỡng tư duy, ngôn ngữ, chánh nghiệp, chánh mạng, chánh tinh tấn, chánh niệm và chánh định. Cho nên chánh kiến tuy là mẹ của bảy chi phần khác, nhưng cũng là con của bảy chi phần khác. Cũng như là lá cây. Có thể nói thân cây, rễ cây, cành cây là mẹ, còn lá cây là con. Nhưng lá cây cũng đóng vai trò mẹ. Vì lá cây có bổn phận phải tiếp nhận thán khí, dùng ánh sáng mặt trời thực hiện diệp lục hoá. Mỗi chiếc lá chính là một viện bào chế, nhờ thế những chất khóang ở trong đất đi lên, từ nhựa nguyên biến thành nhựa luyện để nuôi cây. Thành ra tất cả các chiếc lá tuy là con của cây nhưng cũng đều là mẹ của cây. Giống như vậy, chánh kiến nuôi dưỡng chánh tư duy, chánh nghiệp, chánh mạng, chánh ngữ, vân vân, nhưng đồng thời cũng được chánh tư duy, chánh nghiệp, chánh mạng, chánh ngữ, v. v… nuôi dưỡng. Chúng ta càng thấy rõ tính duyên khởi có thể áp dụng trong bát thánh đạo phần.

Với chánh kiến, chúng ta phân biệt thế nào là căn lành và căn không lành; chúng ta hiểu bốn sự thật khổ, tập, diệt, đạo, v.v.. Có chánh kiến thì tự nhiên tư duy sẽ đi đúng đường, chúng ta suy nghĩ khỏi sai lầm. Có chánh kiến về duyên sinh thì chúng ta biết rằng hạnh phúc của chúng ta tùy thuộc vào hạnh phúc của người khác, như giữa anh chị em, vợ chồng hay cha con. Thấy rồi, mỗi người sẽ không đi tìm hạnh phúc cho riêng mình nữa. Vì khi cha khổ thì con không thể nào có hạnh phúc được, chồng khổ thì vợ không thể nào có hạnh phúc được, anh khổ thì em không thể nào có hạnh phúc được. Chánh tư duy là tư duy xem ta phải làm thế nào để cho người kia có hạnh phúc thì lúc đó ta mới thực sự có hạnh phúc. Người đi tìm hạnh phúc riêng rẽ là người không có chánh kiến, vì chánh kiến là cái thấy của đạo lý duyên khởi.

Nói về chánh ngữ cũng vậy. Nếu chúng ta có chánh kiến thì tự nhiên ngôn ngữ của chúng ta sẽ đi vào đường chánh. Chúng ta sẽ không nói những điều gây hiềm khích và đổ vỡ. Nếu thấy được tính khí của ta, những ưu, nhược điểm của ta và của người khác, thì ta sẽ không nói ra những câu tạo ra địa ngục giữa hai người. Trong tương giao xã hội, thấy rõ được ưu điểm và nhược điểm của mình và của người khác là có chánh kiến. Có chánh kiến thì tư duy và ngôn ngữ sẽ chánh, sẽ không gây thêm đau khổ. Điều đó cũng đúng với chánh nghiệp, chánh mạng, chánh tinh tấn, chánh niệm và chánh định.

!! Chánh Tư Duy về vô thường vô ngã

Chánh tư duy tiếng PHạn là samyak samkalpa, Kinh A Hàm dịch là chánh trí, tiếng pháp có thể dịch là conception correcte. Tư duy có hai loại là tầm (vitarka) và từ (vicara). Tầm là những ý nghĩ đơn thuần. Còn từ là suy đi nghĩ lại sâu xa hơn. Suy nghĩ tới lui, quanh quẩn, không dừng được, như cái máy vô tuyến truyền hình mở giờ này sang giờ khác không ai tắt, không có mục đích nào cả, thì sự suy nghĩ đó không phải là chánh tư duy. Chánh tư duy giúp cho ta nhìn thấy rõ, làm phát sinh chánh ngữ, chánh nghiệp và chánh mạng. Còn tà tư duy thì càng nghĩ càng gây đau khổ. Có chánh kiến, nhìn thấy bốn sự thật, duyên khởi, vô thường và vô ngã thì tư duy sẽ đi vào đường chánh. Tà tư duy phát sinh do cái nhìn không đúng về sự vật, về bản thân và hoàn cảnh của mình và của người. Chánh tư duy phát sinh căn cứ trên chánh kiến và trở lại nuôi dưỡng chánh kiến, hai phần nuôi dưỡng lẫn nhau.

Chánh tư duy là suy nghĩ dựa trên sự thật, không phải là tư duy trên mây, không dính líu gì với thực tế. Sự thật hiện rõ ra là nhờ chánh kiến. Nhiều người suy nghĩ và đi lạc trong vòng lẩn quẩn của lý thuyết, nói thao thao bất tuyệt, và viết những cuốn sách dài tràng giang đại hải. Nếu không có chánh kiến, họ vẫn chỉ nói chuyện trên mây. Chánh tư duy căn cứ trên chánh kiến, trên tuệ giác, nhờ đó ta thấy bản chất của sự vật là vô thường và vô ngã. Suy tư mà ngược lại với nguyên tắc vô thường và vô ngã là tà tư duy. Thí dụ nuôi con ta cứ nghĩ là đứa con nhỏ của mình sẽ như vậy suốt đời là sai. Sự thật là lên 12 tuổi nó đã khác, lên 14 tuổi nó đã có thể có những ý kiến ngược với mình, lên 16 tuổi nó đã có thể tranh luận với mình rồi.

Chánh tư duy là phải thấy được bản chất của vô thường trong con người của ta, của kẻ khác và của sự vật. Một người bây giờ rất dễ thương nhưng một ngày kia có thể trở thành dễ ghét và có thể trở thành kẻ thù. Mỗi chúng ta đều có đủ loại hạt giống, có hạt giống của sự trung thành mà cũng có hạt giống của sự phản bội. Bụt và các vị bồ tát đều như vậy hết. Nhờ ta tu tập, nên hạt giống của sự phản bội không có môi trường phát triển. Khi một người phản bội ta thì chính ta cũng đã tưới tẩm những hạt giống phản bội nơi họ từ ngày này sang ngày khác. Có người nói ‘‘Thôi đi tu cho xong!ì nhưng nếu hạt giống xuất gia trong người ấy không đủ lớn thì chắc người ấy không đi tới được quyết định. Tuy vậy hạt giống không xuất gia, hạt giống muốn lập gia đình nó vẫn còn trong con người đã xuất gia. Nếu sống với thầy với bạn mà vẫn thấy khổ thì tự nhiên hạt giống không xuất gia, nghĩa là niềm ước muốn lập gia đình, có vợ, có con, hạt giống đó sẽ lớn lên. Trong đời sống xuất gia nếu ta có hạnh phúc, nếu ta tự thấy mình có chuyển hóa và đã giúp ích được nhiều người, thì cái hạt giống không xuất gia kia, có thể lâu lâu phát hiện một lần trong giấc mơ nhưng không bao giờ lớn lên được cả. Người tại gia cũng vậy. Người đã quyết định thành lập gia đình cũng có cái hạt giống xuất gia ở trong tâm. Đôi khi cũng nằm mơ thấy mình đi tu, và nếu trong cuộc sống lứa đôi gặp nhiều khổ đau, thì lại cảm thấy tiếc ngày xưa mình đã không đi tu.

Trong ta, tàng thức chôn nhiều hạt giống, có khi những hạt giống ấy chống đối với nhau. Nhìn sâu, ta thấy tâm ta là mảnh đất chứa đựng tất cả mọi hạt giống. Người bạn hôn phối của bạn cũng mang sẵn đủ loại hạt giống như vậy. Người sư anh, người sư chị và người sư em của ta cũng vậy. Tất cả đều có những hạt giống trái ngược nhau ở bên trong. Nếu ta biết tưới tẩm, biết giúp đỡ thì các hạt giống tốt sẽ phát triển, hạt giống tiêu cực sẽ càng yếu, càng nhỏ, dù không bao giờ biến mất. Vì vậy tâm thức gọi là nhất thiết chủng thức (sarvabijaka), nghĩa là ‘‘tất cả các loại hạt giốngì.

Chúng ta phải tập nhìn mình, nhìn người và nhìn xã hội chung quanh cho rõ. Mỗi ngày cái thấy của ta phải sáng thêm, phải mạnh thêm, đó là tuệ giác. Nếu cái thấy không sáng thêm, không mạnh thêm thì sự tu hành của ta chưa có kết quả. Tình trạng tuệ giác còn ốm yếu được kinh gọi là Liệt tuệ. Tuệ giác ốm yếu thì không thể giúp nuôi dưỡng bảy chi phần khác của bát chánh đạo.

Một em bé mười hai tuổi về Làng Hồng, đã hỏi một câu làm cho Sư ông thương quá. Em hỏi: ‘‘Bạch sư ông, một người mình thương hôm nay, làm sao mình có thể biết trước rằng ngày mai mình còn thương nữa hay không?”

Người mình thương hôm nay, ngày mai mình có thể ghét, đó là một sự thật mà em bé này đã chứng kiến. Ba mẹ nó ngày xưa khi quyết định lấy nhau, đã bị cả hai gia đình chống đối. Ba đã tranh đấu, đã thách đố cả gia đình và cả xã hội để cưới được mẹ. Vậy mà bây giờ hai người coi nhau như thù nghịch. Ba và mẹ đang thù ghét nhau nên bé rất đau khổ. ‘‘Bạch Sư ông, làm sao mình biết cái người mình thương hôm nay, ngày mai mình vẫn còn thương?ì Làm sao chúng ta biết được! Vì lòng của chúng ta cũng vô thường. Nơi tâm người kia có những hạt giống khác nhau, nơi tâm ta cũng có những hạt giống khác nhau. Cái thấy về vô thường cho ta biết rằng ta phải cẩn thận trong đời sống hàng ngày. Nếu không biết vun bón những hạt giống tích cực mà cứ hàng ngày tưới tẩm những hạt giống tiêu cực nơi mình và nơi người, thì tự nhiên người mình thương hôm nay, ngày mai có thể mình sẽ ghét; cái người hôm nay thương mình sẽ có thể ghét mình ngày mai. Đó là chánh kiến dẫn ta tới chánh tư duy. Nếu tư duy không căn cứ trên tuệ giác về vô thường thì đó là tà tư duy.

Vô ngã là một nhận thức căn bản khác của chánh tư duy. Nếu tư duy của chúng ta không căn cứ trên nguyên tắc vô ngã thì vẫn là tà tư duy. Vô ngã có nghĩa là mỗi hiện tượng tùy thuộc nhiều hiện tượng khác, không hiện tượng nào có một tự thể riêng biệt và độc lập với tất cả những hiện tượng khác. Các hiện tượng đều do nhân duyên mà sinh khởi.

!! Tư duy ở trình độ xuất thế gian

Trong Kinh có nói đến sơ thiền, nhị thiền, tam thiền và tứ thiền. Trong trình độ thiền thứ nhất có tư duy, có tầm (vitarka) và từ (vicara) nghĩa là còn có những ý nghĩ. Nhưng vào thiền bậc thứ hai, đệ nhị thiền, thì không còn tầm và từ nữa. Càng tiếp xúc trực tiếp với thực tại thì càng thoát khỏi ý niệm và ngôn ngữ. Ý niệm và ngôn từ tuy được sử dụng để chỉ bày sự vật, nhưng cũng có thể làm cho ta xa cách thực tại. Vượt khỏi hàng rào của ý niệm và ngôn từ ta mới tiếp xúc sâu sắc được với sự thật. Như khi nói đến người Mỹ, người Pháp, nhiều người có sẵn những hình ảnh, ý tưởng, tình cảm vốn có về người Mỹ, người Pháp. Đến khi gặp một người Mỹ hay một người Pháp, nếu chúng ta vẫn giữ nguyên các ý niệm cũ, như những định kiến, để nhìn họ thì chúng ta không thể thấy và tiếp xúc được với con người thật trước mắt mình. Như vậy ý niệm và ngôn từ ban đầu có thể giúp ta biết có các sự vật, nhưng sau đó có thể trở thành chướng ngại vật ngăn không cho ta tiếp xúc với bản thân của thực tại. Cho nên trong quá trình tu tập ta phải dần dần học tiếp xúc với thực tại một cách trực tiếp không qua trung gian ngôn từ và ý niệm

Tư duy phải dùng đến ý niệm và ngôn từ. Nhưng trong quá trình văn, tư, tu, chúng ta phải tập vượt ý niệm và ngôn từ để đi vào bản chất của sự vật. Ban đầu của sự học hỏi thì tứ đế, bát chánh đạo, vô thường, vô ngã, thiện cặn, ác căn, đều là những ý niệm và ngôn từ. Và khi đã bắt đầu thấy được bản chất của tứ đế, của bát chánh đạo, của vô thường, vô ngã thì ta không cần đến những danh từ và ý niệm ấy nữa. Như thế gọi là thực chứng (direct experience). Trong phái Tào Động có câu châm ngôn về ngồi thiền: tư lương cá bất tư lương để, bất tư lương để như hà tư lương. Phi tư lương thị thiền chi yếu giả. Viết là tư lượng, đọc là tư lương. Tư là tư duy, lượng là đo lường, so sánh. Tư lương cá bất tư lương để là suy tư và đo lường cái không thể suy tư và đo lường, tư duy về cái không thể tư duy được. Bất tư lương để như hà tư lương là cái không thể suy tư thì làm sao mà suy tư được. Cho nên, phi tư lương thị thiền chi yếu giả: không suy tư, đó là yếu chỉ của thiền.

Người ta thường hay hỏi trong khi ngồi thiền ông suy nghĩ về cái gì? Ngồi thiền cốt yếu là không suy nghĩ gì cả. Lúc ban đầu trong sơ thiền thì còn suy nghĩ, còn dùng khái niệm và ngôn từ. Sau đó phải vượt khái niệm và ngôn từ.

Khi ta thực sự sống với một người hay trong một hoàn cảnh nào thì dần dần những ý niệm và những ngôn từ sẵn có về hoàn cảnh và về người đó tự nhiên rơi rụng. Từ đó có thể kết luận rằng khi ta đã bước sang lãnh vực chân đế, xuất thế gian, thì tất cả mọi tư duy đều là tà tư duy. All thinkings are wrong thinkings.

Khi học về chánh kiến, chúng ta cũng đi từ lãnh vực của thế gian sang lãnh vực xuất thế gian. Lãnh vực thế gian là thấy có chánh kiến, có tà kiến. Khi đi sang lãnh vực xuất thế gian tất cả các kiến đều là tà kiến. All views are wrong views. Chánh tư duy cũng vậy, ban đầu thì ta phân biệt có chánh tư duy và tà tư duy. Nhưng sau quá trình văn tư tu, bứt hết những ý niệm và ngôn từ, ta an trú trong thực tại nhiệm mầu của pháp thân. Lúc đó không thể nào diễn tả thực tại bằng ngôn từ và ý niệm nữa. Gọi là tâm hành xứ diệt. Tâm hành xứ tức là cái chỗ đi về của tâm ý. Nẻo về của mọi tâm hành không còn. Cái gọi là chánh tư duy cũng không còn diễn tả được sự thật, nó chẳng qua chỉ là ngón tay chỉ mặt trăng. Chánh kiến và bất cứ một chi phần nào của Bát chánh đạo cũng đều có hai mặt thế gian và xuất thế gian như vậy. Cho nên Bụt nói giáo pháp ta như biển, có những bãi biển thoai thoải giúp ta đi từ từ xuống nước, chứ không bắt buộc ta phải đi ngay vào chỗ quá sâu.

Học về vô thường, vô ngã, lúc đầu chúng ta chỉ có khái niệm và danh từ vô thường và vô ngã. Chúng ta có thể nói về vô thường, vô ngã suốt đời mà giáo lý vô thường và vô ngã không ảnh hưởng chút nào tới đời sống hàng ngày của chúng ta. Đó là những chiếc xe vận tải trống rỗng. Trái lại, nếu chiếc xe có chuyên chở vật liệu xây cất, thì khi xe rút lui chúng ta vẫn còn vật liệu. Và chúng ta không bị kẹt vào những chiếc xe hình thức của ý niệm và ngôn từ.

Bụt có dạy các phép quán về bất tịnh và khổ. Bất tịnh nghĩa là không sạch sẽ: tuy bên ngoài ta thấy sạch sẽ và đẹp đẽ nhưng bên trong thì không. Cảnh thiên nhiên bên ngoài có thể rất đẹp nhưng bên trong lại không. Cảnh đồng quê thái bình tươi tốt, chim én lượn bay, thấy rất đẹp nhưng bên trong có thể là chất phân hóa học đang giết bao nhiêu côn trùng. Những con chim đang liệng bay kiếm sâu để ăn, và những con sâu đang run sợ. Ta đừng để cái bề ngoài đánh lừa. Những con người trông rất trong trắng, nhưng bên trong thân tâm có những yếu tố bất tịnh. Khi khám phá ra được thì có thể trễ mất rồi. Phải thấy được các yếu tố bất tịnh bên trong chính bản thân mình, trong người khác và trong vạn vật chung quanh. Địa ngục có thể xuất hiện bất cứ lúc nào. Đó là phép quán bất tịnh. Trong đạo Phật có phương pháp quán cửu tưởng, tức là quán sát về thân thể con người để thấy được những sự thật về tính chất bất tịnh. Đó là một cách đối trị tham dục.

Quán khổ là để đối trị với ảo tưởng về vui. Nhìn một cá nhân, một gia đình chúng ta có thể thấy qua bề ngoài hình như có sự hòa thuận và vui vẻ nhưng bên trong có thể chứa chất nhiều khổ đau. Bề ngoài ta thấy một gia đình đầm ấm và tươi vui, nhưng bên trong có thể là oán giận, ghen ghét và mọi người phải chịu đựng lẫn nhau như trong một địa ngục. Bụt dạy quán khổ để ta xoá ảo tưởng về những niềm vui giả tạo. Sau này các thầy nêu ra hai đề tài quán chiếu, khổ và bất tịnh để chép chung với các phép quán vô thường và vô ngã. Quán chiếu để thấy bốn tà kiến gọi là bốn điên đảo (viparyasa). Đó là: sự vật vô thường mà nói là thường, sự vật khổ mà nói là lạc, sự vật vô ngã mà nói là hữu ngã, sự vật bất tịnh mà nói là tịnh. Điên đảo tức là ngược lại, tiếng Anh là up side down, quay ngược đầu xuống đất. Tâm Kinh Bát Nhã nói viễn ly điên đảo mộng tưởng tức là xa lìa những cái thấy điên đảo do tri giác sai lầm sinh ra.

Bụt đã cho bốn bài học: vô thường, vô ngã, khổ và bất tịnh để ta thoát ra khỏi những ý niệm và danh từ về thường, lạc, ngã và tịnh. Nhưng có người chỉ nắm bắt được danh từ và ý niệm thôi. Họ bị kẹt cứng trong các danh từ và ý niệm vô thường, vô ngã, khổ và bất tịnh ấy. Họ chỉ than đời vô thường quá, đời vô ngã quá, đời khổ quá, đời bất tịnh quá và âm thầm kết luận: thôi thì chết đi, hay bỏ cõi đời này tìm sang một cõi khác cho rồi. Đây là mối lầm rất quan trọng, làm họ không tiến thêm được bước nào trên đường tu học.

Trong bài ‘‘Đệ tử chúng con từ vô thỉ” có câu: ‘‘Cùng tăng thân xin nguyện ở lại cõi đời này làm việc độ sinh” ý nói ta không cần phải là bỏ cuộc đời này để đi tìm một cõi khác. Muốn giải thoát khỏi bốn cái điên đảo, tìm tới bốn chánh kiến, nhưng nếu không khéo thì người ta có thể lại kẹt vào những ý niệm vô thường, vô ngã, khổ và bất tịnh. Như một kẻ bị bệnh được người ta cho thuốc, rồi lại bị bệnh ghiền thuốc. đạo Phật Đại Thừa gọi những người này bị bệnh giáo pháp (dharma sickness). Ban đầu bị bệnh khổ đau, bây giờ bị bệnh thêm vì giáo pháp. Trong giới Phật tử, những người bị đắm vào các ý niệm vô thường, vô ngã, khổ và bất tịnh rất đông. Tuy họ nói hoài về vô thường, vô ngã, khổ và bất tịnh, nhưng những giáo lý đó không ích lợi gì cho họ trong đời sống hàng ngày cả. Những chiếc xe vận tải đó không chuyên chở được vật liệu nào cả, chỉ là những chiếc xe không. Đó là những hạt thóc lép không bao giờ mọc ra được lúa gạo. đạo Bụt Đại Thừa nói niết bàn là thường, lạc, ngã, tịnh. Lấy ngay tứ điên đảo để làm bốn đức của Niết bàn. Chúng ta nghe mà giật mình. Có người sẽ được chữa lành bởi cái phương thuốc đó, và cũng có người sẽ đau nặng thêm vì bốn phương thuốc đó không tiêu.

Thành ra khi chúng ta đi vào bình diện bản môn thì tất cả các kiến đều không còn, dù là chánh kiến. Tất cả mọi tư duy đều nên bỏ hết, dù là chánh tư duy. (All views are wrong views, all thinkings are wrong thinkings). Phi tư duy thị thiền chi yếu giả, sự vắng mặt của tư duy là tinh yếu của thiền. Cho nên chúng ta biết rằng khi nghĩ về những điều xấu và ác như sát, đạo, dâm, vọng là tà tư duy đã đành rồi; nhưng nếu chúng ta nghĩ tới tứ đế, vô thường, vô ngã, bất tịnh, khổ mà bị vướng vào ý niệm và ngôn từ thì đó cũng tà tư duy. Chứ không phải cứ đang nói về Phật Pháp là chánh tư duy. Tư duy Phật Pháp mà tư duy theo kiểu bị vướng mắc vào danh từ và ý niệm cũng là tà tư duy. Nói chuyện về quán rượu, sòng bạc và sắc dục, cố nhiên là tà tư duy; nhưng nếu chúng ta nói trong chánh niệm, trong ý hướng muốn chuyển hóa người nghe, để giúp họ ra khỏi những hầm hố và địa ngục ấy thì chúng ta đang thực tập chánh tư duy và chánh ngữ. Và khi đã chuyển sang bình diện xuất thế gian thì không còn sự phân biệt, tất cả tư duy đều là tà tư duy.

Trong việc tu tập, uống trà hay đi thiền hành thì chúng ta chỉ uống trà và chỉ đi thiền hành mà thôi. Nếu chúng ta còn tư duy về trà, tư duy về thiền hành, đó cũng vẫn là tà tư duy. Trong khi đi thiền hành ta chỉ đi thiền hành thôi; nếu suy nghĩ, dù là suy nghĩ về thiền hành, là hỏng. Trong khi uống trà ta chỉ uống trà; nếu trong khi uống trà còn suy nghĩ, so sánh, suy tư về trà, có những ý niệm này, ý niệm khác về trà, thì đâu còn là uống trà nữa?

Trong đời sống hàng ngày, trí óc ta luôn luôn suy nghĩ, nghĩ cái này rồi nghĩ cái khác. Khi sự suy nghĩ đưa chúng ta tới đau buồn, sợ hãi, lo lắng, chúng ta biết đó là tà tư duy và chúng ta phải ngưng lại. Muốn ngưng tập khí suy nghĩ ấy lại, ta phải thực tập chánh kiến. Chánh tư duy đưa đến an vui, đưa tới quyết tâm muốn tạo hạnh phúc cho mình và cho người khác. Trong kinh Thánh đạo và trong Tạp A Hàm kinh thứ 785, chúng ta thấy rõ rằng chánh kiến, chánh tư duy và chánh niệm phối hợp lại thành một bộ ba rất quan trọng, nhất là trong sự thực tập hằng ngày.

Để có một phương pháp tu tập về chánh tư duy, tôi đề nghị bốn mệnh đề này, quý vị có thể tự đặt cho mình như những câu hỏi, áp dụng vào thực tế.

Mệnh đề thứ nhất: Có chắc như vậy không? Câu hỏi này thuộc phạm vi tư duy và tưởng (thinking and perception). Tư duy liên hệ tới tưởng. Tưởng tức là cái nhận thức (perception) hay tri giác của mình. Một sợi dây mà ta tưởng là con rắn, đó là một nhận thức sai lầm, wrong perception. Một người không có ý nói điều đó mà mình tưởng rằng người ấy muốn nói điều đó, một điều giả định mà mình tưởng là sự thật; đó gọi là vọng tưởng. Càng nhiều vọng tưởng thì càng nhiều tà tư duy. Cho nên đừng vọng tưởng về mình, về người, về hoàn cảnh xung quanh. Và muốn như vậy thì phải có chánh niệm. Tự hỏi: Có chắc như vậy không? Có chắc cái tri giác mình tiếp nhận đó là đúng hay không? Trong một khóa tu nọ, tôi đề nghị mỗi người viết câu hỏi Are you sure? dán trong phòng mình. Chúng ta có rất nhiều nhận thức sai lầm trong đời sống hằng ngày. Những sai lầm đó tạo địa ngục cho chúng ta và những người sống chung với chúng ta. Vì vậy muốn chánh tư duy phải biết quán chiếu và kiểm chứng xem những tri giác của ta có đúng hay không.

Mệnh đề thứ hai mà ta nên luôn luôn tự hỏi mình là: Ta đang đi về đâu? Đây là vấn đề liên quan đến tư duy và thất niệm. Tư duy thường lôi ta đi khắp nơi. Nó xỏ mũi mình và kéo mình đi như trẻ mục đồng kéo con trâu đi theo. Nó mang chúng ta xuống địa ngục, chúng ta theo xuống địa ngục. Vì vậy cần phải thực tập chánh niệm. Ta đang đi về đâu? Khi biết mình đang để cho thất niệm hoành hành, để cho tà tư duy kéo mình đi vào địa ngục, ta nói: tôi biết đang đi vào địa ngục, và tự nhiên ta ngưng lại. Tôi biết tư duy của tôi đang đưa tôi xuống địa ngục và tôi quyết định không đi theo nữa.

Mệnh đề thứ ba có liên quan đến tư duy và tập khí. Tập khí là những thói quen ta có, từ hồi ấu thơ, có thể đã do các thế hệ ông bà truyền lại. Khi nhận ra một tập khí của mình ta hãy chào một câu: ‘‘A! bạn cố tri đó hả?” Một thói quen mà chúng ta thường nghĩ là hay nhưng có thể là dở. Ví dụ như cái thói hay làm. Hễ hở tay ra một cái thì kiếm việc ra để làm, nếu không làm thì không chịu nổi. căn nguyên sâu xa là vì từ đời này sang đời khác dân ta vốn rất nghèo đói. Cho nên ông bà tổ tiên của mình khi nào có chút thì giờ rảnh là phải làm một cái gì, để giúp gia đình có thêm cơm ăn áo mặc. Đó là một đức tính tốt. Vì thương gia đình, thương cha mẹ cho nên mình chịu khó làm như vậy. Nhưng thói quen đó có thể trở thành một tập khí xấu có thể làm cho mình không còn cơ hội để sống đích thực nữa. Rất nhiều người trong xã hội chúng ta bị cái bệnh gọi là ghiền công việc (workaholism), tức là không làm gì đó thì chịu không nổi. Họ không có thì giờ để ngắm nhìn trời xanh, mây trắng, không có thì giờ để đi từng bước thảnh thơi. Sự sống phải có những giây phút thản nhiên, nhàn Hạ để có thể được ngắm hoa đào nở, để có thể nhìn mặt trăng lên, để có thể uống một chén trà trong thanh tịnh. Cho nên ta phải quán chiếu tập khí này. Mỗi khi nhận ra mình đang hớt hải nhìn đâu cũng thấy việc chưa làm, việc muốn làm, lo lắng bồn chồn vì công kia việc nọ, chúng ta biết cái tập khí, cái thói quen cũ đang chiếm cứ tâm mình. Và ta cất tiếng chào: ‘‘Kìa, bạn tôi đã trở lại!” Nếu biết tập khí đó ta đã tiếp nhận từ mẹ ta, thì ta sẽ chào: ‘‘Mẹ ơi, con nhận ra mẹ rồi!”

Những tập khí trong cuộc sống với người chung quanh càng đòi hỏi ta giữ chánh niệm hơn nữa. Một người mà nói ra câu gì là ta phản ứng lại ngay lập tức. Tập khí tạo nên một phản ứng máy móc không kịp suy nghĩ. Một trăm lần ta phản ứng giống hệt cả trăm, như một phản ứng hoá học. Một người hễ nói xong câu này thì thế nào người kia cũng điên đầu nổi giận. Một trăm lần nói là một trăm lần giận. Cho nên người sống chung với ta phải biết về tập khí của ta và ta cũng phải tự biết tập khí của chính ta. Nhờ vậy ta có thể tránh được rất nhiều phiền não và khổ đau. Biết như vậy tức là thực tập chánh niệm. Mà biết như vậy không phải là tự ghét mình, giận mình, phạt mình. Ta không cần phải có mặc cảm tự ti, vì người nào cũng có tập khí cả. Có những tập khí do nhiều đời ông bà truyền lại. Cách tu tập của chúng ta là không tự trách, không phải tự đày đọa vì các tập khí đó. Cách thực tập là phải mỉm cười với tập khí; mỗi khi thấy nó ló đầu ra thì ta mỉm cười nói: ‘‘Chào anh! Tôi biết anh rồi!” (Hello, I know you are there) Đó là phương pháp hay nhất. Và khi ta nhận diện được tập khí của ta thì ta sẽ làm chủ tình hình và tập khí đó sẽ từ từ chuyển hóa. Trong lúc đó, ta tập thêm những tập khí mới, luyện nên những tập khí tốt. Ví dụ thiền hành. Nếu ta đi thiền hành cho đều và thấy an lạc trong khi đi thiền hành, thì thiền hành cũng trở nên một tập khí. Mỗi ngày nếu không đi thiền hành thì ta thấy thiếu thốn. Những người tập yoga cũng vậy. Có những ngày không tập yoga họ thấy giống như họ chưa được ăn cơm. ĐÌó cũng là một tập khí tốt.

Và cuối cùng, để chánh tư duy được phát triển với bồ đề tâm, ta sẽ nhớ tự hỏi: ‘‘Ta làm gì, ta nói gì để thể hiện Bồ Đề Tâm?” Bồ đề tâm tức là một ý chí, một ước muốn rất thâm sâu trong tâm thức của ta. Bồ đề tâm tức là ao ước được giác ngộ, được hiểu biết, được có chánh kiến để có thể tạo hạnh phúc cho nhiều người, cho nhiều loài. Động lực khiến một người đi tu là bồ đề tâm. Nếu có bồ đề tâm rồi, thì ngày đêm ta tâm niệm làm thế nào để có thêm tuệ giác, thêm chánh kiến, thêm năng lượng để tự tu, tự độ và giúp cho người khác vượt thoát khổ đau. Bồ đề tâm trở thành một vùng năng lượng rất lớn. Chính nó đẩy tư duy của ta đi tới mục đích. Tự hỏi: ‘‘Ta làm gì, ta nói gì, ta suy nghĩ gì để ước mơ thành tựu?” Nuôi dưỡng bồ đề tâm trong đời sống hằng ngày bằng chánh niệm thì tư duy của ta sẽ đi về hướng chánh. Tư duy sẽ không bị lôi kéo vào những đề tài vẩn vơ không bổ ích. Năng lượng của tâm bồ đề sẽ đưa ta tới chánh tư duy một cách rất nhẹ nhàng.

Quý vị cứ theo bốn tiêu chuẩn trên đây thực tập; sẽ đạt nhiều tiến bộ về chánh tư duy.
! Bài 21 Bốn duyên và sáu nhân

Hôm nay là ngày 3 tháng 2 năm 1994, chúng ta ở xóm Thượng và học tiếp về bát chánh đạo. Bài hôm nay đề cập đến giáo lý duyên khởi.

Duyên khởi là căn bản của Chánh Kiến. Có Chánh Kiến tức là cái thấy sâu sắc và đứng đắn về Duyên Khởi. Chúng ta đã biết Vô Thường và Vô Ngã cũng chỉ có nghĩa Duyên Khởi. Chữ Duyên tiếng Phạn là pratyaya, tiếng Pali là paccaya. Trong kinh Bụt thường nói rất đơn giản về Duyên Khởi. Ngài nói: ‘‘cái này có vì cái kia có, cái này không vì cái kia không, cái này sinh vì cái kia sinh, cái này diệt vì cái kia diệt.’’ Có khi Ngài dùng hình ảnh của một bó lau: một cọng lau, hai cọng lau, ba cọng lau nương vào nhau mà đứng vững. Khi một trong những cọng lau đổ xuống thì các cọng lau kia cũng đổ theo.

Đạo Bụt Nam truyền nói tới hai mươi bốn Duyên. Tư tưởng về 24 Duyên này được ghi lại trong tác phẩm Visuddhimagga (Thanh Tịnh Đạo Luận) của thầy Phật Âm (Buddhaghosa). Thầy Phật Âm phối hợp giải thích Hai Mươi Bốn Duyên đó với Mười Hai Nhân Duyên. Cách diễn giảng rất chi li, phức tạp, đối với những người mới học khó mà hiểu được. Đạo Bụt Nam truyền trong hệ phái Xích Đồng Diệp Bộ (nay là Theravada) đã tiếp nhận sự truyền thừa từ Phân Biệt Thuyết Bộ trong Thượng Tọa Bộ. Trong khi ở miền Nam nói về 24 Duyên thì Hữu Bộ tại miền Bắc lại có ý niệm về Bốn Duyên. Mà Hữu Bộ cũng xuất phát từ Thượng Tọa Bộ. Chắc hẳn ngày xưa đã từng có những lý thuyết chi li hơn về Duyên Khởi. Nhưng sau đó vì sự học hỏi và hành trì nên người ta đã thâu tóm và giản lược lại. Đầu khóa tu chúng ta đã đọc tên 24 Duyên của Đạo Bụt Nam Truyền. Bây giờ chúng ta nhìn lại Bốn Duyên Khởi theo đạo Bụt Bắc truyền.

!! Bốn duyên và sáu nhân

Duyên nói chung là những điều kiện để cấu thành các hiện tượng về tâm cũng như thân. Trong Bốn Duyên, loại duyên thứ nhất là Nhân duyên. Nhân tức là hạt giống từ đó sinh ra quả. Duyên là một điều kiện. Khi ta nói Nhân duyên thì Nhân là một thứ duyên, một điều kiện để tác thành. Điều kiện đầu tiên là có sẵn hạt giống. Ví dụ chúng ta có một hạt giống của giác ngộ, của chánh niệm trong ta. Đó là một duyên đầu, gọi là Nhân duyên. Bụt dạy rằng tất cả mọi chúng sinh đều có hạt giống của giác ngộ, của hạnh phúc. Hạt giống đó vì còn bị ngăn trở không cho trưởng thành nên ta cứ trầm luân trong biển khổ. Chúng ta cũng có hạt giống của niềm tuyệt vọng. Nếu chúng ta cứ tự tưới tẩm hoặc để cho người khác tưới tẩm hạt giống đó, thì một ngày kia niềm tuyệt vọng cũng sẽ lớn lên, tràn lấp tâm ta và sẽ làm ta đau khổ. Chúng ta có hạt giống của giác ngộ, của niềm tin, của tình thương nhưng chúng ta cũng có hạt giống của niềm tuyệt vọng và của sự căm thù. Hạt giống đó là một điều kiện tác sinh, gọi là Nhân.

Loại điều kiện thứ hai là duyên Tăng Thượng. Tăng tức là thêm, Thượng tức là trồi lên. Loại điều kiện thứ hai là những điều kiện giúp vun trồng và tưới tẩm thêm cho hạt giống đầu phát triển. Nếu hạt giống của niềm tin trong ta mỗi ngày được tăng thân, được thầy, được bạn tưới tẩm cho, thì niềm tin đó ngày càng lớn. Duyên Tăng Thượng có hai trường hợp: thuận và nghịch. Những điều kiện thích hợp, nâng đỡ, bổ túc thì gọi là thuận. Ví dụ niềm tin của chúng ta mỗi ngày đều được các bài pháp Thoại của thầy hay lời khuyên nhủ của các sư anh, sư chị hỗ trợ, thì đó gọi là duyên Tăng Thượng thuận. Nếu có người ngày nào cũng nói những điều làm cho chúng ta nghi ngờ, thì niềm tin của chúng ta ngày càng bị yếu, đó là duyên Tăng Thượng nghịch. Nhiều khi duyên nghịch cũng có thể giúp chúng ta được chứ không phải chỉ có duyên thuận. Nếu chỉ gặp những thuận duyên thôi thì có thể chúng ta không biết quý. Gặp sóng gió ba đào, khó khăn trắc trở, niềm tin và sức mạnh có thể nhờ thế lớn lên. Gặp những duyên nghịch thì mình mới biết sức mình, được đào luyện trong những điều kiện khó khăn như thép được tôi luyện trong lửa. Thành ra những duyên nghịch cũng có thể có ích lợi. Nếu Bụt không trải qua những năm tháng tu khổ hạnh thất bại thì Bụt đã không dạy con đường Trung Đạo, con đường không hành hạ xác thân mà cũng không đắm chìm trong năm thứ dục lạc.

Thứ ba là duyên Thứ Đệ, có khi gọi là Đẳng Vô Gián Duyên. Thứ Đệ tức là có trước có sau. Đẳng tức là bằng nhau, bình thường, đều đều. Vô-gián nghĩa là không gián đoạn. Sự hình thành nào cũng cần được liên tục, không gián đoạn. Ví dụ như sự tu học cần được tiếp tục ngày này sang ngày khác không gián đoạn thì mới thành công được. Tục ngữ có câu ‘‘cóc bỏ vào đơiaì là nói những người không đủ kiên trì, không tạo được duyên thứ ba là duyên Thứ Đệ. Luộc khoai mà đốt lửa thật lớn trong ba phút rồi tắt lửa, rồi hai phút sau đốt lửa trở lại rồi lại tắt, cứ như vậy thì không bao giờ khoai chín cả. Đó là thiếu Đẳng vô gián duyên.

Thứ tư là duyên Sở duyên. Sở duyên là đối tượng. Nếu không có đối tượng thì không có chủ thể; như niềm tin thì có đối tượng của niềm tin, niềm tuyệt vọng cũng có đối tượng của niềm tuyệt vọng. Đối tượng đó gọi là Sở Duyên (object), còn chủ thể gọi là Năng Duyên (subject. )

Muốn hiểu vai trò và tác động của bốn loại duyên chúng ta nên nhìn dưới ánh sáng của Duy Biểu học- thường gọi là Duy Thức học. Trước hết, các tâm hành đều có chủ thể và đối tượng, không thể tách rời nhau. Thử hình dung tâm của chúng ta, phía trên là ý thức và phía dưới là tàng thức. Chúng ta hãy nói đến một tâm hành, ví dụ một niềm đau khổ. Niềm đau khổ ấy có hạt giống sẵn ở trong tàng thức. Hạt giống đó có thể nằm im trong bao nhiêu năm ta không cảm thấy gì hết. Niềm đau không phát hiện lên trên ý thức, vì hạt giống ấy chưa được tưới tẩm. Hạt giống là duyên Nhân.

Bây giờ nếu có những điều kiện tưới tẩm từ cha mẹ, anh em, xã hội, học đường thì hạt giống đó có cơ hội nẩy mầm. Mọi người có thể tưới tẩm nó bằng lời nói, cử chỉ, cái nhìn và hành động. Một hạt giống có thể được tưới tẩm bằng sự có mặt của những hạt giống khác. Những hạt giống phiền não khác tưới tẩm hạt giống phiền não này. Những yếu tố nội tại và những tác động bên ngoài đó đều được gọi là những duyên Tăng Thượng.

Việc tưới tẩm xẩy ra liên tục. Ngày ngày ta cũng nghe, cũng thấy, ngày nào cũng xúc tiếp, hạt giống đau buồn ấy tiếp tục lớn lên, biểu hiện trên mặt ý thức. Và đây là loại duyên thứ ba, gọi là duyên Thứ Đệ. Giả thử niềm đau đó không có duyên Thứ Đệ, như ta được đưa về một môi trường khác, một tăng thân có hạnh phúc để tu học, để thực tập chánh niệm, chánh ngữ, chánh kiến, thì sự tưới tẩm hạt giống khổ đau tự nhiên ngưng lại, bị gián đoạn, và duyên Thứ Đệ không còn nữa. Sự phát hiện hạt giống bất thiện có thể ngừng lại để ta thực tập tưới tẩm những hạt giống thiện.

Và cuối cùng, đến các điều kiện thứ tư là duyên Sở Duyên. Niềm đau khổ phải có một đối tượng để phát hiện, như đau khổ về một chuyện gì: về tương lai, thân phận, hạnh phúc hoặc tình thương. Đối tượng đó gọi là duyên Sở Duyên.

Trong truyền thống Đạo Bụt Bắc Tông, từ bộ phái Hữu Bộ đã phát xuất quan niệm về Bốn Duyên và Sáu Nhân mà sau này tông Duy Thức trong Đại Thừa đã khai triển. Tất cả mọi hiện tượng đều có thể giải thích do bốn loại duyên mà thành hình.

Khi chúng ta quán chiếu về một hiện tượng của tâm hay của thân, chúng ta phải quán chiếu đến cội nguồn và phải thấy được bốn loại điều kiện ấy. Riêng về điều kiện đầu, Nhân duyên, chúng ta có thêm lý giải về Sáu Nhân, tức là sáu loại hạt giống của sự hình thành.

Trước hết là nhân Năng Tác (Nói lối Hán Việt là Năng Tác Nhân), tức là nhân đầu tiên điều động và tạo tác. Nhân Năng Tác có hai tác dụng: tác dụng dữ lực, nghĩa là tạo cho sức mạnh (empowering); và tác dụng bất chướng, nghĩa là không gây chướng ngại (non-resistant). Nhân thứ hai là Câu Hữu. Câu Hữu (co-existing) tức là cùng có mặt, tiếng Phạn là sahabhuta, là những nhân có đồng thời với nhau, không có cái nào trước, không có cái nào sau. Ví dụ như khi ta vẽ một đoạn thẳng AB thì ta thấy đầu A với đầu B đều hiện diện, nếu đầu B không có thì A cũng không có; dù đường ngắn hay dài cũng vậy. Có A là có B, có B là có A; B làm ra A, A làm ra B; B và A cùng có một lần. Câu hữu có nghĩa như vậy. Điều này cũng là đặc tính của những ý niệm có và không, trên và dưới, trong và ngoài, trước và sau, sinh và tử.

Thứ ba là nhân Đồng Loại. Đồng Loại tức là cùng chủng loại (of the same kind, same category). Những nhân đó cùng là nhân tốt hay cùng là nhân xấu. Ví dụ như ta có hạt giống của niềm tin và có thêm hạt giống của niềm vui; tin tưởng đưa đến sự vững chãi và sự vui tươi mà vui tươi lại đưa tới sự tin tưởng và vững chãi. Hai nhân đó cùng nâng đỡ nhau, gọi là nhân Đồng Loại.

Thứ tư là nhân Tương Ưng. Tương Ưng (sampayupta) là hai cái đáp ứng với nhau, cộng tác với nhau (associating). Hai cái có thể là khác nhau nhưng tương ứng với nhau. Nhân này tiếp ứng, hỗ trợ cho nhân kia để lớn mạnh thì gọi là Tương Ưng.

Thứ năm gọi là nhân Biến Hành (sanvatraga). Biến Hành tức là hoạt động khắp nơi, có mặt khắp nơi (all pervading, universal). Ví dụ như nước có tính cách biến hành, chỗ nào nước cũng có mặt: trong cơ thể chúng ta, trong cây cối, trong đất, trong không khí đều có nước. Những tâm hành Xúc, Tác Ý, Thọ, Tưởng, TƯ là những tâm sở biến hành ở đâu cũng có.

Nhân thứ sáu gọi là nhân Dị Thục (vipaka). Dị Thục ở đây tức là nói về Tàng Thức. Dị tức là khác nhau, Thục tức là chín. Chữ Dị có ba hình thức: khác thời, khác loại và thay đổi. Dị thời nhi thục tức là có những nhân chín sớm, có những nhân chín trễ. Ví dụ như một nải chuối: nải chuối chưa chín lắm chúng ta mang về để trên bàn, nải chuối ở trong nhà ấm áp sẽ từ từ chín. Nghĩa thứ hai của Dị là khác loại, Dị loại nhi thục tức là không cùng một loại. Ví dụ như xoài và chuối khác nhau; khi chuối chín thì thành ra chuối chín, khi xoài chín thì không thành ra chuối chín. Khác nhau là dị loại. Nghĩa thứ ba của Dị là Biến Dị Nhi Thục. Khi còn xanh, còn non thì quả nó khác, khi chín thì nó khác. Hạt giống thế này, đến khi thành trái cây chín muồi nó lại khác. Người ngồi thiền, mới ngồi thì thấy hơi khó chịu, không được thoải mái lắm. Nhưng ngồi được chừng 20, 30 phút thì chuyện thiền tọa đã chín và ta cảm thấy thư thái, an lạc; trong đó cũng có nhân Biến Dị Nhi Thục. Ngồi cho đúng phép, có duyên Nhân, duyên Tăng Thượng, duyên Thứ Đệ và duyên Sở Duyên thì ngồi thiền thành công. Tại sao có người trông mong đến giờ để được đi thiền hành, lại có người nghe chuông thiền hành thấy mệt nhọc trong lòng? Đó là tùy thuộc những thứ duyên khác nhau.

!! Mười hai nhân duyên

Thuyết Duyên Sinh mà cả Bắc Tông và Nam Tông đều nói tới một cách rất kỹ lưỡng gồm Mười Hai Chi Phần (Anga). Đó là Mười Hai Nhân Duyên, từ Vô minh cho tới Lão tử. Trong Kinh Đại Duyên (Mahanidana) và trong nhiều Kinh khác Bụt cũng nói tới 12 Nhân Duyên. Vì thế con số 12 có tính chất linh thiêng.

Trước hết là Vô Minh, không sáng. Vô Minh tức là sự mù mờ, là bóng tối, không hiểu, hiểu lầm, mê mờ, hồ đồ, rối rắm.

Duyên thứ hai được nói tới là Hành. Hành tức là một động lực trong tâm khi bị quấy động lên bởi Vô Minh. Cái giận, cái thù, cái ghét, cái bực bội của mình, tất cả đều do Vô Minh quấy động. Ta muốn nói cái này, muốn làm cái kia là vì những Hành do Vô Minh quấy động.

Thứ ba là Thức. Thức ở đây phải được hiểu là toàn thể tâm thức của chúng ta: cá nhân và tập thể, ý thức và tàng thức, chủ thể và đối tượng. Mà nói đến Thức là chúng ta đã thấy có Vô Minh và Hành trong ấy. Tại vì Thức được làm bởi Vô Minh và Hành. Vì chứa tính sai lầm, vì chứa mầm khổ đau cho nên gọi là Thức. Nếu không thì nó đã được gọi là Trí. Có Vô Minh gọi là Thức, có Minh ta gọi là Trí.

Thức làm phát hiện ra Danh Sắc. Sắc tức là phần vật chất, sinh lý và Danh là phần tâm lý. Danh Sắc nằm trong Thức. Sắc là đối tượng của Thức mà Danh cũng là đối tượng của Thức. Ví dụ khi chúng ta nhìn bàn tay, thì bàn tay là đối tượng của Thức. Khi chúng ta tiếp xúc với cái giận, cái buồn, với hạnh phúc của chúng ta thì cái giận, cái buồn, vá cái hạnh phúc ấy cũng là đối tượng của Thức.

Lục Nhập tức là sáu căn và sáu trần. Căn là mắt, tai, mũi, lưỡi, thân và ý. Trần là sắc, thanh, hương, vị, xúc và pháp. Lục Nhập nằm trong Danh Sắc. Sáu căn tiếp xúc với sáu trần tạo thành sáu thức.

Lục Nhập tạo ra Xúc, một tâm sở Biến Hành mới nói ở trên. Có sáu căn mắt, tai, mũi, lưỡi, thân và ý và có sáu trần sắc, thanh, hương, vị, xúc và pháp làm đối tượng, thì có xúc. Xúc là tác động giữa căn và trần.

Sự xúc chạm đó tạo ra Thọ, cảm thọ dễ chịu, khó chịu hay là trung tánh. Trong trường hợp đó là lạc thọ thì chúng ta có thể vướng vào Ái. Ái tức là sự vướng mắc. Thứ chín là Thủ. Thủ tức là bị kẹt vào. Vì vướng mắc cho nên ta bị kẹt vào. Kẹt vào mới sinh chuyện ra, gọi là Hữu. Hữu tạo ra Sinh. Và có Sinh thì thế nào cũng có già chết, tức là Lão-Tử. Đó là mười hai Nhân Duyên.

Trong những Kinh đầu nói về đạo lý Nhân Duyên, có khi Bụt chỉ nói tới 9 Nhân Duyên, có khi nói 10 Nhân Duyên. Trong những lần thuyết pháp sau, Bụt thêm vào thành ra mười hai. Luận Đại Tỳ Ba Sa của Hữu Bộ nói đạo lý Nhân Duyên có thể được trình bày qua một chi cũng được, hai chi cũng được, ba, bốn, năm, sáu, bảy, chín, mười, hoặc mười hai chi cũng được. Nếu một chi thì nói rằng các pháp hữu vi nương nhau mà có. Nếu hai chi thì nói là Nhân và Quả; đạo lý Nhân Duyên cũng gọi là Nhân Quả. Nếu là ba nhân duyên thì kể là Tam Thế: Quá khứ, Hiện tại và Vị lai. Nếu là bốn nhân duyên thì kể Vô minh, Hành, Sinh và Lão Tử; tám duyên kia cũng nằm gọn trong bốn duyên này. Nói năm Nhân Duyên thì kể Ái, Thủ, Hữu, Sinh và Lão Tử. Nếu chia ra sáu thì ba lần (Tam Thế) nhân với hai (Nhân và Quả), tức là Nhân và Quả của Quá khứ là hai, thêm Hiện tại vào là bốn, và thêm Tương lai vào thì tất cả là sáu Nhân Duyên.

Chín Nhân Duyên là do chính Bụt nói. Trong Kinh Đại Duyên (Mahanidana), Trường Bộ Kinh thứ 19 ở tạng Pali, Bụt không nhắc tới ba duyên Vô Minh, Hành và Lục Nhập. Sở dĩ Bụt không nói đến Vô Minh và Hành là vì trong Thức đã có bản chất Vô Minh, có vọng tưởng và vọng động là Hành. Nếu không có vọng tưởng và vọng động thì không gọi là Thức, phải gọi là Trí. Không có Lục Nhập là vì trong Xúc, và Thọ đã có Lục Nhập, Danh Sắc cũng hàm chứa Lục Nhập. Vì cái này gồm tất cả các cái kia, phân tích ra cho rõ trong một chi phần đã có tất cả các chi phần. So sánh kinh điển Nam Truyền với kinh điển Bắc Truyền, ta thấy kinh chữ Hán là Tạp A Hàm và kinh Pali là Tương Ưng Bộ đều có một kinh trong đó Bụt chỉ nói về mười Duyên thôi, không kể tới Vô Minh và Hành.

Như vậy, có lúc Bụt nói 9 Duyên, có lúc Bụt nói 10 Duyên và có lúc Bụt nói 12 Duyên. Trong lúc giáo hóa Ngài đã tùy trình độ đại chúng để khai triển dần dần. Bụt đưa ra giáo lý Nhân Duyên đơn sơ lúc ban đầu rồi từ từ khai triển. Vì vậy không phải thuyết 9 Duyên là đúng, hay 10 Duyên, hay 12 Nhân Duyên là đúng, thuyết nào cũng đúng cả. Hai duyên Vô Minh và Hành đã được nói tới từ thời Bụt, không phải do các thầy thêm vào sau. Khi nghiên cứu kinh điển một cách khoa học chúng ta thấy điều đó. Trong Tạp A Hàm và Tương Ưng Bộ, có một kinh Bụt bắt đầu từ Lão Tử, những khổ đau của sự già chết, và Bụt đi ngược trở lại. Bụt nói rằng Danh Sắc duyên Thức, Thức duyên Danh Sắc, tạo ra bao nhiêu khổ đau, đưa tới Sanh và Lão Tử. Kinh Đại Duyên trong Trường Bộ nói tới chín nhân duyên, tuy dài nhưng không hẳn là một kinh nói sau. Chúng ta có khuynh hướng cho kinh dài được nói sau, nhưng có thể kinh này đã được nói trước. Có những Kinh ngắn nói tới 12 Nhân Duyên trong khi Kinh này chỉ nói 9 Nhân Duyên.

Học về nền văn học Abidharma, tức là Luận Tạng, cũng có nhiều điều lý thú. Những tác phẩm Abhidharma ban đầu đã được các thầy viết dưới hình thức kinh. Vì các thầy còn dè dặt, nói thác lời Bụt cho có uy tín. Giai đoạn thứ hai của Abhidharma có tính cách độc lập, nên gọi đúng là Abhidharma. Giai đoạn thứ ba là giai đoạn phát triển, phân tích tỉ mỉ, dài trường giang đại hải, đọc có thể nhức đầu. Và sau đó mới đến giai đoạn thứ tư là giai đoạn tóm tắt. Những tác phẩm mới nhất của nền văn học Abidharma là những tác phẩm ngắn, gọn và dễ học. Tóm lại, chúng ta có thể nói về Nhân Duyên bằng một chi phần cũng được, bằng hai, ba, bốn, năm, bảy, chín, mười hoặc mười hai chi phần cũng được. Điều đó chỉ chứng tỏ một sự kiện là một Duyên bao gồm tất cả các Duyên khác. Có hai lối diễn giải về mười hai nhân duyên, một là thuận, hai là nghịch. Thuận là đi từ Vô Minh tới Lão Tử, và nghịch là đi tử Lão Tử ngược lại tới Vô Minh. Bụt có khuynh hướng đi theo đường nghịch : người thường hay nhìn thẳng vào bản chất Khổ để tìm ra nguyên nhân Khổ. Tại sao có già và chết? Tại vì có sinh ra. Như vậy cho đến khi ta nắm được vô minh là bản chất của sinh tử. Phần nhiều các vị tổ sư thì lại ưa đi theo lối thuận : từ Vô Minh đi tới Lão Tử. Các nhà phật học có khuynh hướng giải thích tại sao có luân hồi, có sự vận hành của sinh mạng, và do đó ưa sử dụng giáo lý mười hai duyên khởi để chứng minh luân hồi. Nhiều vị luận sư của ta cũng có khuynh hướng ấy, nghĩa là khuynh hướng chứng minh luân hồi bằng giáo lý nhân duyên. Chúng ta nên nhớ rằng giÌáo lý có mục đích hướng dẫn sự tu tập chuyển hóa mà không phải có mục đích triết học, do đó đừng nên đi vào dấu vết của những người chỉ muốn làm công việc biện hộ và chứng minh cho luân hồi.

!! Liên hệ giữa 12 nhân duyên

Trong lịch sử phát triển tư tưởng Phật giáo, các Luận sư ngày xưa có khuynh hướng dùng thuyết 12 Nhân Duyên để giải thích sự vận hành của sinh mạng. Tại sao người ta sinh ra? Tại sao luân hồi tiếp tục mãi? Giáo lý 12 Nhân Duyên trở thành một lý thuyết để chứng minh vòng sinh tử luân hồi.

Một khuynh hướng diễn giải về 12 Nhân Duyên theo chiều dọc, (trục tung độ). Trong khuynh hướng này có hai cách trình bầy khác nhau. Theo đường xuôi thì bắt đầu từ Vô Minh và chấm dứt với Lão Tử. Theo chiều ngược, bắt đầu từ Lão Tử đi trở lại Vô Minh. Trong kinh, Bụt thường theo cách trình bầy Tứ Diệu Đế, mở đầu bằng những khổ đau hiện thực của chúng sinh là Lão Tử, rồi lần tìm các nguyên ủy để dẫn tới Thức và Danh Sắc, cùng toàn bộ những duyên tạo khổ đau. Hầu hết các Luận Sư sau này, vì chủ ý là cắt nghĩa sự vận hành của Luân Hồi nên đã đi theo chiều Thuận, lấy Vô Minh làm điểm khởi hành.

Một hậu quả của lối trình bày này là gây ra cảm tưởng Vô Minh là nguyên nhân đầu tiên của mọi sinh mệnh. Nhưng giáo lý Đạo Bụt không phải những tư tưởng theo lý luận đường thẳng, nên ta không thể nói về một nguyên nhân đầu tiên.

Nhiều vị luận sư đã lập ra lý thuyết gọi là Tam Thế Lưỡng Trùng. Tam Thế tức là ba đời: quá khứ, hiện tại, vị lai. Lưỡng trùng là hai tầng nhân quả. Theo thuyết này Vô Minh và Hành được xếp vào quá khứ. Hiện tại gồm có Thức, Danh Sắc, Lục Nhập, Xúc, Thọ, Ái, Thủ, Hữu. Còn Sinh và Lão Tử thuộc về vị lai. Trong 12 chi, hai chi đầu thuộc về kiếp trước, hai chi sau thuộc về tương lai, còn tất cả tám chi ở giữa thuộc về hiện tại. Sự phân chia đó nghe cũng hấp dẫn, nhưng có thể gây nhầm lẫn nguy hiểm. Nguy hiểm vì người học có thể nghĩ lầm rằng nếu Sinh và Lão Tử thuộc về tương lai thì trong kiếp hiện tại không có Sinh và Lão Tử. Cũng vậy, Vô Minh và Hành được xếp trong quá khứ, nhưng chúng ta biết cũng trong hiện tại có Vô Minh và Hành. Trong tất cả các chi phần của 12 Nhân Duyên, ta đều nhận ra sự có mặt của Vô Minh và Hành.

Trên một ngàn năm qua, thuyết Tam Thế Lưỡng Trùng được coi như mẫu mực. Thức, Danh Sắc, Lục Nhập, và Xúc được xem như là quả, mà nhân là Vô Minh và Hành. Trong kiếp trước đã có nhân Vô Minh và Hành cho nên hiện tại phải có quả là có Thức, có Danh sắc (thân, tâm) có Lục Nhập và có Xúc. Đó là cặp nhân quả đầu. Rồi tại vì Thọ, Ái, Thủ, và Hữu mà chúng ta tạo nhân, cho nên trong tương lai chúng ta phải chịu quả Sinh và Lão Tử. Hai lớp nhân quả phối hợp các Duyên, nối kết Quá khứ, Hiện tại và Vị lai, cho nên gọi là Tam Thế Lưỡng Trùng. Ngày xưa tôi cũng học và cũng đi dạy lại người khác như vậy. Nhưng lớn lên, nhờ tu tập cho nên tôi vượt thoát được. Ta phải nương vào các Tổ để lớn lên, nhưng sau đó ta phải học đặt các vị xuống khỏi vai mình, để có thể đứng thẳng. Tam Thế Lưỡng Trùng Nhân Quả là một công thức để giải thích cho người mới học dễ nhớ. Đó không phải là cách hiểu sâu nhất, đó chưa phải là thắng nghĩa.

Chúng ta thấy có những lý thuyết sử dụng Đạo Lý Mười Hai Nhân Duyên để giải thích và thuyết phục người ta về Luân Hồi. Chúng ta không cần phải làm như vậy nữa. Mục đích của chúng ta là tu tập. Chúng ta phải học về Nhân Duyên như phương pháp tu tập và chuyển hóa thì mới đúng với lời Bụt dạy. Chúng ta có thể chữa lại những sai lầm đã tiếp diễn từ hàng ngàn năm. Có những vị đã đi hơi xa, có thể là đi quá xa. Họ đặt ra những từ như là Duyên Khởi Pháp và Duyên Dĩ Sinh Pháp. Duyên Khởi Pháp tức là những pháp có khả năng tạo tác; và Duyên Dĩ Sinh Pháp là những pháp được tạo tác ra. Các vị đó nói rằng Vô Minh và Hành là Duyên Khởi Pháp, tức là những yếu tố có tác dụng tạo tác ra. Hiếp Tôn Giả và Diệu Âm Tôn Giả xưa đều nói Vô Minh và Hành là những Duyên tạo tác, gọi là Duyên Khởi Pháp, còn Sinh và Lão Tử được gọi là Duyên Dĩ Sinh Pháp. Theo các ngài thì Vô Minh và Hành là hai chi phần có tính chủ động, còn Sinh và Lão Tử chỉ có tính thụ động. Quan niệm đó không đúng với giáo lý tương tức của đạo Bụt. Theo tinh thần đạo Bụt, chi phần nào cũng là nhân và cũng là quả, chứ không có cái nào thuần túy là nhân hay quả mà thôi. Các vị giảng Vô Minh và Hành là Duyên Khởi Pháp, Sinh và Lão Tử là Duyên Dĩ Sinh Pháp. Tám chi ở giữa, các vị nói vừa là Duyên Khởi Pháp vừa là Duyên Dĩ Sinh Pháp, vừa có tính cách tạo tác vừa có tính cách được tạo tác. Hai tính chất đó đúng ra phải được áp dụng cho cả Mười Hai nhân duyên.

Dùng thuyết Tam Thế Lưỡng Trùng để cắt nghĩa về cơ năng vận hành của Luân Hồi thì được, nhưng ta đừng nghĩ rằng giáo lý Mười Hai Nhân Duyên được Bụt nói là để chứng minh cho thuyết Luân Hồi. Mục đích của đạo Bụt không phải là đưa ra một hệ thống triết học giải thích về vũ trụ và nhân sinh. Mục đích của Bụt là cho ta một đạo lý để thực tập diệt khổ.

Chúng ta tạm bỏ phương pháp Tung theo chiều dọc, để đi trên mặt ngang theo phương pháp Hoành. Phương pháp này đã được Bụt nhấn mạnh trong các kinh. Không bao giờ Bụt có ý định dạy chúng ta học Mười Hai Nhân Duyên theo tinh thần đường thẳng (linear, còn gọi là tuyến tính), theo một kích thước (one-dimensional). Đừng nghĩ rằng Vô Minh sinh ra Hành, rồi đến lượt Hành sinh ra Thức, đến Thức sinh ra Danh Sắc, v.v.. Hiểu như vậy là đơn giản hóa và nguy hiểm. Bụt nói rằng Vô Minh duyên Hành, tức là Vô Minh có liên hệ nhân quả với Hành, nhưng Bụt cũng dậy Hành có liên hệ nhân quả với Vô Minh. Nếu Vô Minh nuôi Hành thì Hành cũng nuôi Vô Minh. Vô Minh quấy động tâm thức, tạo ra những ham muốn, phiền não, tư niệm, ý chí, v.v.. Những ham muốn, ý chí, tư niệm đó quay trở lại làm cho Vô Minh càng nặng. Vô Minh duyên Hành nhưng mà Hành cũng duyên Vô Minh, là như vậy. Phải bỏ ý niệm đơn giản và ngây thơ về sự tiếp nối nhân quả theo tuyến tính, chỉ nghĩ đến nhân quả trong thời gian mà không thấy được nhân quả đồng thời trong không-thời-gian. Như khi ta nói cây sinh ra lá và cây dẫn nhựa lên nuôi lá, ta không quên sự thật là lá nuôi cây bằng ánh sáng mặt trời qua hiện tượng diệp lục hóa. Lá không phải chỉ là con của cây, lá còn là mẹ của cây nữa. Cây lớn được là do công của lá.

Cũng vậy, ta thấy có liên hệ tương tức và tương nhập giữa các chi phần của Mười Hai Nhân Duyên. Chúng ta phải thấy được liên hệ mật thiết giữa mỗi chi phần với Mười Một chi phần kia. Cho nên chúng ta nên vẽ một vòng tròn hay một mạng lưới (network). Trên mạng lưới này ta nói Vô Minh duyên Hành nhưng Vô Minh cũng duyên Thức. Nếu Vô Minh không duyên Thức thì làm sao Thức lại có thể là Thức? Nếu không có Vô Minh duyên Thức thì Thức đã trở thành Trí rồi. Vô Minh duyên Thức qua Hành, nhưng Vô Minh cũng trực tiếp duyên Thức. Vô Minh duyên Hành, Vô Minh duyên Thức, đồng thời Vô Minh cũng duyên Danh Sắc. Trong Danh Sắc ta thấy có chất liệu Vô Minh. Nếu không có Vô Minh thì Danh Sắc của chúng ta sẽ khác. Cố nhiên trong Lục Nhập của chúng ta cũng có Vô Minh. Cái Tưởng của tôi về bông hoa được căn cứ trên con mắt của tôi, căn cứ trên cái sắc (đối tượng của mắt) là bông hoa. Và vì tính Vô Minh nên cái Tưởng đó mới bị kẹt vào hiện tướng. Cho nên Vô Minh có mặt trong Lục Nhập. Vô Minh lại có mặt trong Xúc, có mặt trong Thọ, có mặt trong Ái, trong Thủ, trong Hữu, trong Sinh và trong Lão Tử. Vô Minh tương tức với tất cả Mười Một chi phần khác. Vô Minh tương nhập vào tất cả Mười Một chi phần khác. Vô Minh không phải chỉ nằm ở quá khứ, Vô Minh có mặt bây giờ và ở đây, trong mỗi tế bào của tôi, trong mỗi tâm hành của tôi. Trong đời sống hằng ngày phải nhận diện Vô Minh, nhận diện sự có mặt của Vô Minh thì mới là sự thực tập chân chính. Nếu không có Vô Minh thì tại sao chúng ta đang bị vướng mắc? Bị vướng mắc tức là đã có Vô Minh. Nếu không có Vô Minh thì tại sao có hiện hữu khổ đau? Mối quan hệ mạng lưới rất quan trọng. Chúng ta phải thấy Tung và phải thấy Hoành, phải thấy đồng thời chiều dọc và chiều ngang. Thời gian và không gian phải được phối hợp để chúng ta có thể chiếu rọi vào mười hai chi phần. Mỗi chi phần duyên với chi phần đặt trước và chi phần kế tiếp, đồng thời cũng duyên với tất cả các chi phần khác. Như vậy mới đúng tinh thần Duyên Khởi, tinh thần tương tức tương nhập.

!! Mặt tích cực của mười hai nhân duyên

Trong kiếp nhân sinh, ta có Vô Minh, nhưng không phải chỉ có Vô Minh. Nếu đời sống hằng ngày chỉ là thuần túy Vô Minh thì Đạo Bụt đi vào bằng cửa nào? Làm sao có sự cứu độ? Làm sao có sự chuyển hóa? Cho nên ta có Vô Minh nhưng cũng có Minh. Nếu ta không có chút Minh nào cả thì tại sao Bụt lại nói tất cả chúng sinh đều có hạt giống của trí tuệ, của giác ngộ và giải thoát? Vì vậy không những trong Thức có hạt giống của Minh mà trong Danh Sắc cũng có hạt giống của Minh; trong Lục Nhập, trong Xúc, trong Thọ, trong Ái, trong Thủ, trong Hữu, trong Sinh và trong Lão Tử đều có hạt giống ấy, như trong Đêm có hạt giống Ngày. Quý vị hãy nghĩ tới nguyên lý tương tức. Trong rác có hoa nhưng trong hoa cũng có rác. Nếu chúng ta biết cách sử dụng rác thì rác sẽ biến thành hoa. Mà nếu chúng ta không biết cách thì hoa, thay vì mười lăm ngày sau mới thành rác có thể hoá thành rác rất sớm. Vì vậy chúng ta biết trong Vô Minh có Minh; trong Thức có hạt giống của Trí Tuệ. Đó mới đúng là tinh thần đạo Bụt.

Nếu vứt bỏ hết tất cả Mười Hai duyên này đi thì chúng ta không có đường nào để đạt tới thanh tịnh, an lạc, Niết Bàn. Chúng ta phải giữ lại tất cả. Điều này rất quan trọng ! Chúng ta có một ly nước đục, nếu đổ hết ly nước đục đi thì chúng ta không còn gì để làm ra một ly nước trong hết. Vì nước đục có thể biến thành nước trong, chúng ta phải sử dụng ly nước đục. Ta đang ở trên biển cả và đang khát. Có một chai nước đục mà liệng xuống biển là dại dột lắm! Phải làm thế nào cho chai nước đó trong lại để uống. Tất cả những Vô Minh, Hành, Thức, Danh Sắc… phải được chấp nhận và chuyển hóa thành (1) Minh. Bụt dạy ‘‘Vô Minh diệt, Minh sinh’’ chứ không phải Vô Minh diệt là không còn gì nữa.

Nếu Vô Minh duyên Hành thì Minh duyên cái gì? Các Tổ chưa nói hết. Chúng ta là con cháu phải tiếp tục. Vô Minh quấy động, tạo ra những đam mê, những giận hờn, những cuộc chạy đua, những quẩn quanh dại dột gọi là Tư Niệm Thực, loại thức ăn thứ ba. Có những người trầy da, tróc vẩy, gây tổn hại cho cả thân tâm vì chạy theo danh vọng, bằng cấp, nghĩ rằng được những cái đó là hạnh phúc. Tư Niệm Thực này đã do Vô Minh quấy động. Hết Vô Minh thì ta thấy được khổ đau và nguồn gốc của khổ đau, thấy con đường dẫn tới sự chuyển hóa khổ đau, dẫn tới an lạc. Tự nhiên cái Minh ấy tạo ra một ước muốn, một ý chí hành động do tâm từ bi thúc đẩy, để mang lại hạnh phúc và an lạc cho mình và cho người khác. Cái đó có thể gọi là Đại Nguyện hay Tâm Bồ Đề. Khi học hỏi đạo Bụt chúng ta được nghe về mặt tiêu cực của Mười Hai Nhân Duyên quá nhiều. Còn mặt sáng tươi của Mười Hai Nhân Duyên thì chúng ta chưa được nghe bao nhiêu. Nhờ bó đuốc của Minh chiếu dọi, ta không muốn chạy theo những cái Hành này nữa. Và nhờ có trí tuệ của Tứ Đế và Bát Chánh Đạo ta muốn phát tâm tu học để độ mình và độ đời. Đó gọi là Tâm Bồ Đề, Boddhicitta, là (2)Đại Nguyện. Cái Minh dẫn tới một ước vọng, một ý chí tu học và cứu độ. Nếu Vô Minh duyên Hành, và duyên Thức; thì Minh duyên Đại nguyện, duyên Bồ Đề Tâm và duyên (3)Trí. Trong giáo lý Tứ Y chúng ta học ‘‘y Trí bất y Thức’’ (nương vào Trí đừng nương vào Thức), chúng ta nên dựa vào phần Trí của chúng ta chứ đừng nương vào phần Thức.

Duy Biểu Học nói đến bốn thứ Trí. Thứ nhất là Trí Đại Viên Cảnh, nói theo văn pháp chữ Hán là Đại Viên Cảnh Trí. Thức thứ tám, Tàng thức, khi xóa được Vô Minh thì được gọi là Đại Viên Cảnh Trí. Nghĩa là khi tất cả các hạt giống của Bồ đề, của Giác Ngộ, của Vô ngã, của Từ bi phát triển thì Tàng thức thành ra Trí Đại Viên Cảnh. Trí Đại Viên Cảnh tìm ở đâu? Tìm ngay trong Tàng thức, vì trong A lại da thức này sẵn có hạt giống của giác ngộ, hạt giống của Trí Đại Viên Cảnh. Bỏ Tàng thức không được. Phải dùng Thức để chuyển hóa. Đại Viên Cảnh Trí tức là trí tuệ như một tấm gương sáng, phản chiếu được sự thật của tam thiên đại thiên thế giới.

Trí thứ hai là Trí Bình Đẳng Tánh. Trí này chuyển hóa từ thức thứ bảy, thức Mạt Na. Thức Mạt Na phân biệt ta và không ta, kỳ thị giữa của tôi và không phải của tôi. Nhưng nếu thực tập thông minh, ta có thể chuyển hóa Thức thứ bảy thành Trí mang tính Bình Đẳng, thấy mình và người khác là một, và mầu nhiệm như nhau. Như khi gặp kẻ thù mà ta lạy xuống một lạy, thì ta sẽ thấy thù cũng cùng một bản tính với bạn, người kia với mình là một và ý niệm hận thù không còn nữa. Đó là Bình Đẳng Tánh Trí, phát hiện ngay trong lòng của thức Mạt Na, cái thức chấp ngã.

Trí thứ ba là Trí Diệu Quan Sát, khả năng quan sát một cách mầu nhiệm, được chuyển hóa từ thức thứ sáu. Thức thứ sáu, tức Ý Thức, đầy dẫy những tri giác sai lầm. Nó tạo tác biết bao nhiêu khổ đau. Nhờ Trí Đại Viên Cảnh, nhờ sự chuyển hóa, Ý Thức trở thành Trí Diệu Quan Sát, có thể quán sát muôn vật mà không bị kẹt vào tri giác sai lầm.

Cuối cùng, Trí Thành Sở Tác là một Trí tuệ mà gốc là các Thức của mắt, tai, mũi, lưỡi, thân. Con mắt có vô minh làm cho ta say đắm, nhìn giả thành thật. Con mắt làm cho ta mù tối. Bây giờ con mắt có minh tạo tác được những thành tựu, mở cửa cho ta thấy pháp Thân mầu nhiệm.

<<<
Mở cửa nhìn pháp Thân, <br>
Đời mầu nhiệm khôn cùng <br>
Lòng dặn lòng tỉnh thức <br>
Dòng nước Tâm trong ngần.
<<<

Dòng nước Tâm trong ngần là lúc Ý Thức đã trở thành Diệu Quan Sát Trí, và Tàng thức đã trở thành Đại Viên Cảnh Trí.

Vậy nếu Vô Minh duyên Thức thì Minh duyên Trí. Gọi là bốn loại Trí cho dễ hiểu, nhưng tất cả bốn cũng chỉ là một.

!! Thân thị hiện

Nếu Thức duyên Danh Sắc thì Trí duyên gì? Phàm phu có Danh Sắc, tức có thân, có tâm. Bồ Tát cũng có thân, có tâm như vậy. Bụt cũng có thân, có tâm sau khi thành đạo. Ta đâu có cần hủy diệt thân và tâm đi thì mới là có giải thoát? Nói về các vị Bồ Tát chúng ta dùng danh từ Thân Thị Hiện. Chúng ta hãy quán tưởng Quan Thế Âm thị hiện ra hình thể bà mẹ xinh đẹp. Thân hình bà cũng có mắt, tai, mũi, lưỡi và ý. Nhưng thân tâm đó không có tính chất của Vô Minh, của Hành, của Thức. Thân tâm đó là để thực hiện ý nguyện độ sinh, giác ngộ. Bồ Tát Quan Thế Âm có thể hóa hiện thành một nhà chính trị, hay thành một em bé… Kinh nói rằng tình thương, có thể được thể hiện bằng muôn vạn cách. ‘‘Ưng dĩ trưởng giả thân đắc độ giả, tức hiện trưởng giả thân nhi vị thuyết pháp. Ưng dĩ đồng nam, đồng nữ thân đắc độ giả, tức hiện đồng nam, đồng nữ thân nhi vị thuyết pháp.’’ Nếu cần hiện ra một vị trưởng giả thì Bồ Tát Quan Thế Âm có thể hiện ra hình thức của một trưởng giả mà thuyết pháp. Nếu cần hiện ra một chú bé, hay là một cô bé để độ đời thì Quan Thế Âm sẽ hiện thành một chú bé, hay là một cô bé để độ đời.

Cho nên Bồ Tát và Bụt đều có thể hiện thân để độ đời, và các vị cũng cần có Danh, có Sắc, có thân, và có tâm. Thành ra chúng ta đâu cần bỏ thân và tâm đi mới giải thoát. Bất cứ một Danh Sắc nào có tác dụng tạo tác được từ bi, hiểu biết, được hạnh phúc, đều là (4) Thân Thị Hiện của Bụt. Dầu thân thể đó yếu ốm, và nghèo khổ nhưng vẫn có tác dụng tạo được tình thương và sự hiểu biết thì đó cũng là thân Bồ Tát, gọi là (5) Thân Thọ Dụng (sambhogakaya). Bất cứ một cái thân, một tập hợp nào của ngũ uẩn, có Danh Sắc nhưng trong đó không còn chất liệu Vô Minh, mà lại có chất liệu của Minh, của Bồ đề tâm, của Tứ Trí, thì đều là Thân Thọ Dụng, là phương tiện để hành đạo.

Ngày xưa tôi có đọc một cuốn tiểu thuyết, không nhớ tên tác giả. Ông kể chuyện một người đi vào rừng. Người này sống trong truyền thống Thiên Chúa giáo nhưng không tin tưởng Chúa. Ông đi vào rừng ở Phi Châu săn bắn, lạc đường, không tìm được lối ra. Sợ quá, lúc đó ông ta mới muốn cầu cứu Chúa. Vì ông không có đủ đức tin, nên ông cầu cứu bằng một giọng bất kính. Ông nói: ‘‘Lạy Chúa! Nếu mà Chúa có thật thì hiện ra để cứu tôi coi nào!’’ Lúc đó ông nghe tiếng sột soạt. Từ sau bụi cây xuất hiện một người da đen. Người da đen đó đưa ông ra khỏi rừng, và ông được cứu thoát! Nhưng ông này về nhà và ghi trong nhật ký: ‘‘Tôi cầu Chúa. Chúa đâu không thấy mà chỉ hiện ra một thằng mọi đen.’’ Câu đó viết bằng tiếng Pháp, dùng chữ nègre có tính kỳ thị mầu da, phải dịch là thằng mọi cho sát nghĩa ‘‘J’ai prié Dieu, mais il m’est arrivé un nègre.’’ Tâm ông này chứa chất Vô Minh. Người Phi Châu đó là Thọ Dụng Thân, là Báo Thân của Lòng Từ Bi để đưa ông ta ra khỏi tình trạng khó khăn; đó là Chúa chứ ai khác? Từ bi thị hiện ra dưới nhiều hình thức. Trong rừng rậm Phi Châu, Chúa đã hiện ra thành một người da đen. Ông kia không thấy Chúa vì không thấy được tình thương. Lại nói bằng giọng mỉa mai như thế thì chắc không bao giờ ông ta có cơ hội để tiếp xúc với Chúa, hay với Bụt.

Ngày hôm qua trong khi đi thiền hành, tôi tự nhiên nảy ý muốn kể chuyện Bụt Thích Ca đi với Thầy Svastika về Việt Nam thăm để xem Đạo Bụt ở đó bây giờ ra sao. Hai thầy trò Bụt tới Hà Nội, vào thặm các chùa. Tất nhiên là các thầy ở chùa đâu biết đây là Bụt. Không biết các thầy sẽ đón tiếp Bụt như thế nào? Tại vì trong đầu các thầy đã có sẵn hình ảnh về Bụt. Ông này không có hào quang bằng đèn néon phía sau đầu thì đâu phải là Bụt? Ông này đi chân đất, mặc áo cũ, không hoạt bát gì cả. Có thể là các thầy ở chùa không nhận ra đó là Bụt. Họ sẽ hỏi: ‘‘Giấy di chuyển đâu? Chứng minh thư đâu?’’ Tôi tưởng tượng lúc đó Bụt mới bảo thầy Svastika ra ngoài Tam Quan, để hai thầy trò bàn bạc. Tôi sẽ viết một cuốn truyện như vậy, kể chuyện Bụt với một vị thị giả đi từ Bắc vào Nam, tới các chùa, gặp các thầy, các đạo hữu, xem cách các thầy ăn cơm, uống nước, đi, đứng, nằm, ngồi như thế nào. Bụt sẽ biết gia tài của Bụt để lại 2500 năm nay còn được bao nhiêu. Chuyện này là chuyện có thật. Bụt có thể thị hiện dưới hình dáng của một người du khách, tìm tới để xem chúng ta tu tập như thế nào. Có thể Bụt đã từng tới Làng Mai, Bụt đã từng gặp các sư chú, sư cô, các đạo hữu ở Làng. Bụt đã biết là chúng ta tu hành hay hay dở tới mức nào rồi.

Bụt đâu phải ở trên mây. Bụt ở ngay trong tâm của chúng ta. Dù ta có thân của Bụt, và tâm Bụt, ta cũng vẫn còn có Xúc. Bụt cũng uống nước và Bụt cũng biết nước nóng hay nước lạnh. Bồ tát cũng cần mặc áo cho ấm. Mùa lạnh, Bồ tát cũng quàng khặn cổ, tại vì Bồ tát biết nếu không choàng khặn cổ thì bị cảm, rồi phải cạo gió. Vì Xúc được phát hiện trong chánh niđđem và tuệ giác nên Xúc này là (6) Xúc Thanh Tịnh. Và khi có sự tiếp xúc giữa sáu căn và sáu trần thì cũng có Thọ. Thọ đây là (7) Thọ Thanh Tịnh. Như là tất cả mọi người. Nhưng trong những tình trạng đó, bồ tát không vướng mắc. Có Trí rồi, với cái Thọ Dụng Thân này, bất cứ một tiếp xúc nào cũng có chánh niệm, cũng có thanh tịnh. Cho nên bất cứ cái Thọ nào cũng có thanh tịnh, có chánh niệm. Sẽ không có Ái mà có Ba trong bốn Vô Lượng Tâm: (8) Từ, Bi, và Hỷ.

Khi có tiếp xúc chúng ta thấy được những cảm thọ: lạc thọ, khổ thọ, và xả thọ. Thấy người khổ đau ta phát sinh trong tâm năng lượng của Từ, muốn giúp họ có niềm vui chân thật, và năng lượng của Bi, muốn làm cho họ tiêu tan nỗi khổ. Ta muốn làm cho họ có niềm vui, có hạnh phúc. Đó là tâm Hỷ. Và Tâm Xả nghĩa là tâm không vướng mắc. Xả đây tức là không bị trói buộc bởi những hình ảnh, và những âm thanh do Xúc và Thọ tạo ra. Xả không phải là sự dửng dưng, mà là khả năng giữ tâm được tự do, không bị cuốn theo bên này hay bên khác. Khi có xả thì người thương và kẻ ghét được coi như nhau. Xả là Bất Nhị. Chân tinh thần của Xả là (9) Vô Nguyện. Xả tức khả năng thấy được tính tương tức, cái này là cái kia. Thí dụ Vô Minh và Minh. Chúng ta phải thực tập Xả, tức là đừng chạy trốn Vô Minh để đi tìm Minh. Vì Minh phải tìm trong Vô Minh.

Nhắc lại chuyện đời Lý, thế kỷ thứ XII, có một thiền sinh nghe vị thiền sư nói là phải làm thế nào để thoát ly sinh tử thì mới xứng đáng với chí nguyện xuất gia. Vị thiền sinh hỏi: ‘‘Bạch Thầy, tìm cái không sinh tử ở chỗ nào?’’ Thầy nói: ‘‘Tìm ngay ở trong chỗ sinh tử.’’ Bỏ sinh tử đi tìm Niết bàn là không có.

Xả là tinh thần Bất Nhị, là tự do, là thảnh thơi. Cũng là Vô Nguyện, không chạy theo gì hết. Chính trong tinh thần tự do, không chạy chọt cầu tìm mà cõi khổ đau sẽ trở thành Tịnh Độ. Ta thoát được Hữu là vì ta đã biến Hữu của Hữu Vô, của Thương Ghét thành Diệu Hữu. (10) Diệu Hữu và Chân Không thoát ra khỏi ý niệm Hữu và Vô. Nếu cần phải thị hiện đản sanh thì thị hiện đản sanh. Thị hiện đản sanh cũng là thị hiện lão tử. Lão tử thì lão tử, nhưng không khổ đau, đó là cái nhìn của Bụt và các vị Bồ tát. Nếu quả thực đã có chất liệu của giác ngộ, thì sinh cũng vậy, mà tử cũng vậy, đều là thị hiện, không có cái gì thay đổi cả. Đợt sóng có lên hay có xuống thì nó vẫn là nước. Đứng về phương diện hiện tượng thì giống như là có Sinh, có Diệt, có Có, có Không. Đứng về phương diện bản thể thì không có Sinh Diệt, không có Có Không; tất cả đều là thị hiện. Đó là (11) Vô Sinh. Sinh là thị hiện Sinh, Diệt là thị hiện Diệt. Và đây là Niết Bàn trong hiện tại (12) Hiện Pháp Niết Bàn.

!! Mười Hai Nhân Duyên

(tiêu cực / tích cực)

# Vô Minh / Minh
# Hành  / Bồ Đề Tâm (Đại Nguyện)
# Thức / Trí
# Danh Sắc / Thân Thị Hiện
# Lục Nhập / Thân Thọ Dụng
# Xúc / Xúc Thanh Tịnh
# Thọ / Thọ Thanh Tịnh
# ái / Từ Bi Hỷ
# Thủ / Tự Tại, Vô Nguyện (Xả)
# Hữu / Diệu Hữu Chân Không
# Sinh /Vô Sinh
# Lão Tử / Hiện pháp Niết Bàn

Mười Hai Nhân Duyên như ta biết, thường được giảng dạy trên mặt tiêu cực. Chúng ta phải học, và thực tập Mười Hai Nhân Duyên về phương diện tích cực. Những danh từ chúng ta dùng hôm nay là để diễn bày Mười Hai Nhân Duyên đứng về phương diện tích cực. Chúng ta thấy rằng thuyết nhân duyên là để nói về thế giới hiện tượng. Thấy được Mười Hai Nhân duyên về mặt tích cực thì, ta đồng thời thấy được Bản Môn của chúng. Chúng ta sẽ tiếp xúc được với Bản Môn.

Nói tóm lại, khi học về Mười Hai Duyên phần, ta đừng nên diễn bày như một chủ thuyết để giải thích luân hồi sinh tử. Ta hãy tập quán chiếu để thấy liên hệ giữa Mười Hai chi phần này. Để trong đời sống hằng ngày ta có thể tu tập cho chất liệu của Vô Minh bớt đi và chất liệu của Minh tăng trưởng. Chất liệu của Vô Minh bớt đi thì Tham, Sân, Si, Mạn, Nghi, và Tà Kiến sẽ bớt đi và chất liệu của Từ, Bi, Hỷ, và Xả sẽ tăng trưởng. Tăng trưởng không những ở một chi phần mà đồng thời trong cả Mười Hai chi phần. Hễ một chút Vô Minh được trị diệt thì tất cả Mười Một chi phần kia đều được thừa hưởng. Khi ta mỉm được một nụ cười hiểu biết thì trong cả Mười Hai chi phần đều có sự thay đổi, tại vì chất liệu của Minh đã đi vào để thay thế cho chất liệu của Vô Minh. Một tâm niệm từ Đi biểu hiện thì tất cả Mười Hai chi phần đều sáng lên lập tức.

Cho nên giữ chánh niệm và hộ trì sáu căn là chìa khóa của sự thực tập. Nếu thực tập hộ trì sáu căn thì trong Xúc, ta sẽ có chánh niệm về Xúc, ta sẽ có Xúc Thanh Tịnh. Nếu sáu căn không hộ trì thì Xúc sẽ không thanh tịnh. Khi có Xúc, và có Thọ thanh tịnh thì ta có chất liệu của Từ, Bi, và Hỷ. Chúng ta sẽ được an trú trong Vô Nguyện, nghĩa là trong xả. Như vậy thế giới của chúng ta càng lúc càng sáng lên tính cách của Diệu Hữu và Chân Không. Tính cách khổ đau của ba cõi (Tam Hữu) sẽ từ từ tiêu diệt để nhường chỗ cho thế giới tương tức, tương nhập của Hoa Nghiêm. Trong thế giới Diệu Hữu và Chân Không đó, nếu cần đản sanh thì chúng ta đản sanh, nếu cần thị hiện lão tử chúng ta thị hiện lão tử.

Chúng ta hãy học hỏi cho thấu đáo các phép hộ trì và chánh niệm. Đây là những chiếc chìa khóa. Đây chính là phương tiện tháo gỡ. Chúng ta cũng có thân, cũng có sáu căn và sáu trần, chứa chấp Vô Minh, Hành, và Thức. Nhưng khi đưa chánh niệm vào, và thực tập hộ trì sáu căn trong Xúc và trong Thọ, chúng ta tránh được Ái, Thủ, và Hữu, chuyển niệm thanh tịnh, thực tập Từ, Bi, Hỷ, Xả, Vô Nguyện. Tinh hoa của giáo lý Mười Hai Nhân Duyên nằm ở đó. Phải học, phải hành và phải trình bày giáo lý đó như thế nào để cho sự học hỏi và, hành trì chuyển hóa được đời sống hằng ngày của chúng ta.
! Bài 16 Chánh định

Hôm nay là ngày 16 tháng giêng năm 1994, chúng ta ở tại Xóm Hạ, học tiếp về tứ diệu đế.

Hôm trước chúng ta đã bắt đầu học về chánh tinh tấn và biết rằng năng lượng tinh tấn được phát sinh là do chất liệu của niềm vui và niềm tin. Nếu thiếu niềm vui và niềm tin, nếu ta không có hặng hái và niềm an lạc thì dù ta có cố sức đó cũng không phải là tinh tấn. Tinh tấn không có nghĩa là cố gắng một cách mệt nhọc. Khi việc ta làm đem lại kết quả tốt, đem lại niềm vui và niềm tin thì chánh tinh tấn sẽ đến một cách rất tự nhiên. Nếu trong khi thiền hành và thiền tọa mà ta cảm thấy an lạc, thì tự nhiên ta sẽ thích thiền hành và thiền tọa. Nghe chuông báo giờ thiền hành hoặc thiền tọa thì tự nhiên trong lòng thấy phấn chấn và hân hoan. Lúc đó là ta có chánh tinh tấn. Tôi còn nhớ hồi xuất gia ở chùa Từ Hiếu, tôi đã đi tu với cả một bầu nhiệt huyết. Tôi đã phải tranh đấu lắm mới được gia đình cho đi tu. Gia đình cứ nghĩ đi tu là khổ, một quan niệm sai lầm của người lớn đã trở thành thói quen. Trong khi đó thì mình cứ nghĩ rằng chỉ có đi tu mình mới có hạnh phúc thật sự. Thành ra khi được đi tu mình cũng giống như một con chim được tung cánh bay lên giữa trời. Và đến giờ đi tụng kinh là tôi mừng lắm, đi tụng kinh mà thấy giống như đi nhạc hội vậy. Tôi rất thích tụng kinh, rất thích nghe tụng kinh và rất muốn được tụng kinh với đại chúng. Những đêm trăng từ dưới hồ bán nguyệt nghe tiếng các thầy tụng kinh ở trên chùa mình có cảm tưởng là nghe thiên nhạc. Những buổi sáng có trách vụ phải làm, không được đi tụng kinh, từ xa nghe tiếng tụng Lặng Nghiêm vọng xuống, trong lòng thích thú vô cùng. Những giờ được vào lớp nghe giảng cũng vậy, giờ ngồi thiền hay khóa tịnh độ cũng vậy. Tôi đã đi tu trong không khí đó. Khi trong tăng thân mình đã có tình bạn rồi thì tất cả đều hặng hái trong chuyện tu học.

Nếu trong lúc tham dự mỗi sinh hoạt ta đều hăng hái, tin tưởng và có niềm vui thì đó là ta đang có chánh tinh tấn. Còn khi ta vẫn thấy mệt nhọc, thấy cần phải cố gắng tham dự, thì ta phải xét lại phép thực tập của mình xem có đúng cách hay không. Chúng ta ngồi thiền theo cách thức nào đó, đi thiền hành theo cách thức nào đó cho nên chúng ta mới chán. Điều này cũng tự nhiên. Vì thực tập mà không có thầy chỉ dạy, không có bạn hướng dẫn, lại không tìm thấy những chất liệu nuôi dưỡng thân tâm trong lúc thực tập, thì sự thực tập trở thành một sự ép buộc.

Nhiều thiếu nhi về Làng Hồng, thấy các bạn ngồi thiền, đi thiền và ăn cơm im lặng thì cũng làm theo. Vì người ta làm nên mình cũng phải làm theo thôi, chứ mình không thích thú gì cả. Đi theo, tuy không thích, nhưng có bạn còn dễ chịu hơn là ra ngoài chơi một mình. Tình trạng đó có thể kéo dài cả năm, hai hoặc ba năm. Cho đến ngày nào đó em lớn lên, thấy thiền hành, thiền tọa và ăn cơm im lặng đều mang lại cho em niềm an lạc, và hạnh phúc. Lúc đó em mới bắt đầu tu thật. Nhiều thiếu nhi đã nói thật cho sư ông biết là trong những năm đầu các em chỉ làm cho có hình thức thôi, thấy các bạn làm thì làm theo, chứ không thấy có thích thú nào. Cháu Thục Hiền đến Làng Mai năm tám tuổi, rất ngoan ngoãn tham dự các sinh hoạt, nhưng chỉ làm theo hình thức. Bây giờ Thục Hiền đã lớn, cô ta mới cảm thấy sự thực tập là thiết yếu. Khi lo âu, buồn khổ hoặc bực bội cô ta mới biết rằng những phương pháp thực tập đó tháo gỡ được những nỗi lo buồn và đem lại thảnh thơi cho mình. Lúc đó cô ta mới biết quý sự thực tập. Kinh nghiệm đau khổ của chúng ta nhiều khi giúp chúng ta tới gần sự thật hơn. Những lúc đó ta mới thấy sự quan trọng của những bài tập nho nhỏ như quay về nương tựa hải đảo tự thân. Nếu ta thấy chán nản, không có năng lượng tinh tấn, đó là vì hoặc chưa nắm được phương pháp thực tập đúng, hoặc chưa có nhu yếu tu tập. Lý do khác là chúng ta không thực sự thích thú trong việc tu tập, hay mới chỉ thực tập hời hợt, chưa có cơ hội tự chuyển hóa thực sự.

Đây là bài thi kệ đầu tiên trong cuốn Từng Bước Nở Hoa Sen :

<<<
Thức dậy miệng mỉm cười <br>
Hăm bốn giờ tinh khôi <br>
Xin nguyện sống trọn vẹn <br>
Mắt thương nhìn cuộc đời.
<<<

Bài này để đọc khi mới thức dậy, đang còn nằm trên giường. Ngày xưa trong các tự viện có một bài khác bằng chữ Hán:

<<<
Thùy miên thỉ ngộ,  <br>
Đương nguyện chúng sanh, <br> 
Nhất thiết trí giác,  <br>
Châu cố thập phương.
<<<

Nghĩa là :

<<<
Ngủ nghỉ mới dậy  <br>
Nên nguyện chúng sanh  <br>
Tất cả trí giác  <br>
Đoái khắp mười phương
<<<

Bài mới bằng tiếng Việt giàu chất liệu Phật pháp, tươi mát và thực tế hơn. Thức dậy miệng mỉm cười, vì ta thấy hăm bốn giờ mới tinh khôi là một món quà rất lớn trong đời sống. Thường thường ta không thấy một ngày của đời mình là châu báu, và cứ để cho hăm bốn giờ đi qua uổng phí. Thức dậy miệng mỉm cười, hăm bốn giờ tinh khôi. Nụ cười đó đã là nụ cười của giác ngộ. Thấy hăm bốn giờ đồng hồ là một tăng thân lớn ta trân quý từng giây phút một. Hăm bốn giờ đó hư uổng hay hăm bốn giờ mầu nhiệm, điều này tùy thuộc vào chính ta. Nếu để những lo âu, phiền giận và ganh ghét làm hư hỏng hăm bốn giờ đồng hồ, đó là mình tự tàn phá cuộc đời mình, chứ không phải là ai khác. Xin nguyện sống trọn vẹn, là lời nguyện không làm hư uổng hăm bốn giờ đồng hồ này. Mắt thương nhìn cuộc đời là năm chữ trong Kinh Pháp Hoa: từ nhãn thị chúng sinh. Nếu lấy con mắt của tình thương nhìn cuộc đời thì tự nhiên lòng thư thái, có hạnh phúc, và trong cái nhìn sẽ không còn có sự khắt khe và giận hờn nữa.

Buổi sáng thực tập bài kệ đó ta làm cho thế giới tươi sáng lên. Rồi trong mỗi giây phút, khi rửa chén, quét nhà, đi thiền hành, ngồi thiền tọa, ta đều hớn hở như mới bắt được vàng ròng của sự sống. Những người xuất gia được cơ hội gần gũi thầy, gần gũi bạn, thì luôn luôn có điều kiện hạnh phúc hơn những người không xuất gia. Người không xuất gia bị các gánh nặng của gia đình và xã hội đè nặng trên vai, không có nhiều cơ hội bằng. Cho nên người xuất gia phải thể hiện hạnh phúc để tạo hứng khởi cho người tại gia. Nếu người xuất gia không thấy hạnh phúc thì không gây được cảm hứng và niềm tin cho người tại gia. Trong bài văn Cảnh Sách của thiền sư Quy Sơn Đại Viên, có câu: thời quang yếm một, tuế nguyệt ta đà, nghĩa là thời gian đi qua rất mau, ngày tháng như tên bắn, và nếu sống hời hợt thì ta sẽ đánh mất cuộc đời của chính mình, rất uổng.

Tóm lại, tu tập là tạo an vui, mà tu tập càng an vui thì càng thấy phấn khởi, đó là chánh tinh tấn.

!! Chánh định

Sau chánh tinh tấn, chúng ta nói tới chánh định. Năng lượng chánh định đã có mặt sẵn trong chánh niệm, chánh tinh tấn, chánh nghiệp và chánh ngữ. Chúng ta biết rằng chánh kiến là hoa trái của chánh định, vì nếu không có định thì sẽ không có tuệ. Tuệ ở đây không phải một chuyện xa vời. Trong khi ăn cơm chẳng hạn, chúng ta cũng có thể có định và có tuệ Một trăm người ngồi trong thiền đường cùng ăn cơm với nhau. Có người ăn cơm với định và có người không. Tất cả đều ngồi đó, nhưng có thể có người đang ngồi như một cái xác không hồn, họ không thật sự có mặt trong bữa cơm. Họ vắng mặt, vì những tâm hành trong họ đang kéo họ về nẻo khác. Chúng kéo ta về quá khứ, tới tương lai, kéo sang châu Mỹ, kéo sang châu Úc…

Lúc mở đầu bữa ăn, nghe tiếng chuông ta trở về với hơi thở. Ngồi trên tọa cụ nếu ta biết rằng ta đang ngồi với đại chúng, thì lập tức ta có chánh niệm và chánh định liền. Nghe người bạn tu đọc lời quán nguyện đầu của năm quán: thức ăn này là tặng phẩm của đất trời và công phu lao tác, nếu chánh niệm và chánh định của ta vững thì ta có thể có liền chánh kiến nghĩa là có tuệ giác. ‘‘Thức ăn này là tặng phẩm của đất trời và công phu lao tác.’’ Ta thấy rõ tính tương quan, tương duyên giữa mình với tăng thân, mình và thế giới. Ta thấy ta sống bằng thức ăn, mà thức ăn ấy là do mặt đất, bầu trời, do công phu lao tác của nhiều người. Tự nhiên những tình cảm thân thiết, biết ơn, hân hoan khởi lên. Đó là tuệ giác phát sinh từ niệm và định. Xin nguyện sống xứng đáng để thọ nhận thức ăn này. Muốn xứng đáng ta chỉ cần ăn thức ăn này trong chánh niệm. Ăn trong thất niệm, nghĩa là trong quên lãng, là vô ơn với đất trời, với công phu lao tác. Xin nhớ ngăn ngừa những tật xấu trước hết là tật tham ăn. Bụt dạy nhiều lần về tính chừng mực khi ăn uống. Tham là một trong những tâm sở bất thiện, cùng với, sân, si, mạn, nghi và kiến. Trong khi ta ăn cơm, ta dặn lòng đừng để những tâm niệm lầm lỗi đó trấn ngự, thì ta đã xứng đáng để được ăn bát cơm này. Chỉ xin ăn những thức ăn có tác dụng nuôi dưỡng và ngăn ngừa tật bệnh. Trong khi quán niệm về điều thứ tư này, ta biết Bụt dạy ta cẩn thận về ăn uống và tiêu thụ. Ngài dạy về bốn loại thức ăn. Có những thức ăn đem lại độc tố, đem lại sinh, tử, luân hồi. Và có những thức ăn mang lại khỏe mạnh, niềm vui và giải thoát.

Năm điều quán nguyện (ngũ quán) đọc trước khi ăn có mục đích giúp ta an trú trong chánh niệm, chánh định và chánh kiến. Vì muốn thành tựu đạo nghiệp nên thọ nhận thức ăn này. Đó là hạnh của người tu. Khi ăn một miếng cơm của đàn việt, của tín thí, của đất trời, ta biết rằng với thức ăn đó ta có thể làm nên tuệ giác, an lạc và hạnh phúc. Như thế mới xứng đáng. Có người hỏi : ‘‘Xin nguyện sống xứng đáng để thọ nhận thức ăn này, vậy phải làm thế nào để thực sự xứng đáng?’’ Tôi nói: ‘‘Chỉ cần ăn trong chánh niệm thôi là đã xứng đáng rồi.’’ Vì chánh niệm đưa tới chánh định, tức là hoa trái của sự tu học. Chỉ một điều đó thôi, nếu ta không làm được thì còn làm được điều gì? Có chánh niệm tức là có định. Chúng ta đã biết rằng chánh niệm trước hết là có mặt thực sự trong giờ phút hiện tại. Trong tác phẩm Lục Súc Tranh Công có câu: ‘‘ngẩn ngơ như ốc mượn hồn’’, tả tình trạng đang ở đây và trong giờ phút này mà không thực sự có mặt. Chánh Niệm trước hết là năng lượng làm cho ta có mặt lúc này và ở đây. Và khi có niệm rồi thì ta có định: Ta biết mình đang ở đâu, đang làm gì và ta sống được sâu sắc giờ phút đó.

Có hai trường hợp về Định. Thứ nhất là khi ta có mặt bây giờ và ở đây, tiếp xử với giờ phút hiện tại một cách sáng suốt, duy trì được chánh niệm thì gọi là định. Ta không cần phải ngồi trong tư thế kiết già mới có định. Đi, đứng, nằm, ngồi, lau chùi, dọn dẹp, tiếp xử với người khác trong chánh niệm thì đã là định. Trường hợp thứ hai là Định mà ta cố tâm duy trì trên một đối tượng duy nhất thôi. Đi thiền hành, ta có thể hoàn toàn tập trung vào sự tiếp xúc giữa bàn chân với mặt đất, tập trung vào đối tượng trái đất, thở vào là để tiếp xúc với trái đất, thở ra cũng là để tiếp xúc với trái đất. Định có thể được thực tập trong tư thế kiết già, tâm chỉ chuyên chú về một đối tượng trong một thời gian khá dài. Có niệm có định và có tuệ, càng ngày ta càng sống thảnh thơi, an lạc, không vướng mắc.

!! Thảnh thơi

<<<
Phong lai sơ trúc, phong khứ nhi trúc bất lưu thanh.  <br>
Nhạn quá hàn đàm, nhạn khứ nhi đàm vô lưu ảnh.  <br>
Thị cố quân tử sự lai nhi tâm thỉ hiện  <br>
Sự khứ nhi tâm tùy không.
<<<

Dịch:

<<<
Gió qua lay trúc  <br>
Gió đi rồi nhưng không lưu luyến âm thanh  <br>
Nhạn lướt mặt hồ Nhạn đi mà hồ không nắm bắt hình ảnh  <br>
Người quân tử cũng vậy  <br>
Việc xảy ra tâm mới tiếp xử  <br>
Việc qua rồi, tâm lại thảnh thơi.
<<<

Cơn gió tới thổi qua lay chuyển khóm trúc, gió đi mà trúc không giữ lại âm thanh. Khi gió xào xạc âm thanh thì trúc tiếp sử với âm thanh. Nhưng khi gió đi rồi thì trúc không cần tiếc nuối âm thanh kia nữa. Con chim nhạn bay ngang qua hồ lạnh mùa thu, nhạn qua rồi thì hồ không cần lưu luyến hình ảnh của chim nữa. Tiếp theo hai hình ảnh trên, thi sĩ kết luận: cho nên người quân tử, tức là hành giả, khi sự việc tới thì tâm đón nhận, không chờ đợi, không mong muốn trước; sự việc đi thì tâm lại rảnh rang, trống không. Sự lai nhi tâm thỉ hiện, tức là chỉ khi sự việc đến thì mới để tâm nhìn nhận, với tất cả tâm ý. Sự khứ nhi tâm tùy không, tức là sự việc đi qua rồi thì cái tâm ta theo đó mà trở thành vắng không. Bài thơ thật hay. Hồi còn làm chú tiểu, tôi đã được đọc bài thơ này treo trên vách thiền viện, nét chữ của thầy Hoằng Thơ. Sống đời sống hàng ngày, ta tiếp xử sâu sắc với những gì đang xảy ra với chánh niệm. Nhưng khi những chuyện đó qua đi thì ta không lưu luyến, không bị ràng buộc nữa, dầu đó là một cái gì ngọt ngào, dầu đó là nỗi ngđam ngùi hay cay đắng.

Người tu hay người đời cũng đều cần phải có định. Sống ở ngoài đời cần có định, sống ở trong tự viện phải thực tập định nhiều hơn. Người lái xe phải có định. Mạng sống của bao nhiêu người tùy thuộc vào niệm và định của anh ta. Cho nên muốn tu hay anh không tu, anh cũng phải có niệm và có định.

Niệm và Định làm cho đời sống sâu sắc hơn và đẹp đẽ hơn. Các bà mẹ thường khuyên con gái : ‘‘Con là con gái thì làm cái gì cũng phải có ý có tứ.’’ (Làm như con trai không cần phải có ý có tứ!) Khi người con gái đi, đứng, nói và cười có ý có tứ thì tự nhiên người con gái đó đẹp lên bội phần. Cái đẹp đó không phải là do phấn son, áo quần lượt là bên ngoài; cái đẹp đó ở trong tư cách, là do chánh niệm. Đi, đứng, nói, cười trong chánh niệm là một món trang sức từ bên trong đi ra. Con trai cũng vậy. Con trai mà đi, đứng, nói, cười trong chánh niệm thì cũng chắc chắn đẹp hơn. Bà mẹ Việt Nam tuy không nói ngôn từ Phật học nhưng bà cũng biết chánh niệm là một mỹ phẩm đích thực của con người. Con bà không có chánh niệm, không có ý tứ thì nó sẽ đi đứng hấp tấp, ăn nói bộp chộp, vô duyên. Không ý tứ thì không phải là một thiếu nữ đằm thắm, đoan trang, có thể mang hạnh phúc cho người xung quanh.

Niệm và định càng cao thì nếp sống của ta càng có phẩm chất. Khi làm một bài toán khó, anh cần phải có định và có niệm. Anh phải chú tâm vào mới làm toán được. Vừa làm toán vừa nghe phát thanh vừa xem truyền hình thì anh không thể có định, anh không thể giải đề toán khó được. Cho nên ngay một cđau học sinh cũng cần phải có niệm và có định. Nhưng định cũng có lúc chỉ nhắm tới việc làm quên lãng khổ đau, để ta trốn tránh những vấn đề thật của mình. Đó là tà định. Trong khi ngồi thiền, cái định của ta làm nên phẩm chất của thiền, nếu không thì chỉ ‘‘ngồi đó như hòn bi,’’ cứng ngắc.

!! Bụt đang có mặt

Sự có mặt đích thực của ta do niệm và định tạo nên. Khi ta thực sự có mặt thì sự sống có mặt, tự nhiên tuệ giác bừng nở. Ngồi thiền mà không có niệm, và định thì không phải là ngồi thiền. Đi thiền mà không có niệm và định thì không phải là đi thiền. Ăn cơm im lặng với đại chúng mà không có niệm và định thì ăn cơm trong hai ngàn năm cũng uổng thôi, không đi tới đâu hết. Khi ta leo núi Linh Thứu, niệm và định của ta làm cho Núi Thứu thành ra Núi Thứu đích thực. Có những người đi hành hương mà rất ham hố, muốn đi cho thật nhiều thật đủ. Cho nên tới đâu họ cũng chạy và họ mệt nhoài. Họ chỉ chụp cái hình để chứng tỏ mình đã từng có mặt tại chỗ đó. Sự thực thì họ có thể chưa bao giờ từng có mặt tại chỗ đó. Tuy đứng trên núi Thứu mà họ không có mặt trên núi Thứu, tuy là đã tới Khổ Hành Lâm, đã lạy sì sụp mười mấy lạy, mà kỳ thực họ chưa bao giờ có mặt ở Khổ Hành Lâm.

Khi có định và tuệ rồi thì ở đâu cũng là núi Thứu, ở đâu cũng là Khổ Hành Lâm. Thiền hành một giờ đồng hồ tại Làng Mai cũng có giá trị tuyệt vời của một huyền sử, mà bất cứ lúc nào chúng ta cũng có thể thực hiện được. Núi Linh Thứu là đây, mặt trời mà Bụt Thích Ca nhìn thấy năm xưa, ngày hôm nay chúng ta cũng vẫn còn nhìn thấy được.

Thiền sư Vô Ngôn Thông, người đã thành lập một phái thiền ở Việt Nam vào thế kỷ thứ chín, trước khi tịch đã để lại một bài kệ trong đó có mấy câu:

<<<
Tây thiên thử độ,  <br>
Thử độ Tây thiên,  <br>
Cổ kim nhật nguyệt,  <br>
Cổ kim sơn xuyên.
<<<

Dịch

<<<
Đây là tây trúc  <br>
Tây trúc là đây  <br>
Trời trăng năm xưa  <br>
Trời trăng năm nay
<<<

Tây thiên thử độ, thử độ Tây thiên nghĩa là Thiên Trúc là chính nơi đây, nơi đây chính là Thiên Trúc, đừng nghĩ rằng anh phải đi tận đâu đâu mới qua được tới Thiên Trúc. Ngôn ngữ của thầy giống như ngôn ngữ tâm kinh Bát Nhã. Nói Tây thiên thử độ đủ rồi, lại còn láy lại Thử độ Tây thiên, giống như sắc tức thị không, không tức thị sắc. Cổ kim nhật nguyệt, cổ kim sơn xuyên, mặt trời, mặt trăng của ngày xưa chính là mặt trời, mặt trăng của ngày hôm nay. Và sông núi cũng vậy, không có gì mất đi cả. Bụt Thích Ca còn đó và mặt trời Bụt Thích Ca nhìn cũng còn đó. Nếu có niệm và có định chúng ta cũng có thể khám phá và tiếp xúc được với núi Thứu với mặt trời trên núi Thứu, ngay khi chúng ta đang ở đây.

Cuộc đời một trăm năm, hay sáu bảy chục năm, là một cuộc leo núi. Ngọn núi đó là một thế kỷ, người leo trước, người theo sau. Mỗi bước leo núi của chúng ta phải tạo thành một truyền kỳ, một huyền sử trong lòng chúng ta và cho con cháu chúng ta. Nếu sống sâu sắc được một ngày như vậy thì chúng ta cũng có thể sống được một năm như vậy. Và sau khi leo ngọn núi thế kỷ này rồi, ta vẫn có thể tiếp tục leo ngọn núi thế kỷ của các thế hệ con cháu chúng ta, tiếp tục hoài hoài không dứt.

Mỗi khi quý vị bước được một bước chân an lạc là Bụt Thích Ca đang đi trên núi Thứu. Đi mà miệng nở được nụ cười là ta đang đi cho Bụt. Bụt sống mãi trong sự tu tập của chúng ta. Có nhiều vị cứ than phiền là chúng ta sinh ra quá trễ, ra đời vào lúc Bụt đã tịch hai ngàn sáu trăm năm trước mất rồi… ‘‘Khứ thánh thời diêu’’ là cách thời đại của Bụt xa lắc xa lơ. Than thân trách phận như vậy là vì chúng ta không có niệm và định.

Vào thời Bụt còn tại thế, nhiều người có khả năng ngồi với Bụt rất sâu sắc, và chỉ cần ngồi cạnh Bụt thôi là hạnh phúc đã tràn đầy. Nhiều người tới ngồi cạnh Bụt nhưng vẫn không thực sự có mặt. Cũng có nhiều người tới để cãi nhau với Bụt. Họ chuẩn bị trước những câu hóc búa để hỏi. Nhiều khi Bụt cười, nhiều khi Bụt không trả lời. Và có những người đã từng học với Bụt, tu với Bụt nhưng cuối cùng lại bỏ Bụt mà ra đi. Thành ra dầu ta có sanh ra cách đây hai ngàn sáu trăm năm, không ở xa thành Vương Xá, không ở xa thành Ca Tỳ La Vệ bao nhiêu, được ngồi bên Bụt mà chưa chắc ta đã thật sự gặp Bụt. Có nhiều người đã từng ngồi với Bụt nhưng đã không thật sự có mặt, và không tiếp nhận được sự có mặt của Bụt. Ngồi như vậy có hơn gì sanh ra cách Bụt hai ngàn sáu trăm năm đâu? Học được phương pháp ngồi, ngồi một mình hay với các bạn, trên núi Thứu hay ngay ở Làng Mai, ta có thể ngồi với Bụt trong giờ phút hiện tại.

Ngay bây giờ, chúng ta đang có thầy, có bạn và có tăng thân. Đối với nhiều người, Làng Mai là một truyền kỳ, mà không bao giờ họ có thể tới được. Mà cũng có người đang ngồi ngay giữa Làng Mai nhưng không tham dự được vào cuộc leo núi. Hành trang của giận hờn, của ganh tỵ, của bực bội, của lười biếng lớn quá, khiến cho họ không tham dự vào cuộc hành trình mầu nhiệm.

!! Chín định

Định luôn luôn là định vào một đối tượng nào. Khi ta đi thiền hành lấy đối tượng là mặt đất thì mặt đất là đối tượng của định. Khi đi thiền hành lấy hơi thở làm đối tượng thì hơi thở là đối tượng của định. Và chúng ta đừng tưởng tượng có định mà không có đối tượng của định. Nhìn vào đối tượng của thiền quán, chúng ta khám phá ra bản chất chân thật, cội nguồn và gốc rễ của nó. Khám phá ấy gọi là chánh kiến.

Đạo Bụt nói tới cửu thứ đệ định, tức là chín loại định nối tiếp nhau. Theo thứ tự trước hết là sơ thiền, nhị thiền, tam thiền và tứ thiền. Tiếp theo là không vô biên xứ định, thức vô biên xứ định, vô sở hữu xứ định, phi tưởng phi phi tưởng xứ định, và thứ chín là diệt tận định.

Thiền nhất là sơ thiền, trong ấy còn có tư duy, sau đó dần dần tư duy không còn nữa. Những giáo phái khác ngoài đạo Bụt cũng thực tập tứ thiền và tứ vô sắc định. Nhưng mục đích và lề lối thực tập của họ khác. Họ có thể đi tìm những cái khác hơn là mục đích giải thoát. Có thể họ chỉ tìm cách xoa dịu khổ đau. Nhiều người đau khổ quá muốn tìm một ít phương thức để làm dịu khổ đau thôi. Họ có thể tìm kiếm sự quên lãng, trốn tránh chính mình, trốn tránh hoàn cảnh, trốn tránh những vấn đề có thật của mình. Đôi khi chúng ta cũng cần sự lẩn trốn như vậy trong một thời gian ngắn. Những phương pháp đó không phải là chánh niệm và chánh định, có thể đó là tà định. Sự khác nhau giữa định thế gian và định xuất thế gian là phép thiền định của chúng ta nhắm tới mục đích giải thoát mà không phải là để trốn tránh.

Tới trình độ thứ năm thì đối tượng của định là không vô biên xứ. Đối tượng này là hư không không có biên giới. Chúng ta đã học hư không là một trong sáu đại: địa, thủy, hỏa, phong, không và thức. Chúng ta lấy hư không làm đối tượng, nhưng quán chiếu để thấy tính cách tương tức tương nhập của hư không với tất cả những yếu tố kia, tức là địa, thủy, hỏa, phong và thức. Trong thức vô biên xứ định (limitless consciousness) thì đối tượng của định là thức, chỉ có thức thôi. Nhưng thức cũng tương tức tương nhập với năm yếu tố kia, là địa, thủy, hỏa, phong và không. Rồi đến Vô sở hữu xứ, Vô sở hữu là không có gì cả, nhưng không phải là hư không. Tri giác của chúng ta nhận thấy có các sự vật ở ngoài nhau, độc lập với nhau. Đối tượng của tưởng (tri giác) là tướng. Nhưng đi sâu vào tính tương duyên tương tức của sự vật, chúng ta thấy rằng mỗi vật chứa đựng tất cả vạn hữu và vũ trụ. Cái này có vì cái kia có. Cho nên chúng ta vượt khỏi tướng, thấy được không sự vật nào hiện hữu riêng biệt, gọi là Vô sở hữu. Định này có công năng hiển lộ sự hiểu biết đó.

Định thứ tám là phi tưởng phi phi tưởng. Tưởng đây là tri giác. Mọi hiện tượng phát hiện ra qua tưởng, qua tri giác của chúng ta. Nhưng ta biết tri giác không phản chiếu sự thật. Muốn vượt thoát vọng tưởng, để có thể tiếp xúc với thực tại, ta không thể nương vào tưởng nữa. Nhưng nếu bỏ tưởng đi thì ta trở thành vô tri vô giác, như gỗ đá, ở trạng thái phi tưởng. Cho nên không dựa vào tưởng mà cũng không ở trong phi tưởng, gọi là phi tưởng phi phi tưởng. Trong Trung A Hàm và Trung Bộ, có nhiều kinh trong đó Bụt nói với thầy A Nan và thầy Xá Lợi Phất về tưởng. Một lần thầy A Nan hỏi: ‘‘Bạch đức Thế Tôn, khi chúng ta quán chiếu về đất, quán chiếu một cách sâu sắc thì chúng ta có thể thấy rằng đất không phải là đất nữa, có đúng không?’’ Bụt nói: ‘‘Đúng như vậy. Khi quý vị quán chiếu về không, về thức, về địa, thủy, về hỏa, về phong cũng như vậy. Nếu quán chiếu cho thật sâu sắc thì đất không còn là đất nữa. Đất cũng là hỏa, là thủy, là phong, là không, là thức. Đất không phải là một thực thể độc lập đối với những cái khác.’’ ‘‘Bạch đức Thế Tôn, khi chúng ta quán chiếu về đất, chúng ta có thể nhận thấy là không có đất nữa chăng?’’ Bụt nói: ‘‘Có thể được.’’ Thầy A Nan hỏi tiếp: ‘‘Nhưng mà vẫn có tưởng?’’ Bụt nói: ‘‘Vẫn có tưởng.’’ Vì tưởng tức là cái tâm của ta trong đó có tướng, ở đây tướng là đất. Cái tướng đất biến mất, tuy nhiên vẫn có tưởng, nghĩa là nhận thức vẫn còn. Trước đó tưởng là một vọng tưởng, nhưng sau đó trở thành một thứ tưởng khác, tạm gọi là chân tưởng (correct perception), và có thể gọi là trí (prajna). Cho nên ở mức thiền thứ tám này người ta gạt bỏ tất cả những tri giác có tác dụng chia cắt thực tại ra từng phần nhỏ. Nhờ thế ta không còn bị lừa gạt bởi tướng sanh, tướng diệt, tướng nhiều, tướng ít, tướng có, tướng không, v.v.. và thoát ly khỏi tưởng (perception), gọi là phi tưởng (non- perception). Nhưng ta biết rằng đó cũng không phải là trạng thái vô tri vô giác, cho nên tuy ta gọi nó là phi tưởng mà cũng gọi nó là phi phi tưởng – không phải tưởng, cũng không phải phi tưởng.

Cuối cùng người tu học đạt tới một trạng thái gọi là diệt tận định, có khi gọi là diệt thọ tưởng định. Chúng ta cần phân biệt thật rõ diệt tận định với vô tưởng định. Cả hai đều gọi là vô tâm định.

Vô tưởng định là định của thế gian, nhắm mục đích thoát khổ bằng cách triệt tiêu tri giác, tức là tưởng, để không còn đau khổ nữa, nhưng chưa phải là giải thoát. Vô tưởng thiên là cõi trong đó có sự sống nhưng không có tri giác. Cõi trời đó ở ngay xung quanh chúng ta, có hình thái của sự sống mà không có tri giác. Đi từ sự sống phức tạp như của các loài thú vật, đến sự sống của những sinh vật đơn bào (chỉ có một tế bào) như con amíp, thì chúng ta thấy rằng tưởng cũng thay đổi từ tình trạng rất phức tạp tới vô cùng đơn sơ. Tới ranh giới giữa động vật và thực vật, có những loài có thể gọi là thực vật mà cũng có thể xếp loại vào động vật. Những loài này có tưởng hay không có tưởng. Vậy sự sống của cõi vô tưởng ở ngay trong cơ thể chúng ta, ở cả xung quanh chúng ta. Trong cõi vô tưởng có chắc là không còn khổ não chăng?

Tưởng, hay tri giác, là một trong những gốc rễ của đau khổ. Cụ Nguyễn Du nói trong cõi người ta nhiều khổ đau quá, chỉ cần mở mắt ra đã thấy khổ rồi. Mở mắt tức là có tri giác, có tưởng:

> Những điều trông thấy mà đau đớn lòng.

Cho nên thà rằng không thấy, không nghe, không có tri giác, cuộc sống chắc khỏe khoắn hơn, như Nguyễn Công Trứ ước ao:

<<<
Kiếp sau xin chớ làm người <br>
Làm cây thông đứng giữa trời mà reo
<<<

Đây là một khuynh hướng tự nhiên, người ta đi tìm một cõi trong đó mình không cần tri giác, đi tìm sự sống vô tưởng. Một trong những cách để vào cõi vô tưởng là phương pháp thiền định gọi là vô tưởng định. Không thấy, không nghe gì nữa. vì thấy và nghe chỉ thêm khổ thôi.

Trong sáu thức: nhãn, nhơi, tợi, thiệt, thân và ý, thức thứ sáu phối hợp với năm thức đầu có công năng làm phát khởi tưởng (xúc, tác ý, thọ, tưởng, tư). Vào cõi trời vô tưởng, hay trong vô tưởng định, thức thứ sáu ngưng hoạt động. Vì vậy không còn tri giác, không còn tưởng. Nhưng trong ánh sáng của tâm lý học Phật giáo, và qua kinh nghiệm tu tập, thì giai đoạn vô tưởng chỉ là một cuộc hưu chiến với đau khổ mà thôi. Khi chấm dứt trạng thái vô tưởng định, lại trở về sự sống có tưởng, đau khổ lại hiện hành.

!! Diệt tận định

Để hiểu trạng thái diệt tận định (còn gọi là diệt thọ tưởng định), cần hiểu chữ diệt theo nội dung diệt đế của tứ diệu đế, như đã giải thích trong những bài đầu. Để thấy Diệt tận định khác Vô tưởng định như thế nào, ta cần đi sâu hơn vào phía tàng thức, theo phân tích của Duy Biểu học.

Trong Duy Biểu học, trước gọi là Duy Thức học, sau các thức Nhãn, Nhơi, Tỷ, Thiệt, Thân, Ý, còn có thức Mạt Na (manas) thường được gọi là thức thứ bảy và thức thứ tám, là Tàng thức (alaya). Khi một người đi vào định vô tưởng tuy rằng thức thứ sáu đã ngưng làm việc, nhưng các thức thứ bảy và thứ tám vẫn hoạt động. Những vô minh và nội kết vẫn còn nguyên trong tàng thức và biểu hiện trong Mạt Na bằng sự phân biệt mình và người. Thức Mạt Na là một năng lượng phân biệt dai dẳng và âm thầm: đây là ta, đây không phải là ta. Vào định Vô tưởng hay vào cõi trời vô tưởng thì cũng chỉ hưu chiến được một thời gian thôi. Khi ra khỏi vô tưởng định và vô tưởng thiên thì tất cả nguồn gốc của khổ đau, từ trong thức thứ tám cũng sẽ hiện hành trở lại. Chỉ có các vị a la hán đã vượt ra khỏi định thứ tám và đi vào định thứ chín mới chuyển hóa được mạt na thức và gột sạch được những nội kết ở trong tàng thức.

Những nội kết trong tàng thức rất nhiều, nhưng nội kết lớn nhất là vô minh. Vô minh tức là sự si mê, không biết được tự tánh chân thật về sự vật. Sự vật là vô thường mà nghĩ là thường, sự vật vô ngã mà nghĩ là hữu ngã. Trên cái vô minh căn bản đó sinh ra những nÕôi kết tham, sân, si, mạn, nghi, kiến v.v.. Người tu học phải tinh chuyên, quán chiếu để chuyển hóa khối vô minh. Những hạt giống chấp ngã, chấp pháp, những hạt giống tham, giận và si mê phải được chuyển hóa. Sau khi chúng được chuyển hóa rồi thì tàng thức được tự do, những khối vô minh tan biến. Lúc đó thức mạt na không còn tác dụng nữa, trở thành một loại trí tuệ gọi là bình đẳng tánh trí. Bình đẳng tánh trí là thấy được tính cách tương tức tương nhập của mọi sự mọi vật, thấy cái ta với cái không ta là một. Khi đó tàng thức (alaya) trở thành đại viên cảnh trí, một tác dụng trí tuệ chiếu rọi như một tấm gương tròn sáng lớn, phản chiếu được sự thật. Thức thứ sáu trở thành một tác dụng gọi là diệu quan sát trí, tức là trí tuệ có thể quan sát được một cách mầu nhiệm tất cả những hiện tượng mà không còn bị kẹt vào vô minh nữa. Nặm thức đầu (mắt, tai, mũi, lưỡi và thân) trở nên thành sở tác trí. Có bốn loại trí tuệ. Đại viên cảnh trí làm bối cảnh soi sáng, bình đẳng tánh trí chiếu rọi tính tương tức của các pháp, Diệu quan sát trí phân biệt và quyết trạch các pháp mà không kẹt vào kỳ thị và cố chấp. Thành sở tác trí vận dụng sắc, thanh, hương, vị, xúc mà không bị nô lệ cho năm trần. Vọng tưởng và vọng thức nhờ tu tập được chuyển hóa thành tứ trí. Trong trạng thái diệt tận định, tuy gọi là diệt thọ tưởng nhưng với tứ trí làm căn bản tất cả các thức vẫn còn, vẫn có tưởng, vẫn có thọ, nhưng không là thọ và tưởng do vô minh tác thành nữa. Diệt hiểu theo nghĩa diệt của tứ diệu đế.

Thọ và tưởng vẫn còn nhưng hoàn toàn được soi sáng trong tứ trí. Cảm thọ vốn do sự tiếp xúc giữa sáu căn với sáu trần, thường vẫn đưa tới Đi, đưa tới thủ rồi tới hữu. Ái thường đưa tới thủ, là sự vướng mắc trôi nổi trong sinh tử. Nhưng trong ánh sáng của tứ trí, thọ bây giờ đưa tới từ và bi, không vướng mắc. Từ, bi và đại nguyện không đưa tới thủ, mà đưa tới cứu độ. Cho nên ta phải hiểu diệt thọ tưởng định không có nghĩa là không còn thọ và tưởng. Phải hiểu là thọ và tưởng không còn là vọng thọ và vọng tưởng như trước, vì tất cả những khối vô minh trong tàng thức và trong mạt na thức đã bị quét sạch. Đó mới đích thực là diệt tận định.

Có ba phép quán, ba trạng thái định rất quan trọng, gọi là tam tam muội. (tam muội là samadhi. ) Tam tam muội có khi gọi là tam giải thoát môn, ba cánh cửa vào giải thoát (the three gates of liberation). Tam tam muội là không tam muội, vô tướng tam muội và vô tác tam muội. Chúng ta sẽ có dịp học thêm khi trở lại nói về chánh kiến.

Nói tóm lại, Định không phải là chỉ có mặt trong khi ta ngồi thiền, định có thể đạt được trong mỗi giờ phút của đời sống hàng ngày. Cho nên phương pháp thực tập của chúng ta là khi đi, đứng, nằm, ngồi, nói, cười và làm việc ta đều phải có định. Ta phải có mặt trong giây phút hiện tại, phải xử lý những gì xảy ra trong giây phút hiện tại với chánh niệm. Làm việc có giỏi cách nào đi nữa mà nếu trong đời sống hàng ngày không có chánh niệm và chánh định thì ta không phải là một thành phần tốt của tăng thân. Đóng góp cho tăng thân bằng cách ngồi cho ra ngồi, đi cho ra đi, giặt áo cho ra giặt áo, ăn cơm cho ra ăn cơm. Ngồi yên tiếng Hán Việt gọi là tĩnh tọa. Thân ngồi yên ổn và vững chãi được thì tâm sẽ yên vững được. Nếu thân không yên thì làm sao tâm yên? Không cần phải có thiên nhãn, chỉ cần nhìn một người đi, đứng, nói, cười là ta biết người đó có an trú trong niệm và định không. Không có niệm và định là sống hời hợt, rất uổng phí sự sống.

Không có niệm và định, tâm ta vẫn còn nguyên những khối giận hờn, buồn bực và ganh tức. Ta sẽ không thực hiện được hoài bão chuyển hóa thân tâm, đem lại hạnh phúc cho chính mình và cho những người mình thương yêu. Khi ta sống có chánh niệm và chánh định, tự nhiên trí tuệ phát sinh, và ta thấy được chân tướng của các pháp là vô thường, vô ngã và niết bàn. Thấy được tính duyên sinh của sự vật, tự nhiên trí hiểu biết, lòng khoan thứ và tình thương yêu sẽ tới. Năng lượng của niệm và của định đưa tới chánh kiến, tức là cái thấy vô thường, vô ngã và niết bàn. Cho nên trong đời sống hàng ngày nếu ta sống trong chánh niệm, và chánh định thì ba tự tánh gọi là tam pháp ấn sẽ hiện rõ. Kỳ sau chúng ta sẽ trở lại bàn về chánh kiến, và chúng ta sẽ hiểu rằng vô thường, vô ngã và niết bàn là những giáo lý Bụt đưa ra để hướng dẫn chúng ta thiền quán, tiếp xúc, quán chiếu các sự vật ở xung quanh ta và trong chính bản thân ta. Chúng ta sẽ thấy rằng vô thường, vô ngã và niết bàn là những phương pháp quán chiếu rất thực tế, rất cụ thể, không phải là những ý niệm và lý thuyết trừu tượng.
! Bài 11 Chánh niệm là tự làm chủ

Hôm nay là ngày 26 tháng chạp năm 1993, chúng ta học tiếp về chánh niệm.

Chữ niệm chúng ta có thể dịch là nhớ, nhưng ở đây nhớ không có nghĩa là ký ức (memory). Kỳ trước chúng ta đã biết rằng có chánh niệm tức là tâm ta trú trong giây phút hiện tại và ta biết được những gì đang xảy ra trong hiện tại. Vì vậy niệm không có nghĩa là nhớ tưởng quá khứ, nhất là nghĩ tới quá khứ để đánh mất mình trong đó. Chúng ta có thể định nghĩa chánh niệm là năng lượng có khả năng nhận diện được bất cứ những gì đang xảy ra bây giờ và ở đây.

!! Chánh niệm là tự làm chủ

Những gì xảy ra cũng có thể được xếp vào một trong bốn lĩnh vực. Trước hết là lĩnh vực thân thể. Tiếp theo là lĩnh vực của cảm thọ. Thứ ba là lĩnh vực của các tâm hành (mental formations) (duy biểu học phân loại 51 thứ tâm hành). Và lĩnh vực thứ tư là các pháp. Pháp ở đây tức là những hiện tượng làm đối tượng của tâm thức.

Ví dụ trong tâm ta, trong ký ức ta, có một hình ảnh đã được gieo vào từ 20 năm về trước. Bây giờ hình ảnh đó hiện trở lại, và hai trường hợp có thể xảy ra. Thứ nhất là chúng ta có thể bị cái hình cũ lôi kéo vào một cuộc phiêu lưu, và chúng ta sống lại thế giới của quá khứ. Trong trường hợp này chúng ta đi vào thất niệm. Đó là nhớ nhưng không phải là nhớ trong chánh niệm. Một hình ảnh có thể áp dẫn chúng ta trở về quá khứ, hay lôi cuốn chúng ta phiêu lưu tới một tương lai chưa hề xẩy ra, để mơ tưởng, để phập phồng, lo âu, sợ hãi, và chúng ta quên lãng, không có mặt trong giây phút hiện tại nữa. Đó là thất niệm.

Trái lại nếu hình ảnh đó từ tiềm thức hay vô thức (trong tàng thức) phát hiện ra mà chúng ta biết mỉm cười nhận diện, ta nói: à, chào ngươi, ngươi đã trở lại’’. Trong trường hợp này chúng ta vẫn còn an trú trong hiện tại. Chúng ta đã khiến việc nhớ lại hình ảnh quá khứ trở thành một biến cố xảy ra trong hiện tại. Có chánh niệm, ta không cần phải xua đuổi hình ảnh đó. Nó không kéo ta được về quá khứ, nó không dẫn ta phiêu lưu tới tương lai. Trường hợp này là có chánh niệm.

Có chánh niệm tức là tâm ta giữ được chủ quyền, và thất niệm là đánh mất chủ quyền. Có thể nói rằng chánh niệm giúp cho ta vẫn còn là ta, có mặt trong cuộc đời để tiếp xúc với sự sống chân thật. Nếu không có chánh niệm thì ta không còn là ta nữa. Chúng ta hãy tưởng tượng có một ngôi nhà không chủ, ngôi nhà đó sẽ tan hoang. Con người ta gồm có bốn phần: thân, thọ, tâm và pháp. Nếu chúng ta không có mặt thì chúng ta để cho ngôi nhà bốn lĩnh vực ấy tan hoang. Cái thân của chúng ta sẽ yếu đuối, cái thọ của chúng ta sẽ đầy những khổ đau, cái tâm của chúng ta rối ren, và những pháp của ta đều là phiền não. Vì vậy cho nên khi chúng ta có mặt thì căn nhà của ta hay khu vườn của ta mới trở nên một căn nhà hay một khu vườn tươi mát có thể đem lại an lạc. Người Việt Nam hay nói vắng như chùa Bà Đanh. Chắc hẳn chùa Bà Đanh là cái chùa không ai chăm sóc. Mỗi người tu cũng là một ngôi chùa. Đừng để ngôi chùa ta biến thành chùa Bà Đanh. Trong khi đi, đứng, nằm, ngồi; trong cảm thọ vui, buồn, giận, ghét; trong khi ăn, uống, cười, nói ta phải có chánh niệm. Có chánh niệm thì ngôi chùa chúng ta có một vị trụ trì và ngôi chùa đó không thể trở thành chùa Bà Đanh.

Quán sát một sư anh, một sư chị, một sư em trong đời sống hàng ngày: đi, đứng, nằm, ngồi, nấu cơm, gánh nước, bổ củi, ta thấy được người đó có chánh niệm hay không, ngôi chùa đó có phải chùa Bà Đanh không, hay đó là một ngôi chùa có chăm sóc đàng hoàng. Một ngôi chùa được chăm sóc đàng hoàng, cây cảnh tốt tươi, thì đó là nguồn vui lớn cho rất nhiều người. Nhận ra điều này cũng không khó. Chỉ cần nhìn người đó quét nhà hay lau bàn là ta có thể biết được cái chùa này đang được chăm sóc hay đang bị bỏ hoang.

!! Nhận diện đơn thuần

Chánh niệm là vị trụ trì của ngôi chùa. Bốn lĩnh vực của quán niệm, thứ nhất là thân thể. Thân thể ta đang làm gì, có gì đang xảy ra cho cơ thể ta, ta phải biết. Thứ hai là cảm thọ (sensation, feelings). Khi nào có vui, buồn, hoặc sợ, chán hay giận thì chúng ta đều biết. Ta nhận diện các cảm thọ đang diễn ra, không cần làm gì khác. Và chánh niệm chính là khả năng nhận diện được cái gì đang xẩy ra trong giờ phút hiện tại. Hai lãnh vực vừa kể gồm những hiện tượng trong thân thể và trong cảm thọ. Tiếp theo là lãnh vực các tâm hành và cuối cùng là lãnh vực những đối tượng của tâm hành.

Chúng ta cần hiểu chánh niệm là năng lượng giúp chúng ta nhận diện được những gì đang xảy ra trong bốn lĩnh vực: thân, thọ, tâm và pháp. Chỉ cần nhận diện thôi, không cần phải làm gì khác. Thực tập chánh niệm bắt đầu bằng sự nhận diện một cách thuần túy tất cả những gì đang xảy ra trong ta và xung quanh ta. Nhận diện mà không cần phê phán. Không cần nghĩ rằng điều đang xảy ra là đáng buồn hay đáng vui. Bông hoa tươi thì biết là bông hoa tươi, bông hoa héo thì biết là bông hoa héo. Tâm đang giận hờn thì biết đây là nỗi giận hờn đang ở trong ta. Không cần phải công phá, không cần phải đè nén. Bí quyết của sự thực tập là ở chỗ này.

Nếu thấy tâm giận hờn phát khởi mà ta xấu hổ, nổi ý muốn dẹp bỏ và đàn áp nó, thì đó chưa phải là chánh niệm. Chánh niệm như một bà mẹ: con của mình tươi vui thì mình thương, mà nó khóc lóc thì mình vẫn thương. Tất cả những gì xảy ra trong bốn lãnh vực đều cần phải được năng lượng chánh niệm ôm ấp như nhau. Đẹp mình cũng săn sóc mà không đẹp mình cũng săn sóc. Thành ra cái gọi là nhận diện đơn thuần rất quan trọng, ta phải nhớ kỹ. Chỉ cần nhận diện và cười với hiện tượng ấy thôi, không cần lên Đn, không mang mặc cảm, hay khổ đau, trách cứ hoặc giận hờn. Tất cả những phản ứng ấy có thể là chướng ngại cho sự tu tập. Hãy để hạt giống của chánh kiến trong ta hoạt động, cứ để những hạt giống của tình thương và sự hiểu biết trong ta hoạt động. Chúng ta chỉ cần nhận diện mà thôi.

Trong lĩnh vực thân thể thì trước hết ta nhận diện rằng có cái thân thể đang sống. Thường thường trước khi sư cô Chân Diệu Nghiêm dạy những động tác thực tập chánh niệm, sư cô hay nói chúng ta hãy thở vào và thở ra, trong khi phát khởi ý thức về thân thể. Thở vào, tôi biết là thân tôi đang đứng đây, thở ra tôi biết là thân tôi đang đứng đây. Đó là nhận diện sự có mặt của thân thể. Có nhiều khi ta xa cách với bản thân của mình. Trong đời sống, chúng ta có thể như một đứa con đau khổ, bỏ nhà ra đi. Cái nhà của chúng ta là bốn lĩnh vực: thân, thọ, tâm, pháp. Thân của chúng ta là một phần căn nhà đó. Nhiều khi ta quên tiếp xúc với thân ta. Khi thở ra và thở vào để trở về với thân thể, ta làm quen lại với thân thể mình, thấy được sự có mặt của thân thể mình, đó là một sự thực tập. Đó là thực tập trở về.

Trong lĩnh vực cảm thọ cũng vậy. Có những cảm thọ làm cho chúng ta đau. Chúng ta chạy trốn những mối lo, những nỗi buồn, những nỗi giận, những cảnh khổ. Chúng ta cũng không dám trở về để làm quen, để ôm lấy những cảm thọ của chúng ta. Chúng ta luôn luôn muốn chạy trốn. Thành ra chánh niệm trước hết là sự trở về, trở về với thân, rồi trở về với những cảm thọ của ta.

Kinh Thân Hành Niệm nằm trong Trung Bộ ở tạng Pali (Kayasmrti sutta) và Trung A Hàm nơi Hán tạng. Trong kinh này Bụt dạy chúng ta trở về với thân, làm quen với thân, nhận diện tất cả những thành phần và động tác của thân. Trước hết ta nhận diện thân ta trong các tư thế đứng, ngồi, nằm và đi. Đó là một sự trở về đích thực. Rồi ta nhận diện từng phần trong thân thể: tôi đang thở vào và tiếp xúc với tóc trên đầu của tôi, tôi đang thở ra và mỉm cười với tóc trên đầu của tôi. Tóc trên đầu tôi đã bắt đầu bạc và tôi mỉm cười với màu muối tiêu trên tóc tôi. Tất cả đều là sự trở về để làm quen trở lại với một người bạn cũ, với ngôi nhà cũ của mình. Đó chính là thân thể mình. Rồi ta đi xuống trán: tôi đang thở vào và trở về tiếp xúc với cái trán của tôi, tôi đang thở ra và mỉm cười với trán của tôi. Trán của tôi còn trẻ chưa nhăn, hoặc là trán của tôi đã bắt đầu có nếp nhăn. Tất cả những thứ đó là đối tượng chánh niệm, là ánh sáng giúp ta nhận diện được tóc của ta, trán của ta. Cứ thế đi từ đầu tới chân. Kinh có nói tới 36 bộ phận của cơ thể cần phải quán chiếu. Ta phải biết tiếp xúc và cười với từng bộ phận. Đó là một sự trở về để làm quen trở lại, để làm hòa với cơ thể của mình.

Phương pháp này có thể thực tập trong khi nằm. Chúng ta nằm buông thõng hai tay và hai chân cho thật thoải mái, và theo dõi hơi thở, bắt đầu chú ý tới tóc ở trên đầu, rồi chú ý tới trán, và lần lượt đi xuống. Ta dùng chánh niệm của ta như một chùm tia sáng, chiếu rọi từ trên đầu, di chuyển chùm ánh sáng ấy từ từ xuống chân. Ngang tới đâu thì ánh sáng chánh niệm cho ta ý thức rõ ràng phần cơ thể đó. Đồng thời hơi thở có ý thức nuôi dưỡng năng lực của chánh niệm. Miệng mỉm cười với đối tượng mà ánh sáng ý thức đang rọi tới. Như quán chiếu hai mắt, tiếp xúc hai mắt, nhờ chánh niệm tiếp xúc được hai mắt thì miệng mỉm cười với hai mắt. Chánh niệm giống như tia laser trong một chiếc máy scanner ở nhà thương.

!! Chánh niệm là trở về

Trong chánh niệm có hành động trở về, có hành động làm quen trở lại, có niềm thương yêu, chú ý và chăm sóc. Chánh niệm có rất nhiều tính trị liệu. Chánh niệm là trở về. Ngày sư chú Pháp Dụng xin xuất gia, sư chú đã đi vào phòng tôi. Quỳ xuống, ôm lấy chân tôi, sư chú nói: ‘‘Bạch thầy, con đã trở về’’. Tu là trở về, trở về với mình, với gốc rễ của mình, với cha ông của mình, với gia đình tâm linh của mình trong đó có thầy, có tổ. Mình là đứa con đã đi lang thang bao nhiêu năm tháng, và tu có nghĩa là quyết định trở về. Điều này cũng đúng với sư chú Pháp Ứng, cũng đúng với sư cô Thoại Nghiêm, với tất cả những người xuất gia. Biết rằng trong chuyến đi hoang mình có thể chỉ làm tan vỡ thêm. Sự nát tan đó có thể xảy ra trong cơ thể, trong tâm hồn mình, mà cũng xảy ra ở trong gia đình, trong xã hội mình. Tu là trở về hòa giải với chính thân và tâm mình. Mà trong thân tâm mình, đã sẵn có ông bà cha mẹ và thầy tổ. ‘‘Bạch thầy, con đã trở về, con xin xuống tóc để thọ mười giới’’, đó mới chỉ là khởi sự trở về thôi. Việc trở về phải tiếp diễn trong từng giây, từng phút. Bước đi một bước, ngồi xuống, uống một chén trà, tất cả những lúc ấy đều là những lúc phải thực tập trở về. Nếu không có năng lượng của chánh niệm thì việc trở về ấy không thể thực hiện được. Bạch thầy, con đã trở về, có nghĩa như vậy. Đó là một lời nguyện, đó là một giây phút giác ngộ, mà cũng là công việc thực tập thường xuyên không ngưng nghỉ.

Có nhiều người chán ghét thân thể mình, họ cảm thấy thân thể là một chướng ngại vật, họ giận hờn thân thể họ. Họ nói thân thể là một cái bình chứa đựng tội lỗi, là một nơi tích tụ khổ đau. Họ muốn đày đọa, dày vò, đánh đập thân thể họ. Đó chỉ là biểu hiện của sự đi hoang mà thôi. Đã đi hoang rồi, thì không còn nhận ra căn nhà của mình nữa, không nhận ra được ngôi chùa của mình nữa. Cho nên, đứng về mặt tình cảm và tâm linh mà nói, ý định muốn hủy hoại thân thể đã bắt nguồn từ chuyện bỏ nhà ra đi. Khi trở về tiếp xúc với thân thể, mỉm cười với từng bộ phận của thân thể, đó là bắt đầu trở về để hòa giải và tha thứ.

Bụt dạy: Ví dụ có một người nông dân leo lên trên gác nhà, khiêng xuống một bao hạt giống. Người nông dân đặt bao hạt giống trên sàn nhà, mở một đầu bao ra và cầm ngược đầu kia trút hết hạt giống xuống. Người nông dân nói: đây là hạt bắp, đây là hạt đậu, đây là hạt vừng, đây là hạt này, đây là hạt kia. Người nông dân nhận ra hạt bắp là hạt bắp, nhận ra hạt đậu là hạt đậu, nhận ra hạt mè là hạt mè. Chúng ta cũng vậy, trong khi trở về tiếp xúc với thân thể, chúng ta nhận ra đây là tóc của tôi, đây là hai mắt của tôi, đây là phổi tôi, đây là tim tôi. Đó là sự nhận diện đơn thuần. Đây là thân thể của tôi, ta chỉ nhận diện như vậy. Trong ví dụ đó, ta thấy được lòng từ bi của Bụt. Ta chỉ cần trở về để nhận diện thân thể ta, và nhận diện cho thật kỹ từng bộ phận của thân thể đó. Chúng ta lâu nay đã lãng quên chính thân thể chúng ta. Chúng ta lâu nay đã bỏ nhà đi hoang và bây giờ cần phải trở về. Nếu không trở về được với thân thể thì làm sao trở về được với cảm thọ, với tâm tư? Cho nên trở về thân thể là quan trọng. Có thể là trong những giờ thiền tập, mình nằm xuống trong tư thế buông thư, dùng ánh sáng của chánh niệm chiếu vào từng phần thân thể, để thấy rõ, tiếp xúc và mỉm cười với nó. Đó là một phương pháp thực tập rất hay.

Tiếp đến là sự dùng chánh niệm chiếu sáng vào những cử động và những tư thế. Khi đi thì biết là đang đi. Có một chứng bịnh gọi là thụy du (sleep walking). Ban đêm tự nhiên người ta nhỏm dậy, mở cửa đi và không biết là mình đi. Đó là biểu tượng của sự vong thân. Năm ngoái, trong khóa tu chúng ta đã nói về tình trạng cô hồn. Mỗi chúng ta đều có cái hạt giống cô hồn trong người. Chúng ta thỉnh thoảng lại có khuynh hướng bỏ nhà ra đi, bỏ cha, bỏ mẹ, bỏ thầy, bỏ bạn mà đi. Hạt giống cô hồn nếu lớn lên thì chính nó sẽ đẩy chúng ta đi. Chúng ta sẽ làm một kẻ thụy du, đi mà không biết là mình đi đâu. Thuyền ơi thuyền theo gió hãy lênh đênh. Đi đâu cũng được.

Vũ Hoàng Chương viết:

<<<
Lũ chúng ta lạc loài năm bảy đứa, <br>
Bị quê hương ruồng bỏ, giống nòi khinh.  <br>
Biển vô tận xá gì phương hướng nữa?  <br>
Thuyền ơi thuyền, theo gió hãy lênh đênh.
<<<

Nếu nghe bốn câu đó mà cảm thấy hay, tức là ta biết trong ta đã sẵn có hạt giống cô hồn. Ít nhiều, chúng ta đều đã là những đứa con đi hoang. Và quyết tâm tu học tức là quyết tâm trở về.

Không phải là chỉ lúc nửa đêm thức dậy chúng ta mới mộng du đâu. Ban ngày cũng vậy. Ban ngày, có lúc đi ra nhà bếp, đi lên thiền đường, đi xuống phòng riêng, chúng ta cũng đi như mộng du vậy. Tức là đi không có chánh niệm. Đi mà không ý thức rằng mình đang đi thì không khác gì thụy du cả. Cho nên người tu, trong mỗi bước chân phải bước đi trong chánh niệm, mỗi bước chân của anh đều phải đưa anh vào tịnh độ.

<<<
Mỗi bước chân đi vào tịnh độ, <br>
Mỗi cái nhìn thấy được pháp thân.
<<<

Khi mắt ta nhìn với chánh niệm, ta thấy được tính mầu nhiệm của sự sống trong giây phút hiện tại. Khi đi ta biết là mình đi. Chỉ cần có ý thức là mình đang đi thôi, tự nhiên bước chân trở nên thanh thản, đầy an lạc. Không cần làm gì hết, chánh niệm tự nó sẽ chuyển hóa tình trạng. Đang đi như bị ma đuổi mà ta vừa trở lại chánh niệm thì bước chân ta tức khắc trở thành khoan thai; và sự an lạc thảnh thơi sẽ đến, rất dễ dàng và tự nhiên. Ta chỉ nhận diện đơn thuần: ‘‘A, mình đang đi như bị ma đuổi.’’ Không cần tự trách cứ, không cần tự chê bai, mà tự nhiên những bước chân ta thảnh thơi trở lại.

Khi đứng ta cũng đứng trong chánh niệm. Như đứng xếp hàng để chờ đến lượt mình múc một bát canh. Trong khi đứng, ta không phiêu lưu bay tận trên mây hay trong vùng trời suy tưởng. Không phiêu lưu trong quá khứ hay ở tương lai. Tôi đang đứng đây và tôi biết rằng tôi đang đứng đây, chỉ như vậy thôi. Chuyện tôi đang đứng đây giữa các bạn tu của tôi, trong một khung cảnh thanh tịnh đã giúp tôi trở về. Riêng điều đó đã đủ để tạo ra an lạc và hạnh phúc rồi, không cần phải làm gì khác.

<<<
Đi, đứng, nằm, ngồi trong chánh niệm.  <br>
Vào ra cười nói tướng đoan nghiêm.
<<<

Nếu có chánh niệm trong tâm thì tự nhiên khi đi ra, đi vào, cười, nói thì bên ngoài tướng mạo sẽ đoan nghiêm. Người ngoài nhìn ta sẽ thấy đây là một học trò của Bụt, không phải là một bóng ma. Còn nếu trong tâm không có chánh niệm mà ngoài cũng không đoan nghiêm, thì mình biết đây là một ngôi nhà bỏ hoang, là một con ma. Sống trong đại chúng tu học ta phải có nhiều cơ hội được nhắc nhở trở về chánh niệm. Cho nên tiếng chuông điện thoại cũng giúp ta trở về chánh niệm, tiếng chuông đồng hồ cũng giúp ta trở về chánh niệm, bàn tay chắp lại chào búp sen của người bạn tu cũng giúp ta trở về chánh niệm. Dáng đi ra hay đi vào của người sư anh hay sư chị cũng giúp ta trở về chánh niệm.

Đến lượt ta, ta cũng phải làm mọi việc trong chánh niệm, cống hiến cơ hội trở về chánh niệm cho tất cả những người ở chung quanh ta. Khi cúi xuống, ta biết rằng ta đang cúi xuống. Khi ngẩng lên, biết ta đang ngẩng lên. Đó là chánh niệm về tư thế của thân. Khi cầm một cái ly thì ta biết rằng ta đang cầm một cái ly. Khi đặt ly xuống thì ta biết rằng ta đang đặt cái ly xuống. Chánh niệm soi sáng các động tác của thân thể ta. Khi đánh răng, ta biết rằng ta đang đánh răng.

Chúng ta phải học Kinh Thân Hành Niệm, nhưng các ý chính của Kinh Thân Hành Niệm cũng có ở trong Kinh Niệm Xứ. Thành ra học Kinh Niệm Xứ cũng như học Kinh Thân Hành Niệm. Kinh Niệm Xứ là Kinh mà chúng ta không thể không học được, vì Kinh này vào thời của Bụt các thầy và các sư cô đều học thuộc lòng. Mỗi khi có một người sắp lìa đời, thường thường người ta đọc Kinh này. Đến bây giờ trong truyền thống Nam Tông, các thầy phần lớn cũng còn thuộc Kinh Niệm Xứ.

Kinh Niệm Xứ nằm trong Trung Bộ Kinh (Majjhima Nikaya, kinh số 10), và cũng có trong Hán Tạng. Tên Pali của Kinh là Satipatthana sutta. Sati tức là niệm. Đây là sách gối đầu giường, đây là một bảo vật. Tu theo đạo Bụt mà không biết Kinh này, không học Kinh này, thì không ổn. Giống như người nông phu mà không nhận ra hạt giống hay là không biết cày bừa vậy. Kinh này tôi đã phiên dịch và chú giải, được xuất bản bằng nhiều thứ tiếng. Tiếng Anh mang tựa đề là Transformation and healing, còn tiếng Việt mang tựa đề là Con Đường Chuyển Hóa. Kinh Niệm Xứ dạy cho chúng ta thực tập quán niệm về thân thể, thực tập chánh niệm về cảm thọ, về tâm hành và về các pháp. Và trong thiền môn, Kinh Niệm Xứ ít nhất phải được tụng mỗi tuần một lần.

Song song với Kinh Niệm Xứ là một Kinh khác, tôi nghĩ, không kém phần quan trọng. Đó là Kinh An Ban Thủ Ý, tức là Kinh Quán Niệm Hơi Thở. Kinh này xuất hiện ở Việt Nam chậm nhất là vào đầu thế kỷ thứ ba. Thiền sư Tăng Hội, gốc người Khương Cư nhưng sinh ở Việt Nam, xuất gia ở Việt Nam, học tiếng PHạn và tiếng Hán ở Việt Nam, đã viết tựa cho Kinh An Ban Thủ Ý vào nửa đầu thế kỷ thứ ba, trước khi Ngài đi sang Đông Ngô để truyền bá đạo thiền. Thiền sư Tăng Hội sống trước tổ Bồ Đề Đạt Ma tới 300 năm. Ngài là sơ tổ của thiền tông Việt Nam. Bài tựa Kinh An Ban Thủ Ý của thầy Tăng Hội vẫn còn trong Hán Tạng. Nhờ bài tựa đó nên chúng ta biết rằng thầy Tăng Hội đã tu học và chứng đạt ở Việt Nam, rồi sau mới sang Trung Hoa hoằng pháp. Ngôi chùa đầu tiên thầy lập ra ở kinh đô nước Ngô gọi là Chùa Kiến Sơ. Sơ tức là đầu tiên. Kiến sơ là đầu tiên được thành lập. Vai trò của thầy Tăng Hội trong đạo Bụt Trung Hoa rất lớn.

An ban, phiên âm từ tiếng Phạn anapana, là hơi thở ra và hơi thở vào. Còn thủ ý là nắm lấy tâm ý của mình. Hai chữ thủ ý ngày xưa dùng để dịch chữ niệm. Tên kinh này có nghĩa là ‘‘thực tập chánh niệm về sự thở ra, thở vào.’’ Kinh An Ban Thủ Ý dịch cho sát nghĩa là Nhập Tức Xuất Tức Niệm Kinh, tức là Kinh quán niệm về hơi thở vào và hơi thở ra, chữ tức nghĩa là hơi thở. Bây giờ chúng ta dịch là Kinh Quán Niệm Hơi Thở. Kinh An Ban Thủ Ý tôi đã dịch ra tiếng Việt và đã chú giải rất kỹ lưỡng. Ngày tôi tìm được Kinh An Ban Thủ Ý, tôi mừng như người tìm được kho vàng. Ta phải biết rằng ta may mắn lắm, có nhiều phước đức lắm mới gặp được những Kinh như vậy. Và nhất là khi bản dịch và chú giải đã được in và đưa tới cho mình mà không biết sử dụng thì thật giống như con nhà giàu mà còn chịu nhịn đói.

Cùng với hai Kinh này còn có một cái Kinh rất gần, gọi là Kinh Người Biết Sống Một Mình (Bhaddekaratta sutra). Có bản dịch là Kinh Nhất Dạ Hiền Giả, nhưng dịch như vậy là sai. Nhất dạ là một đêm, Vị hiền giả một đêm. Biết sống một mình nghĩa là biết nuôi dưỡng chánh niệm, không tự đánh mất mình. Kinh này có nhiều bản lắm, có tới năm, sáu bản cùng một ý. Trong Trung Bộ cũng như là trong Trung A Hàm, mỗi bộ có bốn hoặc năm Kinh nói về chủ đề này, tức là chủ đề biết sống một mình.

!! Kinh người biết sống một mình

Sống một mình là sống trong chánh niệm. Có những người không thể sống một mình, có những người chỉ có thể sống khi dựa vào người khác, vật khác. Người khác ở đây có thể là phim chưởng, có thể là tiểu thuyết, có thể là tivi. Nếu không có một đối tượng bên ngoài nào dẫn dắt thì người ấy không thể sống được, nếu ở không thì chắc chết, cho nên người ấy phải cầm điện thoại lên để nói, nói với bất cứ ai, bất cứ chuyện gì. Hoặc nếu không gọi điện thoại cho ai được thì phải mở truyền hình ra xem. Nếu trong truyền hình không có gì để xem thì phải đi kiếm một tờ báo. Nếu không có báo thì đi tìm một cuốn tiểu thuyết. Luôn luôn phải có cái gì đó để giúp cho mình đứng vững. Nếu không thì ngã lặn ra, không sống nổi.

Biết sống một mình (ekavihari) nghĩa là sống mà không cần đến những thứ trên. Tự mình đã có đủ niềm vui, có đủ sự sống. Trong các Kinh ấy, Bụt dạy: Đi vào trong rừng mà sống, xa cách xã hội, không có ai ở chung với mình, cái đó chưa phải là sống một mình đích thực. Nếu ở trong rừng mà vẫn nghĩ vọng về quá khứ, vẫn mơ mộng hay lo lắng tới tương lai, như thế Bụt gọi là sống hai mình (sadutiyavihari). Chữ này là chữ của Ngài. Dẫu anh ở trong rừng không có bóng người mà không an trú được trong hiện tại thì anh vẫn sống hai mình như thường. Còn nếu anh đi vào trong chợ mà có chánh niệm, biết được những gì xảy ra trong giây phút hiện tại, tinh lực của chánh niệm đang tỏa sáng và cho anh biết anh đang đi, đang đứng, đang nói, đang cười, lúc đó là anh sống một mình. Đây là một Kinh rất quan trọng. Kinh Người Biết Sống Một Mình là văn kiện cổ nhất của nhân loại nói về nghệ thuật sống trong giây phút hiện tại. Kinh này đã được dịch và chú giải. Trong Kinh có bài kệ rất nổi tiếng:

<<<
Đừng tưởng nhớ quá khứ, <br>
Đừng lo lắng tương lai. <br>
Quá khứ đã không còn,  <br>
Tương lai thì chưa tới.  <br>
Hãy quán chiếu sự sống <br>
Trong giờ phút hiện tại. <br>
Kẻ thức giả an trú,  <br>
Vững chãi và thảnh thơi.  <br>
Hãy tinh tiến hôm nay,  <br>
Kẻo ngày mai không kịp;  <br>
Cái chết đến bất ngờ,  <br>
Không thể nào mặc cả.  <br>
Người nào biết an trú  <br>
Đêm ngày trong chánh niệm,  <br>
Thì Như Lai gọi là:  <br>
Người biết sống một mình.
<<<

Đó là một bài thơ của Bụt. Bài này được lặp đi lặp lại nhiều lần ở trong những Kinh có chủ đề Biết Sống Một Mình. Có Kinh lặp lại bài kệ đó tới hai lần, có Kinh một lần. Có khi đọc bài kệ xong, Bụt đi vào ngồi thiền. Các thầy chưa hiểu, đi tìm một thầy khác để hỏi. Có khi đọc xong rồi Bụt giảng giải. Như vậy, ngày xưa Bụt cũng đã dùng thi ca để mà giảng dạy đạo lý.

!! Quán niệm thân trong thân

Khi thực tập chánh niệm về thân, chúng ta biết những gì đang xảy ra trong thân thể. Chúng ta nhận diện những bộ phận của thân thể chúng ta. Chúng ta nhận diện những tư thế và những động tác của thân thể ta: đi, đứng, nằm, ngồi, cúi đầu xuống, co tay lên, lau nhà, rửa chén… Và tiếp đến chúng ta nhận diện những yếu tố tạo thành ra thân thể ta như chất đặc, chất lỏng, hơi nóng và không khí, gọi là tứ đại (maha bhuta): đất, nước, lửa, gió. Tôi đang thở vào và nhận diện yếu tố đất ở trong tôi. Thở vào như vậy, ta nhận ra yếu tố đất trong ta. Đất này không phải là đất bám ngoài da khi chưa đi tắm đâu. Đất nằm ngay ở trong máu, trong tim, trong óc. Sau này ta sẽ nhận diện yếu tố đất bên ngoài đang nuôi dưỡng ta, để thấy ta không phải chỉ ở bên trong, ta còn ở bên ngoài. Từ đó ta sẽ đi tới cái thấy về tính chất bất sinh và bất diệt. Tôi đang thở vào và thấy yếu tố đất trong tôi, tôi đang thở ra và cười với yếu tố đất trong tôi. Tôi đang thở vào và nhận diện yếu tố lửa trong tôi. Nếu không có sức nóng thì làm gì có sự sống? Ta phải thấy được sức nóng ở trong ta, rồi thấy năng lượng mặt trời ở ngoài đang nuôi dưỡng ta. Tôi đang thở ra và tiếp xúc với yếu tố nước ở trong tôi. Trong thân thể ta, ít nhất bảy mươi phần trăm trọng lượng là nước. Sau này, ta sẽ nhận diện sự có mặt của yếu tố nước ngoài thân thể, để thấy rằng ta thật không phải ở trong cũng không phải ở ngoài. Rồi đến không khí. Tất cả những thực tập đó đều thuộc về lĩnh vực mà trong Kinh dạy là quán niệm thân thể trong thân thể (the contemplation of the body in the body).

Quán niệm ở đây không có nghĩa là nhìn ngắm với tư cách một quan sát viên, mà phải đặt mình vào trong đối tượng quán chiếu. Người quán niệm với đối tượng quán niệm là một. Nếu ta đóng vai một quan sát viên thì sự quán sát vẫn có tính cách nhị nguyên, tức là có sự tách rời giữa người quán sát và vật được quán sát. Thực tập theo Kinh Niệm Xứ, ta phải quán chiếu như thế nào để ta với đối tượng quán chiếu trở thành một. Cho nên Kinh nhấn mạnh là quán niệm thân thể trong thân thể. Chúng ta tưởng tượng: có một anh đi xin việc. Người chủ hãng ngước nhìn anh từ đầu tới chân, đánh giá. Con mắt nhìn đánh giá đó có tính cách nhị nguyên. Ông chủ hãng và anh xin việc hoàn toàn khác biệt. Nhưng ta cũng có thể có một cách nhìn khác. Ta nhìn người ấy, tự đặt ta vào người ấy. Ông chủ biết rằng người xin việc đang run. Một tiếng ‘‘có’’ hay ‘‘không’’ của ông có thể quyết định số phận của người ấy. Nếu ta đặt ta vào hoàn cảnh của anh, của gia đình anh, của tâm tư anh, thì ta mới hiểu được anh. Cách thứ hai này chính là cách Bụt dạy quán chiếu. Khi quán chiếu, ta đừng dùng cái trí năng, cái intellect của ta, đừng đứng ngoài đối tượng của sự quán chiếu. Quán chiếu như thế nào để chủ thể và đối tượng trở thành một thì mới đúng là quán chiếu theo tinh thần đạo Bụt. Đó gọi là vô phân biệt trí. Tiếng Pháp có động từ comprendre, tức là hiểu. Động từ đó gồm tiếp đầu ngữ com và động từ prendre. Prendre tức là cầm lấy. Com tức là trở thành một với cái đó. Khi hiểu một người nào thì mình phải trở thành một với người đó, như vậy mới thật sự là hiểu. Đó là tinh thần quán chiếu của đạo Bụt.

Quán niệm thân thể trong thân thể, quán niệm cảm thọ trong cảm thọ, quán niệm tâm hành trong tâm hành. Luôn luôn Bụt lặp đi lặp lại như vậy. Có lần tôi đặt câu hỏi: ‘‘Tại sao phải lặp lại quán niệm thân thể trong thân thể?’’ Một vị Phật tử trả lời: ‘‘Như vậy để người nghe chú ý rằng đây là thân thể chứ không phải là tâm hành hay là cảm thọ.’’ Nói vậy là không hiểu ý Bụt. Theo phương pháp đạo Bụt, câu trên phải được hiểu là trong khi quán niệm ta phải xóa bỏ ranh giới giữa chủ thể và đối tượng.

Trong phần quán niệm thân thể trong thân thể, Bụt dạy đến việc theo dõi hơi thở. Hơi thở thuộc về lĩnh vực của thân, vì hơi thở liên hệ tới phổi, tới những bắp thịt của hoành cách mô. Nhưng hơi thở còn là một cây cầu bắc từ thân sang tâm. Vì vậy, theo dõi hơi thở giúp ta phát khởi và duy trì chánh niệm một cách kỳ diệu. Người tu học không nắm vững phương pháp quán niệm hơi thở thì rất khó thành công. Trong khi quán niệm về thân thể, về các bộ phận, các tư thế, các động tác và về tứ đại trong thân thể, nếu biết sử dụng hơi thở có ý thức, ta sẽ thành công gấp trăm, gấp ngàn lần. Hơi thở có ý thức (la respiration consciente) giúp ta duy trì đối tượng đang quán chiếu, và nuôi dưỡng chánh niệm, không để cho tan loãng.

Hơi thở có thể là đối tượng đơn thuần của chánh niệm, hoặc cùng đi đôi với một đối tượng khác. Tôi đang thở vào và tôi biết tôi đang thở vào; tôi đang thở ra và tôi biết tôi đang thở ra. Tôi đang thở vào một hơi dài và tôi biết tôi đang thở vào một hơi dài; tôi đang thở ra một hơi dài và tôi biết tôi đang thở ra một hơi dài. Tôi đang thở vào một hơi ngắn và tôi biết tôi đang thở vào một hơi ngắn; tôi đang thở ra một hơi ngắn và tôi biết tôi đang thở ra một hơi ngắn. Đó là nhận diện hơi thở, biết được chiều dài ngắn của hơi thở. Trong trường hợp này, hơi thở là đối tượng đơn thuần của chánh niệm, gọi là hơi thở chánh niệm (mindfulness of breathing). Chúng ta nên nhớ chánh niệm luôn luôn là chánh niệm về một cái gì (mindfulness is always mindfulness of something). Không thể có chánh niệm mà không có đối tượng.

Điều này cũng áp dụng với tất cả các tâm hành. Niệm là một trong năm mươi mốt tâm hành. Dùng tâm hành chánh niệm ta quán chiếu các tâm hành khác. Tôi đang thở vào và làm an tịnh sự vận hành của thân thể tôi; tôi đang thở ra và làm an tịnh sự vận hành của thân thể tôi. (Breathing in, I calm the activity of my body. Breathing out, I calm my body). Trong trường hợp này, đối tượng của chánh niệm vừa là hơi thở vừa là tình trạng của thân thể. Đối tượng chánh niệm không còn thuần là hơi thở nữa. Những vận hành của thân thể gọi là thân hành. Dùng hơi thở để làm cho thân thể mình yên tịnh lại, đó gọi là an tịnh thân hành. Đối tượng chánh niệm ở đây tuy là hơi thở nhưng hơi thở đó chuyên chở cảm thọ về thân thể, giúp cho thân thể êm dịu lại.

Thân thể ta đôi khi bất an như trong trạng thái gọi là trạo cử, một trong 51 tâm hành. Trạo cử tức là chộn rộn, muốn múa máy, muốn cựa quậy, cả thân lẫn tâm, đứng không yên, ngồi không yên, như trên đống lửa. Thân và tâm đều như đang bốc cháy, ta muốn đứng dậy, muốn nhảy, muốn làm một cái gì. Tâm hành đó gọi là trạo cử. Tâm có thể bị trạo cử, và thân cũng vậy. Những lúc có trạo cử ta phải dùng phương pháp quán niệm hơi thở để làm cho thân tâm an tịnh lại. Theo kinh nghiệm của thiền môn, mỗi khi tâm hay thân bị trạo cử thì người ngồi thiền tập trung ý niệm vào nơi rốn. Vừa thở và vừa chú ý tới bụng mình đang lên xuống theo. Tôi đang thở vào và biết rằng bụng tôi đang phình ra, tôi đang thở ra và biết rằng bụng tôi đang xẹp xuống. Tôi đang thở vào và làm cho thân tôi an tịnh, tôi đang thở ra và làm cho thân tôi an tịnh. Khi ta chú ý vào huyệt đan điền nơi bụng thì máu sẽ dồn xuống đó, và trên đầu sẽ bớt nóng. Thân và tâm ta sẽ bớt lăng xăng. Những lúc buồn ngủ, ta lâm vào trạng thái hôn trầm (sleepiness). Khi bị hôn trầm thì ta làm ngược lại, nghĩa là đem sự chú ý của mình lên trên chóp mũi. Thở vào, ý thức rằng hơi thở đang đi vào cơ thể mình qua lỗ mũi. Thở ra, ý thức rằng hơi thở đang từ hai lỗ mũi đi ra. Làm như vậy máu sẽ dồn lên phía trên, sau một vài phút ta sẽ thấy tỉnh táo hơn. Đó là phương pháp các thầy từng sử dụng ở chùa lâu nay. Nếu ngồi thiền một mình thì ta có thể đứng dậy, đi kinh hành. Còn nếu ngồi thiền với đại chúng, sợ đứng dậy sẽ làm động chúng, ta nên thực tập theo cách thức trạo cử đi xuống, hôn trầm đi lên.

!! Rửa chén hay chép kinh trong chánh niệm

Kỳ trước chúng ta đã nói tới như lý tác ý. Như lý tác ý là để ý tới những đối tượng có thể giúp ta đi về hướng chánh niệm, đi về hướng hiểu biết và thương yêu. Ví dụ khi nghe tiếng chuông, ta nhớ trở về với hơi thở chánh niệm và mỉm cười. Tiếng chuông trở thành một yếu tố giúp chúng ta thực tập như lý tác ý. Còn nếu chú ý tới một hình ảnh hay một âm thanh có công dụng kéo ta đi về quá khứ, đưa ta bập bềnh trên biển tương lai, hay khiến ta bị giam hãm trong những tâm trạng buồn khổ, lo phiền, thì đó gọi là phi như lý tác ý.

Sống ở trong một tăng thân, ta phải tạo cho mình và mọi người những cơ hội để được thức tỉnh, để ai nấy có thêm những giây phút như lý tác ý. Khi bước vào bếp thấy anh rửa bát, tôi hỏi: ‘‘Anh đang làm gì đó?’’ Đó là một phương cách giúp anh như lý tác ý. Nếu anh chỉ biết trả lời: ‘‘Thưa thầy, con đang rửa bát.’’ thì anh còn dở quá đi! Tôi hỏi như vậy với mục đích là giúp anh trở về với hơi thở, để anh thấy được rửa chén trong chánh niệm là một động tác mầu nhiệm. Nếu ta rửa chén với chánh niệm và nụ cười thì việc rửa chén trở nên một niềm vui. Còn nếu ta đang rửa chén với sự bực bội: ‘‘Tại sao người ta đi ngủ hết rồi mà mình còn đứng đây?’’ thì anh đang ở địa ngục. Câu hỏi của tôi giúp anh thực tập như lý tác ý, trở về với chánh niệm, với tịnh độ. Còn nếu tôi không có đó thì anh phải tự hỏi mình. Nếu anh tự thấy đang thất niệm, đang lẩn quẩn trong nỗi buồn bực vì nghĩ rằng mình rửa bát mà người khác đang ngủ, thì anh phải trở về hơi thở. Hơi bực dọc một chút thì anh tự hỏi: ‘‘Ta đang làm gì đây?’’ Đang rửa bát mà đầu ta suy nghĩ từ chuyện này đến chuyện khác cũng vậy. Đó không phải là như lý tác ý. Thực tập chánh niệm là khi rửa bát ta chỉ rửa bát mà thôi. Phải rửa bát như là ta đang ở trong tịnh độ. Rửa bát với hơi thở và với nụ cười thì cũng giống như ta đang tắm cho một đức Bụt sơ sinh.

Cho nên lúc nhận ra là ta đang rửa chén vội vàng, ta chỉ muốn làm cho xong, thì ta phải như lý tác ý. Ta nói: ‘‘Mình đang làm gì đây?’’ Nếu sư chú không thực tập được như vậy thì uổng cả cuộc đời tu! Dầu sư chú có rửa được sáu, bảy ngàn cái chén mỗi ngày thì công đức của sư chú cũng chỉ bằng hạt cát. Cho nên khi vua Lương Vũ Đế hỏi thầy Bồ Đề Đạt Ma: ‘‘Lâu nay tôi làm được bao nhiêu chùa, tô bao nhiêu tượng, vậy tôi có công đức không?’’ Thầy Bồ Đề Đạt Ma nói : ‘‘Không có công đức gì hết’’. Nếu sư chú hay sư cô làm việc quần quật suốt ngày, nghĩ rằng đang đem hết thân mạng của mình để phụng sự Tam Bảo, nhưng trong khi làm việc sư chú và sư cô làm không có chánh niệm và an lạc, thì công đức của sư chú và của sư cô cũng rất ít! Quý vị cũng vậy, quý vị có thể là y tá, là bác sĩ, là người bảo vệ sinh môi. Nếu quý vị làm quần quật suốt cả đời, nghĩ rằng mình đang cứu vớt nhân loại, mình đang bảo vệ trái đất, nhưng quý vị không sống đích thực, sống không chánh niệm, thì quý vị cũng bị thầy Bồ Đề Đạt ma sổ toẹt thôi. Điều quan trọng là trong giây phút hiện tại ta có sống hay không? Giây phút đó có hạnh phúc, có an lạc, có ánh sáng của Bụt chiếu tới, hay không?. ánh sáng của Bụt ở đây là chánh niệm. Mỗi khi có chánh niệm là ta có ánh sáng ấy. Ta không cần phải trở lui hai ngàn sáu trăm năm trước để gặp Bụt mới có ánh sáng đó. Ta có thể tiếp xúc với Bụt trong bất cứ giây phút nào, tại vì chánh niệm là Bụt, là giác ngộ.

Chánh niệm nhiều khi được tạo ra từ thất niệm. Cũng như hoa sen sinh ra tự trong bùn. Muốn có chánh niệm, muốn nuôi dưỡng chánh niệm, ta có thể sử dụng ngay những chất liệu phiền não. Những đau buồn và sầu hận của ta, cũng như tất cả những rác rến khác ở trong ta, nếu biết cách ta có thể ủ chúng làm phân bón. Từ phân bón đó có thể sinh ra những bông hoa chánh niệm rất tươi đẹp. Đó là Bụt ở trong tự thân của chúng ta.

Cho nên khẩu quyết đưa ra rất đơn giản: ‘‘Ta đang làm gì đây?’’ là một tiếng chuông chánh niệm rất lớn. Ta đang phung phí đời ta vào việc gì vậy? Ngay trong lúc ta chép kinh hay tụng kinh cũng vậy nữa. Có khi ta chép kinh và tụng kinh trong thất niệm, đó cũng là làm phí cuộc đời. Đừng tưởng chép kinh thì tự nhiên có công đức. Chép kinh không chánh niệm thì công đức là số không.

!! Hiện pháp lạc trú

Câu hỏi: ‘‘Ta đang làm gì đây?’’ là tiếng chuông chánh niệm đầu. Câu hỏi tiếp theo: ‘‘Ta làm việc này để làm gì?’’ Rửa bát không phải chỉ là để có bát sạch mà ăn cơm. Nếu quả như vậy thì công đức rửa chén còn nhỏ lắm. Rửa nồi mà chỉ để cho có cái nồi sạch thì công đức cũng nhỏ. Nhưng nếu ta biết chùi nồi trong chánh niệm, chùi nồi như đang ngồi ở cõi tịnh độ nâng niu một đóa hoa sen thì công đức ta sẽ vô lượng. Hai câu hỏi trên giúp ta an trú trong hiện tại. Tuy rằng công việc ta làm có thể chậm hơn một chút, nhưng ta trở nên thư thái và có hạnh phúc ngay trong khi làm việc. Những điều này rất cụ thể, đơn giản, rất thực tế, nếu đem ra thực hành sẽ thấy.

Đôi khi ta nghĩ ta chỉ muốn làm những việc rất quan trọng, như thuyết pháp, chép kinh, dịch kinh. Nhưng nếu ta không sống an lạc và thoải mái trong những giây phút ấy thì công đức vẫn không có gì.

Tu tức là một cuộc trở về. Xuất gia là sự trở về nhưng xuất gia chưa phải là tu. Cách đây năm năm, có một ông ở Xóm Thượng hỏi: ‘‘Đi tu có dễ không?’’ Tôi nói: ‘‘Đi tu thì dễ, chỉ tu mới khó.’’ Thì đi tu nghĩa là phát nguyện trở về. Và con đường về có đèo, có suối, ta phải leo, phải vượt. Tuy rằng đường có đèo, có núi, phải leo phải vượt, nhưng ta vẫn có thể có hạnh phúc. Chúng mình có thể leo núi Linh Thứu với nhau. Mỗi bước chân đi đem tới bao nhiêu an lạc, bao nhiêu hạnh phúc. Mà leo núi Thứu ta đâu cần phải qua tận bên Ấn Độ. Núi Thứu là đây. Đi thiền hành với nhau, những bước chân thảnh thơi, có khả năng đưa ta về an trú trong hiện tại, thì đây là núi Thứu. Điều quan trọng là chúng ta có ý chí, có nguyện vọng muốn trở về. Trở về với tư cách một tăng thân thì sẽ dễ dàng hơn. Từ khi sinh ra đến giờ, chúng ta được huấn luyện phải lo cho tương lai. Mới có ba, bốn tuổi mà đã bắt đầu phải lo cho ngày mai, cái đó đâu chắc đã là hay. Khi mải miết làm việc này hay việc kia, ta bị cái tập khí ‘‘lo cho hạnh phúc ngày mai’’ điều khiển. Và đó là một chướng ngại rất lớn cho sự tu học và cho sự an lạc của mình. Làm cái gì cũng là để xây dựng cho ngày mai hết, còn hôm nay chỉ đáng để hy sinh thôi. Nhan nhản xung quanh ta biết bao nhiêu người dạy ta phải hy sinh hiện tại cho tương lai, ‘‘Ngày nay nước bạc, ngày sau cơm vàng.’’

Câu thơ ‘‘Vui trong tham dục, vui rồi khổ. Khổ để tu hành, khổ ấy vui’’ ngụ ý tu hành thì phải khổ. Tại sao tu hành phải khổ? Bụt dạy rằng: ‘‘Pháp của ta là an lạc trong hiện tại và an lạc trong tương lai.’’ Vì vậy châm ngôn của đạo Bụt là hiện pháp lạc trú. Hiện pháp lạc trú (drstàdharmasu Khavihara) nghĩa là an trú hạnh phúc ngay trong hiện tại. Hiện pháp, drstadharma, tức là bây giờ, ở đây. Nếu chúng ta đày đọa thân tâm trong khi tu học là chúng ta đi ngược lại lời Bụt dạy. Chúng ta phải cố gắng để thực hiện phương châm tu học đích thực của đạo Bụt cho chúng ta và cho những người xung quanh. Đó là hiện pháp lạc trú.

Quét nhà, gánh nước, nấu cơm, rửa nồi, ta phải tổ chức như thế nào, phải sắp đặt như thế nào để có thể làm được những công tác đó một cách thoải mái, không gấp gáp. Và khi đầu óc ta miên man lo lắng về những gì phải làm ngày mai, những lúc chúng ta đang có trạo cử, chúng ta nên thực tập như lý tác ý. Phải lập tức nhớ bài kệ để thực tập. Đã về, đã tới, bây giờ, ở đây. Nhà của ta là hiện pháp, là bốn lĩnh vực: thân, thọ, tâm, pháp, trong hiện tại. Phải trở về ngay lập tức. Bước một bước ta thở vào và ta nói: đã về. Bước một bước khác, thở ra, ta nói: đã tới. Tự nhiên bao nhiêu phiêu lưu và rong ruổi của tâm ý đều bị cắt đứt hết. Và ta bước những bước chân thảnh thơi trong an lạc.

Phương pháp này phải thực tập trong khi ngồi thiền, đi thiền, trong khi ăn cơm, uống nước. Ta thực tập trong khi làm việc, trong khi ngồi với thầy, với bạn. Và ta thấy rõ ta có khả năng an trú trong hiện tại. Khả năng sống hạnh phúc trong hiện tại (the capacity to be happy in the present moment), đó là điều đáng ca ngợi nhất. Người không có khả năng sống hạnh phúc trong hiện tại, người đó rất nghèo, rất khổ. Chỉ những người có khả năng ngồi, đứng, đi, nằm, và mỉm cười với những gì đang xảy ra trong hiện tại, mới là những người có hạnh phúc thực sự. Bụt là một người như vậy. Ngài chỉ cần bước chân đi thôi, mà đi bước nào là tới bước đó. Đi mà không cần lo tới, vì mỗi bước chân đều đưa ta tới hết. Mỗi bước chân đưa ta tới hiện tại, đó là phép thiền hành của chúng ta. Cho nên về Làng Mai mà quý vị nếu không thực tập thiền hành thì quý vị đâu có thực sự về Làng. Tuy nói là ở Làng mà kỳ thực quý vị đang ở chỗ khác. Mỗi bước chân, dầu ta đi vào bếp hay đi sang cầu tiêu, cũng phải bước đi như bước đi trên tịnh độ. Mỗi bước chân đi vào tịnh độ, bài tụng đó để nhắc nhở ta chứ không phải là một lời cầu nguyện. Chúng ta phải tu mà đừng nhờ Bụt tu dùm. Khi làm thị giả cho thầy, ta biết rằng cái lợi lạc nhất là được thấy thầy làm việc này, việc kia. Nếu thầy an trú trong hiện tại, nếu thầy có hạnh phúc trong hiện tại, thì ta cũng học được phép an trú đó. Không phải làm thị giả để được học những điều gì khác.

!! Đâu chẳng phải là nhà

Đây là một bài thực tập :

<<<
Đã về Đã tới  <br>
Bây giờ Ở đây  <br>
Vững chãi Thảnh thơi  <br>
Quay về Nương tựa
<<<

Đã về, đã tới. Thở vào một hơi, ta nói: Đã về rồi. Không cần phải làm một việc gì khác nữa. Việc làm quan trọng nhất là sự về nhà. Mỗi bước chân đi đều có an lạc. Mỗi bước chân đi vào tịnh độ. Cũng trên mặt đất này nhưng có người đang bước đi như bước trong địa ngục. Còn ta đang bước trên tịnh độ vì ta đã về. Nơi nào cũng là nhà. ‘‘Đại thiên sa giới ngoại, hà xứ bất vi gia?’’ Trong tam thiên đại thiên thế giới này, chỗ nào chẳng phải là nhà của mình? Đó là hai câu thơ của một thiền sư đời Lý, tên là Thường Chiếu. Nếu cùng đi với đại chúng mà đi mau hơn, ta có thể trong khi thở vào, bước hai hay ba bước (đã về, đã về, đã về), thở ra (đã tới, đã tới, đã tới). Đi thiền hành là một niềm vui. Leo núi Thứu ta bước như vậy, mà bước trên đồi Meyrac ở Làng Mai, ta cũng bước như vậy. Ta có thể gặp Bụt bất cứ lúc nào nếu ta thực tập đã về, đã tới. Chỉ thực tập như vậy, cũng đủ mang lại rất nhiều hạnh phúc rồi, chứ đừng nói là tu tập nhiều hơn.

Sau khi thực tập 5 phút hoặc 10 phút, ta có thể tập đến các câu kế tiếp: bây giờ, ở đây. Khi thở vào, bây giờ, bây giờ; khi thở ra, ở đây, ở đây, Nhưng ta không được lặp lại những quán ngữ ấy như một con vẹt: bây giờ, bây giờ, ở đây, ở đây. Ta phải làm sao để cho ta thực sự an trú ở giây phút hiện tại thì đó mới là bây giờ và ở đây. Có những người niệm Bụt mà không đủ chánh niệm. Niệm Bụt như một con vẹt thì dù có niệm 52 vạn tiếng, công đức cũng là số không. Các câu ‘‘bây giờ và ở đây’’, nếu lặp lại mà thiếu chánh niệm, thì chi bằng ta thâu chúng vào băng cassette để phát ra cho dễ có công đức! Nhưng chúng ta nhất định không làm cái máy cassette. Khi thở vào (bây giờ, bây giờ) ta thấy rất rõ ta đang an trú trong giờ phút hiện tại. Ta an trú ở đây. Ta đang ở Làng Mai thì Làng Mai là tịnh độ. Chừng nào ta về Úc, thì Úc là tịnh độ. Chừng nào về Houston, thì Houston là tịnh độ. Còn bây giờ ở Làng thì Làng còn là tịnh độ của ta.

Có khi ta thực tập đã về, đã tới, mà mới chỉ về chỉ tới được có 30 phần trăm thôi. Vì ta đang còn bị lôi kéo bởi quá khứ và tương lai. Nhưng càng thực tập ta càng về được nhiều hơn. Đến khi thực tập sang câu ‘‘bây giờ và ở đây’’, ta có thể đã về tới 80 hoặc 90 phần trăm, có khi 100 phần trăm. Bước chân ta đã thực hiện được sự trở về 100 phần trăm, đó là bước chân của tượng vương, của con voi chúa. Bước chân của Bụt bước nào cũng như vậy. Mỗi bước chân đều vững chãi như bước chân tượng vương.

Sau khi thực tập và biết là mình đang ở đâu rồi, thì hạnh phúc tự nhiên có mặt. Ta sẽ tập tiếp ‘‘Vững chãi, thảnh thơi’’. Đây là hai thuộc tính của niết bàn. Khi nếm được an lạc của niết bàn thì ta có sự vững chãi, thảnh thơi. Thảnh thơi tức là không bị ràng buộc, không làm nô lệ cho quá khứ, cho tương lai, cho sự thèm khát, giận hờn, lo lắng, buồn phiền. Ta là con người tự do. Chỉ cần đi trong hai điều kiện này thôi là ta có hạnh phúc tràn trề rồi. Hạnh phúc đó nuôi dưỡng ta và trị liệu những khổ đau trong ta. Cả những khổ đau đã được truyền lại từ nhiều thế hệ tổ tiên, ta cũng có thể chuyển hóa. Chúng ta có thể đã tiếp nhận bao nhiêu khổ đau của nhiều thế hệ. Nhưng nếu ta biết phát khởi chánh niệm và dùng năng lượng chánh niệm để trở về, để tiếp xúc được với những hạt giống an lạc, hạnh phúc trong bản thân ta, thì sự vững chãi, thảnh thơi đạt được sẽ chuyển hóa và trị liệu những nỗi khổ và niềm đau ấy.

Sự thực tập của ta là quy y, nghĩa là quay về nương tựa. Quay về đây tức là quay về với gốc rễ của mình. Gốc rễ Bụt, Pháp, Tăng vốn sẵn ở trong lòng ta. Ta không còn sợ hãi nữa. Như một đợt sóng. Đợt sóng có lên có xuống, nhưng khi đợt sóng quay về với nước, biết mình là nước rồi, thì không còn sợ hãi nữa. Quay về với bản tánh tự tâm của mình, với chân như, với giác tính, là ta không còn sợ hãi. Lên cũng được, xuống cũng được, sống cũng được, chết cũng được. Không có gì thêm, không có gì bớt cả. Đó gọi là quay về nương tựa. Đây là một bài thực tập rất đơn giản cùng với nhiều bài thực tập khác mà chúng ta phải nắm cho vững. Bài thực tập này có thể được sử dụng trong khi ngồi thiền, trong khi đi thiền hành, trong khi làm việc, trong khi nấu cơm, trong khi ăn cơm. Ăn cơm cho có an lạc, ngồi ăn như ngồi ở tịnh độ. Nếu ăn cơm mà không có hạnh phúc, không có thảnh thơi thì ta đã thực tập sai. Đừng nói: ‘‘Ăn cho mau xong để còn đi ngồi thiền.’’ Nói thế là không đúng. Tại vì ăn cơm cũng có giá trị tương đương với ngồi thiền. Phải ăn cơm trong chánh niệm. An lạc từng giây phút, đó là thiền. Cho nên chúng ta có thiền đi, thiền ngồi, thiền trà, thiền ăn, thiền nói. Cái gì cũng có chất thiền. Thiền ở đây chỉ có một nghĩa thôi, đó là sự có mặt của chánh niệm. Hễ có mặt của chánh niệm thì bất cứ việc gì ta làm đều trở thành thiền hết. Và nếu có chánh niệm tức là ta đang ở cõi tịnh độ, ta đang tiếp xúc với gốc rễ tâm linh của ta.
! Bài 09 Chánh niệm và 51 tâm hành

Hôm nay là ngày 19 tháng Chạp năm 1993, chúng ta học tiếp về bát chánh đạo. Hôm trước chúng ta đã vẽ một trái quít, năm múi tượng trưng cho năm uẩn: sắc, thọ, tưởng, hành và thức. Hôm nay chúng ta vẽ một cái nhà hai tầng. Tầng dưới là Thức uẩn và tầng trên là Hành uẩn.

!! Chánh niệm và 51 tâm hành

Hành uẩn ở trên đây gồm đủ 51 tâm hành, trong đó có cả Thọ và Tưởng, tức là cảm thọ và tri giác, và 49 hành khác.

Thức uẩn là phần căn bản của tâm thức. đạo Bụt đại thừa (học phái Duy Thức) gọi là Thức A lại da (Alaya) hay Tàng thức. Alaya có nghĩa là hàm tàng, kho cất chứa. Ví dụ lòng đất chứa đựng những hạt giống. Khi những hạt giống ở trong đất tâm phát hiện ra, đó là những tâm hành (mental formations). Từ là một tâm hành, Tầm là một tâm hành, Thọ là một tâm hành, Tưởng là một tâm hành. Hành có nghĩa là phát hiện và lưu hành. Sau khi phát hiện rồi những tâm hành sẽ biến trở lại thành những hạt giống mới. Chúng ta thường ví dụ Thức là cái nhà kho ở dưới và Hành là phòng khách ở trên. Những hạt giống của tâm thức ở dưới nhà kho, phát hiện lên phía phòng khách ở trên, tồn tại một thời gian rồi nó trở lại xuống dưới, lại mang hình thái hạt giống.

Trong số 51 tâm hành có Tầm (vitarka) và Từ (vicara), tức là tác dụng liên tưởng và tư duy, có hạt giống ở trong tàng thức. Tuệ giác của chúng ta cũng tồn tại dưới hình thức những hạt giống ở trong tàng thức. Thường tiếng Anh dịch Tầm là thought, conception. Từ dịch là the continuing activity of the mind. Tầm và từ là ngữ ngôn của ý, như chúng ta nói thầm ở trong ý, trong tâm. Trong trí ta các tâm hành tầm và từ luôn luôn đang hoạt động mà chúng ta không nghe thấy. Ví như chúng ta mở máy phát thanh nhưng không nghe được vì không cắm giây nối vào loa phóng thanh. Khi tư duy chuyển sang ngữ ngôn thì tầm và từ phát hiện trong tiếng nói, như cắm loa phóng thanh vào thì tự nhiên phát ra tiếng. Nhưng trong thức của chúng ta cũng còn có những hạt giống khác, đồng thời phát hiện, để chọn lựa những điều muốn phát thanh ra. Cũng như tầm và từ được kiểm soát, được nhuận sắc. Có nhiều người bệnh tới một bác sĩ tâm lý trị liệu, biết rằng muốn lành bệnh thì phải nói hết cho bác sĩ nghe, nhưng họ vẫn che dấu, hoặc thêm bớt, tô điểm. Vị bác sĩ giỏi có khi bất chợt hỏi một câu, bệnh nhân buột miệng nói. Bác sĩ nhờ câu nói đó mà nắm được một điều, khám phá ra những sự thật ẩn chứa trong tâm người bệnh.

Khi có chánh niệm, ta biết ta đang nghĩ gì, ta tự biết những suy tư đó có phù hợp với chánh pháp không, có phù hợp với nguyên tắc của bốn sự thật, với quan niệm về bốn loại thức ăn hay không. Chánh niệm giống một cây đèn thắp lên trong cái phòng khách phía trên, phòng của tâm hành, soi rõ hình dáng của tầm và của từ. Nhờ đó ta biết ta đang suy tư những gì và, nếu thực tập giỏi hơn, biết được nội dung và bản chất của điều ta suy tư. Biết được như vậy thì tự nhiên tầm và từ thay đổi, đó là nhờ chánh niệm.

Hạt giống chánh niệm là một hạt giống rất quý trong đất tâm. Biết sử dụng thì hạt giống chánh niệm, khi phát hiện thành tâm hành, sẽ đóng vai trò soi sáng, dẫn đường và chuyển hóa. Có chánh niệm, chúng ta sẽ biết tư duy của ta là thiện hay bất thiện, có tác dụng gây tai hại hay không. Khi tầm và từ phát ra thành lời nói, chánh niệm vẫn tiếp tục soi sáng để ta biết ngôn ngữ của ta có phải là ái ngữ hay không. Phát xuất từ chánh kiến, tầm và từ là chánh tư duy. Ngôn ngữ phát xuất từ chánh tư duy là chánh ngữ. Cho nên ngọn đèn chánh niệm rất quan trọng.

Có khi những khổ đau và nội kết chìm sâu trong tâm thức quá lớn. Những giận hờn, bực tức, thất vọng và những thèm khát của chúng ta, đôi khi không cần đi qua trung gian của tầm, từ mà cũng tự phát thành ngôn ngữ. Những nội kết của ta cũng trực tiếp biểu hiện ra bằng ngôn ngữ khi ta không đủ chánh niệm, không đủ sức kiểm soát tất cả những niềm đau, cơn giận, nỗi buồn phiền, thất vọng của mình. Chúng ào ra thành những tiếng gào thét, khóc lóc, chửi rủa, hoặc những lời than vãn và kể lể. Người bác sĩ tâm lý có tài có thể làm cho người bệnh nói ra được điều họ thường che giấu một cách ý thức hay vô thức. Người ấy nói một câu làm động tới một điều sâu kín trong lòng người bệnh; người này tự nhiên mở ra tất cả những điều chất chứa, dù muốn che dấu cũng không được. Trong câu chuyện hàng ngày ta có những bước trượt của vô thức, những câu nói lỡ lời. Ta phải thấy mối liên hệ giữa chánh ngữ và tri giác, giữa chánh ngữ và thất niệm, giữa chánh ngữ với tập khí. Và cuối cùng chánh ngữ liên hệ với bồ đề tâm và từ bi tâm. Khi ta có tình thương, có ý chí muốn cứu giúp người thì năng lượng của bồ đề tâm sẽ là một yếu tố rất quan trọng giúp biểu hiện ra chánh ngữ. Bằng chánh ngữ chúng ta có thể giúp người khác thấy được nỗi khổ, niềm đau và nhìn rõ những khối nội kết của họ. Bằng chánh ngữ chúng ta có thể giúp cho người khác thấy được những hạt giống của hạnh phúc và của tài năng họ mà họ không thấy. Những hạt giống hạnh phúc và các tiềm năng ở trong tâm họ bị đè nén bởi những lớp khổ đau và phiền muộn cho nên không phát hiện ra được. Với chánh ngữ, chúng ta có thể tưới tẩm những hạt giống hạnh phúc và tài năng ấy để chúng tự khai mở.

!! Thực tập chánh niệm và chánh ngữ

Câu chuyện sau đây là một thí dụ về thực tập chánh ngữ. Có một phụ nữ người Pháp năm 18 tuổi không chịu đựng nổi gia đình nên bỏ sang nước Anh ở. Cô ấy giận mẹ, giận gia đình, cô muốn bỏ đi, vơinh viễn không trở lại. Nhưng hai chục năm sau, một hôm cái hạt giống quê hương, hạt giống thương mẹ trong cô nổi dậy. Người phụ nữ đó bắt đầu có ước muốn trở về Pháp và hòa giải với mẹ. Bà mẹ cũng đã bảy mươi mấy tuổi và cũng nhớ con gái. Bà tuy rất giận con nhưng trong lòng bà tất nhiên cũng có hạt giống thương con. ‘‘Giận thì giận mà thương thì thương’’. Trong tâm thức chúng ta có nhiều hạt giống trái chống nhau cùng một lúc.

Khi nghe nói con gái mình sẽ về, bà mẹ rất vui. Người con gái cũng nao nức về gặp để hòa giải với mẹ. Nhưng đến lúc hai mẹ con gặp nhau, hàn huyên được vài ba hôm, họ lại cãi nhau nữa. Trái bom chứa trong lòng người mẹ nổ. Trái bom trong lòng cô con cũng nổ. Mặc dù cả mẹ lẫn con đều có ý chí muốn hòa giải, muốn tha thứ, nhưng chánh kiến đó chỉ mới phôi thai là một ước muốn thôi. Trong khi đó thì trái bom nội kết ở trong cả hai người vẫn còn nặng. Khi ngồi xuống với nhau, họ lại vô ý tưới tẩm lên những hạt giống của bao nỗi niềm đau khổ cũ. Chúng phát hiện, biểu lộ thành ngôn ngữ. Ngôn ngữ nóng giận của người này tưới lên niềm đau khổ của người kia. Cho nên mỗi khi hai mẹ con gặp nhau lại sinh cãi cọ. Bao nhiêu lần đến gần nhau để hòa giải, bấy nhiêu lần họ thất bại.

Người thiếu phụ đã tới Làng Mai, tôi khuyên bà ta phải chờ đợi một thời gian. Một thời gian để tu tập chánh kiến, học sống chánh niệm trước khi về gặp mẹ. Trong thời gian đó người thiếu phụ tập thiền hành, thiền tọa, ăn cơm im lặng, sinh hoạt với đại chúng, nấu cơm, xách nước, giặt áo, v.v.. tham dự vào đời sống của tăng thân. Đây cũng là thời gian bà ta có dịp tưới tẩm những hạt giống hạnh phúc lâu nay bị bỏ quên. Trong tăng thân thế nào cũng có người có nụ cười, có lời nói, có khả năng giúp đỡ mình vén những tấm màn khổ đau đang che phủ tâm mình, và giúp mình tưới tẩm những hạt giống an lạc. Trong tăng thân thế nào cũng có người soi sáng cho mình thấy các sai lầm trong nhận thức của mình. Và trong thời gian đó, người thiền sinh có thể phát triển chánh niệm. Sự thực tập tại Làng Mai là thực tập chánh niệm, đi trong chánh niệm, đứng trong chánh niệm, ngồi trong chánh niệm, nấu cơm, giặt áo trong chánh niệm. Chánh niệm giúp mình thấy tâm tư của mình như thế nào. Chánh niệm cho mình thấy những vận dụng của tầm và từ. Chánh niệm giúp mình nhận ra tầm và từ của mình đã bắt nguồn từ những hạt giống nào. Tôi đề nghị với người thiếu phụ đó cứ mười ngày thì ngồi viết cho bà mẹ một lá thư, viết như một bài thực tập chánh niệm. Lá thư đó là hoa trái của quá trình tu học chánh niệm ở làng. Tôi đề nghị rằng trong lá thơ đó người con quán chiếu để thấy con người của bà mẹ và đồng thời cũng thấy được chính mình. Nghĩa là thấy những tập khí, những nỗi khổ, niềm đau, những hy vọng và thất vọng của chính mình và của mẹ. Viết là diễn đạt những tầm và từ của mình, một cách an toàn hơn, vì người kia chưa phải nghe. Và khi viết xong có thể để đó một thời gian rồi đọc trở lại, dùng chánh niệm xem những đoạn mình mới viết bắt nguồn từ những khối nội kết nào ra. Bởi vậy viết là một phương pháp thực tập chánh niệm. Ngồi viết một lá thư hay một bài văn trở thành một buổi thực tập chánh niệm. Đây không còn là một công việc nữa, mà là một phép thực tập. Cũng như khi ta rửa nồi hay lau nhà, nếu chúng ta biết thực tập chánh niệm thì đó không phải là công việc nữa. Đó là những phép tu, gọi là phép tu rửa chén, phép tu chùi nồi. Mà nếu chùi nồi chỉ để cho nồi sạch không thôi thì rất uổng. Việc chùi nồi phải dùng để thực tập như là một phép tu.

Khi ngồi viết một lá thư trong chánh niệm, người thiếu phụ đó đã tự nhìn lại mình, nhìn lại mẹ mình, đã thấy rõ nỗi khổ đau và những điều kiện để có hạnh phúc của cả hai mẹ con. Đời sống tu tập là cơ hội đầu tiên để tự khai mở cho mình và khai mở cho mẹ. Lá thư đó là một công trình thực tập. Nếu trong lá thơ đó người con lại cãi lý hoặc phân trần, thì lá thư sẽ không ích lợi gì cả. Lý luận và thanh minh chỉ tưới tẩm những hạt giống khổ đau của bà mẹ mà thôi. Viết như vậy vô ích. Viết như vậy chứng tỏ trong tư duy của mình, tầm và từ chưa được chánh niệm soi sáng, vẫn phát xuất từ những hạt giống tiêu cực. Nhưng nếu viết để nói về những điều kiện sẵn có của hạnh phúc mà mẹ chưa bao giờ sử dụng tới, thì người con làm một công việc trước đây chưa ai từng làm. Ông ngoại, bà ngoại chưa làm, trường học, xã hội chưa làm, bè bạn của mẹ cũng chưa làm. Bây giờ người con gái làm được, vì người ấy có chánh niệm. Thiếu phụ viết thư kể lể: ‘‘Mẹ ơi, con nhớ hồi con còn bé thơ,…’’ Kể một câu chuyện bình thường, nhưng để gợi ý và chứng tỏ cho mẹ thấy là bà có những hạt giống của hạnh phúc, của tình thương, những hạt ngọc ở trong tàng thức. Lá thư đó phải do công trình quán chiếu mới viết được.

Quán chiếu vào lúc nào? Quán chiếu khi rửa chén, khi lau nhà, khi đi thiền hành, khi ngồi thiền tọa. Viết lá thơ là kết quả những điều đã thấy trong khi quán chiếu. Và ta tiếp tục quán chiếu trong khi viết thơ, viết xong rồi thì tự nhiên thấy khỏe, và biết rằng mẹ mình đọc xong cũng sẽ thấy khỏe. Ta dùng ánh sáng của chánh niệm chiếu vào để thấy tác dụng của từng câu, từng chữ. Ta biết rằng lá thơ này phát xuất từ chánh kiến, từ chánh tư duy và được thể hiện bằng chánh ngữ. Mười ngày sau người con gái viết lá thư thứ hai, cũng tưới tẩm những hạt giống hạnh phúc của bà mẹ. Trong khi thực tập viết những lá thư như vậy, người con cũng tự tháo gỡ cho mình. Rồi khi bà mẹ đọc được một lá thư như thế thì bà mẹ cũng được tháo gỡ. Nếu người con thực tập đồng thời cho mình và cho mẹ thì chỉ trong sáu tháng hay một năm là hai mẹ con có thể gặp lại nhau. Lúc đó thì các niềm đau khổ đã chuyển hóa, vơi bớt đi nhiều, những niềm vui trong lòng đã phát triển. Chánh tư duy và chánh ngữ sẽ phát hiện. Hai mẹ con có thể nói chuyện với nhau. Người con không đợi cho người mẹ chuyển hóa rồi mình mới chuyển hóa. Chúng ta phải bắt đầu từ sự tu tập của chính mình. Một người tu mà hai người được lợi ích.

Viết văn, viết thư trong khi thực tập chánh niệm có khả năng tưới tẩm, chuyển hóa, có thể ảnh hưởng trên mình và trên người đọc, nhờ lời văn chuyên chở tuệ giác, chuyên chở chánh tư duy, vì văn đó là chánh ngữ. Chúng ta thường nói văn chương để chuyên chở đạo lý, ‘‘vặn dĩ tải đạo’’. Đó là nguyên tắc của người viết văn ở Đông phương. Viết văn không thể thiếu tinh thần trách nhiệm. Viết văn không chỉ để cào cấu những niềm đau khổ của mình làm cho người khác đọc cũng lây đau khổ, cũng bị cào cấu. Khơi lên những nỗi bực dọc và chán chường vô ích rồi vung vãi cho tất cả độc giả lãnh đủ, văn chương đó không phải là văn chương có đạo lý. Những bài hát, những bài văn đầu độc, làm cho con người hết ý chí sống, mất niềm tin, những loại văn nghệ như vậy phải xếp vào ‘‘Tập Đoạn Trường’’. Có những thanh niên, thiếu nữ nằm ôm máy nghe những bài hát rên rỉ, tưới tẩm những hạt giống phiền não, đau khổ của mình. Đó là ‘‘văn nghệ đứt ruột’’, không chuyên chở đạo lý. Cho nên người có chánh kiến, người có chánh tư duy phải dứt khóat với các loại văn nghệ đứt ruột. Không tiêu thụ những độc tố làm hại mình, hại người. Sự tu học của ta dính líu tới rất nhiều người khác: cha mẹ, anh chị em, bạn bè của ta, rồi xã hội bên ngoài. Những lá thư ta gửi cho cha, mẹ, anh, em phải có tác dụng chuyển hóa. Sự thành công tu học của ta trước hết được thể hiện qua sự chuyển hóa của gia đình, của những người thân thuộc. Những lá thư là chất liệu nuôi dưỡng, là những luồng gió mát, nâng đỡ, khai mở, mà nếu không tu tập thì ta không viết được. Cho nên người tu học ở đây viết những lá thư cho những người mình yêu thương, phải biết rằng những lá thư đó có giá trị tưới tẩm và chuyển hóa. Viết thư trong chánh niệm như vậy là một cách thực tập. Một lá thư như vậy có giá trị chuyển hóa rất lớn. Dẫu chúng ta không gặp khó khăn với mẹ như trường hợp người phụ nữ Pháp kể trên, ta cũng nên viết thư cho người thân, 10 ngày, 15 ngày một lần, ít nhất một tháng một lá thư. Viết để tu tập và hành đạo. Giá trị của lá thư tùy ở chánh kiến và chánh tư duy. Viết thư ‘‘thuyết pháp’’ một cách vụng về lại có tác dụng ngược lại. Đừng tưởng cứ thuyết pháp tức là hành chánh ngữ. Không có quán chiếu thì ngôn ngữ sẽ không phù hợp, người nhận sẽ không thích đọc, rồi sau này khi thấy thư họ sẽ không muốn mở ra nữa. Vì đó không phải là chánh ngữ, dù lá thư nói về tứ đế, thập nhị nhân duyên hay bát chánh đạo. Dù đề tài là Phật Pháp mà bài thuyết pháp không khơi động, không chuyển hóa được lòng người, thì đó cũng không phải là chánh ngữ.

!! Phép tu im lặng

Chánh ngữ là một phép thực tập cần đi trên quá trình văn, tư và tu. Đó là phần thế gian, phần hướng thượng. Khi sự thực tập chín dần chúng ta sẽ thấy được mặt xuất thế gian. Khi thực tập thiền quán, ban đầu chúng ta còn cần tới tầm và từ, tư duy và ngữ ngôn. Càng đi sâu vào thiền quán, chúng ta càng tiếp xúc được với bản môn, càng tự do ra khỏi tư duy và ngôn ngữ. Tới một lúc nào đó, hoàn toàn được tự do, chúng ta không còn lệ thuộc vào ngôn ngữ nữa. Tuệ giác siêu việt không cần ngôn ngữ nữa, gọi là ngôn ngữ đạo đoạn. Đây là một danh từ thiền. Ngôn ngữ đạo đoạn tức là con đường ngôn ngữ đã bị cắt đứt (the way of the speech is cut). Giống như chiếc xe lửa thấy đường rầy không cần thiết nữa, bởi vì nó đã cất cánh biến thành một chiếc máy bay. Nó bay lên trên không gian, hoàn toàn tự do.

Chánh tư duy khi đến mức xuất thế gian thì đạt tới tâm hành xứ diệt. Tâm hành xứ diệt là nơi mà các hoạt động tư duy tâm hành đều đã mất. Tâm hành ở phạm vi chánh ngữ tức là tầm và từ. Vì chân lý tuyệt đối hay tuệ giác siêu việt đã vượt thoát tất cả mọi tư duy, nên gọi là tâm hành xứ diệt. Vượt thoát tất cả mọi ngôn ngữ nên gọi là ngôn ngữ đạo đoạn.

Ở Việt Nam xưa có thiền phái Vô Ngôn Thông. Vô ngôn thông có nghĩa là sự thông cảm và hiểu biết được thực hiện không cần qua trung gian của lời nói. Tổ sư của phái Vô Ngôn Thông trước khi tịch đã để lại một bài kệ nhấn mạnh đến ý niệm chân lý vượt thoát mọi ngôn ngữ văn tự. Bài đó nó chấm dứt bằng hai câu: trực nhiêu vấn ngã, ngã bổn vô ngôn (ữừng hỏi tôi nữa, tôi vốn là vô ngôn). Tên ngài là Vô Ngôn Thông. Kinh Duy Ma Cật nói tới sự im lặng, thứ im lặng hùng hồn hơn bất cứ ngữ ngôn nào, gọi là im lặng sấm sét (thundering silence), chữ Hán là mặc như lôi. Lôi là sấm sét, mặc là im lặng. Trong đạo Nho, đức Khổng Tử cũng có lần nói: ‘‘Trời có nói gì đâu?- thiên hà ngôn tại?’’ Trời không nói gì cả, vì mình không biết lắng nghe. Nếu mình có chánh niệm, nếu mình biết lắng nghe thì mỗi bông hoa nở, mỗi tiếng chim hót, tiếng thông reo, đều là ngôn ngữ cả (tứ thời hành yên, vạn vật sinh yên). Kinh A Di Đà có câu là: ‘‘Mỗi khi gió thổi qua những hàng cây ở nước Cực Lạc phát ra những âm thanh kỳ diệu; nếu lắng tai thì họ nghe được các giáo lý như tứ diệu đế, ngũ cặn, ngũ lực, thất bồ đề phần và bát thánh đạo phần. Tất cả những chúng sanh ở nước Cực Lạc khi nghe những âm thanh đó thì lòng phát sinh chánh niệm về Bụt, Pháp và Tăng.’’ (xuất vi diệu âm, kỳ vi diễn xướng ngũ cặn, ngũ lực, thất bồ đề phần, bát thánh đạo phần, như thị đẳng pháp; kỳ độ chúng sinh văn thị âm dơi, giai phát niệm Phật, niệm Pháp, niệm Tăng chi tâm). Điều này cũng đúng với cõi Ta Bà của chúng ta. Nếu có chánh niệm, khi đi thiền hành, chúng ta sẽ nghe tiếng chim hay tiếng gió trong những cây phong hay những cây sồi, chúng ta cũng có thể nghe được giáo lý ngũ cặn, ngũ lực, thất bồ đề phần và bát thánh đạo phần. Nghe tiếng gió, tiếng chim, hay tiếng chuông đồng hồ, chúng ta có thể trở về với chánh niệm. Chúng ta niệm Phật, niệm Pháp, niệm Tăng và có thể sống cái kinh nghiệm của tịnh độ ngay ở đây và bây giờ. Đừng đợi chết rồi mới sống, hãy tập sống ngay bây giờ kinh nghiệm cõi tịnh độ. Trong Thánh Kinh có nói rằng mười điều rặn cấm của Chúa (the ten commendements) được mặc khải cho thánh Moĩse qua những hàng chữ khắc trên đá. Người học đạo Bụt nhìn vào đá cũng phải đọc thấy những thông điệp. Nhìn vào cây, nhìn vào suối, nhìn vào đất, nghe tiếng chim, tiếng gió đều có thể đọc được và nghe được những vi diệu âm. Đây là một phép thực tập chánh niệm.

Có những lúc ta cần im lặng để thực tập chánh niệm về ngôn ngữ. Chúng ta không nói, không trò chuyện, để lắng nghe tiếng nói của tầm và của từ ở trong ta, quán chiếu xem những tầm và từ ấy phát xuất từ những thấy biết nào, những nội kết nào. Thời gian tịnh khẩu là thời gian quán chiếu. Ta tịnh khẩu không phải vì ta không được phép nói. Khi tu pháp môn tịnh khẩu, mỗi người xin đại chúng được sống trong im lặng trong năm ngày, mười ngày hoặc trong một tháng. Như vậy không phải là để tránh xung đột với người khác. Chính đó là cơ hội lắng nghe tiếng nói của tầm và từ ở trong chính mình, và phát hiện nguồn gốc của tầm và từ đó. Trong một khóa tu thường thường chúng ta không nói chuyện. Những người chưa quen phương pháp này có thể sẽ thấy cặng thẳng và ngột ngạt. Những người đã quen quán sát tầm và từ của mình rồi thì khác. Không nói chuyện là một cơ hội rất lớn để mình có thể nhìn rõ bản chất của tư duy và cái thấy của mình. Đối với họ, sự im lặng trong khóa tu rất quan trọng. Nếu không duy trì sự im lặng đó, chúng ta mất cơ hội thực tập quán chiếu. Tuy nhiên có những người tuy bên ngoài im lặng nhưng bên trong tầm và từ của họ vẫn rất ồn ào.

!! Chánh niệm làm cơ bản

Tới đây ta có thể tạm rời lãnh vực chánh ngữ để bắt đầu bàn về chánh niệm. Trong khi học về chánh kiến, chánh tư duy và chánh ngữ ta đã thấy chánh niệm là điều kiện rất cần thiết rồi. Không thể nào có chánh kiến, chánh tư duy và chánh ngữ nếu không có chánh niệm. Vì ngay trong chánh nghiệp, chánh mạng và chánh tinh tấn, vai trò của chánh niệm cũng quan trọng không kém. Thường thường ta vẫn nói theo trình tự niệm, định, tuệ. Chánh niệm đưa tới chánh định. Nhưng chánh niệm không phải chỉ đưa tới chánh định mà thôi, nó dẫn tới cả chánh kiến, chánh tư duy, chánh ngữ, chánh nghiệp, chánh mạng và chánh tinh tấn. Chúng ta hãy nói sơ lược về chánh nghiệp, chánh mạng, chánh tinh tấn để bàn vào chánh niệm và sẽ trở lại ba chi phần đó sau.

Chánh nghiệp tức là hành động chân chánh, đây là về hành động của thân thể, tức thân nghiệp. Vì khẩu nghiệp thuộc về phạm vi của chánh ngữ và ý nghiệp thuộc về phạm vi của chánh kiến, chánh tư duy, chánh định, và chánh niệm. Trong Kinh nói sát sanh, trộm cướp và tà dâm là tà nghiệp. Không sát sanh, không trộm cướp và không tà dâm là chánh nghiệp. Vì vậy về chánh nghiệp chúng ta phải nói đến giới thứ nhất, giới thứ hai, và giới thứ ba của năm giới. Thân nghiệp cũng liên quan tới giới thứ năm. Giới thứ tư thuộc về chánh ngữ và bốn giới khác có liên hệ trực tiếp tới chánh nghiệp.

Chánh mạng tức là nghề nghiệp hoặc phương tiện sinh sống chân chánh. Sống bằng những phương tiện bất chính là tà mạng. Những nghề nghiệp vi phạm giới sát sanh, giới trộm cướp, giới tà dâm, phải sử dụng các chất ma túy và phải nói dối, đều là tà mạng. Vậy chánh mạng cũng liên hệ tới tất cả năm giới. Người xuất gia cũng có thể phạm vào tà mạng nếu sử dụng những phương tiện hành đạo không phù hợp với chánh pháp. Thí dụ đưa người ta vướng thêm vào vòng mê tín. Nếu không tu tập, chỉ tụng kinh và làm đám như một nghề sinh nhai, cũng là tà mạng. Việc tụng kinh và đưa đám nếu hành trì như những phương pháp hướng dẫn tu học và chiếu ánh sáng của đạo lý vào đời sống của mọi người và của chính mình, thì đó là chánh mạng. Còn tụng kinh và làm đám chỉ với mục đích cầu lợi thì đó là tà mạng.

Chánh tinh tấn là năng lực giúp ta tu học một cách siêng năng. Chánh tinh tấn gồm có bốn loại thực tập liên hệ với chánh niệm. Loại thực tập thứ nhất là với những hạt giống xấu chưa phát hiện thì cố ngăn đừng cho chúng phát hiện, những chủng tử xấu đừng để cho chúng có cơ hội hiện hành. Mỗi lần hiện hành các hạt giống ấy lại lớn lên ở trong tàng thức. Đừng cho phát hiện không phải là đè nén, mà chỉ có nghĩa là đừng để người khác hay chính mình tưới tẩm những hạt giống xấu trong mình. Ngoài ra, phải tìm cách cho những hạt giống tốt phát hiện. Đó là phép thực tập thứ nhất. Thứ hai là khi những hạt giống xấu phát hiện rồi thì phải biết cách làm cho chúng trở về gốc càng mau càng tốt, tìm cách cho chúng trở về nguyên quán, nằm im ở đấy. Đó là phương pháp thay chốt, phương pháp quán chiếu, phương pháp chánh niệm. Thứ ba là những hạt giống tốt chưa từng được phát sanh thì tìm cách tưới tẩm cho chúng phát sanh. Tự mình tưới tẩm hay nhờ sự có mặt của tăng thân tưới tẩm. Thứ tư là những hạt giống tốt đã phát sanh rồi thì tìm cách mời chúng ở lại và nuôi dưỡng cho chúng lớn lên. Bốn phương pháp đó gọi là tứ chánh cần. Thành ra nội dung của chánh tinh tấn là tứ chánh cần, tức là bốn loại hành động siêng năng. Mục đích là làm cho những hạt giống xấu yếu đi và làm cho những hạt giống tốt lớn lên. Ta thấy chánh tinh tấn liên hệ đến tất cả những chi phần khác trong bát chánh đạo. Nói chánh tinh tấn là sự siêng năng thì không đủ nghĩa. Cần phải có kiến thức về tâm học, về duy thức học thì mới có thể hiểu được nội dung tám chi phần của bát chánh đạo. Chúng ta nói qua như vậy để bàn tới chánh niệm rồi sẽ trở về với ba chi phần ấy sau.

!! Như lý tác ý

Chữ niệm nghĩa là nhớ. Chữ Hán viết phần trên là chữ kim, nghĩa là nay, phần dưới chữ tâm, nghĩa là lòng mình. Niệm là điều ta đang nhớ tới, đang nghĩ tới. Mà điều ta nhớ và nghĩ có thể là tà, có thể là chính, vì vậy nên có tà niệm và chánh niệm. Chánh là thẳng, tà là nghiêng. Chánh niệm tức là đặt những điều ngay, thẳng và điều tốt đẹp vào trong tâm nhớ nghĩ của mình.

Trong 51 tâm hành có một tâm hành tên là tác ý (manaskara, Pali là manasikara). Tác ý tức là khởi tâm để ý tới một đối tượng nào đó. Trước đó chưa chú ý tới, bây giờ ta chú ý tới, gọi là tác ý. Tác ý là một trong năm tâm sở biến hành. Và tác ý mở đầu cho một niệm. Như khi ta xem một truyện phim hay nghe một bài hát thì hình ảnh hay câu hát khiến cho ta tác ý. Nếu ta biết tu tập thì ta sẽ tác ý tới một điều chính, và ta duy trì điều chính đó lại. Khi nghe chuyện hay nhìn hình ảnh ta cũng có thể tác ý tới một điều bất chánh. Khi ta tác ý tới một điều chánh đáng, phù hợp với tinh thần bốn sự thật, với kiến thức về bốn loại thực phẩm, với giáo lý bát chánh đạo thì đó gọi là như lý tác ý hoặc là như pháp tác ý (yoniso manaskara). Ngược lại là bất như lý tác ý (ayoniso manaskara). Chữ như lý được dịch từ chữ yoniso. Yoni có nghĩa là tử cung, cái cung của đứa con, mọi người đều sinh ra từ đó. Và vì thế yoni ở đây có nghĩa là cội nguồn. Khi đưa về đúng cội nguồn, không lạc hướng, thì gọi là yoniso. Đưa đi lạc khỏi cội nguồn thì gọi là ayoniso, dịch là bất như lý hay là phi như lý tác ý. Thí dụ ở Làng Mai khi nghe tiếng chuông đồng hồ, mọi người trở về với chánh niệm, thở và mỉm cười. Ta lấy chánh niệm để soi sáng và như thế ta thực tập như lý tác ý. Khi nghe một tiếng hát đưa lòng ta tới những thương nhớ vẩn vơ, quên rằng ta đang ở đây để thực tập chánh niệm cùng với tăng thân, thì đó là phi như lý tác ý. Cho nên trong đời sống tu học, chúng ta phải tổ chức như thế nào để có thể thực tập được như lý tác ý trong mỗi giây phút. Khi bước vào nhà bếp, thấy một vị thiền sinh đang xắt cà rốt, tôi hay hỏi: ‘‘Anh đang làm gì đó?’’ Câu hỏi giống như một tiếng chuông để giúp người đó như lý tác ý. Trong một tăng thân tu tập với nhau chúng ta phải giúp nhau gióng tiếng chuông như lý tác ý cho nhau. Cách đi, cách đứng, cách ngồi, cách nhìn, cách làm việc của ta đều có thể có tác dụng giúp người khác thực tập như lý tác ý. Trong tăng thân chúng ta có những người làm được như vậy. Khi nhìn thấy họ ta tự nhiên trở về được với chánh niệm. Sự có mặt của họ có tác dụng như tiếng chuông tỉnh thức. Xây dựng tăng thân cũng là thực tập để cho mỗi lời nói, mỗi cái nhìn, mỗi cái động tác của ta là một tiếng chuông cho chính ta và cho người khác. Trong thiền viện, từ cách trình bày bàn thờ, cắm một bình hoa, một góc chùa cong, một tiếng chuông thỉnh đều chủ ý giúp chúng ta thực tập như lý tác ý. Cái gì trong thiền viện cũng phải được sắp đặt để nhắc nhở chúng ta phải trở về như lý tác ý. Như lý tác ý là giây phút khai sanh của chánh niệm. Ngược lại, nếu chúng ta sống trong một môi trường mà mọi thứ đều khiến chúng ta quên lãng, ta sẽ bị kéo theo bởi những phi như lý tác ý. Ngồi trong một quán rượu, tất cả những điều chúng ta nghe, thấy và cảm bằng sáu giác quan đều có tác dụng đưa chúng ta đi lạc vào phi như lý tác ý.

Khi chúng ta nghĩ tới những danh, lợi, tài, sắc, nhớ tới thuốc hút ‘‘nhớ ai như nhớ thuốc lào, đã chôn điếu xuống lại đào điếu lên’’, thì niệm đó là tà niệm. Nhớ một người nào đến nỗi không làm ăn gì được, không tu học gì nổi, đó là tà niệm. Có khi chúng ta quán tưởng một dòng nước trong hay là một bầu trời xanh để cho tâm hồn thư thái, để tự nuôi dưỡng trước khi trở về đối diện những khó khăn hiện tại, việc này có thể là như lý vì chúng ta biết mình đang làm gì. Nhưng thường thì chúng ta không biết là mình đang mơ mộng và đang trốn tránh. Mà người tu học không trốn tránh thực tại. Tu học tức là đem chánh niệm chiếu vào đối tượng khổ đau, để tìm ra những nguyên do đã đem tới đau khổ. Mà thấy được khổ đế và tập đế rồi, tự khắc ta thấy được đạo đế. Trốn tránh thì suốt đời ta không giải quyết vấn đề đau khổ của ta và của người.

Chánh niệm là một loại năng lượng để thắp sáng tâm ý. Chúng ta biết trong chiều sâu tàng thức của chúng ta có hạt giống chánh niệm. Không tu tập thì hạt giống bị vùi lấp qua nhiều lớp thất niệm, khổ đau phiền não. Tu tập là chạm vào hạt giống chánh niệm để nó nở thành hoa. Ta hãy tìm cách giữ nó lại trong phòng khách của tâm hành, vì đó là một người khách quý. Người khách đó là Bụt, vì chánh niệm chính là Bụt tương lai. Nuôi dưỡng chánh niệm là làm cho Bụt ở trong ta càng ngày càng sáng tỏ. Người tu tập giỏi có thể nuôi dưỡng ngọn đèn chánh niệm thường xuyên. Ngọn đèn đó sẽ đem chiếu sáng bốn lãnh vực, đối tượng của thiền quán.

Lãnh vực thứ nhất là thân. Thân, tức là uẩn đầu tiên trong ngũ uẩn, gọi là sắc uẩn. Có một kinh chuyên trình bày sự thực tập chánh niệm về thân, gọi là kinh Thân Hành Niệm. Kinh này có trong Trung Bộ (Majjima Nikaya), và cũng có trong bộ Trung A Hàm. Chánh niệm cũng soi sáng lãnh vực thứ hai gọi là lãnh vực cảm thọ. Thọ là những cảm giác của mình, những cảm giác vui, buồn. Những cảm thọ dễ chịu, khó chịu, hoặc không dễ chịu cũng không khó chịu, gọi là cảm thọ trung tính. Chánh niệm soi sáng lãnh vực thứ ba là tâm ý hay tâm hành. Bất cứ một tâm hành nào phát hiện là chánh niệm nhận diện được. Thấy tầm thì biết là tầm, thấy từ thì biết là từ, thấy tham thì biết là tham, thấy sân thì biết là sân, thấy mạn thì biết là mạn. Chánh niệm nhận diện tất cả 51 thứ tâm hành mỗi khi chúng phát hiện. Sau cùng chánh niệm soi sáng đối tượng của tâm hành, tức là các pháp. Pháp ở đây là tất cả mọi hiện tượng tâm lý cũng như vật lý, và sinh lý. Trước hết pháp là đối tượng của tưởng, tức là tri giác. Ở đây các pháp là đối tượng của tâm hành. Chúng ta soi sáng vừa chủ thể vừa đối tượng của tâm hành.

Chúng ta thường nghĩ nhầm năm uẩn là của một người này hay người kia. Phải nhớ năm uẩn không phải là một cái gì biệt lập, năm uẩn gồm cả chủ thể lẫn đối tượng. Mà đối tượng của năm uẩn bao gồm cả vũ trụ.

Người tu học dùng chánh niệm soi chiếu bốn lãnh vực thân, thọ, tâm ý và đối tượng tâm ý. Sự soi chiếu này đưa tới tuệ giác, có công năng tháo gỡ và giải thoát cho bản thân người tu học.
! Bài 18 Chuyển hóa tập khí

Hôm nay là ngày 23 tháng giêng năm 1994, chúng ta ở tại Xóm Hạ và học tiếp về bát chánh đạo.

Hôm trước tôi có trao cho quý vị một bài tập để quán chiếu và trình bày. Hôm nay chúng ta có một bài khác cần được thực tập với nhau trong tăng thân, trong một tuần lễ. Trong suốt tuần lễ chúng ta phải dùng một thiền ngữ đơn giản để thực tập niệm và định. Thiền ngữ đó là ‘‘Ta đang làm gì đây?’’ (What am I doing here? What am I doing now?)

Đây là thiền ngữ ta phải dùng để tự hỏi mình trong mỗi giây phút. Khi đang đi từ phòng ăn ra vườn mận, hoặc đi từ phòng riêng lên thiền đường, ta tự hỏi: ‘‘Ta đang làm gì?’’ Hoặc là ‘‘Mình đang đi đâu?’’ Chúng ta tổ chức thực tập cách nào để tăng thân cùng được thực tập chung thì hiệu quả mới cao. Nếu tăng thân quanh ta biết ta đang thực tập, và tăng thân cũng biết ta đang trông đợi họ thực tập, thì sức mạnh của sự thực tập mới lớn. Đang rửa chén, đang cưa gỗ, đang quét nhà, đang cắm hoa, v.v.. đó là những lúc ta tự hỏi: ‘‘Ta đang làm gì?’’ Thiền ngữ này rất mầu nhiệm để thực tập chánh niệm. Ai cũng biết rằng rửa bát là để có bát sạch ăn cơm. Ngoài đời, rửa bát chỉ là để có bát sạch. Nhưng trong thiền viện, ta có phương pháp rửa bát của thiền viện.

Kinh có một đoạn kể lại câu chuyện của một triết gia tới thặm Bụt, và triết gia đó nêu những câu hỏi có tính cách trí thức. Cuối cùng, ông hỏi: ‘‘Tại đây quý vị tu hành theo phương pháp nào?’’ Rồi lại muốn cho cụ thể hơn, ông hỏi: ‘‘Nói một cách khác, mỗi ngày quý vị làm những gì?’’ Bụt cười và bảo: ‘‘Chúng tôi đi, đứng, nằm, ngồi, giặt áo, rửa bát, quét sân. Chúng tôi làm những việc như vậy.’’ Triết gia đó nói: ‘‘Như vậy thì đâu có khác gì chúng tôi ở ngoài đời? Ngoài đời chúng tôi cũng đi, đứng, nằm, ngồi, ăn, uống, quét sân, giặt áo, rửa bát…’’ Bụt nói: ‘‘Khác lắm chứ! Vì khi chúng tôi đi, chúng tôi biết là chúng tôi đi. Khi chúng tôi đứng, chúng tôi biết là chúng tôi đứng. Khi chúng tôi ngồi xuống, chúng tôi biết là chúng tôi ngồi xuống. Khi chúng tôi nằm xuống, chúng tôi biết là chúng tôi nằm xuống. Khi chúng tôi rửa bát, chúng tôi biết rằng chúng tôi rửa bát. Khi chúng tôi giặt áo, chúng tôi biết là chúng tôi đang giặt áo.’’ Lời Bụt nói có nghĩa là: chúng tôi thực tập chánh niệm trong mỗi giây phút của đời sống chúng tôi. Đó là một đoạn kinh rất đơn giản, nhưng trong đó ta thấy rất rõ ràng sự khác biệt giữa cuộc sống thiền viện và cuộc sống ở ngoài.

Trong cuộc sống ngoài đời người ta làm việc gì cũng nhắm một mục đích. Như rửa bát là để có bát sạch, đi chợ là để mua thức ăn, giặt áo là để có áo sạch. Trong thiền viện, giặt áo, đi chợ, nấu ăn còn có mục đích để chuyển hóa thân tâm, đạt tới an lạc. Các mục đích này có thể được thực hiện ngay trong giờ phút thực tập, làm cho người hành giả có hạnh phúc ngay trong khi thực tập. Và cái năng lượng có khả năng chuyển hóa và đưa tới an lạc ấy là chánh niệm.

Vậy thì trong khi rửa bát hoặc quét nhà, ta có thể tự hỏi: ‘‘Ta đang làm gì đây?’’ Nếu trong khi quét nhà, lòng chỉ muốn quét cho mau xong, đã không có an lạc mà còn có bực bội, thì ta sẽ bực bội suốt đời. Phải quét nhà như thế nào để trong khi quét nhà ta có an lạc. Tự hỏi: ‘‘Mình đang làm gì vậy?’’ thì tự nhiên những hấp tấp, vội vàng và ý muốn làm cho mau xong sẽ biến mất. Ta mỉm cười và tự nhủ: ‘‘Quét nhà là công việc quan trọng nhất trong giờ phút này.’’ Điều này ta đã được học ngay từ đầu. Vấn đề là chúng ta có thực tập hay không, và có giúp được tăng thân của ta thực tập được hay không? Cách giúp hay nhất là chính ta thực tập và mọi người khi nhìn vào sẽ thấy ta đang thực tập.

Câu hỏi đó có thể đặt dưới một hình thức khác: ‘‘Ta làm cái này để làm gì vậy?’’ (What am I doing this for?) Phải có sáng kiến đặt các câu hỏi tương tự để hàng ngày ta có thể thực tập được. Trước cửa ra vào chúng ta có thể treo một tấm bảng. Ai bước ra thì đọc câu: ‘‘Anh đi đâu đây?’’ và tự mỉm cười. Lúc chưa thấy cái bảng có thể ta đi như bị ma đuổi; khi đọc tấm bảng đó thì ma biến mất, ta khôi phục được chủ quyền, ta tự nhiên thảnh thơi trở lại. Tấm bảng đó là một tiếng chuông cảnh tỉnh. Phải đặt những bài hát, những câu thiền ngữ để giúp mọi người trở về an trú trong giây phúc hiện tại, để thắp sáng chánh niệm. Tu tập là trở về, trở về với nguyên quán của mình. Ta dùng bài Quay Về Nương Tựa:

<<<
Quay về nương tựa, <br>
Hải đảo tự thân. <br>
Chánh niệm là Bụt, <br>
Soi sáng xa gần. <br>
Hơi thở là Pháp, <br>
Bảo hộ thân tâm. <br>
Năm uẩn là Tăng, <br>
Phối hợp tinh cần. <br>
Thở vào, thở ra <br>
Là hoa tươi mát <br>
Là núi vững vàng <br>
Nước tịnh lặng chiếu <br>
Không gian thênh thang
<<<

Hoặc thực tập bài Đã Về Đã Tới:

<<<
Đã về đã tới <br>
Bây giờ ở đây <br>
Vững chãi thảnh thơi <br>
Quay về nương tựa
<<<

Quay về nương tựa là thực tập Quy Ỵ Quay về nương tựa, hải đảo tự thân, chánh niệm là Bụt, soi sáng xa gần, đó là quy y Bụt. Rồi đến quy y Pháp, và quy y Tăng. Đó là những bài thực tập có thể làm giàu chánh niệm; ta phải nắm cho vững. Đừng đợi về tới thành phố mình rồi mới thực tập. Tập ở Làng Mai cho thành thói quen rồi thì về thành phố ta mới tiếp tục được. Nếu quý vị nghĩ bây giờ mình chỉ cần học lý thuyết thôi, để về nhà mình sẽ làm, thì như vậy là bảo đảm thất bại một trăm phần trăm. Phải bắt đầu thực tập ngay cho đến khi sự thực tập trở thành một thói quen.

!! Chuyển hóa tập khí

Dân ta vốn con nhà nghèo ‘‘hay lam hay làm’’, hở tay ra là phải làm, không bao giờ cho tay được nghỉ. Đó là một tập khí mà những hạt giống được truyền từ nhiều thế hệ tới cho chúng ta. Nhưng chúng ta đã biết rằng muốn an trú được trong hiện tại thì mỗi bước chân đều phải thảnh thơi, cái tập khí làm không hở tay trở thành một chướng ngại. Vì vậy ta phải thực tập thế nào để khi ta làm cũng như khi ta không làm gì thì sự sống vẫn có mặt. Muốn chuyển hóa một tập khí ta cần trải qua công phu tu luyện. Mà tăng thân là một dung dịch trong đó ta ngâm mình vào để cho tập khí tan rã. Trong tăng thân có những người đi đứng thảnh thơi, có khả năng an trú trong hiện tại. Họ nhìn, họ nghe, họ nói, họ cười, họ thực tập an trú trong hiện tại. Khi đặt mình trong một tăng thân như vậy thì dần dần ta thấy tập khí của ta sẽ rã ra. Cho nên những người mới tu luôn luôn phải sống trong tăng thân, phải nương vào tăng thân.

Có những khóa tu kéo dài chỉ có bốn ngày thôi, nhưng trong bốn ngày đó có thể xảy ra những phép lạ. Ngày thứ nhất vào dự khóa tu có người cảm thấy rất miễn cưỡng và có cảm giác chật chội. Đi, đứng, nằm, ngồi bị bắt ép phải theo một khuôn khổ, người ta cảm thấy bứt rứt. Nhưng nghĩ nếu bỏ về thì uổng công đi, uổng cả tiền bạc, tiếc rẻ cho nên họ ráng ở tới ngày thứ hai. Ngày thứ hai họ cảm thấy bớt khó chịu; tuy chưa thoải mái lắm nhưng mà tạm sống được. Người khác làm được tại sao mình làm không được? Tới ngày thứ ba thì thấy hay hay. Đi chậm lại cũng cảm thấy thoải mái. Ăn cơm im lặng, ban đầu tưởng như là ngộp thở nhưng bây giờ mình bắt đầu thích. Những tập khí cũ bắt đầu rã ra. Rồi tới ngày thứ tư họ bắt đầu ưa thích, nhưng khóa tu lại gần chấm dứt rồi. Cuối ngày thứ tư họ hỏi: ‘‘Bao giờ có khóa tu mới?’

Đó là trường hợp của những người thành công. Trong bốn ngày họ đã nếm được mùi vị của sự chuyển hóa, nếm được niềm tịnh lạc của sự thực tập an trú. Những người này sau khi trở về thành phố có thể kéo dài tình trạng thảnh thơi đó ba bốn tuần, hay năm bẩy tuần. Nếu có một số bạn bè mỗi tuần họp nhau lại để nuôi dưỡng tiếp thì việc tu tập có thể kéo dài vài ba tháng. Nếu không thì sau vài ba tuần là họ bị hoàn cảnh lôi kéo và đánh mất nếp sống tu tập. Tu tập vững ở trong tăng thân rồi mà trở về nhà vẫn còn đánh mất. Không thể nói rằng ở Làng ta chỉ cần học lý thuyết, về nhà sẽ thực tập cũng không muộn.

Chúng ta biết là mình bị cái tập khí tham công tiếc việc sai sử đến nỗi lúc nào cũng chỉ nghĩ đến tương lai và sẵn sàng hy sinh giờ phút hiện tại. Ta biết rằng như vậy là ta đang đánh mất sự sống của mình. Bụt dạy phải sống sâu sắc giây phút hiện tại. Chặm sóc giờ phút hiện tại của mình với hết tâm tư mình, tức là đã làm hết sức mình để lo lắng cho tương lai. Vì vậy ta áp dụng ngay những phương pháp mà thiền viện chế tác: khi đi thì biết là mình đang đi, khi đứng thì biết mình đang đứng, khi ngồi thì biết mình đang ngồi, khi rửa chén thì biết mình đang rửa chén. Ta tập mỉm cười với ta và tự hỏi ta : ‘‘Ta đang làm gì? Ta đang làm cái này với mục đích gì?’’

Rửa bát trong chánh niệm là đang tiếp xúc với sự sống nhiệm mầu. Tôi đang là người thức tỉnh. Tôi đang an trú trong hào quang của Bụt. Và tôi đang giải phóng tôi khỏi những sợi dây ràng buộc lôi kéo. Con ma quá khứ, con ma tương lai, con ma giận hờn, con ma lo lắng không nắm đầu tôi được. Tôi là một con người tự do. Như vậy phẩm chất của sự sống trong giờ phút rửa bát trở thành rất cao. Phẩm chất cao hay thấp, có hay không, là do ta có thực tập hay không.

Hai ngày qua tôi đã chép tên, họ và pháp danh vào điệp hộ giới của một số Phật tử đã quy y tại Bắc Mỹ. Có hàng trăm pháp danh phải ghi chép, rồi lại phải đóng dấu hàng trăm lần. Sau đó tôi biên địa chỉ trên bì thư để gửi cho từng người, rồi dán tem. Có hàng trăm điệp hộ giới để làm, nhưng ta phải làm như thế nào để công việc trở thành một sự thực tập, chứ không phải là một việc cần làm cho mau xong. Khi cầm bút viết xuống một tên hay một địa chỉ, ta có thể thực tập mỉm cười, có thể thực tập tiếp xúc với một người. Người đó, ta biết rằng trong vòng ba ngày hay năm ngày sẽ nhận được điệp hộ giới. Người đó sẽ mở ra, sẽ mỉm cười, sẽ thấy tên mình, sẽ nhớ lại ngày thọ giới của mình, sẽ thấy lại địa điểm nơi thọ giới của mình, và sẽ đọc pháp danh của mình. Người đó biết, hay có thể không biết, rằng pháp danh này do chính thầy mình viết lên trên điệp hộ giới của mình. Nhưng trong lúc viết, tôi biết là chính tôi đang viết pháp danh người đó vào điệp hộ giới, với tất cả lòng thương yêu, với tất cả sự tin cậy, tin rằng người này sẽ thực tập năm giới vững chãi để bảo vệ hạnh phúc, an lạc của mình và của gia đình mình. Trong khi viết ba trăm điệp hộ giới như vậy, thì tôi thực tập. Nếu không thực tập thì có viết một trăm ngàn điệp hộ giới đi nữa thì kết quả tu tập vẫn là số không. Điều này phải được áp dụng trong tất cả mọi công việc khác.

Nếu ta làm công việc của ta trong chánh niệm thì đó cũng là làm cho cả tăng thân, vì hành động đó giúp nâng cao phẩm chất thực tập của tăng thân. Khi gặp một người bạn tu, ta hỏi: ‘‘Anh đang làm gì đó? Chị đang làm gì đó?’’ thì câu hỏi này là một sự nâng đỡ, một sự yểm trợ. Ta biết người đó đang làm gì rồi, nhưng vẫn hỏi. Hỏi để thắp sáng chánh niệm trong ta và chánh niệm ở trong người kia. Đôi khi ta không cần hỏi, ta chỉ cần nhìn nhau mỉm cười thôi là đã có thể đã tạo ra phép lạ, phép lạ của sự tỉnh thức. Vậy đại chúng hãy chuẩn bị cho tuần lễ thực tập này. Thực tập để tất cả mọi người có cơ hội, trong một tuần lễ tinh tấn, làm rã bớt các tập khí cũ của mình, để tạo thành một tập khí mới, là biết an trú và sống sâu sắc trong giờ phút hiện tại. Thắp sáng chánh niệm và soi thấu những ngõ ngách sâu kín của đời sống, của tâm lý mình thì ta sẽ có sự chuyển hóa. Sống đời sống hàng ngày biết, ta nên trân quý mỗi phút mỗi giây. Khi đi thiền hành dưới những cây mận, chúng ta có thể mỉm cười với những cành mận, với những lá cỏ, với những hạt sỏi, với những tiếng chim. Vì tất cả những sự có mặt đó đều là những người bạn tu của mình từ bao nhiêu kiếp trước.

<<<
Sáng hôm nay, <br>
tới đây <br>
Chén trà nóng <br>
Bãi cỏ xanh <br>
Bỗng dưng hiện bóng hình em ngày trước
<<<

Tất cả đều là những người bạn cũ thân yêu. Một cành cây. Một con chim. Một đám mây. Một nhánh hồng. Một hòn sỏi. Một gốc cây. Tất cả đều là những người bạn cũ.

<<<
Bàn tay gió <br>
Dáng vẫy gọi <br>
Một chồi non xanh mướt <br>
Nụ hoa nào <br>
Hạt sỏi nào <br>
Ngọn lá nào <br>
Cũng thuyết Pháp Hoa Kinh.
<<<

Trong chánh niệm ta có thể nhận diện được tất cả những người bạn cũ đó. Trong chánh niệm ta có thể nghe được tiếng thuyết pháp của viên sỏi, của tàu lá, của đám mây. Rất mầu nhiệm. Ta hãy tập cười với hạt sỏi, tập cười với đám mây, tập cười với mặt trăng. Cười như vậy ta chứng tỏ đang có mặt và vầng trăng kia cũng có mặt, đám mây kia cũng có mặt. Khi cái giận, cái buồn, cái tập khí xấu hiện ra, ta cũng mỉm cười với chúng, vì đó cũng là những người bạn cũ của ta. Mỗi khi cười được như vậy là chúng ta có chuyển hóa, chúng ta có từ bi.

!! Thực tập năm lễ

Chúng ta đã đi khỏi Việt Nam bao nhiêu năm, có thể nhớ nhà hoặc muốn trở về, và nghĩ rằng trong mấy tháng nữa, trong vài ngày nữa là ta về tới đất nước. Trong phương pháp tu tập này, chúng ta không cần đợi đến khi bước từ máy bay xuống đất mới là trở về, chúng ta hãy trở về ngay từ bây giờ. Mỗi bước chân là một sự trở về. Quê hương nằm trong lòng chúng ta. Tổ tiên, sông núi đều nằm ở trong lòng chúng ta. Chúng ta đang làm gì? Chúng ta đang làm cái này để làm gì? Đặt câu hỏi, tự nhiên chúng ta về quê hương ngay lập tức. Quê hương là nơi ta gặp được an lạc, tỉnh thức, gặp được Bụt, Pháp, Tăng và gặp được tất cả tổ tiên. Các thế hệ tổ tiên vẫn còn sống sinh động ở trong cơ thể và tâm hồn chúng ta. Đó là sự thực tập quay về và nương tựa vào cội nguồn gốc rễ. Quý vị đã học và thực tập năm lễ. Những lễ này có mục đích đưa ta trở về quê hương, đưa ta về tiếp xúc với những gì đẹp nhất, thân yêu, gần gũi nhất của ta. Tổ quốc, quê hương, văn hóa, gia đình, dòng dõi huyết thống, v.v.. khi lễ xuống chúng ta có thể tiếp xúc với tất cả.

Chúng ta lạy xuống, trán chạm vào đất, theo lối ngũ thể đầu địa, tức là năm vóc gieo xuống đất. Năm vóc tức là hai tay, hai chân và trán của mình. Quý vị hãy tưởng tượng một đợt sóng đang cúi xuống tiếp xúc với nước, tức là bản chất của sóng. Chúng ta cũng vậy. Bụt, Pháp, Tăng, đất nước, quê hương, tổ tiên, dòng họ, khi lạy xuống chúng ta phải tiếp xúc được với tất cả quê hương đó. Sau đây là những lời hướng dẫn cho lễ thứ nhất.

!!! Lễ thứ nhất

> Trở về kính lạy, liệt vị tiền nhân, dòng họ tổ tiên, gia đình huyết thống, hai bên nội ngoại.

Trong tư thế ngũ thể đầu địa, nghe tiếng thầy hay bạn hướng dẫn, ta có thể bắt đầu thực tập quán chiếu và tiếp xúc:

<<<
Con thấy cha của con, con thấy mẹ của con mà xương thịt và sự sống đang có mặt và lưu nhuận trong từng tế bào và mạch máu của con. Qua cha con, qua mẹ con, con tiếp xúc được ông bà của con, bên nội cũng như bên ngoại, đã và đang đi vào con với tất cả mọi năng lượng, mọi trông chờ, mọi ước mơ, cũng như tất cả trí tuệ và kinh nghiệm của tổ tiên trải qua bao nhiêu thế hệ. Con mang trong con sự sống, dòng máu, kinh nghiệm, tuệ giác, hạnh phúc và khổ đau của các thế hệ tổ tiên trong con. Những yếu kém, những tồn tại và những khổ đau đã truyền đạt lại, con đang tu tập để chuyển hóa. Chuyển hóa cho con và cho tất cả quý vị. Những năng lượng của trí tuệ, và năng lượng của thương yêu mà các vị truyền đạt lại, con đang mở rộng trái tim con và xương thịt của con để tiếp nhận. Con có gốc rễ nơi cha, nơi mẹ, nơi ông, nơi bà, nơi tổ tiên. Con chỉ là sự nối tiếp của tổ tiên và dòng họ con. Xin cha mẹ, xin ông, xin bà, xin tổ tiên hỗ trợ cho con, che chở cho con, truyền thêm năng lượng cho con. Con biết rằng con cháu ở đâu thì tổ tiên ở đó. Con biết cha mẹ nào, ông bà nào cũng thương yêu và đùm bọc độ trì cho con cháu dù khi sinh tiền có lúc gặp phải khó khăn hay rủi ro mà không bộc lộ được niềm thương yêu và sự đùm bọc đó. Con thấy cha, ông của con, từ Lạc Long Quân qua các vua Hùng và biết bao nhiêu thế hệ những người khai sáng đất nước, mở rộng cõi bờ, gìn giữ núi sông và hun đúc nên nếp sống Việt Nam có thỉ, có chung, có nhân, có hậu. Con là sự nối tiếp của liệt vị, con cúi rạp mình xuống để đón nhận năng lượng của dòng họ và tổ tiên của gia đình huyết thống của con. Xin tổ tiên phù hộ độ trì cho con.
<<<

Chúng ta lạy xuống để tiếp xúc với tổ tiên, với đất nước, với cội nguồn của chúng ta. Tất cả đang có mặt ở trong chúng ta. Chúng ta không phải đi tìm xa. Chúng ta không cần lên máy bay, đi mấy chục giờ mới về tới quê hương. Chúng ta chỉ cần bước một bước, chúng ta chỉ cần lạy xuống một lễ là chúng ta quán chiếu được tất cả. Tiếp xúc được rồi thì những nguồn năng lượng của tổ tiên, của ông bà, của đất nước, của quê hương, của Bụt, Pháp, Tăng sẽ lưu nhuận trong ta và ta sẽ có thêm sức mạnh. Nếu không thì ta có thể sẽ trở thành một đứa con đi hoang, một lãng tử, một cô hồn không nơi nương tựa. Khi ta cảm thấy gốc rễ của tổ tiên, dòng họ và đất nước vẫn còn bám sâu trong ta thì ta sẽ mạnh mẽ và sẽ vững chãi hơn.

Sau đây là lễ thứ hai:

!!! Lễ thứ hai

> Trở về kính lạy, Bụt và tổ sư, truyền đặng tục diệm, gia đình tâm linh, qua nhiều thế hệ.

Lễ thứ nhất hướng về gia đình huyết thống (blood family). Lễ thứ hai là tiếp xúc với gia đình tâm linh. Mỗi chúng ta đều có hai gia đình. Khi lạy xuống năm vóc sát đất rồi thì ta bắt đầu quán niệm như sau:

<<<
Con thấy thầy của con trong con. Con thấy sư ông của con trong con, Người đã dạy cho biết hiểu, biết thương, biết thở, biết cười, biết tha thứ, biết sống trong giây phút hiện tại.

Qua thầy của con, qua Sư ông của con, con tiếp xúc được với các thế hệ thánh tăng qua các thời đại. Con tiếp xúc được với các vị bồ tát và với Bụt Thích Ca Mâu Ni, Người đã khai sáng gia đình tâm linh của con, đã có từ hai ngàn sáu trăm năm nay.

Con biết Bụt là thầy của con mà cũng là tổ tiên tâm linh của con nữa. Con thấy trong con có chất liệu nuôi dưỡng của Bụt, của tổ, của các thế hệ cao-tăng và năng lượng của liệt vị đã và đang đi vào trong con, đã và đang làm ra sự bình yên, an lạc, hiểu biết, và thương yêu trong con. Con biết Bụt đã giáo hóa cho gia đình huyết thống của con trong bao nhiêu ngàn năm, đã làm đẹp, làm lành nếp sống đất nước của con và của dân tộc con. Bụt đã làm cho dân tộc con trở nên một dân tộc thuần từ và văn minh, điều này con thấy rõ trong nền văn minh Lý và Trần. Con biết nếu không có Bụt, có tổ, có thầy thì con không biết tu tỉnh và chế tác an lạc cho con và cho gia đình con. Con mở rộng trái tim và xương thịt con để tiếp nhận kinh nghiệm, tuệ giác, tình thương, sự che chở và năng lượng từ bi của Bụt và của các thế hệ Thánh tăng, gia đình tâm linh của con. Con là sự tiếp nối của Bụt và của các thế hệ tổ tiên tâm linh của con; xin Bụt và chư tổ, xin sư ông và thầy truyền cho con nguồn năng lượng thương yêu, an lạc và sự vững chãi của liệt vị. Con nguyện tu tập để chuyển hóa và để truyền về cho thế hệ tương lai năng lượng của Bụt, của tổ và của thầy.
<<<
 
Sau khi lễ hai lạy như vậy rồi, ta thấy năng lượng của gia đình huyết thống và năng lượng của gia đình tâm linh chuyển động trong huyết quản, và trong tâm tư ta. Ta cảm thấy vững chãi hơn, có đức tin mạnh mẽ hơn và ta lạy lễ thứ ba để tiếp xúc với đất nước, với khí thiêng sông núi và liệt vị tiền nhân. Tiền nhân đã qua đời nhưng vẫn luôn luôn có mặt để che chở, phù trợ cho ta.

!!! Lễ thứ ba

<<<
Trở về kính lạy, liệt vị tiền nhân, khai sáng đất này, sông núi khí thiêng, hàng ngày che chở.

Con thấy con đang đứng trên đất nước này, và tiếp nhận công ơn khai sáng của tiền nhân đất nước này. Con thấy các vua Hùng, con thấy Trần Hưng Đạo, con thấy Lý Thái Tổ, con thấy Lý Thánh Tông, con thấy bao nhiêu người có tên tuổi và không có tên tuổi, đã đem tài trí, kiên nhẫn và chịu đựng làm cho đất nước này trở nên nơi nương náu của bao nhiêu giống dân; đã lập nên trường học, nhà thương, xây dựng cầu cống, đường sá, chợ búa; đã thiết lập nhân quyền, luật pháp và phát minh khoa học làm cho mức sống được nâng cao. Con cũng tiếp xúc được với những thế hệ tổ tiên ngày xưa đã sinh sống trên đất nước này và đã biết sống an lành với mọi loài và với thiên nhiên. Con sống ở đây, học hòa hợp với thiên nhiên, với con người, và cảm thấy năng lượng của đất nước này đi vào trong con, yểm trợ con, chấp nhận con. Con xin nguyện tiếp tục giữ gìn và làm tiếp nối những dòng năng lượng ấy. Xin nguyện góp phần chuyển hóa những bạo động, căm thù và vô minh còn tồn tại trong đất nước và trong xã hội này. Xin quý vị tiền nhân phù hộ độ trì cho chúng con.
<<<

Nếu đang sống ở quê hương, thì trong khi lạy xuống lạy thứ ba ta phải tiếp xúc được với các vị tiền nhân khai sáng đất nước. Có những vị tuy không để lại tên tuổi nhưng đã âm thầm xây dựng đất nước. Nếu đang sống ở hải ngoại, ta cũng phải biết đất nước mà mình đang sống đây là do những ai khai phá và xây dựng. Phải tiếp xúc được với tiền nhân của đất nước này.

Sau ba lễ, ta đã cảm thấy như một thân cây có gốc rễ, có thêm nhiều năng lượng. Lễ thứ tư giành cho người mà ta thương yêu để ta chia sẻ những nguồn năng lượng đã nhận được:

!!! Lễ thứ tư

> Trở về kính lạy, gia đình huyết thống, gia đình tâm linh, gia hộ độ trì, cho người con thương.

Người con thương có thể là cha con, mẹ con, anh con, chị con, em con, cháu con, thầy con, sư ông của con. Khi lạy xuống, ta sẽ quán nguyện như sau:

<<<
Những nguồn năng lượng vô biên mà con vừa tiếp nhận được, con xin truyền cho cha con, chia xẻ cho cha con, tiếp sức cho cha con, cho mẹ con, cho những người con thương yêu, cho những người đã từng khổ đau, đã từng lo lắng, đã từng buồn khổ vì con, vì những vụng về và dại dột của con trong quá khứ, và cũng đã từng lo lắng, buồn khổ vì hoàn cảnh khó khăn và không may của các vị. Con xin truyền nguồn năng lượng ấy, nguyện cầu và tiếp sức cho cha con, cho mẹ con, cho anh chị em của con, cho những người thân của con, cho chồng con, cho vợ con, cho các con của con để cho tâm hồn họ lắng dịu lại, cho khổ đau trong lòng những người ấy được chuyển hóa, cho những người ấy nở được nụ cười, cho những người ấy cảm nhận được niềm vui sống, cho những người ấy mạnh khỏe trong thân thể và an lạc trong tâm hồn. Con hết lòng cầu mong cho những người ấy có hạnh phúc và an lạc. Con biết nếu những người ấy có an lạc thì con có an lạc. Con cảm thấy trong lòng con không oán hận trách móc những người ấy một mảy may nào. Con lạy tổ tiên và ông bà trong gia đình huyết thống, tổ tiên trong gia đình tâm linh của con phù hộ độ trì cho những người con thương, những người mà con đã nguyện thương yêu và chăm sóc. Con thấy con không còn là một cái ta riêng biệt mà đã trở thành một với những người con thương.
<<<

Thỉnh một tiếng chuông, ta đứng dậy. Lúc đó sự phân biệt giữa cái ngã và cái phi ngã không còn nữa. Mình và người mình thương trở thành một dòng liên tục. An lạc của mình trở thành an lạc của người mình thương. Trong khi ta lạy và quán chiếu như vậy thì ranh giới giữa ta và những người ta yêu thương được phá bỏ. Ta thấy được ta với người đó cùng chung một dòng sinh mạng. Nếu ta vững chãi và có năng lượng thì ta có thể truyền được năng lượng đó cho người ta thương. Tình thương trong mình nuôi dưỡng chính mình trước, và vì vậy trong tâm mình cảm thấy nhẹ nhàng và thư thái.

Đến lễ thứ năm thì ta cúi xuống và truyền năng lượng của ta cho những ai đã từng làm khổ ta. Nhiều người lúc đầu không chịu được lễ này. Người kia đã làm cho mình đau khổ, tại sao bây giờ mình phải thương yêu và truyền năng lượng cho họ? Nhưng sau khi thực tập được vài tuần thì ai cũng thấy có ích lợi. Thực tập với tất cả tâm hồn của ta, sau đó mấy tháng trong lòng ta, ta cảm thấy hận thù tiêu tan, rất là mầu nhiệm. Nhiều người cho biết họ chỉ thực tập lễ thứ năm trong vòng sáu tháng rồi thôi không thực tập nữa, vì sau thời gian đó họ đã hoàn toàn không còn thù ghét những người đã làm khổ họ nữa.

!!! Lễ thứ năm

> Trở về kính lạy, gia đình huyết thống, gia đình tâm linh, gia hộ độ trì, người làm khổ con.

Trong tư thế ngũ thể đầu địa, ta thiết lập cảm thông với người kia:

<<<
Con mở rộng lòng ra để truyền đi năng lượng hiểu biết và xót thương của con tới những người đã làm con khổ đau và điêu đứng. Con biết người ấy cũng đã đi qua nhiều khổ đau, đã chứa chấp quá nhiều cay đắng và bực bội trong trái tim nên đã làm vung vãi những khổ đau và bực bội của người ấy lên con. Con biết những người ấy không được may mắn, có thể là từ hồi còn bé thơ đã thiếu sự chăm sóc và thương yêu, đã bị cuộc đời dằn vặt và ngược đãi bao nhiêu lần. Con biết những người như người ấy chưa có may mắn được học, được tu, trái lại đã chứa chấp những tri giác sai lầm về cuộc đời và về con, nên đã làm khổ con và làm khổ những người con thương. Con xin gia đình huyết thống và gia đình tâm linh của con truyền năng lượng cho người đó (cho những người đó), để trái tim của họ được tiếp nhận giọt nước cam lộ mà nở ra được như một bông hoa, có thể lần đầu tiên trong đời họ. Con chỉ cầu mong cho người đó được chuyển hóa, cho người đó tìm được nguồn vui sống, để không còn giữ tâm thù hận mà tự làm khổ mình và làm khổ người khác. Con biết những người ấy khổ mà không tự chủ được nên đã làm khổ con và những người con thương. Con cũng cầu mong cho tất cả những ai đã làm cho gia đình con khổ, dân tộc con điêu đứng, kể cả những kẻ xâm lặng, cướp nước, những người hải tặc, những kẻ ích kỷ, dối trá và tàn bạo được nhờ ơn Bụt, ơn tổ, ơn tiền nhân mà cải hóa. Con thấy họ khổ và nỗi khổ ấy đang kéo dài qua nhiều thế hệ, và con không muốn giữ tâm niệm sân hận oán thù. Con không muốn cho họ khổ. Con có gốc rễ nơi tổ tiên và dòng họ huyết thống và dòng họ tâm linh; trái tim con đã nở ra như một đóa hoa, con xin buông bỏ tất cả mọi hiềm hận, một lòng cầu nguyện cho kẻ đã làm khổ con, làm khổ gia đình và dân tộc con được thoát khỏi vòng tai nạn và đớn đau, để họ có thể thấy được ánh sáng của niềm vui sống và an lạc như con. Tâm con không còn mang một mảy may trách móc và oán thù. Con xin truyền năng lượng của con cho tất cả những người ấy. Lạy Bụt, lạy tổ, lạy ông bà chứng minh cho con.
<<<

Đây là sự thực tập lòng từ bi trong đạo Bụt. Bụt dạy: hận thù không thể nào đáp lại được với hận thù; chỉ có tình thương và sự tha thứ mới đáp lại được với hận thù mà thôi. Khi ta thực tập như vậy thì chất liệu từ bi trào lên trong trái tim ta. Sự tha thứ, sự thương yêu sẽ chữa trị cho ta, và con người ta sẽ an hòa và mạnh mẽ hơn. Hạnh phúc trở thành có thật. Lòng ta còn mang theo chất liệu của hận thù thì ta còn khổ đau mãi mãi.

Tùy trường hợp từng người, ai đã từng đau khổ quá nhiều, vết thương hận thù quá nặng, thì phải thực tập lễ thứ năm này nhiều lần. Muốn lễ thứ năm thành công thì trước hết ta phải thành công trong sự thực tập lễ thứ nhất và thứ hai. Ta phải trở về tiếp xúc được với tổ tiên trong gia đình huyết thống, tổ tiên trong gia đình tâm linh, thì mới có đủ năng lượng thương yêu để thực tập lễ thứ năm này. Tối nào tôi cũng lạy cả. Có khi tôi lạy phủ phục rất lâu. Trong những giây phút đó, hiệu quả chữa trị và nuôi dưỡng đã xẩy ra thật sự. Phương pháp năm lễ này đã được các vị thường trú ở Làng Mai thực tập mỗi ngày. Quý vị có thể lên chánh điện hoặc thiền đường một mình để thực tập riêng. Quán nguyện như thế nào cho thích hợp với trường hợp của mình thì làm, nhưng trước hết phải học phương pháp theo công thức như trên.

Đối với những vị đã có gốc rễ tôn giáo khác và mới quay về nương tựa Bụt, Pháp, và Tăng, thì nên lạy thêm một lễ khác nữa. Lễ thứ sáu này để tiếp xúc với gia đình tâm linh gốc rễ của họ, gia đình tâm linh họ đã lìa bỏ, nhưng ngày xưa tổ tiên và ông bà của họ đã theo. Ví dụ như ngày xưa tổ tiên ông bà đã theo Do Thái giáo hay là Cơ Đốc giáo, thì bây giờ ta phải lạy cái lạy thứ sáu này để trở về và tiếp xúc. Gốc rễ của gia đình tâm linh đó rất cần thiết cho sự chữa trị và sự vững mạnh của ta. Những người có hai gia đình tâm linh thường thường là những người Âu châu và Mỹ châu cho nên tôi sẽ đọc lời quán nguyện này bằng tiếng Anh.

Có hai gia đình tâm linh thì chúng ta có thể giàu có thêm. Tiếp xúc được với nhiều gia đình tâm linh chỉ làm đời sống tâm linh của ta giàu có thêm thôi. Trong thời gian ở Tây phương, tôi đã gặp những người bạn thuộc những truyền thống Do Thái giáo và Cơ Đốc giáo. Những người còn gốc rễ tâm linh vững chãi thì nơi họ có lòng từ bi, có hoan hỷ, có nhân ái. Họ đã giúp ta bằng sức mạnh tâm linh của họ. Họ giúp ta vận động chấm dứt chiến tranh, đã giúp ta nuôi trẻ mồ côi, cứu trợ những nạn nhân chiến tranh, bão lụt, v.v.. Chúng ta thấy chất liệu thương yêu và hiểu biết có thật. Tiếp xúc được với họ, ta tiếp xúc được với gia đình tâm linh của họ, tiếp xúc được với những vị đạo sư của họ. Chúa Ky Tô là một vị đạo sư đã dạy về bác ái, về thương yêu. Chúa Ky Tô là một vị Bồ Tát lớn vì ngài đã tạo nên niềm tin và đức từ bi nơi hàng triệu, triệu người. Khi nhận ra Chúa Ky Tô là một vị Bồ Tát thì ta thấy niềm tin của mình nơi Bụt, nơi Pháp, nơi Tăng, nơi truyền thống tâm linh của chính ta lớn thêm và giàu có lên thêm. Phía những người thuộc về các truyền thống tâm linh Do Thái hay là Cơ Đốc chẳng hạn, khi nhận Bụt Thích Ca làm thầy, nhận các vị như Long Thọ, Mã Minh, Vô Trước là thầy, thì họ cũng làm giàu cho truyền thống tâm linh của họ. Lễ thứ sáu này có mục đích đưa họ về tiếp xúc được với gốc rễ tâm linh mà lâu nay họ đã lơ là hoặc đã ruồng bỏ.

Đạo Bụt dạy chúng ta rằng ngã được làm bằng những yếu tố phi ngã, đạo Bụt được làm bằng các chất liệu không phải đạo Bụt. Phật pháp tức thế gian pháp. Đạo Bụt không nghĩ rằng chỉ trong truyền thống của ta là có chân lý và chân lý không thể có trong những truyền thống khác. Người theo đạo Bụt không có chủ đích làm cho người khác bỏ truyền thống tâm linh của họ để đi theo mình. Theo giáo lý này ta phải giúp cho người khác trở về bám rễ vào trong truyền thống tâm linh của họ. Sự thực tập đạo Bụt có mục đích giúp người ta trở về nguyên quán: quê hương tâm linh, quê hương huyết thống. Phương pháp của chúng ta khác với phương pháp của những giáo sĩ ngoại quốc tới nước ta cách đây ba bốn trăm năm. Chúng ta hiện giờ đang làm ngược lại phương pháp của họ. Chúng ta sang Tây phương chia sẻ sự thực tập của chúng ta, nhưng lại mong ước và khuyến khích những người Tây phương trở về với truyền thống tâm linh của họ. Vì chúng ta biết rõ khi một người mất gốc, người ấy trở thành một cô hồn lãng tử, khó mà có được an lạc, hạnh phúc, vững chãi và thảnh thơi. Cho nên lễ thứ sáu này rất cần thiết cho những người đã bỏ truyền thống tâm linh cũ của họ.

Việc tu tập của chúng ta là một sự trở về. Trở về tiếp xúc với quê hương. Quê hương đó có thể được tiếp xúc ngay bây giờ và ở đây, ngay chính trong con người của ta. Chúng ta không cần đi máy bay mới trở về được quê hương tâm linh. Chúng ta không cần tưởng tượng. Trong ta có gốc rễ của gia đình huyết thống, có gốc rễ của gia đình tâm linh, có Bụt, có Pháp, có Tăng, có ông bà, tổ tiên. Khi trở về, chúng ta được che chở, chúng ta được tiếp nhận thêm năng lượng. Chúng ta bắt đầu được nuôi dưỡng, được chuyển hóa và trị liệu cả vật chất lẫn tinh thần.

Trong khi thực tập, mỗi bước chân ta là một sự trở về. Bước đi mỗi bước, điểm ta đạt tới là bây giờ và ở đây. Bài Đã Về Đã Tới là để giúp ta thực tập sự trở về đó. Bài Quay Về Nương Tựa Hải Đảo Tự Thân cũng là để ta thực tập điều đó. Mùa thu vừa qua, trong buổi thuyết giảng ở Berkeley, tôi đã nói phương pháp thực tập của chúng ta có thể được gọi là phương pháp trở về (the practice of going home). Trong cuộc sống thất niệm và quên lãng, chúng ta để cho tư tưởng, để cho nhớ thương, giận hờn, quá khứ và tương lai lôi kéo. Chúng ta đã sống như một bóng ma, đã bước đi trong cuộc đời như một người mộng du. Chúng ta chưa trở về. Ngoài chánh niệm, không ai có thể giúp chúng ta trở về được quê hương của chính ta, quê hương tâm linh cũng như quê hương huyết thống. Với những câu hỏi: ‘‘Anh đang làm gì? Anh làm cái đó với mục đích gì? Anh đang đi đâu?’’ chúng ta trở về ngay với chánh niệm, với bây giờ và ở đây. Bỗng nhiên ta biết rằng ta đang đứng trên quê hương, chưa bao giờ rời khỏi quê hương ta.

Trở về như vậy, chúng ta cảm thấy tràn đầy và được nuôi dưỡng. Phương pháp này phải thực tập trong từng giây, từng phút. Nếu quý vị thất bại trong thời gian thực tập ở Làng Mai thì tôi lo rằng quý vị sẽ thất bại khi về nhà. Tại Làng Mai có một tăng thân đang cùng tu tập, chúng ta phải giúp nhau tu tập. Nếu ở Làng Mai mà chúng ta không tạo ra được cái thói quen, cái tập khí mới, thì khi trở về chúng ta sẽ bị cuốn theo nhịp sống cũ, khó thực tập thành công được. Cho nên, trước khi lên máy bay, chúng ta đã phải trở về.
! Bài 05 Đạo đế, bát chánh đạo

Hôm nay vì đã đi đến phần đạo đế, nên chúng ta sẽ học về Bát Chính Đạo.Hôm nay là ngày mùng 5 tháng 12 năm 1993. Chúng ta ở tại Xóm Hạ và học tiếp về tứ diệu đế.

Đạo tức là con đường (marga là con đường), con đường chuyển hóa, con đường đưa tới giải thoát và an lạc. Muốn tìm con đường giải thoát, con đường chuyển hóa, ta phải tìm ở đâu? Nhiều người đã trả lời và có những câu trả lời rất mạnh mẽ. Một vị thiền sư Việt Nam, trong khi thuyết pháp đã nói : ‘‘Mục đích quan trọng nhất của người xuất gia là vượt thoát sinh tử. Một vị đệ tử mới hỏi: ‘‘Bạch thầy, tìm sự vượt thoát sinh tử ở đâu? Vị thiền sư trả lời : ‘‘Tìm ngay ở trong sinh tử. Thiền sư đó tên là Thiện Hội, và thiền sinh ấy tên là Vân Phong, sống ở thế kỷ thứ mười.

Tìm cái không sinh tử ngay ở trong sinh tử. Đạo không tách rời khỏi cuộc sống hiện thực của chúng ta, trong đó có những khổ đau mà chúng ta đã và đang trải qua. đạo không phải tự trên trời rơi xuống đất. đạo tức là con đường tìm ra ngay trong hoàn cảnh đau khổ. Nếu không có hoàn cảnh đau khổ của chúng ta thì không có đạo. Cho nên đạo đế được làm bằng khổ đế. Điều này cho thấy, một lần nữa, nguyên tắc duyên khởi và bất nhị của đạo Bụt. Nếu không nhìn vào cuộc đời thực tại với những đau khổ, với những vấn đề của nó, thì ta không thể tìm ra đạo. Tìm đạo ngay trong khổ và trong tập.

Cho nên khi nói về bát chánh đạo chúng ta phải nhớ rằng đạo là phương pháp hành trì liên hệ mật thiết đến những khổ đau có thực của chúng ta. Trong giới Tiếp Hiện có một giới nói về chuyện cần thiết tiếp xúc với đau khổ, không được trốn tránh đau khổ, phải trực diện với đau khổ. Cũng như hoa sen không có thể mọc trên đá mà phải mọc trong bùn, đạo giải thoát phát sinh từ vũng lầy của đau khổ. Không những đạo đế liên hệ với khổ đế mà còn liên hệ mật thiết với tập đế và diệt đế.

!! Chánh kiến

Bụt nói tới con đường giải thoát như là con đường của tám sự hành trì chân chính, gọi là bát chánh đạo. Sự hành trì chân chính đầu tiên là chánh kiến.

Kiến là cái nhìn, cái thấy. Chánh kiến là cái thấy, cái nhận thức xác thật. Chữ chánh trong tiếng Hán Việt có nghĩa là thẳng, còn khi nghiêng ta gọi là tà. Chánh kiến có thể dịch là right understanding hay right view (samyak drsti). Chữ PHạn Drsti là cái thấy. Samyak là chính.

Trong văn mạch của tứ diệu đế thì chánh kiến trước hết là cái nhìn rõ rệt về bốn sự thật căn bản. Phải hiểu thế nào là khổ, tập, diệt và đạo. Tu tập chánh kiến có hai giai đoạn, hữu lậu và vô lậu, có cái thấy phản ảnh chân lý tương đối và có cái thấy phản ảnh chân lý tuyệt đối. Tuy nhiên ta phải ghi nhớ câu Nhị đế dung thông tam muội ấn trong nghi thức tụng niệm hàng ngày. Nhị đế dung thông có nghĩa là tục đế không trái chống với chân đế, chân đế bao gồm tục đế ở trong. Dung có nghĩa là chứa đựng được, có thể bao trùm được. Tương dung có thể dịch là inter-embracing, bao dung lẫn nhau. Thông có nghĩa là cái này truyền với cái kia, inter-penetration. Phải thấy được tính cách dung thông của nhị đế trong mỗi giáo lý của đạo Bụt. Nói rằng chánh kiến là cái thấy đứng đắn về tứ diệu đế, nhưng cái thấy tới mức nào mới là đứng đắn? Sự hiểu biết và nhận thức của chúng ta gần với chân đế nhiều hay ít là tùy theo sự tu tập của chúng ta.

Trong sự tu tập, học hỏi, chúng ta có ba giai đoạn : văn, tư, tu. Văn tức là nghe giảng, đọc sách, nghe giáo lý, học giáo lý, pháp đàm về giáo lý. Tư là dùng trí thông minh, kinh nghiệm của mình mà chiêm nghiệm. Không vâng tin theo một cách ngây thơ những gì mình nghe, mình học. Tu là đem ra thực tập. Thực tập bằng thiền hành, thiền tọa, ăn cơm im lặng, làm việc, nói năng. Thực tập để có cơ hội xét nghiệm lại, để có thể chuyển đổi tự thân cho sâu sắc hơn, đứng đắn hơn, vững vàng hơn. Đó gọi là quá trình văn, tư, tu (learning, reflecting and practicing). Vặn, tư và tu luôn luôn bắt đầu bằng tục đế, tức là bằng sự thật thông thường, có thể dùng óc suy luận, có thể dùng khái niệm và ngôn ngữ để diễn bày, để chuyên chở. Chúng ta dùng những danh từ và những khái niệm như khổ, tập, diệt, đạo mà tu tập. Càng tu tập bao nhiêu thì chúng ta càng có kinh nghiệm trực tiếp bấy nhiêu, và dần dần chúng ta không còn bị trói buộc bởi những danh từ và khái niệm nữa, nghĩa là bước sang lãnh vực chân đế.

Trong bước đầu văn, tư và tu, tuy rằng chúng ta đang ở trong tục đế nhưng sự tu tập đã hàm chứa chân đế rồi. Và khi đạt tới sự chứng ngộ, có được cái thấy tuyệt đối, thì chúng ta biết rằng sự chứng ngộ đó có chứa đựng tất cả những hạt giống, những thành quả đã đi qua từ những bước đầu tu tập. Nói như vậy để nhắc lại một lần nữa quy tắc Nhị đế dung thông, hai loại chân lý không chống đối nhau. Cho nên, cái hiểu và cái biết của chúng ta về tứ diệu đế dù còn nhỏ bé tới đâu, dù chưa đúng hẳn với lời Bụt dạy, nhưng trong đó đã có hạt giống của chân đế.

Trong Kinh thỉnh thoảng Bụt và các thầy có nói tới thế nào là chánh kiến. Sự diễn tả chánh kiến luôn luôn bắt đầu ở trình độ dễ dàng để mọi người có thể hiểu được. Ví dụ như nói chánh kiến là cái thấy về thiện, ác, về nhân quả: gieo đậu sẽ được đậu, làm lành thì sẽ có phúc, làm dữ thì sẽ bị tai họa, v. v. tất cả đều thuộc về chánh kiến. Tất cả mọi người đều cần những ý niệm sơ khởi như vậy thì mới biết đường đi. Như niềm tin nơi Bụt, một bậc giác ngộ; niềm tin nơi Pháp, con đường giải thoát và niềm tin nơi Tăng, đoàn thể tu tập. Đó là chánh kiến. Tin rằng có thể chuyển hóa đau khổ, rằng có những bậc A la hán, nhờ tu tập mà đã thoát được những phiền não và sinh tử luân hồi… những điều đó đều thuộc về chánh kiến. Hễ lời nói nào, ý niệm nào mà chứa đựng được một hạt chân lý của Phật Pháp trong đó là có chứa đựng ít nhiều chánh kiến rồi, dầu chưa phải cái thấy tuyệt đối.

Chúng ta hãy đọc một đoạn trong Kinh Thánh Đạo. Kinh nói : ‘‘Có bố thí, có cúng dường, có cha có mẹ, có các loài hóa sanh, có các vị sa môn, bà la môn, có người tu học thành công, có sự tu hành để chứng đạt được trong đời này. ì Đó là một cách trình bày chánh kiến để mọi người thấy và có đức tin. Với đức tin, người ta đi theo con đường chuyển hóa, bỏ những hành động sai lầm gây khổ đau, bắt đầu tạo an lạc và hạnh phúc. Nhưng chánh kiến trước hết là thấy bốn sự thật mầu nhiệm, tại vì đó là căn bản của Phật Pháp. Mà thấy được bốn sự thật cho rõ ràng thì điều này không phải là chuyện dễ. Công nhận sự thật về khổ, tập, diệt và đạo, tức là chấp nhận tứ diệu đế. Nhưng ta cần có công phu học hỏi, tư duy và công phu thực tập rất nhiều mÌới có thể có được cái nhìn sâu sắc và vững chãi về tứ diệu đế. Sau đây chúng ta thử tập quán chiếu để có một cái thấy về tứ diệu đế.

!! Chánh kiến về tứ diệu đế

Chúng ta biết rằng con đường thoát khổ mà chúng ta tìm, con đường đưa tới sự an lạc mà chúng ta tìm, chúng ta phải tìm ngay ở trong cái khổ. Đó là nguyên tắc thực tập: phải trực tiếp đối diện với khổ. Cái khổ có thể là nỗi sợ hãi, có thể là niềm lo âu, bất an. Cái khổ có thể là mối hận thù, giận dữ, là buồn rầu, chán nản hay tuyệt vọng. Chúng ta phải trở về tiếp xúc và tìm hiểu những nỗi khổ đó với tất cả sự can đảm của mình. Chúng ta phải nâng nỗi khổ lên, ôm vào trong hai tay và quán chiếu sâu xa vào nó. Nếu không làm được chuyện đó thì không dễ gì ta thấy được tập, diệt và đạo.

Khi quán chiếu về khổ, trước hết chúng ta thấy một sự thật là nhiều người đang khổ mà không biết là mình khổ. Họ luôn luôn tìm cách trốn chạy, tìm cách lãng quên cái khổ của họ. Cũng như người bị bệnh ho lao mà không nhận biết mình bị bệnh ho lao.

Nhiều người mang một niềm thất vọng, một nỗi đau khổ quá sâu kín trong lòng mà không tự biết. Họ chỉ cảm thấy không an lạc, cảm thấy không muốn đối diện với chính mình. Vì thế họ tìm sự quên lãng, vùi lấp đời họ trong những quán rượu, vũ trường, bài bạc, hay chôn nỗi khổ của mình trong những phim video, v. v. Bụt dạy rằng cái khổ của con lạc đà hay con lừa phải chở hành lý nặng nề trên lưng, cái đó chưa phải là khổ. Ngu si không biết mình là khổ, không biết có đường đi thoát khổ, đó mới là cái khổ thật. Đó là tình trạng của người không tu, không biết tu. Bắt đầu vào con đường văn, tư, tu ta nhận diện cái khổ, quán chiếu cái khổ, gọi tên cái khổ của mình mà không còn sợ hãi nữa. Và nhờ đó ta thấy được bản chất của cái khổ, thấy được tập, thấy được diệt và thấy được đạo ở trong khổ.

Thấy Tập tức là thấy được những gốc rễ gần xa, nguyên do của cái khổ. Chúng ta đã sống như thế nào, đã ăn uống như thế nào, đã thở như thế nào, đã tiêu thụ như thế nào? Đã sống đời sống cá nhân và xã hội của chúng ta như thế nào? Ta nhận diện cái khổ, gọi tên nó, quán chiếu và thấy được bản chất của nó. Và khi thấy được bản chất của khổ thì ta sẽ thấy tập. Tập tức là nguyên do của khổ, những nguyên do xa gần trong quá khứ và trong hiện tại. Cái thấy đó chỉ có thể đạt được bằng sự quán chiếu. Chúng ta có những phương pháp để quán chiếu. Chúng ta cần sự yên lặng, cần có thì giờ, chúng ta cần thiền tọa, thiền hành, chúng ta cần bạn tu để giúp đỡ, chúng ta cần thầy để hướng dẫn. Một ông bác sĩ trị bệnh cũng làm như vậy thôi. Bác sĩ mà quán chiếu sai lầm, đưa thuốc sai lầm thì có thể làm hại bệnh nhân. Trong sự tu học, chúng ta làm công việc thầy thuốc cho chính bản thân. Chúng ta phải có đủ thì giờ quán chiếu, phải can đảm tiếp xúc với cái đau khổ của mình. Phải tìm ra những nguyên nhân của khổ đau hàng ngày. Như vậy, không những ta thấy được tập, mà ta còn thấy được diệt đế nữa.

Diệt tức là khổ diệt, nghĩa là sự vắng mặt của khổ. Hôm nay cái khổ có mặt cũng có nghĩa là ngày hôm qua, hay trong quá khứ, nó đã từng không có mặt. Nếu chúng ta biết chuyển hóa thì ngày mai nó có thể cũng không còn có mặt nữa. Đó là sự ước ao của chúng ta. Diệt tức là khổ diệt, có nghĩa là an lạc, hạnh phúc. Ta thấy là ngày xưa ta có những trạng thái vô tư, an lạc, có sức khỏe, nhưng ta đã không biết quý, không biết hưởng và không biết bảo hđo.

Diệt cũng được thực tập qua ba giai đoạn. Thứ nhất là tiếp xúc với cái hạnh phúc bình thường trước khi nó mất. Ví dụ có một bà mẹ yêu quý mà không biết đó là hạnh phúc nên không hưởng niềm vui có mẹ, khi mẹ mất đi thì thấy khổ. Có lúc chúng ta không đau răng mà không thấy mối hạnh phúc của người không đau răng, đợi tới khi răng đau nhức thì mới thấy rằng lúc không đau răng là hạnh phúc. Vì vậy nên khi nhìn vào khổ thì thấy được thế nào là diệt. Thấy tập rồi là thấy diệt. Không đau răng tượng trưng cho biết bao nhiêu là an lạc mà mình đã dẫm đạp, đã tàn phá bằng sự quên lãng và dại khờ của mình. Khi hai chân mình đang còn khỏe, còn chạy được, còn đi được thì mình không biết hưởng, mình không có hạnh phúc. Đến lúc già yếu, chân đi không vững, mình mới thấy rằng có hai chân khỏe là hạnh phúc lớn.

Tình trạng khổ mà không biết là mình khổ cũng tương tự như tình trạng diệt, có yên vui mà không biết là mình yên vui. Đó là vì mình không có khả năng tiếp xúc với hạnh phúc. Có hai con mắt mở ra để thấy trời xanh, nhưng ta không biết rằng đó là hạnh phúc. Khi khổ đau mà quán chiếu cái khổ và tiếp xúc với cái khổ, ta thấy được cái diệt. Trong một ngày, nếu thực tập quán chiếu bằng chánh niệm, ta sẽ thấy mình có sẵn rất nhiều điều kiện của hạnh phúc ngay trong hiện tại. Nhưng vì không tu tập chánh niệm, ta tự dẫm đạp lên trên những điều kiện hạnh phúc. Sống trong một tâm trạng chán nản rồi để cho tâm trạng đó trùm lấp mình, ta không còn khả năng tiếp xúc được với bất cứ sự mầu nhiệm nào trong đời sống hiện tại. Tại sao người khác đang đi thiền hành an lạc, đang tự nuôi dưỡng bằng hơi thở và bằng bước chân hạnh phúc, thì ta tuy cũng đi thiền hành với họ mà lại tự chôn mình trong đau khổ, buồn bực, giận hờn?

Trong khi quán chiếu khổ, ta thấy được diệt, là trạng thái không khổ và tự nhiên đạo phát khởi. Ta có thể nhận ra rằng cái khổ bắt nguồn từ sự quên lãng và những tri giác sai lầm. Quên lãng tức là không có chánh niệm (the lack of mindfulness). Khi ganh tị, giận hờn, ta khổ đau. Mà những ganh tị và giận hờn ấy bắt nguồn từ vọng tưởng. Có thể người khác không có chủ ý làm khổ ta, nhưng ta cứ nghĩ rằng người ấy có chủ ý. Khi thấy nguyên do gây khổ, ta thấy được tập, và nguyên do đó tại ta. Nếu thấy nguyên do đó không đáng cho ta khổ, thì cái khổ tan biến, và tự nhiên ta có nụ cười và ta an lạc. Khổ, tập, diệt và đạo có mặt đồng thời trong một giây phút.

Đạo, là con đường chánh niệm phá tan quên lãng, là con đường chánh kiến phá tan vọng tưởng. Cái khổ của ta vốn chứa hạnh phúc trong tự thân nó, nhưng vì cách nhìn sai lầm của ta nên ta không thấy hạnh phúc. Hạnh phúc của mình, chính mình vứt bỏ nó đi, mình đẩy nó đi. Biết bao nhiêu thanh thiếu niên đã dại dột như vậy. Trong một cơn giận dơư, trong một phút đam mê, họ không còn nhìn thấy được hạnh phúc lớn lao sẵn có, và họ tự chấm dứt đời họ. Cái mà mình gọi là khổ có thể đang chứa đựng cái diệt, có khi ta chỉ cần một thực tập nho nhỏ là có thể tự chuyển hóa, khôi phục được tình trạng diệt. Phương pháp khôi phục đôi khi rất đơn giản. Khổ hay lạc đều tùy theo cách của mình nhìn. Một người bạn tu là một người có thể giúp mình nhìn lại và thấy được những gì mình chưa thấy. Ta nên nhìn tận mặt cái khổ của ta và hãy chào cái khổ ấy: Buồn ơi chào mi! Chán nản ơi chào mi! Giận ơi chào mi!. . Quán chiếu trực tiếp vào cái khổ ta thấy ở trong khổ có tập, có diệt và có đạo. Có người tưởng rằng đạo phải do thầy dạy, phải được học trong Kinh. Ai ngờ nhìn sâu vào trong nỗi đau khổ của ta, ta đã có thể thấy đạo rồi.

Bụt đã làm như vậy. Bụt có bao giờ học Kinh? Ngài không học Kinh Pháp Hoa, cũng không học Kinh Hoa Nghiêm, cũng không học Kinh A Hàm, … Ngài chỉ quán chiếu cái khổ của mình mà tìm ra con đường và Ngài đã dạy chúng ta. Chúng ta cũng phải nhìn vào sự thật khổ đau, không nên tìm cách quên lãng, trốn chạy, che dấu, xô đẩy, chống đối lại khổ đau. Chỉ có sự quán chiếu khổ đau mới giúp ta tìm ra được những nguyên do khiến cho ta không hạnh phúc, rồi sau đó tìm ra con đường chuyển hóa khổ đau thành hạnh phúc. Quán chiếu vào khổ thì thấy tập, diệt và đạo. Một cái chứa đựng tất cả các cái khác. Giáo lý duyên sinh của Bụt rất mầu nhiệm.

Trong quá trình quán chiếu, nhận diện và gọi tên như vậy, ta thấy được bản chất của khổ, thấy tập, thấy diệt, thấy đạo. Nhờ ta nhìn thấy tập, thấy diệt, thấy đạo trong khổ, tự nhiên khổ sẽ giảm bớt, các nguyên do tập thành tự ngưng, đạo hiện ra. Thấy tập thì ngưng tập. Ví dụ thấy vì uống rượu mà đau gan thì ta sẽ tự ngưng uống rượu. Thấy phổi yếu vì hút thuốc ta tự ngưng hút thuốc. Tập càng ngày càng bớt đi và sự chuyển hóa sẽ tới. đạo càng ngày càng hiện rõ. Quá trình tu tập đó là văn, tư và tu.

Khi mức chuyển hóa đã cao, thì cái khổ trước đây bây giờ không còn là khổ nữa. Những cái gọi là chết, bệnh, già, hay giận, buồn, ghen, không làm cho mình sợ hãi nữa. Quán chiếu sâu xa hơn ta sẽ thấy rằng những cái gọi là sanh và diệt chỉ là những ý niệm trong đầu mình. Không có sanh cũng không có diệt, chỉ có sự biểu hiện và sự ‘‘n tàng. Cho nên những cái mà thế gian gọi là khổ đã được Bụt và các vị bồ tát cho là lý thường nhiên. Một chiếc lá sanh ra, lớn lên, ve vẩy trên cành rồi rụng xuống, đó là chuyện thường. Chuyện ta sanh ra, lớn lên, già rồi chết, cũng thường nhiên như một chiếc lá. Nhìn sanh, lão, bệnh, tử với con mắt bình thản, ta sẽ không lo sợ.

Vô khổ, tập, diệt, đạo là một lời tuyên bố của Tâm Kinh. Ta đi vào phạm vi của chân đế, của vô lậu, của liễu nghĩa kinh: không có khổ, tập, diệt và đạo. Các vị bồ tát dạo chơi trong biển sinh tử để cứu người. Nơi ta gọi là biển khổ chính là môi trường hành đạo của họ. Họ không còn bị những đợt sóng còn, mất, tử, sinh vùi dập. Ranh giới giữa khổ và diệt, giữa khổ và vui đã mất đi. Chính bằng chất liệu khổ mà họ tạo ra an lạc, bằng phân rác mà họ tạo ra được bông hoa. Phiền não tức bồ đề là ngôn ngữ siêu việt khổ vui. Hoa và rác tương tức. Chúng ta biết rằng cái khổ mà chúng ta thấy là ngược với cái vui, nhưng sau một thời gian tu tập và quán chiếu sâu sắc, khổ vui sẽ tương tức. Sau khi vượt ra, không còn sợ hãi và trốn chạy cái khổ, không còn mê đắm trong cái vui tương đối, chúng ta đạt tới niềm vui chân thật và vô lậu, đó là niết bàn. Cái vui này siêu việt cả cái khổ và cái vui thông tục: Sanh diệt diệt dơi, tịch diệt vi lạc. Giai đoạn quán chiếu khổ và tập tuy còn là trong cõi hữu lậu nhưng giai đoạn đó đã chứa đựng những hạt giống của vô lậu. Khi nghe ngôn ngữ của chân đế, chúng ta phải thấy ngôn ngữ đó không nói ngược lại sự thật tục đế.

Bây giờ chúng ta nói đến chánh kiến về Tập, tức là những nguyên do gần xa gây ra khổ. Cứ để khổ đau tràn lấp, làm cho đen tối cuộc đời. Đó là một câu trong bài Sám Nguyện. Hàng ngày, những ý tưởng, lời nói và hành động của ta có thể đang nuôi dưỡng cái khổ mà ta không biết. Bây giờ tu học ta phải nhận diện, quán chiếu, thấy được những điều ta đã làm và đã nói thường gây đổ vỡ trong đời sống hàng ngày.

Bụt dạy nhiều phương pháp giúp ta nhìn thấy bản chất của khổ và tập, thấy được bản chất của diệt, thấy ta có thể đạt tới diệt, tức là hạnh phúc. Nếu làm đúng phương pháp Bụt dạy, nếu chuyển hóa thành công, ta sẽ phát khởi được cái nhìn vô lậu. Lúc đó ta sẽ không còn kẹt vào các khái niệm khổ, diệt và đạo nữa. Tư tưởng ta có thể bị kẹt. Ví dụ như nghĩ rằng diệt là không còn gì nữa hết cho nên hết khổ, đó là một quan niệm sai lầm. Chứng đạo rồi ta không còn chấp trước nữa, dù cả vào sự tu tập. Trong cửa thiền ta gọi là đói ăn khát uống: Tôi đói thì tôi ăn, tôi khát thì tôi uống, mà khi làm theo điều mong muốn, tôi không gây đau khổ cho tôi và cho người. Khổng tử nói tùng tâm sở dục bất du củ. Tùng tâm sở dục có nghĩa là lòng mình muốn gì thì mình làm cái đó, và mình không còn bị kẹt vào hình thức. Bất du củ là vẫn đúng khuôn phép*. Đó là tình trạng thảnh thơi, an lạc nơi Tịnh độ. Theo ngôn ngữ của mười bức tranh chặn trâu là thõng tay vào chợ. Cũng đi vào chợ, cũng nói cũng cười, cũng mua bán như người khác, nhưng mình vẫn là con người giải thoát. Không tuyên bố nghiêm trọng: tôi đang tu đây. Đi thiền hành thảnh thơi như không. Kinh Tứ Thập Nhị Chương nói ‘‘ngã pháp hành vô hành hạnh, tu vô tu tu. ì

Ở trình độ ‘‘tùng tâm sở dụcì- muốn làm gì cũng được, thì hành động sẽ không còn gây thêm tập, không tạo thêm những nguyên do của khổ. Nhưng nếu chưa đạt tới trình độ đó mà ta bắt chước thì đó là điều nguy hiểm. Khi xưa Hòa thượng Nhất Định, chùa Từ Hiếu, xin vua được từ chức tăng cương về trụ trì ở núi Diên Xuân với hai vị đệ tử. Ngài lập một cái am, gọi là am An Dưỡng, rồi Ngài mời bà mẹ về để được dịp sống gần mẹ già. Các quan trong triều tới thặm, xin cất một ngôi chùa, Ngài nói: ‘‘Thôi, thôi, tôi đã trú trì nhiều chùa rồi, mục đích của tôi xin vua về nghỉ là để khỏi phải giữ chùa, không lý bây giờ các vị lại bắt tôi làm chùa nữa?ì Từ đó ngài sống những ngày rất an lạc cùng bà mẹ. Có một hôm mẹ ngài bị bệnh nặng, bà nói: ẩCon, sao mẹ muốn ăn cháo cá quáì. Ngài đi xuống chợ Bến Ngự, thản nhiên xin một con cá đem về nấu cháo cho mẹ ăn. Ngài xách con cá trong tay, đi từ dưới chợ lên núi. Nhiều người nói: Sao thầy tu mà làm như vậy? Nhưng vì Ngài không còn nđe vào hình thức nữa, thành ra Ngài thản nhiên. ẩ Làm cái gì cũng được hếtì, trong thiền học gọi là đói ăn khát uống. Người ta chỉ làm được như vậy khi đã đạt tới tự do và vượt thoát thường tục.

Diệt tức là sự chấm dứt những nguyên do gây khổ đau. Người ta sống có hạnh phúc, an lành và thảnh thơi mà không tự biết. Trước khi bị khổ đau trấn ngự ta đã có tình trạng diệt, nhưng ta không biết quý. Vì dại dột, ta có thể tự phá hạnh phúc tự nhiên sẵn có của ta. Nguyên do là ta sống không chánh niệm, ta thiếu thầy, thiếu bạn để chỉ cho ta thấy hạnh phúc ta đang có. Những điều kiện hạnh phúc có thể đang có mặt trong ta và xung quanh ta nhưng ta không có khả năng tiếp xúc để sống hạnh phúc.

!! Hạ thủ công phu

Tu tập cũng là quán chiếu để nhận diện hạnh phúc, bằng những bài thực tập chánh niệm. Ví dụ: ‘‘Tôi đang thở vào và tôi biết là tôi có hai con mắt. Tôi đang thở ra và tôi mỉm cười với hai mắt của tôi. ì Đó là một trong những bài tập giúp ta tiếp xúc được với những điều kiện hạnh phúc đang có của mình. Ta là người đã tiếp nhận nhiều điều kiện hạnh phúc ấy từ cha, mẹ, ông, bà, tổ tiên và trời đất nhưng ta đã không biết thừa hưởng kho tàng hạnh phúc đó. Kinh gọi đó là người cùng tử. Trong lúc quán chiếu như vậy ta thấy được ngay trong diệt cũng đã có sẵn mầm khổ. Cách sống hàng ngày của ta có thể tiêu diệt hạnh phúc của ta và tạo ra khổ đau. Rõ ràng là quán chiếu hạnh phúc thì ta thấy khổ đau nằm sẵn trong ấy. Và khi thấy điều đó, ta thấy được đạo.

Bụt dạy phép an trú trong hiện tại (hiện tại lạc trú), tức là sống tỉnh thức trong từng giây phút, biết quý trọng từng giây phút của đời sống. Con đường rõ ràng như vậy, chỉ có điều ta thực tập hay không mà thôi. Nghe Bụt ta biết là lời Bụt hay lắm, cần đem ra rao giảng cho thế gian, nhưng chính ta lại không chịu thực hành. Cho nên ta phải quyết chí thực tập chứ không còn nói lý thuyết suông, đó gọi là Hạ thủ công phu (get down to the real practice). Thiền hành mỗi ngày, tụng kinh mỗi ngày, thực tập mỉm cười và hơi thở ý thức mỗi ngày, và tập nhìn mọi người bằng con mắt hiểu và thương. Ta nấu cơm, rửa chén và quét nhà như thế nào để có thể có hạnh phúc ngay trong khi ta nấu cơm, rửa chén và quét nhà. Đó là công phu. Trong khi rửa chén, nấu cơm, kê bàn, dọn ghế, uống nước và cưa cây, ta tự hỏi: ‘‘Ta đang làm gì đây?- What am I doing?ì Ta tự trả lời: Ta đang rửa chén. Rửa chén như thế nào để có an lạc, quét nhà như thế nào để có an lạc đó là điều quan trọng. Khi ta tự hỏi: Ta đang làm gì đây? Ta sẽ rửa chén một cách khác và quét nhà một cách khác. Trong chánh niệm ta thấy hạnh phúc tràn lan. Ta sẽ không còn xem rửa chén và quét nhà là những công tác nặng nhọc và muốn làm cho xong. Ta đang làm gì đây? Hỏi xong ta mỉm cười, và chuyện rửa chén quét nhà bỗng tạo ra một niềm vui trong đời sống hàng ngày. Đó gọi là Hạ thủ công phu.

Ngoài việc thực tập trong cuộc sống cá nhân, chúng ta còn thực tập trong đời sống chung với mọi người. Giả dụ vì xung khắc mà hai người cùng đau khổ. Chúng ta có cơ hội thực tập để làm giảm bớt khổ đau. Cơ hội thứ nhất là cả hai người cùng thực tập. Hai người đều quán chiếu, hai người đều dùng mắt thương nhìn cuộc đời.

Cơ hội thứ hai là người này thực tập nếu người kia không thực tập. Khi ta thực tập và nhìn người kia bằng con mắt từ bi thì không những ta thay đổi mà người đó cũng sẽ thay đổi. Ta không cần hai người mới ký được hòa ước, một mình ta ta đã có thể ký hòa ước rồi. Trong tự tâm ta có thể hòa giải, ta tự bắt đầu trước, và sự chuyển hóa sâu xa và chân thật của ta sẽ đưa tới sự chuyển hóa của người kia.

Cơ hội thứ ba: nếu người này không thực tập thì người kia bắt đầu thực tập.

Thành ra lúc nào ta cũng có ba cơ hội để tạo niềm thông cảm. Tình trạng không phải là một tình trạng tuyệt vọng. Xung quanh ta, bất cứ một lời kinh, một tiếng mõ, một tiếng chuông, một bước chân nào cũng nhắc ta rằng ta có ba cơ hội đó. Hạ thủ công phu là việc ta có thể làm được và có thể làm ngay. Ta có thể thành công trong mấy phút đồng hồ, chứ không hẳn phải chờ ngày này sang ngày khác.

Nếu ta biết thay đổi cách nhìn thì tự nhiên bể khổ cuộc đời sẽ tiêu tan. Mắt thương nhìn cuộc đời là một phương pháp rất mầu nhiệm. Chính ta có thể thay đổi được tình trạng. Đừng nói rằng nếu người kia không thay đổi thì ta làm sao thay đổi.

Phương pháp tu tập này là tiếp xúc với an lạc và tạo tác niềm vui trong mỗi giây phút của cuộc đời. Đây là thực tập hiện tại lạc trú, thực tập phép lạ. Cuốn Phép Lạ Của Sự Tỉnh Thức bản dịch tiếng Pháp nhan đề là Le Miracle, cíest de marcher sur terre -Phép lạ là đi trên mặt đất. Đi trên mặt đất đã là thần thông. Phép lạ là biết mình đang sống. Chỉ đi bộ thôi cũng đã là thần thông. Chỉ cần rửa chén, chỉ cần nhìn một thân cây thôi, cũng đã là một phép thần thông. Phép lạ là biết rằng hễ mở mắt thì thấy được trời xanh. Phép lạ ấy, ta có thể thực hiện trong từng giây phút để nuôi dưỡng và chuyển hóa, để an lạc tăng trưởng, và để thấy đạo. đạo không phải chỉ được thấy nhờ học Kinh và nghe giảng mà nhờ thực tập. Càng thực tập ta càng thấy rõ đạo. Theo công phu tu tập này, những niềm vui hời hợt và giả tạo sẽ được chuyển hóa thành những niềm vui đích thật và sâu sắc.

Tuy biết rằng cái gì cũng vô thường, cũng thay đổi, nhưng ta không còn sợ hãi, vì ta đã biết cách tạo niềm vui. Thực tập như vậy, ta sẽ đạt tới mức độ vững chãi, sẽ không sợ hãi vô thường, sợ hãi thay đổi, đó là tự do, là không vướng bận. Không phải chờ tới một trình độ cao nào đó ta mới đạt được vững chãi và thảnh thơi. Công trình tu tập càng ngày liên tục đem lại cho ta vững chãi và thảnh thơi. Cho đến khi ta đạt tới sự vững chãi và thảnh thơi vượt trên những khổ vui thông tục thì diệt đế có tên là niết bàn (nirodha trở thành nirvana). Diệt không phải chỉ là sự vắng mặt của đau khổ. Sự vắng mặt tạm thời của khổ đau sẽ dẫn tới sự vắng mặt vơinh viễn của khổ đau. Tục đế sẽ đưa tới chân đế. Đó là chân như, có khi gọi là Pháp giới tánh hay là Pháp thân (dharmakaya). Và niềm vui lớn này, ta không thể diễn tả bằng lời nói được nữa, vì nó đã vượt ra khỏi ngôn ngữ của tục đế.

Niềm vui lớn này, Bụt và các vị bồ tát đã thực chứng được. Các vị có thể gật đầu xác nhận rằng niềm vui đó có mặt, nhưng họ diễn tả không được, và chính ta phải tự tìm lối vào. Không thể diễn tả được niết bàn (nirvana). Cho nên trong lãnh vực này thì diệt đế là ngôn ngữ đạo đoạn: con đường của ngữ ngôn đã bị cắt đứt. Không có ngữ ngôn nào có thể diễn tả được niết bàn, được niềm vui lớn, được sự vững chãi và thảnh thơi của người đã đạt tới cái niềm vui lớn. Không những ngôn ngữ không chuyên chở được mà các ý niệm cũng không chuyên chở được. Không suy tưởng được, không khái niệm được, gọi là tâm hành xứ diệt. Nó không thuộc về lãnh vực của tư tưởng nữa. Niết bàn không thể suy tư, không thể so sánh, không thể tưởng tượng được. Niết bàn chỉ có thể tự thân tác chứng.

Vậy thì sự thật thứ ba, diệt, cũng có hai phần. Phần thứ nhất là phần hữu lậu và phần thứ hai là phần vô lậu. Hữu lậu là asvara, như nước rỉ ra. Vô lậu là anasvara. Trong lãnh vực hữu lậu, chúng ta còn tùy thuộc vào ngôn ngữ và khái niệm. Tới lãnh vực vô lậu rồi thì không còn ngôn ngữ và khái niệm nữa. Nhưng trong quá trình văn, tư và tu, chúng ta đã có thể thấy được những hạt giống vô lậu trong cõi hữu lậu rồi. Cũng như không phải đợi chấm dứt sóng thì mới có nước. Ngay trong khi sóng là sóng thì đồng thời nó cũng đã là nước rồi.

!! Chú thích

Đức Khổng Tử nói rằng: ‘‘Năm 30 tuổi, tôi đã có thể đứng vững. Đến 40 tuổi, tôi bỏ được tất cả những điều nghi hoặc. Đến năm 50 tuổi, tôi biết được lẽ vận hành của trời đất. Tới năm 60 tuổi, thì tai nghe đã xuôi. Tuổi 70, tôi muốn làm gì thì làm mà không trái lại với đạo lý. (Tam thập nhi lập, tứ thập nhi bất hoặc, ngũ thập tri thiên mệnh, lục thập chi nhơi thuận, thất thập tùng tâm sở dục bất du củ).
!! Bài 22 Hộ trì sáu căn bằng chánh niệm

Hôm nay là ngày 6 tháng 2, năm 1994. Chúng ta ở tại Xóm Hạ và chúng ta học tiếp về Bát Chánh Đạo.

Kỳ trước chúng ta đã nói về Mười Hai Nhân Duyên thuộc phạm vi của chủ đề Duyên Sinh. Có hai loại duyên sinh, gọi là Vọng tâm duyên sinh và Chân tâm duyên sinh. Vọng tâm (deluded mind) tức là tâm còn chứa chất sự sai lầm. Thế giới, xã hội, cũng như con người, vì được duyên sinh tạo thành căn cứ trên vọng tâm đó nên có nhiều đau khổ, nhiều phiền não. Nhưng đứng về mặt tích cực thì chúng ta có Chân tâm duyên sinh. Chân tâm (true mind) là tâm phản chiếu thực tại mầu nhiệm, tâm của Tứ Trí. Thế giới, cũng như xã hội loài người, được tạo dựng ra trên chân tâm duyên sinh sẽ là thế giới hạnh phúc, an lạc.

!! Hộ trì sáu căn bằng chánh niệm

Chúng ta hãy tưởng tượng 1000 người mà tâm trí đầy dẫy những ganh tị, giận hờn và vô minh tụ họp lại để sống chung với nhau. Họ sẽ tạo nên một địa ngục nhỏ. Khung cảnh nơi họ sống có tính cách địa ngục. Cuộc sống hằng ngày của họ, và liên hệ giữa họ với nhau cũng có tính cách địa ngục. Điều đó đã sinh khởi do vọng tâm của 1000 người. Các vọng tâm tạo thành một cộng nghiệp khổ đau. Hai người hiểu lầm nhau đã có thể tạo ra một địa ngục nhỏ rồi, huống hồ là 1000 người. Muốn chuyển hóa địa ngục ấy thành ra một thiên đường, chúng ta biết chỉ có một cách là chuyển hóa nội tâm. Nhưng ai có thể chuyển hóa được tâm của 1000 người đó? Phải có một yếu tố khác như một vị đạo sư, hay một tăng thân lớn. Sự chuyển hóa bắt đầu từ một người, rồi hai người, để cho chất vọng bớt đi, và để cho chất chân bắt đầu có mặt. Bây giờ ta hãy tưởng tượng 1000 người kia có hiểu biết, có thương yêu, không giận hờn, không ganh tị… Họ có thể tạo ra một cọng đồng hạnh phúc. Đó gọi là chân tâm duyên sinh. Cho nên vốn liếng của chúng ta là tâm. Mà nếu tâm còn nhiều vọng, còn nhiều sự hiểu lầm (wrong perceptions, deluded mind) thì cái tâm ấy còn gây đau khổ. Khi một người có cái tâm sáng, cái tâm không hiểu lầm, thì người ấy đã có một thiên đường nhỏ cho chính mình. Và nếu hai người như vậy thì hai người ấy có thể tạo ra một thiên đường nhỏ cho nhau. Và khi người thứ ba tới, hai cái chân tâm có sẵn đó hy vọng sẽ chuyển hóa được cái vọng tâm kia một cách từ từ. Có 1000 người với tâm nhẹ nhàng thanh thoát là có Niết bàn hạnh phúc, là có thế giới Hoa Nghiêm.

Chúng ta thường học, thường giảng về mười hai Nhân Duyên, đã chú trọng nhiều về vọng tâm duyên sinh, và đã nói rất ít về chân tâm duyên sinh. Chúng ta than thở, buồn khổ vì tính chất tiêu cực của vọng tâm duyên sinh nhưng chúng ta chưa học, và chưa thực tập đủ về phần tích cực của chân tâm duyên sinh. Cho nên thế hệ của quý vị là phải mở ra một kỷ nguyên mới của sự tu học Phật pháp. Thay vì nói nhiều về mười hai Nhân Duyên đưa tới khổ đau thì quý vị phải nói nhiều, phải học nhiều, và phải đưa ra những phương pháp thực tập cụ thể về chân tâm duyên sinh. Chúng ta phải biết căn cứ vào giáo nghĩa Mười Hai Nhân Duyên để tạo dựng một thế giới của hạnh phúc, một thế giới của an lạc.

Chúng ta hãy vẽ lại một đồ hình, phía trong có mười hai chi phần của Thập Nhị Nhân Duyên, gồm có Vô Minh, Hành, Thức, Danh Sắc, Lục Nhập, Xúc, Thọ, Ái, Thủ, Hữu, Sinh, Lão tử. Phía ngoài chúng ta vẽ Chân Tâm Duyên Sinh. Vòng duyên sinh ngoài có Minh duyên Bồ đề tâm tức là Đại nguyện. Bồ đề tâm là một thứ năng lượng rất lớn thường thúc đẩy ta làm việc độ sanh. Bồ đề tâm đưa tới Trí.

Trí biểu hiện ra bốn mặt. Mặt thứ nhất gọi là Trí hiển hiện để soi sáng, Đại Viên Cảnh Trí. Trí đó phát xuất từ A Lại Da Thức, hay gọi là Dị Thục Thức. A Lại Da thức thuộc về vọng tâm cho nên biểu hiện ra thế giới thiên nhiên (khí thế gian) và chúng sinh (tình thế gian). Khí thế gian tức là hoàn cảnh trong đó ta sống, còn gọi là Y Báo. Chính con người ta thì được gọi là Chánh Báo, tức là Danh Sắc. Ngoài ra có Diệu Quan Sát Trí từ thức thứ sáu chuyển thành, Bình Đẳng Tánh Trí từ thức thứ bảy chuyển thành. Và công năng soi chiếu và tạo tác gọi là Thành Sở Tác Trí là từ năm thức đầu chuyển hiện.

Chúng ta đừng hiểu Trí là trí năng, sự thông minh. Trí ở đây tức là bản chất tạo tác ra một thế giới an lạc. Thức tạo ra Hữu, tức là cuộc sống nhiều khổ đau, nhiều đày đọa, Ưu sầu. Còn Trí tạo ra Tịnh độ, tạo ra Phật độ, ra thế giới của Hoa Nghiêm. Thức là vọng tâm, Trí là chân tâm. Chân tâm tạo ra thế giới Danh Sắc của người giác ngộ, của Thân Thị Hiện, gọi là Báo Thân. Báo Thân này vẫn có Lục Nhập, là sáu căn và sáu trần. Nhưng căn và trần này mang lại hạnh phúc, được gọi là Thọ Dụng Thân (sambhogakaya). Thọ Dụng là tiếp nhận và sử dụng. Lục Nhập thì đầy dẫy những mê mờ vọng tưởng trong khi đó thì Thọ Dụng Thân tràn đầy tính hạnh phúc và nhẹ nhàng của người giải thoát. Có Thọ Dụng Thân này thì Xúc có chánh niệm, Xúc thanh tịnh. Xúc này luôn luôn được sáu căn hộ trì.

<<<
Khi sáu căn tiếp xúc sáu trần <br>
Đem ý thức tinh chuyên phòng hộ.
<<<

Đó là cách sử dụng sáu căn và sáu trần của người giác ngộ. Xúc thanh tịnh, Xúc chánh niệm sẽ tạo tác ra Thọ thanh tịnh, Thọ chánh niệm. Chìa khóa của sự tu học là ở Xúc và Thọ. Nếu Xúc và Thọ không được chánh niệm hộ trì thì sẽ không có sự chuyển hóa. Cho nên bí quyết thành công của sự tu học là trong đời sống hằng ngày ta biết dùng chánh niệm để rọi vào Xúc và Thọ để sáu căn và sáu trần được tiếp xúc trong chánh niệm, và cảm thọ trong chánh niệm. Đó là cửa đi vào sự hành trì giải thoát. Nếu không tức là không có mặt của sự tu tập đích thực. Tụng Kinh mười hay là mười hai giờ đồng hồ một ngày, ngồi thiền mười hay là mười hai giờ đồng hồ một ngày mà không thực tập chánh niệm, không hộ trì sáu căn thì có thể không có kết quả gì cả. Khi ta đã biết hộ trì sáu căn thì khổ thọ được đặt trong chánh niệm, lạc thọ và xả thọ cũng được đặt ở trong chánh niệm. Ái dục lôi kéo hay không là do Xúc và Thọ có được đặt trong chánh niệm hay không. Ái tức là sự đắm đuối, thèm khát (craving, thirst). Nếu Xúc và Thọ được hộ trì trong chánh niệm thì không đi tới Ái, mà đi tới Xả, tức là tự do. Chúng ta phải định nghĩa chữ Xả một cách thấu triệt. Xả có nghĩa là tự do, là không phe phái, là có khả năng buông bỏ không vướng mắc. Xúc và Thọ bây giờ đưa tới Từ, Bi, Hỷ, và Xả.

Ái thuộc về tình cảm, nhưng đó là một thứ tình cảm bệnh hoạn đam mê, vướng mắc. Từ, Bi, Hỷ, và Xả cũng là tình cảm, nhưng đây là thứ tình cảm giải thoát, nhẹ nhàng. Tình cảm là loại năng lượng có thể thực hiện được nhiều phép lạ. Khi người ta thương, người ta có thể làm được những việc mà người không thương không sao làm được. Tình thương vướng mắc và nặng nề hay tình thương của chân tâm cao quý cũng đầy năng lượng như vậy. Có tình thương, có Từ, Bi, Hỷ, và Xả, anh có thể làm được những chuyện mà người không thương không thể nào làm được. Anh có thể chịu đựng được khổ đau, anh có thể hy sinh thân mạng, có thể làm mọi cách để cứu độ chúng sanh, là vì anh có tình thương lớn. Đạo lý Từ Bi Hỷ Xả là đạo lý về tình thương trong đạo Bụt để thay thế tình thương vướng mắc, và hệ lụy, gọi là khát Đi (trsna). Biết bao nhiêu người hụp lặn trong biển khổ vì Ái, vì tình thương vô minh. Biển Ái dìm chết biết bao nhiêu người là do thứ tình này. Từ Bi Hỉ Xả cũng là tình nhưng là tình có thể cứu vớt và giải phóng.

Trong truyền thống tu học có nhiều người sợ không dám nói tới tình. Làm như đi tu là phải bỏ hết tất cả tình. Điều đó không đúng. Tu phải có rất nhiều tình, tình Từ, tình Bi, tình Hỷ, và tình Xả. Trong thiền đường chùa Trúc Lâm, ta thấy hai câu đối. Câu bên phải là: ‘‘Bất tục tức tiên cốt’’ nghĩa là bản chất của người tiên là không vướng ở cõi tục. Vế kia là: ‘‘Đa tình thị Phật tâm’’ tâm đa tình, tâm nhiều tình cảm là tâm của Bụt. Tình cảm ở đây là Từ, Bi, Hỷ, và Xả.

Cho nên khi học đạo Bụt mà nặng về tri thức, chúng ta có thể có cảm tưởng là đạo Bụt khô khan. Ta mải nói về Giới, về Định, về Tuệ, về Trạch Pháp. Cái gì cũng là Trí Tuệ. Chúng ta đã nghiêng về Trí mà lơ là về Bi. Trong khi đó Bụt là Trí và Bi viên mãn. Phần trí tuệ và phần tình cảm phát triển song song với nhau và có quân bình. Vì vậy đạo lý Từ Bi Hỷ Xả cần phải được đề cao, cần phải được phát triển, và áp dụng rất nhiều. Thực tập Từ Bi Hỷ Xả thì sự sống có thêm hạnh phúc ngay trong giây phút hiện tại. Vì vậy bài pháp thoại hôm nay có chủ đề là Tình Thương. Thương như thế nào mà ta có hạnh phúc, những người được ta thương cũng có hạnh phúc, và không ai bị chìm đắm trong cái biển khổ đau của khát Đi (trsna).

!! Tứ vô lượng tâm

Tu học đích thực luôn luôn mang tới hạnh phúc, niềm tin và niềm vui. Bụt nói đi nói lại nhiều lần là giáo pháp của người là để thực tập và có hạnh phúc ngay trong khi thực tập, chứ không phải là thực tập xong rồi năm bảy năm sau mới hạnh phúc. Đó là phương pháp Hiện Pháp Lạc Trú (Ditthadammasukhavihara): lạc trú ngay trong giờ phút hiện tại. Trong đạo lý Thất Giác Chi, tức là bảy yếu tố giác ngộ, chúng ta có hai yếu tố, Khinh An (prasrabdhih) là nhẹ nhàng, và Hỷ (priti) là vui mừng. Bảy phần gồm Trạch Pháp (investigation of Dharma), Tinh tấn, Hỷ, Khinh An, và Niệm, Định, và Tuệ gọi là Thất Giác Chi, hay là Thất Bồ Đề Phần. Trong bảy yếu tố đưa tới giác ngộ đã có hai giác chi về hạnh phúc, đó là Hỷ và Khinh An. Điều đó chứng tỏ trong sự tu học hằng ngày, chúng ta phải có hạnh phúc, và niềm vui. Nếu không thì không phải đích thực là pháp môn của Bụt. Chúng ta sẽ phải nhấn mạnh tới điểm này nhiều hơn.

Đạo lý về tình thương trong đạo Bụt (The teaching of love in Buddhism) là một đề tài rất lớn cần được khai thị cho thế giới bây giờ. Loài người ngụp lặn trong khổ đau vì trong đời sống hằng ngày tình thương của họ còn rất nhiều tính chất hệ lụy và vướng mắc. Cho nên chúng ta phải khơi mở một dòng tình thương từ sự thực tập đạo Bụt.

Giáo lý về tình thương được gọi là Tứ Phạm Trú, Brahmavihara (The Four Abodes of Brahma). Brahma có nghĩa là Phạm Thiên hay là cao quý. Vihara là chỗ ở, là cƯ xá, có khi được dịch là tu viện. Đó là nơi cƯ trú của Bụt và Bồ Tát. Nếu ta muốn có hạnh phúc thì ta hãy xin vào ở cư xá đó để sống chung với Bụt, với Bồ tát. Tứ Phạm Trú tức là Từ, Bi, Hỷ, và Xả mà chúng ta gọi là bốn tâm vô lượng. Nếu có ai hỏi: ‘‘Địa chỉ của ông ở đâu?’’ Ta trả lời: ‘‘Địa chỉ của tôi là ở cư xá Brahmavihara, Tứ Vô lượng Tâm.’’ Ta có bổn phận phải xây thêm những cư xá như vậy. Vô lượng tức là không thể đo được, có thể phát huy đến vô cùng. Bốn tâm không có biên giới là tâm Từ, tâm Bi, tâm Hỷ, và tâm Xả.

Trước hết là tâm Từ. Chữ Phạn là Maitri, chữ Pali là Metta. Maitri có nghĩa là khả năng hiến tặng niềm vui, hiến tặng hạnh phúc (the capacity to offer joy and happiness). Đức Bụt sắp ra đời để nối tiếp sự nghiệp của Bụt Thích Ca tên là Maitreya, đức Bụt của tình thương.

Thứ hai là Bi, Karuna, có nghĩa là khả năng làm vơi đi nỗi khổ đang có mặt. Nó gồm ý chí muốn làm vơi đi nỗi khổ, muốn chuyển hóa nỗi khổ của người; và gồm cả phương pháp và khả năng chuyển hóa nỗi khổ.

Hỷ tức là Mudita, là niềm vui. Tình thương đích thực, có Từ, có Bi, sẽ đem tới sự nhẹ nhõm, và niềm tươi vui. Tình thương mà chứa chất sầu đau thì không phải là tình thương trong đạo Bụt. Cho nên Mudita là một yếu tố của tình thương đích thực. Tình thương có thể đem lại cho người thương và người được thương hạnh phúc thì mới đúng là tình thương trong đạo Bụt. Còn thứ tình thương mỗi ngày gây khổ đau và vướng mắc cho nhau, thì không phải là tình thương của đạo Bụt. Hỷ là yếu tố thứ ba của tình thương ấy.

Và sau cùng, Xả (Upeksa) là sự nhẹ nhàng, thư thái, tự do và không kỳ thị. Thương như thế nào mà ta còn giữ được tự do cho ta và cho người ta thương thì mới đích thực là tình thương đạo Bụt. Thương như thế nào mà hai người không dìu nhau vào trong ngục tù. Tình cha con, tình thầy trò, tình anh em, tình yêu nam nữ cũng vậy.

Trong đạo Bụt có một giáo lý rất đầy đủ và thâm sâu về tình thương. Tình thương này có năng lượng trị liệu. Từ, Bi, Hỷ, Xả không phải là những ước muốn, những mục tiêu xa xôi, mà là sự thực tập. Từ không phải chỉ là ước muốn đem lại hạnh phúc cho người. Chính sự thực tập Từ đem lại hạnh phúc cho người – The willingness and the capacity to offer joy and happiness. Có người càng thương thì càng làm cho người kia khổ. Thương như vậy chưa phải là Từ. Có ý chí thương nhưng không có khả năng thương. Bi cũng vậy. Bi là ước muốn và cũng là khả năng làm vơi nỗi khổ – The willingness and the capacity to remove pains. Hỷ là ước muốn và khả năng tạo hạnh phúc cho mình, và cho người – The willingness and the capacity to bring joy. Và Xả tức là ước muốn và khả năng hiến tặng tự do và sự không kỳ thị cho người và cho chính mình – The willingness and capacity to offer freedom and non-discrimination.

Ta không thể hiểu được bản chất của tình thương trong đạo Bụt nếu không đặt giáo lý tình thương đó trong Bát Chánh Đạo. Nếu không thực tập Bát Chánh Đạo thì ta không thể thực tập được tình thương. Chánh niệm cho chúng ta thấy được nhu yếu chuyển hóa khổ đau và nhu yếu hiến tặng niềm vui. Khi một người làm cho ta khổ thì chính người đó cũng đang bất an; phản ứng của ta có thể làm cho người đó thêm khổ, vì thế lại làm khổ chính ta hơn. Cái khả năng giúp ta nhận chân ra sự thật đó là chánh niệm. Lắm khi người đó chính là mình. Từ, Bi, Hỷ, Xả phải thực hiện cho chính mình trước. Nếu ta không có bốn tâm đó trong ta thì ta không thể nào hiến tặng nó cho người khác. Phải đầu tư, phải gây vốn cho bốn tâm vô lượng. Vốn liếng của ta là công phu thực tập Tứ Diệu Đế. Đi thiền hành cho đúng phép, có an lạc trong từng bước chân, nuôi dưỡng từng tế bào của thân thể bằng hơi thở chánh niệm, đó là ta đang tự thương mình. Thương mình đích thực, ta làm cho rã bớt những nỗi sầu khổ, tưới vào bản thân những niềm vui. Truyện Kiều có hai câu nói về lòng tự thương, nhưng hoàn toàn tiêu cực. Đó là hồi Kiều ở lầu Ngưng Bích, đau đớn và thương xót cho thân phận của mình:

<<<
Khi tỉnh rượu, lúc tàn canh <br>
Giật mình mình lại thương mình xót xa.
<<<

Thương ở đây chẳng qua chỉ là xót xa tội nghiệp cho mình thôi. Niềm xót xa này không có khả năng chữa trị được đau khổ, không đem lại hạnh phúc. Tự thương theo lối đạo Bụt, ta phải chuyển hóa thân tâm. Buổi sáng nhìn mặt trời lên, nghe chim hót, có chánh niệm, ta mỉm cười, ta thấy những thứ đó đều mầu nhiệm. Xúc và Thọ cần nuôi dưỡng và mang tới thân tâm chúng ta chất liệu của Từ, Bi, Hỷ, Xả. Nếu ta không tự thương ta được thì ta không có khả năng thương người khác. Tình thương người ta thường nói tới có thể chỉ là sự đắm đuối, vướng mắc, là năng lượng kéo nhau xuống vực thẳm của biển khát ái thôi, chứ không phải là tình thương đích thực.

Nuôi dưỡng mình và nuôi dưỡng người xung quanh bằng tình thương, đó là sự thực tập của chúng ta. Và tình thương ở đây phát xuất từ Tuệ. Nếu không hiểu biết thì không thể thương yêu. Bản chất của Từ Bi là Trí Tuệ. Thương mà không hiểu thì làm khổ người mình thương. Ví dụ tôi sợ mùi sầu riêng. Nếu sư chú nói: Chắc là thầy mệt, nếu ta mời thầy ăn sầu riêng thì thầy sẽ khỏe. Bắt tôi ăn sầu riêng sẽ chỉ làm khổ tôi. Muốn hiến tặng niềm vui cho người, ta phải hiểu người. Con mắt chánh niệm phải quán sát. Cư xử với con cái cũng vậy, với mẹ cha cũng vậy. Chúng ta có thể nói rằng trong đạo Bụt, thương yêu được làm bằng một chất liệu gọi là hiểu biết. Mà hiểu biết là hoa trái của chánh niệm, của thiền quán.

Nguyên tắc thực tập Tứ Diệu Đế phải được áp dụng ở đây. Trước hết ta nhìn vào để thấy những nỗi khổ. Sau khi nhận diện được sự thật thứ nhất về Khổ, ta mới tìm ra được những nguồn gốc xa gần của khổ, tức là ta quán chiếu Tập. Và chỉ khi nắm được hai sự thật đầu ta mới biết con đường nào giúp người vượt qua những khổ đau, biết được Diệt và Đạo. Thực tập Tứ Diệu Đế là thực tập tình thương. Bụt là một bậc Trí và Bi viên mãn. Thật ra nếu Bi mà viên mãn thì Trí cũng viên mãn, và nếu Trí viên mãn thì Bi cũng viên mãn. Hai là một, một là hai. Nếu hiểu được thân phận của người hải tặc thì ta cũng sẽ thương được cả người hải tặc. Trong kinh Bát Đại Nhân Giác, Bụt nói rằng một vị Bồ Tát không đem tâm ghét những người đã làm điều ác. Những điều kiện xã hội, kinh tế, chính trị, những vô minh, căm thù đã được chứa chất từ lâu, đã đưa tới hành vi ác độc. Bất tăng ác nhân là bốn chữ trong Kinh Bát Đại Nhân Giác. Làm sao ta hiểu được bốn chữ ‘‘không ghét người ác’’ nếu ta quên tình thương, nếu ta chỉ dùng trí năng khô khan để học Bụt? Trí năng khô khan gọi là càn tuệ, dried knowledge. Tình thương chỉ có thể làm bằng chất hiểu biết, bằng tuệ giác chân thật, chữ Phạn là Prajna, phiên âm là Bát Nhã. Bát Nhã là hoa trái của sự quán chiếu. Không giận mình, không ghét người. Vì thấy những nguyên do sâu xa của mọi hành động nên ta thấy thương mình, và thương người. Chất liệu của Từ phát xuất từ trái tim, và tƯới trở lại cho trái tim. Thực tập Từ và Bi trên căn bản hiểu biết thì không bao giờ vướng mắc vào tình thương chiếm hữu (possessive love). Thương mà không hiểu thì chỉ giam nhau vào ngục tù, tự giam mình vào ngục tù và làm khổ lẫn nhau. Người này lập ra nhà tù nhốt người kia vào cũng chỉ vì có thiện chí. Chồng với vợ, cha mẹ với con, bạn bè với nhau, khi thương nhau chúng ta thường vẫn giam nhau vào ngục tù, chỉ vì ta không biết được nhu yếu sâu xa đích thực của chính bản thân ta, và của những người mà ta thương.

Bụt dạy rằng : tình thương được làm bằng hiểu biết. Nhưng vì hiểu rõ tâm của chúng sinh nên Bụt còn đi xa hơn nữa. Ngài nói rằng trong tình thương chân thật phải có niềm vui. Nếu không có vui thì ta biết đó chưa phải là Từ, chưa phải là Bi. Đây là một phương pháp khác nữa để nhận diện tình thương chân thật: sự có mặt của niềm vui vô cầu, không vị lợi. Tu không phải là từ bỏ niềm vui. Niềm vui của người tu không phải chỉ phát sinh khi thấy người khác thành đạt và có hạnh phúc, mà cả khi thấy mình nhẹ nhàng, thảnh thơi và có hạnh phúc. Tại sao ta lại tự kỳ thị mình? (Joy là joy, tại sao phải là altruistic joy, hay là sympathetic joy?) Khi tôi bước những bước thiền hành thảnh thơi, tôi tiếp xúc với nắng, tôi tiếp xúc với tiếng chim, tôi tiếp xúc với tăng thân, tôi được nuôi dưỡng, tôi thư thái, đó là niềm vui, chữ Phạn là Mudita. Bụt dạy chúng ta phải nuôi dưỡng thân tâm bằng niềm vui và sự nhẹ nhàng. Làm như vậy cũng là thực tập thương yêu.

Để tôi ngưng một vài phút và đọc cho quý vị nghe một bài thơ tình của Vũ Hoàng Chương. Đọc để thấy tình yêu vướng mắc, và tình yêu chiếm hữu có thể tạo nên khổ nghiệp thế nào. Những năm trước khi tịch, Vũ Hoàng Chương có nhiều bài thơ về đạo rất hay, rất đạt. Nhưng thời còn trẻ ông đau khổ lắm, ông viết những Thơ Say, Thơ Điên, Mây. Đây là một bài viết năm 1940, trong tập Thơ Say, trong đó thi sĩ nhớ tiếc người yêu mà, ông gọi là ‘‘Tố của Hoàng’’:

<<<
Trăng của nhà ai, trăng một phương <br>
Nơi đây rượu đắng, mưa đêm trường.
<<<

Nghe hai câu đầu, ta đã thấy khổ. Ở đây chỉ có trời mưa suốt đêm, và một mình uống rượu say mèm, ở đây không có trăng. Rượu thì có chất cay đắng. Rượu cay đắng hay tình cay đắng?

<<<
Ừ đêm tháng sáu, mười hai nhỉ? <br>
Tố của Hoàng ơi ! Hỡi nhớ thương!
<<<

Mười hai tháng sáu là ngày cô nàng bỏ đi lấy chồng.

<<<
Là thế, là thôi, là thế đó<br>
Mười năm, thôi thế mộng tan tành!<br>
Mười năm trăng cũ ai nguyền ước<br>
Tố của Hoàng ơi! Tố của anh!
<<<

Chúng ta thấy Ngã và Ngã Sở. Yêu thương một người, người đó phải thuộc về mình, phải là Ngã Sở. Tố của Hoàng ơi! Tố của anh. You are mine! Mười năm chỉ sống trong mộng cho nên khi mộng tan tành mới khổ.

<<<
Tháng sáu, mười hai từ đấy nhé<br>
Chung đôi, từ đấy nhé lìa đôi.<br>
Em xa lạ quá, đâu còn phải<br>
Tố của Hoàng xưa, Tố của tôi?
<<<

Bây giờ anh đi thất thểu bên bờ hồ Hoàn Kiếm; có gặp anh, cô ta cũng không thèm nhìn. Ngày xưa, Tố là của Hoàng. Nhưng bây giờ, đời là vô thường mà, Tố đâu còn phải là Ngã Sở của Hoàng nữa?

Hoàng xưa và Tố xưa là một Hoàng khác và một Tố khác. Hoàng bây giờ là Hoàng khác, mà Tố cũng là Tố khác rồi. Vô thường và vô ngã. Mình của phút này đã không còn là mình của phút trước, huống hồ là từ ngày mười hai tháng sáu cho tới bây giờ.

<<<
Men khói đêm nay sầu vũng mộ <br>
Bia đề tháng sáu, ghi mười hai <br>
Tình ta tha thiết, cuồng, ta khóc <br>
Tố của Hoàng, nay, Tố của ai?
<<<

Tình thương mà đưa tới cuồng điên là tình thương mù quáng, không thấy được bản chất Vô thường và Vô ngã. Tố của Hoàng, nay Tố của ai?

Bốn câu tiếp nhắc sự tích Trang Tử khi vợ chết không khóc, ông gõ trên thành chậu mà hát một bài gọi là Cổ Bồn Ca:

<<<
Tay gõ vào bia, mười ngón dập <br>
Mười năm theo máu hận đầy vơi <br>
Học làm Trang Tử thiêu cơ nghiệp <br>
Khúc Cổ Bồn Ca, gõ hát chơi. <br>
Kiều Thu hề Tố em ơi! <br>
Ta đang lửa đốt tơi bời Mái Tây.
<<<

Mái Tây tức là Tây Sương, tên một vở tuồng kể lại một chuyện tình nổi tiếng. Khi tình thương gây đau khổ, gây lửa cháy trong lòng như vậy, thì tình thương đó là tình thương gây tàn phá, tạo khổ đau.

<<<
Hàm ca nhịp gõ khói bay <br>
Hồ Xừ Xang Xế bàn tay điên cuồng. <br>
Kiều Thu hề trọn kiếp thương <br>
Sầu cao ngùn ngụt mấy đường tơ khô. <br>
Xừ Xang Xế Xự Xang Hồ <br>
Bàn tay nhịp gõ điên rồ khói lên. <br>
Kiều Thu hề Tố hỡi em <br>
Nghiêng chân bốn bể mà xem lửa bùng <br>
Xế Hồ Xang khói mờ rung <br>
Nhịp vươn sầu tỏa năm cung ngút ngàn.
<<<

Đây là một bài thơ tình rất hay, vì đọc xong người ta sẽ thấy nát gan nẫu ruột, và bị cuốn vào trong cơn đau khổ cuồng si của thi sĩ. Dùng chánh niệm để quán chiếu ta sẽ thấy tình yêu ở đời thường dẫn đến tình trạng đó. Vì tình yêu vô minh có rất nhiều ái thủ trói buộc, đưa đến giận hờn, tan vỡ, tạo ra khổ đau cho cả hai người - Thơ tình cũng có thể làm hại cả độc giả nữa nếu độc giả cũng chìm đắm trong “thú đau thương”, quên thực tập chánh niệm.

Chúng ta cần phân biệt tình thương trong sáng khỏe mạnh và tình thương mê đắm vướng mắc. Phải quán chiếu để nhận diện xem trong tình thương có chất liệu của Từ, của Bi, và của Hỷ hay không. Nếu hoàn toàn trong ấy không có chất liệu nào của Từ, Bi, và Hỷ, thì tình thương đó chắc chắn đang và sẽ tạo đau khổ. Nếu chất liệu của Từ, Bi, và Hỷ còn quá ít thì người ta vẫn còn đang đi theo con đường của vướng mắc, của sầu hận, của khổ đau, và đày đọa. Cho nên ta phải thực tập mỗi ngày để chuyển hóa các yếu tố tiêu cực của tình thương, và nuôi dưỡng chất liệu Từ, Bi, Hỷ, Xả càng ngày càng lớn.

Bây giờ chúng ta nói tới yếu tố thứ tư là Xả. Thường thường chúng ta dịch Xả là buông bỏ, là không vướng mắc. Có khi chúng ta dịch là không phân biệt, không kỳ thị. Bản chất của Xả là Bất Nhị. Định nghĩa hay nhất của Xả là tự do. Một tình thương chân thật là một tình thương có chất liệu tự do. Người thương có tự do, và người được thương vẫn không mất tự do. Người đó không cần phải hội đủ những điều kiện nào đó mới được thương. Tôi thương anh không phải vì anh là người đồng bào máu mủ của tôi mà tôi thương. Không phải vì anh đã theo cùng một tôn giáo với tôi mà tôi thương. Tình thương không phân biệt như vậy là tình thương có Xả. Trong tình thương đích thực này, người gọi là kẻ thù cũng được thương. Tại vì người ấy cũng đau khổ, cũng cần chuyển hóa khổ đau, cũng cần có hạnh phúc. Khi ta nhìn người gọi là kẻ thù và thấy được nhu yếu đó, thì ta thương được kẻ thù của ta. Mà khi đã thương được rồi thì ta đâu còn gọi người đó là kẻ thù nữa. Cho nên trong tình thương đích thực không có kẻ thù. Có những chủ thuyết nói rằng mình phải phân biệt bạn với thù, mình không được thương thù, mình chỉ được thương bạn thôi. Trong giáo lý của đạo Bụt thì người nào khổ là mình thương, vì người đó cần tới tình thương.

Cách đây ba tuần một sư cô ở Huế viết thư kể chuyện hiện giờ các nhà thờ chiêu dụ được con nít rất nhiều, chỉ tại vì các em đói. Trẻ em không có thức ăn, không có trường học thì tới nhà thờ để học đọc, học viết buổi sáng, rồi được ăn cơm trưa, và ở lại học đọc và học viết nữa. Đó đích thực là một công tác từ bi. Nhưng một số phụ huynh hơi lo, sư cô cũng hơi lo. Họ kể rằng các cháu về nhà, trong bữa cơm chiều, làm dấu thánh giá trước khi ăn, và đọc kinh “Con lạy chúa trên trời.” Và họ hoảng sợ. Sư cô đó đề nghị Phật tử phải làm thế nào để cho con cháu mình đừng đi đến nhà thờ, phải làm thế nào để đưa hết những trẻ em đói đó về chùa. Để thay vì làm dấu thánh giá, và đọc kinh “Con lạy chúa trên trời” thì chắp tay đọc “Con về nương tựa Bụt.”

Đó là tâm trạng chung của rất nhiều người. Phật tử và không Phật tử. Chúng ta làm việc thiện do tình thương, nhưng trong tình thương vẫn có phân biệt. Nếu chúng ta chỉ làm việc thiện vì sợ các con em Phật tử đi theo đạo Cơ Đốc, thì chất liệu của Từ Bi sẽ không trọn vẹn. Nếu ta làm việc thiện vì thấy có rất nhiều trẻ em cần phải được nuôi ăn trưa, cần phải học đọc, học viết, thì đó là chân tinh thần của Từ, Bi, Hỷ, và Xả. Làm việc thiện vì sợ tôn giáo khác đang dụ con em mình, là đã để cho một áng mây mờ bay vào trong tình thương của mình. Điều này là do quán chiếu mà thấy. Cho trẻ con ăn cơm trưa, và cho các em học đọc, học viết là tại vì chúng cần những thứ đó. Còn sử dụng hành động đó để làm cho con nít theo đạo (hoặc là đạo Chúa, hoặc là đạo Phật) thì tình thương đó đã bị che ám bởi đám mây của kỳ thị. Như thế là trái với tinh thần Xả. Nếu học Tứ Vô Lượng Tâm mà nghĩ rằng chỉ có Từ và Bi mới là tình thương thôi, còn Hỷ và Xả là chuyện khác, đó là chúng ta lầm.

Trong lịch sử của giáo đoàn có rất nhiều sự hiểu lầm về giáo lý Tứ Phạm Trú, tức là Tứ Vô Lượng Tâm. Ngay trong Đại Trí Độ Luận (Mahaprajnaparamita Sastra) của thầy Long Thọ (Nagarjuna), chúng ta cũng thấy có một vài hiểu lầm. Đại Trí Độ Luận được soạn sớm hơn những tác phẩm khác được coi là của thầy Long Thọ như Trung Quán Luận. Sự hiểu lầm trong này phản ảnh sự hiểu lầm của những tông phái đang diễn giảng và thực tập Tứ Vô Lượng Tâm trong thời kỳ ấy.

Hiểu lầm thứ nhất là cho rằng tâm Từ, hay tâm Bi đều còn bị vướng mắc. Thương yêu là bị ràng buộc vào những người được thương và mất đi một phần tự do. Đến tâm Hỷ thì sự vui mừng cũng còn làm xáo động tâm. Vì vậy phải tu Xả, nghĩa là phải buông bỏ. Ban đầu thì tu Từ, tu Bi, và tu Hỷ. Tới mức tu Xả là bỏ Từ, bỏ Bi, và bỏ Hỷ để cho tâm thanh tịnh.

Hiểu như vậy là rất sai với tinh thần đạo Bụt, chưa thấy được rằng Xả là một chất liệu trong tình thương. Mà sự sai lầm đó ta thấy nhan nhản trong các bộ luận từ ngày xưa cho tới bây giờ. Đại Trí Độ Luận cũng phản ảnh tình trạng đó. Về sau, khi nói đến nhân cách của Bụt, các bộ phái mới nêu thêm ý niệm Đại Từ và Đại Bi, vượt lên trên Từ và Bi. Đại Từ và Đại Bi là hai danh từ chỉ được dùng trong trường hợp của Bụt và Bồ Tát thôi, còn trong trường hợp chúng ta thì ta chỉ có quyền dùng Từ thường, và Bi thường. Hiểu như vậy cũng sai. Nếu Đại Từ, Đại Bi là lòng Từ Bi không giới hạn, thì Tứ Vô Lượng Tâm cũng có nghĩa là bốn tâm không có giới hạn. Tại sao cần phân biệt Từ Bi với Đại Từ, Đại Bi? Chỉ vì người ta hiểu rằng thực tập Tứ Vô Lượng Tâm chỉ đem lại phước báo, giúp ta sinh lên cõi trời Phạm Thiên và sống hạnh phúc một thời gian. Hết phước rồi chúng ta sẽ đọa lại trong kiếp người. Và không khéo có thể xuống cả địa ngục, trừ khi chúng ta có tu Tứ Diệu Đế và Bát Chánh Đạo. Đó là cách hiểu của nhiều luận giả trong các bộ phái Phật giáo. Ý niệm đó chứng tỏ rằng người ta có thể tu Từ, Bi, Hỷ, Xả riêng mà không cần Tứ Diệu Đế và Bát Chánh Đạo. Đó là sai lầm căn bản. Chúng ta biết rằng nếu không có Tứ Diệu Đế và Bát Chánh Đạo thì Từ, Bi, Hỷ, Xả không thực sự là Từ, Bi, Hỷ, và Xả. Phân biệt tu Từ Bi Hỷ Xả riêng, khác với cách tu Từ Bi Hỷ Xả chung với Tứ Đế và Bát Chánh Đạo, đó là một quan niệm sai lầm chúng ta phải chỉnh lại.

Sai lầm lớn thứ hai là nói rằng tu Từ Bi Hỷ Xả chỉ chuyển hóa được tâm của người tu thôi, chứ không ảnh hưởng trực tiếp tới mọi loài chúng sanh. Những người diễn giảng và thực tập bốn tâm đó đã hiểu lầm lời của Bụt dạy. Họ nghĩ rằng tu Từ Bi Hỷ Xả là những ức tưởng, những tưởng tượng ở trong đầu người tu. Có một đoạn Kinh nói về phương pháp tu Từ Bi Hỷ Xả (đoạn Kinh này được lập lại rất nhiều trong tạng Hán cũng như là tạng Pali). Đoạn Kinh đó như sau:

“Tâm dữ Từ câu, biến mãn nhất phương thành tựu du. Như thị nhị tam tứ phương tứ duy thượng hạ phổ châu nhất thiết. Tâm dữ Từ câu, vô kết, vô oán, vô nhuế, vô tranh, cực quảng thậm đại, vô lượng thiện tu, biến mãn nhất thiết thế gian thành tựu du. Như thị Bi, Hỷ tâm dữ Xả câu, vô kết, vô oán, vô nhuế, vô tranh, cực quảng thậm đại, vô lượng thiện tu, biến mãn nhất thiết thế gian thành tựu du”. Dịch nghĩa: Tâm ta với chất liệu Từ, đi về một phương, tiếp xúc với tất cả trong phương đó một cách rất sâu sắc, trở thành một với phương đó. Cũng như vậy, tâm ta với chất liệu Từ đi vào phương thứ hai, đi vào phương thứ ba, đi vào phương thứ tư, đi lên phương Thượng, đi xuống phương Hạ, đồng nhất mình với từng phương, làm cho chất Từ thấm nhuận vào phương đó. Không có nội kết, không có oán hờn, không có giận dữ, không có tranh chấp, rất lớn, rất rộng cho tới vô cùng. Và điều này cũng được thực hiện với Bi, với Hỷ, và với Xả.

Bản dịch tiếng Anh như sau: He dwells suffusing, first, one direction with the heart link to Friendliness, then the second, then the third, then the fourth, then above, below, around and everywhere. And so he dwells recognizing himself in all, suffusing the entire world with the heart linked to Friendliness, far reaching, gone great, unlimited, free from enmity and malice.

Tiếng Pháp, dịch từ Pali: Ayant englobé la première région par une pensée associée à la Bienveillance, il demeure. Ayant englobé de la même manière la deuxième, la troisième et la quatrième région, le zénith, le nadir, les quatres régions intermédiaires. Ayant englobé partout et de toute manière le monde entier par une pensée associée à la Bienveillance, pensée étendue, agrandie, immense, exempte d'ennimité, exempte de méchanceté, il demeure. Il en fait de même avec la pensée associée à la Compassion, avec la pensée associée à la Joie, avec la pensée associée à l'Equanimité.

Một số các vị dạy như thế này: Trong khi ngồi thiền mình rải tâm Từ của mình về phương Đông, bao trùm tất cả các loài đang ở bên phương Đông; rồi sau đó rải tâm Từ của mình qua phương Tây, bao phủ tất cả các loài ở phương Tây; rồi phương Bắc, rồi phương Nam, rồi phương Thượng, rồi phương Hạ, rồi Tây Bắc, Tây Nam, Đông Bắc, Đông Nam; và cứ như vậy chúng ta tiếp tục với Bi, với Hỷ, và với Xả.

Có thầy giải thích rằng ta tưởng tượng lòng Từ của mình như là một đám mây trắng, từ trái tim của ta đi ra, bao trùm một phương, bao trùm hai phương, ba phương, bốn phương, tám phương, mười phương; và đó là thực tập Tứ Vô Lượng Tâm. Vì vậy trong Đại Trí Độ Luận có dùng một chữ là “ức tưởng”. Đại Trí Độ Luận nói rằng Thanh Văn tu Từ Bi Hỷ Xả chẳng qua là những ức tưởng bên trong, để chuyển hóa tâm sân hận của mình bên trong, chứ không có ảnh hưởng trực tiếp và thực tế tới mọi loài chúng sinh. Vì vậy muốn tu Từ Bi Hỷ Xả thật đàng hoàng là phải phát nguyện thành Phật, phải thực tập sáu phép Ba La Mật (the six paramitas), tức là Bố Thí, Trì Giới, Nhẫn Nhục, Tinh Tấn, Thiền Định, và Trí Tuệ.

Cách hiểu về Tứ Vô Lượng Tâm đó còn nông cạn. Từ là năng lượng làm cho người vui, Bi là năng lượng làm cho tiêu tan nỗi khổ. Ta chỉ có thể thực hiện được Từ và Bi khi quán chiếu. Từ hiểu biết mà đi tới thương yêu, rồi biến thành hành động. Tình thương biến thành hành động, chứ không phải là chỉ là ức tưởng. Vì vậy cách hiểu về Tứ Vô Lượng Tâm nói trên không đủ sâu sắc.

Tôi hy vọng quý vị đã nắm được những ý chính. Tránh sự hiểu lầm và phân biệt giữa Từ Bi Hỷ Xả với sự thực tập Tứ Đế và Bát Chánh Đạo. Tránh sự hiểu lầm rằng tu Từ, Bi, và Hỷ có thể bị vướng mắc cho nên mình phải tu Xả để bỏ Từ, bỏ Bi, và Hỷ. Đó là những cách hiểu rất nông cạn. Và nhất là hiểu lầm rằng tu Từ, tu Bi, tu Hỷ, tu Xả chỉ là chuyện ức tưởng bên trong đầu người tu, không ảnh hưởng gì tới thế giới bên ngoài. Đó là những sai lầm căn bản mà chúng ta phải sửa ngay trong Đại Trí Độ Luận. Thầy Long Thọ nói rằng vì cách tu Từ Bi Hỷ Xả của những bậc Thanh Văn chỉ là ức tưởng thôi, cho nên bây giờ người tu Đại Thừa phải tiến lên thực tập Sáu Ba La Mật. Câu đó cũng chứng tỏ rằng người đương thời chưa hiểu đúng phương pháp tu tập Từ Bi Hỷ Xả. Tại vì tu Từ, tu Bi, tu Hỷ, tu Xả rất cần Bát Nhã Ba La Mật. Có Bát Nhã Ba La Mật thì sẽ có Bố Thí Ba La Mật, có Trì Giới Ba La Mật. Khi trì giới tức là ta thương yêu.

Các vị Tổ đã dạy dỗ chúng ta rất nhiều. Tôi rất biết ơn các vị. Ngày xưa có lúc tôi từng nghĩ là điều gì các Tổ nói đều đúng hết. Bây giờ lớn rồi, thành ra tôi thấy được những điều thất truyền, và những ý trên đây là những đóng góp của tôi. Cũng là một cách để đền đáp công ơn các Tổ. Bồi đắp những chỗ còn bị trống, bị thiếu, và tiếp tục khai triển sự nghiệp của Tổ. Tôi không nói rằng các vị đã làm sai, hay làm thiếu. Cố nhiên là học trò của tôi, và học trò những thế hệ sau cũng phải tiếp tục làm như vậy. Bồi đắp cho cây Phật pháp mỗi ngày mỗi lớn, mỗi ngày mỗi mạnh. Và ta phải có con mắt Tuệ của chính ta mới được. Chứ còn học với tinh thần nô lệ, chấp nhận bất cứ một chữ nào, một câu nào ở trong các sách để lại, thì ta sẽ không đi xa được, và chỉ làm cho Phật Pháp mỗi ngày mỗi héo mòn đi mà thôi.
! Bài 02 Học Phật phải thấy lòng nhẹ nhàng

Hôm nay là ngày 25 tháng 11 năm 1993, chúng ta đang ở tại xóm thượng, trong khóa tu mùa đông. Hôm nay tôi muốn trình bày thêm về cách thức học phật sau đó se nói về lý duyên khởi.

!! Học phật phải thấy lòng nhẹ nhàng

Khi học Phật Pháp, chúng ta phải làm cách nào để giáo lý của Bụt giúp cho tâm tư ta nhẹ nhàng hơn, chứ không làm cho ta nặng nề thêm. Những bài pháp thoại có thể khiến cho đầu óc chúng ta thêm nặng nề nếu chúng ta chỉ học giáo lý với mục đích chất chứa thêm kiến thức. Phương pháp đó không hay. Trái lại, nếu trong khi học mà ta cảm thấy càng ngày càng nhẹ nhàng hơn thì như thế chúng ta đang theo đúng đường. Nhẹ nhàng hơn vì những điều ta học có tác dụng tháo gỡ và phá bỏ những thấy nghe và hiểu biết sai lầm. Nghe tới đâu, học tới đâu, ta cảm thấy nhẹ nhàng và thoải mái tới đó.

Trong chúng ta vốn có nhiều mối vướng víu, nhiều chỗ bế tắc. Những cái kẹt và bế tắc ấy do tri giác sai lầm hoặc sự hiểu biết thiếu sót gây ra. Tri giác và hiểu biết sai lầm luôn luôn tạo ra những bế tắc, rồi từ đó sinh ra những thành kiến, những ngộ nhận, khiến tâm tư nặng nề thêm. Vì tâm tư nặng nề cho nên ngay trong đời sống hàng ngày chúng ta đau khổ, rồi lại gây đau khổ cho những người xung quanh. Cho nên học Phật không cốt chứa nặng thêm những kiến thức. Học là để có một cơ hội đưa giáo lý vào trong tâm, phá những bế tắc, dẹp những vướng mắc. Như khi ánh sáng mặt trời lên thì tuyết băng tan. Sau khi nghe một bài giảng, học một cuốn kinh mà tâm tư cảm thấy nhẹ nhàng, thoải mái hơn, thì chúng ta đã thừa hưởng được bài học từ cuốn kinh hay từ bài giảng đó.

Lần trước chúng ta học về nhị đế, hai loại chân lý, và tứ tất đàn, bốn tiêu chuẩn về sự thật trong kinh điển. Sau bài học đó, nhiều người có thể nghĩ rằng họ mới học thêm được hai khái niệm lý thuyết là nhị đế và tứ tất đàn. Nhưng biết hai điều đó rồi mà không cảm thấy lòng nhẹ nhàng hơn, tức là chưa học. Cảm thấy lòng thư thái nhẹ nhàng hơn, là chúng ta đã học và đã có thêm hạnh phúc. Bài giảng về nhị đế và tứ tất đàn đã phá vỡ, đã dẹp bỏ cho chúng ta nhiều mối nghi hoặc và bối rối trong lòng. Chúng ta thở phào ra, nói rằng: Thảo nào, ngày xưa mình bị kẹt, ngày xưa mình thấy lộn xộn, ngày xưa mình còn chấp điều này điều kia. Bây giờ mình thấy trong lòng khỏe khoắn, khi nghe, khi nói, mình có thái độ rộng rãi hơn, tâm hồn nhẹ nhõm hơn. Học Bụt để tâm ta thư thái nhẹ nhàng mới đúng. Trong đời sống hàng ngày, khi nghe và khi nói, chúng ta sẽ có một thái độ ung dung, một tinh thần cởi mở và nhẹ nhàng, thì trong cách tiếp xử chúng ta mới không tạo ra thêm khổ đau cho mình và cho người.

Chúng ta biết rằng Bụt là một người có tuệ giác và biện tài. Vậy mà trong thời đại của Ngài, nhiều người vẫn hiểu lầm. Nhiều khi Bụt cũng chỉ mỉm cười, không nói gì được nữa. Những sự thật Bụt muốn dạy chúng ta, Ngài phải diễn bày qua các trường hợp cụ thể. Bụt đã dùng tuệ giác của mình để quán chiếu căn cơ người đương thời, và Ngài đã đưa ra những lời dạy có công dụng tháo gỡ cho họ. Cố nhiên khi Bụt nói với người này thì người khác cũng nghe và có thể họ không tiếp nhận được vì không ở trong cùng hoàn cảnh. Vì vậy nên đã có người hiểu lầm Bụt.

Một hôm có một nhà triết học tới hỏi Bụt nhiều câu hỏi nhưng Ngài không trả lời. Ông ta hỏi rằng: ‘‘Có Ngã không?ì Bụt không nói gì. ‘‘Hay là không có Ngã?ì Ngài cũng im lặng. Sau khi ông khách đi rồi, Thầy A Nan mới hỏi: ‘‘Bạch đức Thế tôn, tại sao Ngài không trả lời nhà thông thái đó? Ngài thường dạy chúng con về vô ngã, tại sao Ngài không nói với ông ta là không có ngã?ì Bụt trả lời rằng: ‘‘Vị này tới để tìm một lý thuyết, để chờ tôi xác nhận lý thuyết vô ngã. Điều tôi dạy không phải là lý thuyết. Tôi dạy phương pháp giải thoát khỏi khổ đau. Nếu nhìn phương pháp của tôi như một lý thuyết thì rất nhầm. Cho nên khi ông ta hỏi có ngã không, tôi không trả lời, mà khi ông ta hỏi có phải vô ngã không, tôi cũng không trả lời. ì Thái độ im lặng của Bụt phát xuất từ nhận xét của Ngài là người kia không đi tìm phương pháp tu học, người kia đang đi tìm một chủ thuyết. Xác nhận một chủ thuyết có ngã hay chủ thuyết vô ngã, đều có thể có hại cho ông ta. Thà rằng đừng nói gì cả.

Một lần các đệ tử của Bụt đàm luận với nhau, nói Bụt dạy như thế này, Bụt dạy như thế khác. ‘‘Không, Bụt dạy như thế này này, không phải như anh vừa nói đâu!ì Chắc Bụt cũng hơi nhức đầu nên Ngài bảo: ‘‘Tôi có nói gì đâu! Trong 45 năm thuyết pháp tôi đâu có nói gì đâu!ì Câu nói đó nó chứng tỏ Ngài cũng ý thức lắm, nói ra cái gì cũng có thể làm cho người ta kẹt vào cái đó, rồi cứ chấp vào đó mà tranh luận với nhau. Thành ra Ngài bảo: ‘‘Tôi đâu có nói gì đâu mà các ông cãi nhau như vậy?ì

Cho nên ta phải có thái độ mềm mỏng, phóng khóang, không cố chấp thì mới tiếp nhận được giáo lý của Bụt. Khi chúng ta học về nhị đế hay tứ tất đàn, chúng ta biết rằng mỗi lời Bụt nói nhắm vào một mục tiêu tương đối nào đó, tháo gỡ một cái kẹt của một người hoặc nhóm người nào đó. Chúng ta phải thấy được hoàn cảnh của họ mới mong hiểu được lời tuyên bố của Bụt.

!! Không cần chất chứa kiến thức

Có một thiền sinh sống đã ba năm trong thiền viện rồi nhưng chưa bao giờ được thầy dạy câu gì gọi là cao siêu như chân như, bản thể, niết bàn, v.v.. Dạy những chuyện như ăn cơm trong chánh niệm, đi đứng trong chánh niệm, rửa chén trong chánh niệm, v.v.. một hồi chú chán quá. Chú mới thưa với thiền sư: Bạch thầy, con ở đây ba năm rồi, thầy chưa dạy con cái gì sâu xa hết. Thầy chỉ dạy những chuyện đi, đứng, nằm, ngồi, nói chuyện, thở và cười thôi. Ông thầy thương quá, mới nói: ‘‘Chú nhìn kìa, nhìn cây tùng phía trước sân kia kìa. ì Rồi thầy không nói gì thêm nữa. Sư chú chắc là thất vọng lắm.

Trong đời sống hàng ngày, nếu ta không thực tập chánh niệm, nếu ta không tiếp xúc sâu sắc với những gì ở trong ta và xung quanh ta, thì làm sao ta có thể nói được những chuyện chân như, bản thể? Những lời đó trống rỗng, chỉ là những danh từ, những ý niệm trừu tượng mà thôi. Cho nên thiền sư bảo sư chú hãy nhìn cây tùng ở ngay trước mặt. Hình ảnh cây tùng trước sân về sau trở thành một đề tài đàm luận của tăng chúng trong thiền viện. Tiếng đồn đi xa, các vị học giả ở các nơi cũng nghe nói đến chuyện cây tùng trước sân. Và mấy chục năm sau vẫn có một vị từ phương xa trở về, cố hỏi cho ra ý nghĩa chuyện cây tùng trước sân. Khi tới tu viện thì thiền sư đã viên tịch, ông ta phải tìm một vị cao đồ của ngài để hỏi. Vị hành giả đó mới đi gặp tu viện trưởng, hỏi về vụ cây tùng trước sân ngày xưa. Tu viện trưởng nghĩ: Tại sao hành giả này, từ mấy ngàn cây số tới, không nói về những chuyện trước mắt mà lại phải lôi một đề tài xưa mấy chục năm ra hỏi? Ông mỉm cười nhìn hành giả đó, nói: ‘‘Thầy tôi có bao giờ nói tới cây tùng trước sân đâu? Đừng nói oan cho thầy tôiì Vị cao đệ muốn chấm dứt những đàm thoại lăng nhăng về một câu chuyện cách đây bốn, năm chục năm, để mọi người có thể đối diện với những vấn đề trực tiếp, cụ thể, ngay bây giờ. Vị cao đệ đó biết rõ chuyện cây tùng trước sân năm xưa có thật. Nhưng ông muốn chấm dứt chuyện đó, cắt đứt, coi như nó không có. Cho nên ông mới nói một câu giống như là nói dối: Thầy tôi có nói chuyện cây tùng trước sân hồi nào đâu?ì Đó là ngôn ngữ thiền, nhắm chặt đứt những hý luận. Cây tùng trước sân là câu chuyện giữa thiền sư và đệ tử cách đây 40 năm. Và chỉ trong văn mạch giữa hai thầy trò lúc đó thì câu chuyện mới có ý nghĩa. Còn đứng ở ngoài nhìn vào thì nó có thể trở thành một câu chuyện triết học. Nếu mình hiểu được hoàn cảnh của họ thì mình hiểu được luôn cả lời của thiền sư và thái độ của vị cao đệ. Thầy đã sinh ra cây tùng trước sân, và trò nhất định thanh toán cây tùng trước sân, không để cho người ta bị kẹt vào. Hai thầy trò cùng đi một đường, đều đúng hết.

Cách đây chừng 20 năm, lúc đang ở Hòa Lan, có một vị linh mục hỏi tôi: “Thưa thầy, trong cuốn Hoa Sen Trong Biển Lửa thầy đã nói rằng...” Rồi ông đọc lên một câu trong Hoa Sen Trong Biển Lửa, hỏi có phải câu đó có nghĩa như thế này, nghĩa như thế kia, v. v. Lúc đó tôi bỗng dưng trả lời: “Tôi có viết cuốn Hoa Sen Trong Biển Lửa bao giờ đâu?” Ông ta ngạc nhiên vô cùng. Cuốn sách đó đề tên tác giả Nhất Hạnh rõ ràng, mà ông thầy này cũng tên Nhất Hạnh. Tại sao ông ta nói như vậy? Lúc đó tôi hoàn toàn không nhớ tới chuyện thiền sư và cây tùng, nhưng tự nhiên tôi có phản ứng như thế. Có lẽ là trong máu mình có hạt giống của ngôn ngữ thiền tông, thành khi mở miệng ra mình nói rất tự nhiên: “Tôi đâu có viết cuốn đó?”

Mà sự thật lúc đó ở sâu trong lòng tôi, tôi thấy cái ông Nhất Hạnh tác giả cuốn Hoa Sen Trong Biển Lửa đã đi sang kiếp khác rồi, còn đây là một Nhất Hạnh khác đang sống. Tại sao không bàn công chuyện với ông Nhất Hạnh đang sống đây mà lại chỉ muốn nói chuyện với ông Nhất Hạnh ngày xưa? Học kinh điển mà không sống ở trong giây phút hiện tại, không đối diện với những vấn đề của hiện tại, cứ bị ràng buộc vào những câu chuyện và những ý niệm ngày xưa, chúng ta sẽ không đi tới đâu cả. Vị linh mục kể trên cũng đã từng học thiền, nghe tôi nói ông khựng lại và không hỏi nữa. Câu trả lời phũ phàng quá! Linh mục là một con người mới, sống trong giờ phút hiện tại. Tôi cũng là một con người mới, trong giờ phút hiện tại. Tại sao chúng ta không tiếp xúc và đối thoại với nhau trên căn bản đó, mà phải lôi ra một cuốn sách mấy chục năm về trước.

Sở dĩ tôi kể chuyện này là vì trong giới học Phật, chúng ta có khuynh hướng chất chứa kiến thức quá nhiều, và càng học cái hành trang khái niệm càng nhiều, làm cho chúng ta mất hết tự do và không còn nhẹ nhàng nữa. Bởi vậy tôi đã nói chúng ta phải học như thế nào để con người của chúng ta càng ngày càng nhẹ nhàng hơn. Khi quý vị học về tứ diệu đế thì điều quan trọng nhất là quý vị hiểu được tứ diệu đế để đem ra áp dụng trong sự tu tập. Còn chuyện quý vị có thể nói được đế thứ nhất là cái này, đế thứ hai, thứ ba, thứ tư là cái kia; và trong đế thứ nhất có thể chia làm bốn cái, cái thứ nhất của bốn cái đó lại được chia làm bảy món nữa, vân vân. . Mấy cái đó quý vị có thuộc hay không thuộc, điều này không quan trọng. Điều quan trọng là quý vị hiểu phương pháp tu tập. Hiểu xong thì quên hết đi. Nếu muốn nhớ lại một điều gì thì lật cuốn sách hay cuốn kinh là tìm ra chứ khó gì đâu. Không cần phải nhớ đủ thứ. Càng học càng nhẹ, càng học càng vui, càng học ta càng thấy ta bao dung không cố chấp, như vậy mới hay.

Khi nghe về nhị đế và tứ tất đàn là chúng ta đã bắt đầu thấy nhẹ nhàng rồi. Chúng ta không chấp nữa. Ta biết ta sẽ rất cẩn thận trong khi nói năng để lời nói của ta có tác dụng tháo gỡ cho người đối diện. Và khi nghe chúng ta cũng phải nghe như vậy. Điều người kia đang nói với ta có thể chỉ nói cho ta nghe thôi, lặp lại cho người khác không được. Ngày xưa thiền sư Triệu Châu nói với đệ tử về Phật tánh: Con chó có Phật tánh hay không? Kinh điển nói rằng cái gì cũng có Phật tánh cả. Những loài hữu tình có Phật tánh đã đành mà đến các loài vô tình như đất đá, cây cỏ cũng có Phật tánh nữa. Cố nhiên, theo lý luận đó, con chó thế nào cũng có Phật tánh. Mấy hôm sau có một vị thiền sinh lên hỏi: ‘‘Thưa thầy, con chó có Phật tánh hay không?ì Thiền sư Triệu Châu nói: ‘‘Không. Con chó làm gì có Phật tánh. ì Cũng chính ông thầy đó ngày hôm trước nói con chó có Phật tánh, hôm nay ông lại nói không! Thiền sinh này sau khi nghe tiếng không (vô) chắc đã thất điên bát đảo. Vì đã tin chắc rằng con chó có Phật tánh rồi, nên chú đã lên hỏi thầy cốt để chứng tỏ mình cũng biết về giáo lý sâu sắc đó, ai ngờ thầy lại nói không. Tại vì sư chú quen lối chất chứa kiến thức và muốn khoe thầy là mình cũng hiểu được giáo lý. Thấy được cái kẹt của chú, thầy mới tặng cho chú một tiếng ‘‘khôngì. Và đó là ngôn ngữ thiền. Nó có tác dụng tháo gỡ cho người bị vướng mắc. Nếu chúng ta căn cứ vào lời nói mà bảo rằng thiền sư này nói thế này đúng, thiền sư kia nói thế kia sai, là trật cả. Đúng là đúng với ai? Sai là sai với ai? Có khi nó đúng với người này mà nó sai với người khác. Đó là ý niệm về bốn tất đàn. Nói với từng người một, mỗi người có căn cơ, có hoàn cảnh riêng, gọi là các các vị nhân tất đàn. Muốn giúp một người bằng Phật pháp ta phải thấy được căn cơ của người đó. Nếu không biết căn cơ thì ta không thể giúp ai được.

!! Khế lý cũng là khế cơ

Trong đạo Bụt có thêm khái niệm về nhị khế, khế lý và khế cơ. Khế lý nghĩa là phải phù hợp với căn bản đạo Bụt, không chống lại với giáo lý vô thường, vô ngã và niết bàn. Thứ hai là khế cơ, có nghĩa là phù hợp với hoàn cảnh, với tâm lý, với trường hợp của người ta đang muốn giúp đỡ.

Khi đứng ra thuyết pháp cho một nhóm người, ta phải quán chiếu xem họ là những người nào, bối cảnh văn hóa và tôn giáo của họ như thế nào, họ mang những khổ đau nào, những vướng mắc nào, lúc đó ta mới nói về giáo lý cho họ được. Còn nếu đến với một thính chúng mà không có ý niệm gì về họ, thì ta không nên nói pháp, vì ta không có thể quán cơ, không thấy căn cơ của người nghe. Một pháp sư giỏi là một pháp sư biết quán cơ. Không phải mình có một mớ kiến thức Phật học rồi mình cứ thao thao bất tuyệt, người ta tiếp nhận được hay không cũng mặc. Đó là không biết khế cơ, mà lại thiếu cả từ bi. Động cơ thuyết pháp như thế không phải là lòng từ bi.

Trước hết, ta phải thấy những con người với những khổ đau, vướng mắc và khao khát của họ. Sau khi quán cơ, ta mới biết cần phải đưa ra và hiến tặng giáo lý nào. Dầu trong ta có chất chứa 2690 bài pháp thoại đã được chế biến sẵn, đó cũng chưa phải là Phật pháp. Vì Phật pháp đích thật phải có hai tính chất là khế lý và khế cơ. Nếu không khế cơ thì chưa chắc đã là khế lý, vì bài giảng đó vô ích, không trị được bệnh nào cho ai cả. Một ông thầy thuốc trước khi cho thuốc phải chẩn mạch, phải biết được tình trạng cơ thể của người bệnh. Người thuyết pháp cũng vậy, phải thấy được căn cơ của người nghe để đưa ra những giáo pháp thích hợp. Nói rằng bài thuyết pháp này khế lý nhưng không khế cơ là sai. Vì khi không khế cơ thì nó cũng không khế lý, dầu nó chứa đầy danh từ Phật học dù không ai bác bẻ được những lý luận trong đó. Lấy ngay cả đoạn kinh ra đọc, không thay đổi một chữ nào cũng chưa chắc là giáo lý đích thật. Vì khi không giúp được ai an lạc thì nó không phải là giáo lý. Nghĩ cho kỹ ta thấy rằng khi nào khế cơ thì tất phải khế lý, mà khi nào thật sự khế lý thì đã khế cơ rồi. Cho nên khế lý bao hàm khế cơ, mà khế cơ cũng bao hàm khế lý ở trong. Ngay trong một buổi pháp đàm cũng vậy. Một buổi pháp đàm gồm một số người với những kiến thức của họ. Những điều ta nói trong buổi pháp đàm là nói ra cho những người đó nghe, chứ không phải nói cho những người ở chỗ khác nghe. Vì vậy ngôn ngữ của ta cũng phải theo nguyên tắc nhị đế và tứ tất đàn. Có thể có nhiều điều không nói được, vì thính chúng này không phải là thính chúng để nghe chuyện đó. Có những điều ta thấy rõ, đã chứng nghiệm là sự thật, nhưng chưa thể nói cho họ nghe. Ví dụ như khi ta nói người cộng sản hay người tư bản cũng là người, người cộng sản cũng như người tư bản cũng cần được thương, cũng cần được giúp, cũng cần được chuyển hóa, họ không phải là kẻ thù của ta. Kẻ thù của ta là vô minh, là bạo động, là tham tàn, là cố chấp, kẻ thù của ta không phải là con người. Con người, dầu là con người tư bản hay con người cộng sản đều đáng thương, đáng giúp đỡ cả. ì Những câu nói trên rất đúng với tinh thần đạo Bụt. Nhưng khi quý vị nói điều đó ra giữa những người đã đau khổ nhiều quá vì chiến tranh, vì bị đấu tố hoặc tù đầy, thì nói câu đó có thể khiến tâm hồn họ bị một bức tường ngăn lấp, và họ không thể nào nghe tiếp được nữa.

Những điều ta nói mà người khác không nghe được thì không nên nói, vì nói ra họ cũng không hiểu. Nói những chuyện mà họ tiếp nhận được thì họ hiểu liền. Cho nên không phải bất cứ những kiến thức nào mình cho là đúng đều có thể nói, bất cứ ở đâu, bất cứ lúc nào. Đó là nguyên tắc tứ tất đàn. Cho nên thuyết pháp cũng như pháp đàm không phải là một dịp phô diễn kiến thức, mà phải làm sao cho những người hiện diện được lợi lạc. Có thể nói rằng một bài giảng, một câu nói phù hợp với chánh pháp thì đồng thời phải phù hợp với căn cơ của người nghe. Nếu không phù hợp căn cơ của người nghe, nếu không giúp tháo gỡ được cho người đó, nếu không đem lại lợi ích, thì chưa hẳn đó đã là chánh pháp. Vậy chúng ta đã học được gì với bài pháp thoại về nhị đế, tứ tất đàn, và hai quy tắc khế hợp, khế cơ và khế lý? Chúng ta học được rằng phải thực tế, phải bao dung, đừng cố chấp. Chúng ta phải như không khí, ở đâu cũng thong thả ra vào, không còn vướng mắc nữa.

!! Duyên khởi

Hôm nay chúng ta học sơ qua về khái niệm duyên khởi rồi, trong những bài sau chúng ta sẽ đi vào sâu hơn. Duyên khởi còn gọi là duyên sinh. Trong đạo Bụt có khi ta dùng danh từ đạo lý nhân quả, có khi ta dùng danh từ đạo lý duyên khởi hay đạo lý duyên sinh. Danh từ nào cũng được, nhưng có những danh từ dễ gây nhiều hiểu lầm hơn.

Ví dụ như hai chữ nhân quả. Có nhân thì có quả, trồng bắp thì ra bắp, trồng đậu thì sinh đậu. Nhân đưa tới quả. Nghe như vậy, cố nhiên chúng ta có khuynh hướng nghĩ rằng nhân phải có trước, và quả sẽ đến sau. Nghĩ như vậy thì ý niệm nhân quả đã bị đặt trong khuôn khổ thời gian và không gian. Đứng về mặt không gian, nhân khác, quả khác; đứng về phương diện thời gian, nhân có trước, quả có sau. Và đó là một điều chưa chính xác. Sự thật nhân quả không phải đơn giản như vậy.

Nói đến nhân quả ta lại còn có khuynh hướng nghĩ rằng chỉ một cái nhân nào đó cũng có thể sinh ra quả. Điều đó cũng không đúng, vì không bao giờ một cái nhân duy nhất có thể đưa tới quả được. Khi nói duyên sinh, chữ duyên có nghĩa là điều kiện. Dịch sang tiếng Anh là conditions, luôn luôn viết số nhiều, giúp ta tránh được ý tưởng một nhân sinh một quả. Chữ sinh trong từ duyên sinh có nghĩa là phát khởi ra. Một vật phát khởi có thể không cần sinh ra, có thể nó đã có sẵn rồi, giờ mới biểu hiện ra cho ta thấy. Chữ khởi này dịch là arising, biểu hiện ra, dấy lên. Conditioned co-arising là cùng phát hiện ra. Có người dịch là conditioned production, gần với chữ sinh hơn. Phát có nghĩa là có sẵn rồi bây giờ chỉ cần biểu lộ ra. Chữ khởi rất hay. Ví dụ như khi một niềm vui phát khởi thì niềm vui đó không hẳn là mới được sinh ra, nó chỉ phát hiện thôi. Hạt giống của niềm vui có sẵn trong ta rồi. Nhưng lâu nay không có tăng thân, không có thầy có bạn nên hạt giống niềm vui đó không được tưới tẩm. Bây giờ nhờ có tăng thân, có tu học, mưa xuân nhẹ hạt đất tâm ướt, hạt đậu năm xưa hé miệng cười, thì niềm vui đó như hạt nẩy mầm, biểu hiện lên. Như vậy gọi là sinh cũng không đúng, dùng chữ khởi sẽ thích hợp hơn.

Trong kinh điển Bụt dùng một hình ảnh rất hay là những cọng lau nương vào nhau. Ví dụ có ba cọng lau nương vào nhau mà đứng, nếu lấy đi một cọng thì các cọng lau kia sẽ ngã xuống. Cái này nương vào cái kia mà có, cái kia nương vào cái này mà có. Hình ảnh giao lô rất nổi tiếng ở trong đạo Bụt. Giao lô là những cọng lau dựa vào nhau mà đứng vững.

Trong đạo lý mười hai duyên khởi mà chúng ta sẽ học sau, thì vô minh duyên hành, hành duyên thức, thức duyên danh sắc, v.v.. Chữ duyên ở đây có thể dịch là condition. Thức làm điều kiện cho danh sắc phát khởi, ta nói thức duyên danh sắc. Nhưng Bụt cũng nói ngược lại: danh sắc làm điều kiện cho thức tồn tại. Nghĩa là thức duyên danh sắc và danh sắc duyên thức. Phải thấy hai thứ nương vào nhau mà tồn tại, không có thứ này thì cũng không có thứ kia. Cho nên phải vượt thoát khuôn khổ thời gian, không nghĩ rằng thức có trước rồi danh sắc có sau. Điều này rất quan trọng. Thấy sâu sắc về duyên khởi là vượt khỏi ý niệm không gian và thời gian. Thức không tồn tại biệt lập với danh sắc và danh sắc không tồn tại biệt lập với thức. Trong phạm trù không gian, hai cái dung lẫn nhau, trong cái này có cái kia, và ngược lại. Cho nên ý niệm về tương tức đã có sẵn ở trong cái giáo lý đạo Bụt nguyên thủy.

Trong thế giới khái niệm của chúng ta, ta nghĩ rằng cái nhân nằm ngoài cái quả và nhân có trước quả. Ví dụ như có con gà rồi mới có quả trứng. Khi con gà sinh ra trứng rồi, quả trứng tách khỏi con gà. Đó là cái thấy trong khuôn khổ thời gian và không gian. Trong giáo lý nguyên thủy, Bụt đã nói rất rõ ví dụ về giao lô, khi hai cọng lau nương vào nhau, lấy một cọng này đi thì cọng kia đổ, lấy cọng kia đi thì cọng này cũng đổ. Cọng này là điều kiện tồn tại cho cọng kia và cọng kia là điều kiện tồn tại cho cọng này. Ví dụ mẹ và con. Làm sao một người được gọi là mẹ nếu người ấy không có con? Và làm sao người đó được gọi là con nếu không có mẹ? Mẹ và con cùng sinh với nhau một lần. Giờ phút người này được làm mẹ thì người kia được làm con. Mà đồng thời mẹ cũng là con. Tại vì mẹ cũng là con của bà ngoại. Vì vậy nhân đồng thời là quả, quả đồng thời là nhân. Cho nên khi thầy A Nan nói: ‘‘Bạch đức Thế tôn, tính nhân quả rất rõ ràng, mình có thể hiểu một cách dễ dàng đượcì, thì Bụt dạy: Đừng có nói như vậy, thầy A Nan. Tính nhân quả sâu xa lắm. Đừng nói là có thể hiểu được dễ dàng. ì

Khi nhìn bằng con mắt không phân biệt, ta không thấy trên hay dưới, trái hay phải. Khi nhìn một cây bút, ta nghĩ đầu này là trên thì thế nào cũng phải có đầu dưới, không thể nào có trên mà không có dưới. Đầu trên là do đầu dưới phát khởi ra và đầu dưới do đầu trên sinh ra. Trên là nhân, sinh ra quả là dưới; dưới là nhân sinh ra quả là trên. Bỏ một cái đi thì cái kia cũng mất. Ý niệm trên phát sinh ra ý niệm dưới và dưới sinh ra trên, hai cái đồng thời sinh ra, nên ta có thể dịch tiếng Anh là co-arising. Co-arising là cùng có mặt, nương vào nhau mà có mặt. Bây giờ để cây bút nằm ngang thì ta thấy có phía trái và có phía phải, cũng vậy. Hễ có trái là có phải, hễ có phải là có trái. Phía phải và phía trái tương sinh, tương duyên, tương khởi, không thể loại bỏ một phía mà giữ phía kia được.

Bụt đã diễn bày sự thật về duyên khởi bằng một câu nói hết sức đơn giản: ‘‘Cái này có cho nên cái kia có. ì Không thấy lời tuyên bố triết học nào về nguyên do vũ trụ mà đơn giản đến như vậy. ‘‘Thử hữu tức bỉ hữuì, câu này chúng ta đọc hàng trăm lần trong các kinh, Nam tông cũng như Bắc tông. This being, that is. Cái này có vì cái kia có. That being, this is. Cái kia có thì cái này có. Vì có trái cho nên có mặt, vì có mặt cho nên có trái. Lấy một cái đi thì cái kia mất luôn. ‘‘Nhược thử hữu tức bỉ hữu, nhược thử vô tức bỉ vô, nhược thử sinh tức bỉ sinh, nhược thử diệt tức bỉ diệt. ì Đến cuối thế kỷ thứ 20, thầy Nhất Hạnh thêm một câu nữa: ‘‘cái này như thế này vì cái kia như thế kia. ì Mình nhặn mặt cho nên người kia nhặn mặt. Mình khó chịu cho nên người kia khó chịu. Soi gương thì thấy. This is like this because that is like that. Con của Bụt phải làm giàu thêm cho Bụt, đó là cành mọc từ thân cây, không có gì mới lạ.

Các kinh Nidana dạy về nhân duyên nói có mười hai duyên khởi, từ vô minh cho đến lão tử. Trong các kinh này Bụt luôn luôn nhấn mạnh rằng cái này có thì cái kia có, cái kia có thì cái này có, cả hai nương vào nhau mà hiện hữu. Nhận thức về duyên khởi trong đạo Bụt vượt lên trên khái niệm thời gian và không gian, sau này ta sẽ thấy rõ thêm. Ý niệm về sinh nương vào ý niệm về diệt mà có mặt. Ý niệm về diệt nương vào ý niệm về sinh mà phát hiện. Vì vậy thỉnh thoảng kinh chỉ nói rằng mục đích của sự tu học là đạt tới vô sinh. Đạt tới vô sinh có nghĩa là đạt tới vô diệt. Không cần nói tới vô diệt, vì vô sinh đã có nghĩa là vô diệt rồi. Nếu người ta hỏi: đạo Bụt nói gì về sự sinh khởi của thế giới, của con người thì ta chỉ cần trả lời: ‘‘cái này có vì cái kia có, vạn vật nương nhau mà phát hiện. ì Rất đơn giản mà có tinh thần khoa học, không đòi hỏi một niềm tin siêu hình nào hết. Thử hữu cố bỉ hữu. Câu đó xuất xứ từ kinh số 300 trong Tạp A Hàm, Samyukta Agama, Đại Tạng Đại Chánh, tập 2, trang 85. Đó là kinh nói về Trung Đạo.

Đạo lý duyên khởi được trình bày rất chi li trong các tông phái đạo Bụt sau này. Trong bộ phái Sarvastivada, tức là Thuyết Nhất Thiết Hữu Bộ, chúng ta thấy có ý niệm về tứ duyên và lục nhân. Tứ duyên, mà trong Duy Biểu Học chúng ta có học, gồm nhân duyên, tăng thượng duyên, sở duyên duyên và đẳng vô gián duyên. Sáu nhân là năng tác nhân, câu hữu nhân, đồng loại nhân, tương ứng nhân, biến hành nhân và dị thục nhân. Và trong bộ phái Đồng Diệp Bộ, Tamrasatiyah sau gọi là Theravada, phân biệt ra 24 duyên, pattaya. Đó là căn bản duyên, cảnh giới duyên, tăng thượng duyên, vô gián duyên, đẳng vô gián duyên, câu sanh duyên, phổ vi duyên, y duyên, cận duyên, tiền sinh duyên, hậu sinh duyên, tương tục duyên, nghiệp duyên, dị thục duyên hay là báo duyên, thực duyên (thực là ăn), căn duyên, thiền duyên, đạo duyên, tương ứng duyên, bất tương ứng duyên, hữu duyên, phi hữu duyên, ly duyên và phi ly duyên, tổng cộng 24 duyên. Nhưng điều chúng ta cần học hôm nay là tập quán chiếu, để có thể thấy được tánh duyên khởi của vạn sự vạn vật, để có thể vượt thoát được ý niệm về không gian và thời gian. Chúng ta không cần học thuộc 24 duyên đó. Chúng ta phải sống và quán sát trong đời sống hàng ngày để thấy được cái nhân ở trong quả, và cái quả ở trong nhân. Thấy được cái này ở trong cái kia, thấy được cái kia ở trong cái này, thấy mỗi cái chứa đựng được tất cả, và thấy tất cả mọi cái đều chứa đựng mỗi cái.

Điều này rất quan trọng cho sự học hỏi và tu tập của chúng ta. Để chúng ta thấy được rằng niềm vui chúng ta có hôm nay có liên hệ với tất cả những gì đang và đã xảy ra ở trong ta và trong đại chúng quanh ta. Một liên hệ tới tất cả. Học về khế lý và khế cơ, chúng ta đã thấy ngay rằng có khế cơ thì đồng thời có khế lý và khi đã thật sự khế lý rồi thì chắc chắn khế cơ. Hai cái là một. Sau này trong khi học về tứ diệu đế, bát chánh đạo, ngũ cặn, ngũ lực, thất bồ đề phần, bát chánh đạo phần, chúng ta đều sẽ thấy như vậy cả. Đây là một cách nhận thức rất mầu nhiệm, mà chìa khóa do chính Bụt đưa ra đó là thuyết duyên sinh (conditioned co-arising). Trong 24 duyên của học phái Theravada, có tiền sinh duyên và hậu sinh duyên. Tiền sinh là cái phát khởi trước và hậu sinh là cái phát khởi sau. Có một hiện tượng, thì trước đó có tiền sinh duyên và sau đó có hậu sinh duyên. Hai cái đều là duyên cho hiện tượng ấy cả, không có tiền sinh duyên không được, mà không có hậu sinh duyên cũng không được. Cái hậu sinh đã là duyên của cái hiện hữu, cho nên ta nói tiền và hậu không phải là ý niệm trước và sau trong thời gian. Thuyết Duyên khởi trong đạo Bụt, xin nhắc lại, vượt ra ngoài ý niệm về thời gian và không gian.

!! Tương tức và tương nhập

Ý niệm về tương tức và tương nhập đã bao hàm trong thuyết duyên khởi của đạo Bụt nguyên thỉ. Tương tức là interbeing và tương nhập là interpenetration. Thí dụ trong khế lý có khế cơ, trong khế cơ có khế lý. Khế lý là khế cơ, khế cơ là khế lý, đó là nguyên tắc tương tức và tương nhập của đạo lý duyên khởi. Không những khi học kinh điển và giáo lý chúng ta phải sử dụng cái chìa khóa tương tức và tương nhập. Trong đời sống hàng ngày, chúng ta cũng phải tập nhìn để thực chứng tương tức và tương nhập. Nỗi buồn vui của chúng ta, trong mỗi giây phút hàng ngày, liên hệ tới nỗi buồn vui của tất cả những người khác. Khi chúng ta nở được một nụ cười, chúng ta biết rằng nụ cười đó từ đâu tới: từ cha mẹ, ông bà, tổ tiên, và cũng nhờ có các thế hệ tương lai, nhờ tăng thân trong hiện tại. Hiểu như vậy chúng ta thấy được vai trò của chúng ta khi làm phát khởi một niềm vui hay một nỗi buồn nơi người khác. Chúng ta có thể vươn một cánh tay dài để gỡ một mối kẹt từ 3500 năm về trước, trong chính ta hay trong một người bạn của ta. Chuyện đó có thể làm được. Tại vì tất cả đều ở trong ta.

Trong Tạp A Hàm, kinh 288, Samyutta II, 112, về ví dụ giao lô, Bụt nói rằng: ‘‘Người nào thấy được tính duyên khởi là thấy được Bụt, thấy được Bụt trong bản chất. ’’ Cho nên phải dùng đạo lý duyên khởi như là một cây đuốc để đi vào trong kho tàng giáo lý đạo Bụt. Khi thấy những điều truyền tụng sai lầm thì nhờ hiểu đạo lý duyên khởi ta có thể chỉnh lại.

Chúng ta bắt đầu khóa tu bằng các bài học về nhị đế, về tứ tất đàn, để hiểu ngôn ngữ của Bụt. Nhờ thế chúng ta không bị kẹt vào ý niệm và danh từ. Chúng ta học tiếp về đạo lý duyên khởi để thấy bản chất của giáo lý đạo Bụt. Một mặt là học để thấy một chút về ngôn ngữ của Bụt, một mặt hiểu được một chút về đạo lý duyên khởi. Với hai ngọn đuốc đó, chúng ta có thể đi vào ba tạng kinh điển trong một chuyến viếng thăm rất thích thú để khám phá đạo Bụt. Sau này, những khi nói pháp thoại, nghe pháp thoại, hay phát biểu trong các buổi pháp đàm, ta phải nhớ đem những dụng cụ đó theo. Như trong một chuyến đi thám hiểm rừng sâu, chúng ta phải đem theo con dao rựa, đôi gặng tay, hay là một cái đèn pin. Khi chúng ta đi vào rừng giáo lý của đạo Bụt, truyền lại từ 2500 năm nay, chúng ta phải có vài hành trang, như nguyên tắc về nhị đế, về tứ tất đàn và về duyên khởi.

Nói, phải ý thức được những điều mình đang nói. Quán chiếu, phải ý thức được điều mình đang quán chiếu. Luôn luôn áp dụng những nguyên tắc đó. Nghe cũng vậy, phải nghe bằng những nguyên tắc đó. Sử dụng những nguyên tắc đó thì ta có thể nhận ra những điều đã truyền tụng sai, những điều đã bị hiểu lầm. Tuệ giác của ta về duyên khởi, về nhị đế sẽ hướng dẫn ta trong chuyến đi này.
! Bài 13 Như lý tác ý

Hôm nay ngày mùng 6 tháng giêng năm 1994, chúng ta ở tại Xóm Thượng và học tiếp bát chánh đạo. Hôm nay ta học về sự thật thứ tư trong tứ diệu đế.

Chúng ta đã học rằng trong tinh thần của Tứ diệu đế, một sự thật gồm chứa cả ba sự thật khác. Khi quán chiếu về một sự thật ta phải thấy được cả ba sự thật kia. Đạo, sự thật về con đường, hàm chứa sự thật về khổ đau. Nếu con đường không phải để chuyển hóa khổ đau thì không phải là con đường đích thực trong tứ diệu đế. Khi quán chiếu và tu tập về đạo đế, nếu chúng ta không thấy được bản chất và cội nguồn của khổ đau thì đó chưa đích thực là đạo đế. Cũng vậy, trong khi học hỏi và thực tập về đạo đế mà chúng ta không cảm thấy an lạc và chuyển hóa, nghĩa là chưa sống được sự thật thứ ba là diệt đế, thì đó cũng không phải là đạo đế đích thực. Cần nhắc lại rằng sự thật thứ tư là đạo đế gồm chứa cả ba sự thật đầu: khổ đế, tập đế và diệt đế.

Đạo đế có thể diễn tả bằng những vòng tròn bát chánh đạo. Vòng tròn thứ nhất là chánh kiến, rồi đến chánh tư duy, chánh ngữ, chánh nghiệp, chánh mạng, chánh tinh tấn, chánh niệm và chánh định. Chúng ta đã thấy tính cách tương tức, tương nhập và tương dung của tất cả những chi phần trong bát chánh đạo và bốn sự thật mầu nhiệm. Mỗi chi phần của bát chánh đạo cũng bao hàm bảy chi phần khác. Mỗi chi phần của bát chánh đạo cũng hàm nhiếp tất cả bốn sự thật.

Trong khóa tu này, chúng ta sẽ thấy toàn bộ giáo lý đạo Bụt có thể thâu tóm trong bát chánh đạo và tứ diệu đế. Chúng ta đã biết rằng ngay trong bài thuyết pháp đầu tiên cho năm thầy khất sĩ, Bụt đã giảng dạy giáo lý tứ diệu đế và bát chánh đạo. Đến giờ nhập diệt ở rừng Sala, khi dạy người đệ tử cuối cùng là Subadha, Bụt cũng giảng về bát chánh đạo. Cho nên chúng ta có thể vững tâm tin rằng bát chánh đạo là tinh yếu của giáo lý đạo Bụt. Toàn bộ giáo lý có thể được học hỏi qua cấu trúc của bát chánh đạo.

Chúng ta đã thấy rằng càng học về chánh niệm chừng nào chúng ta càng hiểu thêm về chánh kiến, chánh tư duy, chánh nghiệp, chánh mạng, chánh tinh tấn và chánh định chừng ấy. Đây cũng là một điều chứng minh cho tính tương tức của bát chánh đạo.

!! Như lý tác ý

Kỳ trước chúng ta đã nghe về Kinh Quán Niệm Hơi Thở. Kinh này dạy ta quán chiếu các lĩnh vực của thân, của cảm thọ, của tâm hành, và của pháp, tức là những đối tượng của tâm hành. Kinh Quán Niệm Hơi Thở chỉ dạy mười sáu phép thở. Người hành giả có thể căn cứ trên mười sáu phép thở căn bản ấy để sáng chế những phương pháp thực tập mới cho cả bốn lĩnh vực.

Thí dụ trong mười sáu hơi thở chỉ có bốn hơi thở để quán chiếu về thân. Trong khi đó thân ta có rất nhiều khía cạnh cần được quán chiếu. Vì vậy bốn hơi thở này cần được thực tập, rồi được khai triển để biến thành vô số phương pháp thực tập nhằm quán chiếu tất cả những bộ phận của thân thể. Bụt lại dạy bốn hơi thở khác để quán chiếu cảm thọ. Cảm thọ cũng là một lĩnh vực rộng lớn. Rồi đến bốn hơi thở quán chiếu về các tâm hành. Tâm hành có tới 51 thứ, rất năng động, rất phức tạp. Cuối cùng có bốn hơi thở để quán chiếu về các pháp, tức là đối tượng của tâm hành.

Kỳ trước chúng ta đã nghe khá đầy đủ về quán niệm thân thể trong thân thể. Trong đời sống hàng ngày, khi đi, đứng, nằm, ngồi, làm việc, ta phải chiếu rọi ánh sáng chánh niệm vào để biết ta đang làm gì, như ta biết ta đang đứng, đang ngồi, v.v.. Ta thực tập và giúp những người khác trong tăng thân cùng thực tập. Những phương pháp thiết yếu và cụ thể như vậy biết mà nếu không thực tập được thì uổng phí và dại dột lắm.

Về trường hợp cảm thọ cũng vậy. Trong đời sống hàng ngày, chúng ta có những cảm thọ vui, buồn, giận, ghét, có những khổ thọ, lạc thọ và xả thọ. Ta phải chăm sóc cảm thọ của chính ta, nếu không thì ai chăm sóc những cảm thọ ấy cho ta? Bụt dạy ta lấy ánh sáng chánh niệm soi chiếu vào những cảm thọ. Những đau buồn, giận hờn, ganh ghét, nhức nhối, thao thức, sợ hãi, âu lo. Ta ôm ấp, săn sóc và chuyển hóa chúng bằng năng lượng chánh niệm. Không ai làm được việc đó thay ta được. Bằng cách chăm sóc, trị liệu và chuyển hóa những cảm thọ của mình, ta có thể giúp người chung quanh chăm sóc, trị liệu và chuyển hóa những cảm thọ của họ. Những phương pháp Bụt dạy rất cụ thể và rõ ràng. Khi có một nỗi buồn ta biết ta có một nỗi buồn. Khi có một niềm vui ta biết ta có một niềm vui. Biết đây không phải là một cái cảm tưởng suông, biết đây là dùng năng lượng của chánh niệm để nhận diện và soi xét cảm thọ.

Trong Kinh Trung A Hàm, Bụt dặn sau khi đã nghe giảng về tứ diệu đế và bát chánh đạo, ta nên thực tập như lý tác ý để đưa chánh kiến vào đời sống hàng ngày. Các chữ như lý tác ý được sử dụng trong Kinh Phật Thuyết Tam Chuyển Pháp Luân. Thực tập như lý tác ý tức là khởi tâm chú ý tới một điều Bụt đã dạy, và bắt đầu áp dụng nó. Mỗi ngày chúng ta có hai mươi bốn giờ đồng hồ để sống. Những việc chúng ta làm như nấu bếp, quét nhà, giặt áo và làm vườn, chúng ta đều phải làm trong tinh thần tu tập. Nghĩa là trong khi làm những công việc đó chúng ta phải áp dụng phương pháp chăm sóc thân thể ta và cảm thọ của ta bằng năng lượng của sự quán niệm.

Sống trong thiền viện, nếu không thực tập chánh niệm và quán chiếu thân và thọ của mình, thì không khác gì sống ở ngoài đời. Ngoài đời người ta nấu cơm, quét nhà, đun nước, giặt Đo, mà ở trong chùa chúng ta cũng làm như thế. Khác nhau chăng là ở chùa ta làm những việc đó trong chánh niệm. Chúng ta phải chăm sóc ngôi chùa bản thân của chúng ta, để ngôi chùa quý giá ấy đừng trở thành một chùa Bà Đanh.

Có những cảm thọ rất đau đớn, có những cảm xúc có thể làm ta tê liệt ngày này sang ngày khác, có khi từ tháng này sang tháng khác. Tu học theo đạo Bụt ta phải biết săn sóc những cảm thọ và những cảm xúc đó. Ta biết sở dĩ ta có những cảm xúc làm ta tê liệt như vậy, là vì trong quá khứ ta đã không biết săn sóc cảm thọ. Khi cảm thọ đang còn non yếu ta đã không biết xử lý, chúng ta để cho chúng càng ngày càng có cường độ mạnh. Bây giờ nó đang làm ta tê liệt, nó đang hoành hành trong ta chỉ vì ta đã không thực tập những điều Bụt dạy. Trong quá khứ, ta đã khinh thường, đã không tu học, ở trên núi châu báu nhưng chưa bao giờ biết nhận diện châu báu. Đi, đứng, nằm, ngồi ta không có chánh niệm. Cảm thọ nổi lên thì ta vùng vẫy, chạy trốn, chứ không biết nâng niu, chăm sóc, quán chiếu và chuyển hóa. Khi ngọn gió cảm thọ đã thổi mạnh thành bão tố, mà ta mới bắt đầu thực tập thì sẽ thấy khó khăn. Là nạn nhân cảm thọ, ta khổ đau và trở thành gánh năng cho những người xung quanh. Trong một tăng thân, mỗi khi ta bệnh hoạn thì anh chị em ta phải chăm sóc và lo lắng cho ta. Đó là nói về thân bệnh. Khi trong tâm ta có niềm đau quá lớn thì tăng thân ta cũng khổ và cũng phải đưa lưng ra để chịu đựng. Nếu ta biết chuyên cần tu tập trong đời sống hàng ngày, và nếu những người xung quanh ta cũng thực tập, thì sự thực tập của người này tạo thêm năng lượng cho người kia. Muốn giúp đỡ người khác ta hãy thực tập cho bản thân. Nếu bản thân ta không thực tập thì ta không thể nào giúp cho người khác bớt khổ.

!! Một bài thực tập quán hơi thở

<<<
Thở vào tâm tĩnh lặng,  <br>
Thở ra miệng mỉm cười.  <br>
An trú trong hiện tại,  <br>
Giây phút đẹp tuyệt vời.
<<<

Đây là một bài thực tập ở Làng Mai rất nổi tiếng; đã có hàng ngàn, hàng chục ngàn người, có thể hàng triệu người khắp nơi đang thực tập và đã hưởng rất nhiều kết quả của sự thực tập ấy. Nó rất đơn giản. Nó bắt đầu như sau: 

> Thở vào tôi biết tôi đang thở vào, thở ra tôi biết tôi đang thở ra.

Câu này được lấy trực tiếp từ Kinh Quán Niệm Hơi Thở. Bất cứ lúc nào, khi quét nhà, nấu cơm, ngồi lái xe, giặt áo quần, đi thiền hành hay ngồi thiền tọa, ta đều có thể thực tập câu này. Từ 2600 năm nay, người nào vào chùa cũng thực tập bài này cả: thở vào biết thở vào, thở ra biết thở ra (Breathing in I know I am breathing in. Breathing out, I know I am breathing out). Tuy bài tập rất đơn sơ nhưng kết quả to lớn ta không thể lường được. Bước đầu, ta tập trở về nắm lấy hơi thở của ta, biết đây là hơi thở vào, biết đây là hơi thở ra. Nhưng chỉ trong một vài phút thực tập, ta đã có thể thực hiện được thân tâm nhất như (thân và tâm trở thành một). Hơi thở nối liền thân và tâm. Hơi thở giúp ta có mặt thật sự tại chỗ, trong giây phút hiện tại. Ta làm chủ ta, ta không đánh mất ta nữa. Ta đã bắt đầu trở lại là ta, ta đã về, ta đã tới.

Hơi thở này là hơi thở căn bản. Chúng ta có thể thực tập hơi thở này mười lần, hai mươi, ba mươi lần. Chúng ta có thể chỉ cần thực tập hơi thở ấy cũng đủ.

Tiếp theo chúng ta có thể thực tập tiếp: Hơi thở vào đã sâu, hơi thở ra đã chậm. (As the in- breath becomes deeper, the out breath becomes slower). Hơi thở sâu và chậm không phải vì ta cố ý làm cho nó sâu hơn và chậm hơn. Nếu ta thở một cách có ý thức, thở vào biết thở vào, thở ra biết thở ra, thì chỉ sau hai, ba lần thở, hơi thở chúng ta đã tự nhiên sâu hơn và chậm hơn. Ta không cần cố gắng. Xin đừng hiểu là ta cố làm cho hơi thở vào sâu thêm, cố làm cho hơi thở ra chậm hơn. Hai câu này chỉ có nghĩa rằng: tôi đang thở vào và nhận thấy hơi thở vào của tôi đã sâu thêm, tôi đang thở ra và nhận thấy hơi thở ra của tôi đã chậm lại. Mà một khi hơi thở đã sâu thêm và chậm lại là nó đã có phẩm chất cao hơn. Nó mang lại sự tĩnh lặng, an lạc, tự do và thảnh thơi. Không cần phải tu mười năm hoặc hai chục năm mới đạt được kết quả này. Chúng ta chỉ cần thực tập hai hoặc ba phút thôi là có thể đạt rồi!

Chúng ta cũng không cố ý làm cho thân và tâm trở về làm một, thân tâm nhất như. Chúng ta không cầu khẩn được an lạc. Chúng ta chỉ cần ‘‘thở vào, biết thở vào, thở ra biết thở ra’’, thì một lúc sau tự nhiên thân và tâm sẽ nhất như, sẽ trở thành một khối. An lạc, nhẹ nhàng tự nhiên sẽ tới, không ai phải bắt ép. Trong khi ngồi thiền hay đi thiền ta cứ tiếp tục thở như vậy.

Ngồi thiền hay đi thiền mà thở như vậy là một niềm vui lớn, một ân sủng lớn. Nếu trong khi tu tập mà ta có cảm tưởng là bị ép buộc thì ngồi thiền hay đi thiền là một khổ dịch. Trong đời sống tu viện, ngồi thiền và đi kinh hành phải là những giây phút sung sướng nhất. Trong những giây phút đó, không ai được quyền động tới ta, không ai được hỏi ta một câu hỏi hay nhờ ta làm một việc gì. Trong những giờ phút đó, ta có tự do hoàn toàn. Ta chỉ cần thở vào biết thở vào, thở ra biết thở ra. Đừng bỏ qua những thời khóa. Đó là những giờ phút quý báu mà chúng ta có thể sống cùng đại chúng.

Hai câu tiếp theo trong bài thực tập là: Thở vào tôi thấy khỏe, thở ra tôi thấy nhẹ. Khỏe và nhẹ đây không phải là tự kỷ ám thị (auto-suggestion) -Tự kỷ ám thị là khi không khỏe nhưng mình cứ nói: ‘‘tôi khỏe, tôi đang khỏe đây’’, khi không nhẹ mà mình cứ nói: ‘‘tôi đang nhẹ, tôi đang nhẹ đây’’ để tự ảnh hưởng vào lòng mình. Nếu ta thở vào và thở ra có ý thức vài ba lần thì tự nhiên hơi thở trở thành sâu và chậm. Rồi nếu hơi thở tiếp tục sâu và chậm, thì tự nhiên ta cảm thấy trong người khỏe và nhẹ. Nói ‘‘khỏe, nhẹ’’ vì ta nhận thấy có khỏe và có nhẹ thật. Đây là sự nhận diện. Và khi khỏe mà biết là mình khỏe thì ta sẽ thấy khỏe thêm. Khi nhẹ mà biết là mình nhẹ, thì mình sẽ thấy nhẹ thêm. Biết ở đây nghĩa là có ý thức, là có chánh niệm. Chánh niệm nâng cao phẩm chất của những gì đang hiện diện. Ví dụ bông hoa. Bông hoa đẹp, nhưng nhờ tôi nhìn có chánh niệm nên bông hoa càng biểu lộ được cái đẹp của nó. Khi quý vị ngắm trăng trong chánh niệm thì trăng càng sáng tỏ. Cho nên khi ý thức rằng hơi thở đang làm cho ta khỏe khoắn và nhẹ nhàng, thì vì có ý thức, cảm giác khỏe và nhẹ trở thành hiện thực hơn. Nhiều khi ta khỏe và nhẹ, cũng như ta có tự do và an lạc, nhưng vì không ý thức nên ta không thật sự thừa hưởng được cái khỏe và cái nhẹ ấy.

Bài thực tập tiếp tục với hơi thở chánh niệm:

<<<
Thở vào tâm tĩnh lặng,  <br>
Thở ra miệng mỉm cười.  <br>
An trú trong hiện tại,  <br>
Giây phút đẹp tuyệt vời.
<<<

Thở vào tâm tĩnh lặng là một bài tập Bụt dạy trong Kinh Quán Niệm Hơi Thở. Tôi đang thở vào và làm cho tâm hành tôi êm dịu lại. Tâm hành ở đây có thể là một cảm thọ không dễ chịu, như buồn bực, sợ hãi, giận hờn hoặc thao thức. Ta sử dụng hơi thở vào để làm lắng cảm thọ xuống. Ngay từ đầu quý vị cũng có thể thực tập liền hơi thở, ‘‘thở vào tâm tĩnh lặng’’ được. Nhưng nếu quý vị theo thứ tự bài thực tập, mỗi câu thực tập vài ba phút, khi đến đây thì quý vị rất dễ làm cho cảm thọ mình lắng dịu.

Thở ra miệng mỉm cười. Miệng mỉm cười có thể là một thực tập thuộc lĩnh vực thân. Mỉm cười ở đây là một động tác yoga, (yoga of the mouth). Có những thiền sinh Tây phương nói: ‘‘Thưa thầy, trong lúc con không có gì vui trong lòng cả mà thầy lại bảo con cười? Như vậy là nụ cười giả tạo sao?’’ Tôi trả lời: ‘‘Tôi đâu có bắt anh cười đâu, tôi chỉ đề nghị anh tập yoga miệng thôi mà. Tại sao anh tập yoga tay được, anh tập yoga chân được, chổng ngược đầu được, mà lại không tập yoga miệng được? Tôi chỉ yêu cầu anh nhếch cái mép anh lên một chút xíu thôi.’’ Khi anh mỉm cười, có ba trăm bắp thịt trên mặt được thư giãn và sự cặng thẳng trong hệ thần kinh của anh tự nhiên tan biến. Tôi không cần anh giả làm bộ vui, anh chỉ cần tập yoga cái miệng dùm tôi thôi thì tự nhiên cơ thể anh có thể thư giãn, hệ thần kinh anh buông thư và điều này sẽ có ảnh hưởng tốt tới tâm anh.

Quỳ xuống hay đảnh lễ cũng là những động tác yoga. Muốn bày tỏ sự cung kính tam bảo, ta đâu nhất thiết phải lạy xuống. Nhưng khi anh lạy xuống thì tâm cung kính tam bảo của anh được bày tỏ một cách dễ dàng hơn gấp bội. Khi tu tập ta phải biết sử dụng thân thể ta nữa, chứ nói rằng chỉ cần tu tâm thôi thì không được. ‘‘Tôi tu trong tâm thôi, tôi không cần tu bằng hình thức, tôi không cần ngồi thiền, đi thiền, tôi chỉ cần bỏ ác làm lành thôi à!’’ Quý vị đã từng nghe câu nói ấy chưa?

Các nhà khoa học đã nghiên cứu về nụ cười và về tác dụng của nụ cười. Nụ cười mà họ nghiên cứu đây không phải là cái cười vui, mà chỉ là những động tác của bắp thịt khi miệng ta nhoẻn ra cười thôi. Mỉm miệng cười đưa tới những kết quả rất kỳ diệu. Đang tức bực vậy mà ta mỉm miệng cười được một cái thì tự nhiên tâm trạng ta biến đổi hoàn toàn.

An trú trong hiện tại, giây phút đẹp tuyệt vời. Khi thở vào, ta đem tất cả thân tâm trở về với giây phút hiện tại, bây giờ và ở đây. Khi thở ra, ta thấy được giây phút hiện tại chứa đựng tất cả những mầu nhiệm tuyệt vời của sự sống. Trở về giây phút hiện tại, ta khám phá được nhiều châu báu trong thân và trong tâm của ta. Trước hết ta khám phá ra sự thật là ta đang sống và ta đang thở. Ta đang sống, sự sống đang có mặt với tất cả những mầu nhiệm của nó. Ta tiếp xúc được với Bụt, với Pháp, với Tăng. Tất cả những mầu nhiệm đó đều đang có mặt trong giây phút hiện tại. Ta chỉ cần tiếp xúc sâu sắc với giây phút này là có thể tiếp xúc với những mầu nhiệm ấy. Ta tiếp xúc được với tất cả những gì mà lâu nay ta từng đi tìm nhưng chưa gặp. Tất cả đều ở ngay đây.

!! Tịnh độ là ở đây

Có những người tu tịnh độ hai, ba chục năm mà không có dấu hiệu gì đã tiếp xúc được với tịnh độ. Đó cũng vì họ cứ nghĩ tịnh độ là ở trong tương lai. Nghĩ rằng tịnh độ chỉ có ở tương lai là một chướng ngại lớn. Giáo lý căn bản của Bụt là tất cả những gì ta tìm kiếm, từ niết bàn cho đến tịnh độ, đều ở trong tâm ta, ở trong giây phút hiện tại. Làng Mai có một bài hát rất đơn giản:

<<<
Đây là tịnh độ,  <br>
tịnh độ là đây,  <br>
mỉm cười chánh niệm,  <br>
an trú hôm nay,  <br>
Bụt là lá chín,  <br>
Pháp là mây bay,  <br>
Tăng thân khắp chốn,  <br>
quê hương nơi này. 

Thở vào hoa nở,  <br>
Thở ra trúc lay,  <br>
Tâm không ràng buộc, <br> 
Tiêu dao tháng ngày.
<<<

An trú được trong hiện tại, ta hoàn toàn thanh thản. Bụt ta cũng tiếp xúc được bây giờ, pháp ta cũng tiếp xúc được bây giờ. Nhặt một chiếc lá rụng lên, ta đã có thể thấy Bụt. Ngắm một đám mây bay, ta tiếp xúc với pháp. Còn Tăng thân là cây, là gió, là chim, là các bạn tu. Đâu cần phải đi đâu? Đâu phải tìm về quá khứ hay mơ tới tương lai mới gặp được Bụt, Pháp và Tăng? Thở vào hoa nở. Hoa vẫn nở nhưng ta không thấy. Thở vào có ý thức mới thấy được hoa nở. Thở ra trúc lay, tâm không ràng buộc, tiêu dao tháng ngày. Niềm an lạc được đạt tới có thể ngay bây giờ. Giây phút hiện tại có thể là đẹp tuyệt vời, đây không phải là một triết lý. Đó là hoa trái của sự thực tập tiếp xúc bằng chánh niệm. Bài kệ này là một Pháp bảo rất đơn giản. Mới học ta có thể chưa thấy được gì huyền diệu và uyên áo ở trong. Một em bé mười tuổi cũng có thể hiểu được. Nhưng bao nhiêu điều sâu xa của Phật Pháp, làm bằng chất liệu của Kinh điển và của tuệ giác đều có thể đang được chứa đựng trong đó.

An trú hiện tại là một phép tu rất mầu nhiệm. An trú trong chánh niệm, và với năng lượng chánh niệm ta tiếp xúc được rất sâu sắc với hiện tại. Những mầu nhiệm của sự sống nuôi dưỡng ta. Giờ phút bây giờ và không gian ở đây trở thành quê hương, ta không cần đi tìm tòi đâu xa nữa, và ta chấm dứt được cuộc lang thang.

Cả hai bài kệ Đây Là Tịnh Độ và Thở Vào Tâm Tĩnh Lặng trong khi được thực tập đều có thể giúp ta trở về an trú trong hiện tại và khám phá chiều sâu mầu nhiệm của sự sống. Bài Thở Vào Tâm Tĩnh Lặng có thể được rút ngắn cho tiện việc thực tập:

> Tĩnh lặng, Mỉm cười, Hiện tại, Tuyệt vời.

Từ năm 1980, tôi đã sử dụng bài kệ này để hướng dẫn thiền sinh Tây phương thực tập thiền ngồi và thiền đi. Bài dịch tiếng Anh:

<<<
Breathing in, I calm myself  <br>
Breathing out, I smile,  <br>
Dwelling in the present moment  <br>
I know this is a wonderful moment.
<<<

Rút ngắn để dễ thực tập như sau:

> Calming Smiling Present moment Wonderful moment.

Bài kệ này đã được dịch ra hàng chục thứ tiếng, trong đó có tiếng Nga và tiếng Hoa. Bài tiếng Hoa đã được dùng cho các khóa tu tổ chức ở Đài Loan và Lục Địa.

!! Học đời sống của Bụt

Chúng ta thường nghe nói tới những kỳ nhập thất ba năm, hoặc chương trình bốn năm học Phật Pháp cơ bản hay sáu năm Phật Pháp cao cấp. Chúng ta có thể học rất nhiều, có thể thuộc rất nhiều kinh, viết được những bài giảng rất dài. Nhưng điều quan trọng là chúng ta có được thật sự nuôi dưỡng bằng pháp lạc hay không? Bụt đã để lại cho ta những gì? Và ta đã thừa hưởng được những gì? Bụt đã để lại cho ta ba tạng Kinh điển, Bụt đã để lại cho ta lịch sử của một giáo đoàn. Nhưng trước hết Bụt đã để lại cho chúng ta cuộc đời của Bụt.

Cuộc đời của Bụt nghĩa là sự sống của Bụt. Bụt đã sống như thế nào? Bụt có phải là một nhà trí thức không? Bụt có phải một nhà văn viết hết từ bộ sách này sang bộ sách khác hay không? Hay Bụt chỉ là một người đi bộ, đi từ khu vườn này sang mái tranh kia, đi từng bước thảnh thơi, tiếp xử với mọi người bằng lòng từ bi, bằng nụ cười khoan lạc của mình? Bụt là như vậy. Bụt không phải là một nhà trí thức. Bụt không phải là một nhà nghiên cứu. Bụt không phải là một người tổ chức. Bụt không phải là một uy quyền cầm đầu một giáo hội lớn lao. Bụt chẳng qua là một ông thầy tu, một ông thầy tu có lòng từ bi lớn và có tuệ giác lớn. Và quanh Bụt có những người học trò, có những người bạn. Họ cũng muốn làm như Bụt: đi bộ từng bước thảnh thơi, đi xin thức ăn mỗi ngày để tiếp xúc và độ đời, thực tập hơi thở, thực tập chánh niệm.

Chính vì thế Bụt đã cứu giúp cho không biết bao nhiêu người. Không phải giúp bằng cách tổ chức cứu trợ có hàng trăm triệu, mà giúp bằng cách dạy cho người ta biết đi, đứng, nói, cười, thở, và chuyển hóa. Và Bụt là một người vui tươi, không rầu rĩ, Ngài có một nụ cười sống mãi 2500 năm cho tơi bây giờ.

Đời sống cûa Bụt là thông điệp của Ngài. Thông điệp đó, ta phäi tiếp nhận cho được. Còn những hệ thống tư tưởng trong đạo Bụt liên hệ gì với đời sống của Ngài, có liên hệ gì với an lạc, hạnh phúc trong sự sống của Ngài, câu hỏi đó chúng ta sẽ phải đặt ra.

Có những giờ phút nghe như là huyền sử về cuộc đời Bụt. Ví dụ những giờ phút Ngài ngọa bịnh ở Vaisali. Bịnh nặng đến nỗi thầy A Nan phải ra bên ngoài đứng khóc. Nhưng sau đó Bụt lành bịnh và cho triệu các thầy trong vùng đến để nói chuyện. Bụt biết rằng Ngài sẽ tịch trong một thời gian ngắn. Khi gặp các đệ tử Bụt dạy: ‘‘Này các thầy, các thầy hãy thực tập quay về nương tựa nơi hải đảo của tự thân. Đừng tìm nương tựa vào một nơi nào khác. Vì nơi hải đảo tự thân vốn có Bụt, có Pháp, có Tăng. Đừng tìm kiếm nơi khác, không cần đi đâu xa. Ở trong tâm ta đã có đủ hết những gì ta muốn tìm kiếm.’’ Đó là những giây phút rất ấm cúng và mầu nhiệm, chỉ có thầy với trò ngồi với nhau thôi. Lời dạy ấy cho ta thấy một tình thương rất lớn. Và khi thầy trò lên đường đi về phương Bắc thì có lúc Bụt quay lại và đưa mắt nhìn thành phố Vaisali một lần chót. Bụt nhìn với tất cả chánh niệm. Kinh ghi chép: ‘‘Đức Thế Tôn ngoái lại nhìn thành phố Vaisali bằng đôi mắt của một con voi chúa, rồi Ngài mỉm cười hướng về phía Bắc và bước tới.’’ Đó là lần chót Đức Thế Tôn nhìn thành phố Vaisali, và Ngài đã nhìn bằng con mắt của chánh niệm, con mắt của một tượng vương.

Mỗi bước chân đi của Bụt là một huyền sử, mỗi cái nhìn của Bụt là một huyền sử. Bốn mươi lăm năm trước, vào một buổi sáng, lúc sao mai mọc, Bụt đã thành đạo. Nhìn sao mai vừa mọc, Ngài giác ngộ, và mỉm cười. Đó là một giây phút đẹp như một huyền thoại. Những sự việc xảy ra tuy có thật, nhưng đẹp đến nỗi ta không thể diễn tả được. Ta chỉ biết nói: mỗi giây phút trong đời sống của Bụt là một huyền sử. Ngồi trên núi Thứu, ăn cơm với các đệ tử, leo lên núi, đi xuống núi, từng bước chân, tất cả những giây phút đó đều tràn đầy an lạc và hạnh phúc. Mục đích của sự tu học là để sống được những giây phút như vậy. Chúng ta hãy sống như thế nào để mỗi giây phút của đời ta trở nên một giây phút linh diệu. Cho con cháu sau này nghĩ tới sẽ tự hào về cha ông. Những điều kiện của hạnh phúc, của giác ngộ, của thương yêu có sẵn bây giờ và ở đây. Ta làm thế nào để tiếp xúc, để sống an lạc ngay, đừng đợi mười năm sau, đừng đợi phải nghiên cứu hết cả ba tạng giáo lý của đạo Bụt rồi mới bắt đầu.

Năm 1968, tôi được leo núi Linh Thứu với thầy Maha Gosananda, sư cô Chân Không, thầy Thế Tịnh và một số người khác. Lên đến đỉnh núi Thứu, chúng tôi chỉ ngồi xuống mà thôi, ngồi cho đến khi mặt trời lặn. Và cũng chỉ muốn lặp lại những gì mà ngày xưa Bụt đã từng làm. Lên núi Thứu chúng tôi không đọc Kinh, không pháp đàm, chúng tôi chỉ ngồi xuống thôi. Ngày xưa Bụt đã ngồi ở đó, và bây giờ ta cũng chỉ muốn ngồi ở đó. Đột nhiên nhìn về phương Tây, tôi thấy mặt trời huy hoàng đang lặn. Chưa bao giờ tôi thấy mặt trời lặn đẹp như vậy. Tự nhiên tôi ý thức được tôi đang nhìn mặt trời bằng con mắt của Bụt ngày xưa. Ngày xưa Bụt đã từng ngồi nhìn mặt trời lặn. Bao nhiêu năm tháng đã trôi qua. Chiều nay mình cũng ngồi như thế, cũng nhìn như thế. Không có gì khác. Đức Thế Tôn đã ngồi nhìn mặt trời lặn. Ta sống lại giây phút huyền sử ấy bằng cái nhìn của ta. Khi xuống núi, chúng tôi cũng đi từng bước ý thức. Không ai nói với ai một lời nào. Trong tâm không lo lắng, không gợn một chút buồn phiền hoặc chút giận hờn. Đó là những điều mà hôm nay chúng ta có thể làm được. Bắt đầu từ ngày đó trở về sau, đi đâu tôi cũng đi theo kiểu thiền hành. Tôi đã hướng dẫn những đoàn người hai chục người, năm chục người, một trăm người, hai ngàn người ở Âu Châu, Mỹ Châu, Á Châu, Úc châu, đi những bước thảnh thơi như Bụt đã đi.

Đi như thế nào, ngồi như thế nào, ăn như thế nào để mỗi giây phút của đời sống ta có thể trở thành huyền sử. Ngày các sư cô Chân Đức, Chân Không và Chân Vị thọ giới trên núi Thứu, chúng tôi cũng đã thực tập ngồi yên trên ấy. Chúng tôi đã bắt đầu leo lên núi Thứu từ lúc bốn giờ sáng để kịp chứng kiến giờ phút mặt trời mọc. Chúng tôi nghĩ nếu mặt trời lặn trên núi Thứu đẹp, thì mặt trời mọc trên núi Thứu cũng rất đẹp. Thầy trò leo núi rất sớm, có một ông cảnh sát được mời đi thiền hành với chúng tôi cho có thêm an ninh. Quả nhiên là mặt trời mọc trên ấy cũng đẹp không thua gì mặt trời lặn.

Ta phải biết rằng mặt trời ở đâu cũng đẹp như mặt trời trên núi Linh Thứu. Mặt trời ở bên Úc, ở bên Hoa Kỳ, ở Âu Châu, ở Á Châu đều đẹp. Chúng ta có con mắt nào để nhìn mặt trời hay không, có hai chân nào để tiếp xúc với mặt đất hay không? Tại Làng Mai có những buổi sáng và buổi chiều tuyệt đẹp. Những ngày có sương rất đẹp, những ngày không có sương cũng đẹp. Trời mưa hay nắng đều đẹp. Cây ‘‘bồ đề’’ trước thiền đường Chuyển Hóa, mùa xuân, mùa Hạ, mùa đông hay mùa thu gì đều đẹp. Chúng ta chỉ cần nhìn cây với một chút chánh niệm, là đã có thể tiếp xúc được với cái đẹp ấy.

!! Hạnh phúc ở trong ta

Những mầu nhiệm của sự sống đang được biểu hiện trước mắt ta trong mỗi phút mỗi giây. Chính bản thân ta là một mầu nhiệm. Chính người bạn tu sống bên ta cũng là một mầu nhiệm. Không có gì ngăn cản chúng ta tiếp xúc với sự sống trong những giây phút hiện tại để biến chúng ta thành những trang huyền sử. Những điều Bụt dạy ta hết sức đơn giản. Những bài thiền tập có hướng dẫn nằm ở trong tầm tay mọi người, ai cũng có thể thực tập được cả. Bài kệ học hôm nay, ta chỉ cần thực tập trong vài phút là đã thấy mình khỏe hơn, nhẹ hơn và có thể đạt đến hạnh phúc lớn và sâu. Có câu chuyện những người đi lên núi châu báu, chân đạp lên trên châu báu, nhưng đến khi ra về thì không mang được một hạt ngọc nào về. Chúng ta có thể cũng giống những người ấy vậy. Chúng ta đã có cơ hội gặp được Pháp bảo, gặp được Bụt, Pháp và Tăng, đã có rất nhiều điều kiện để hạnh phúc nhưng chúng ta không có khả năng sống cái hạnh phúc đó. Chúng ta tiếp tục làm nô lệ cho quá khứ, cho tương lai. Chúng ta nghĩ hạnh phúc chỉ có thể đạt tới khi nào xung quanh có sự thay đổi, sau khi mọi người thay đổi. Ta không ngờ rằng hạnh phúc ở ngay trong trái tim. Tu hành cũng như là đào giếng. Nếu chúng ta đào xuống và gặp được mạch nước thì tự nhiên nước ngọt trào ra. Mạch nước ngọt đó nằm ở ngay trong tâm chúng ta. Nguồn suối chánh niệm đó lưu nhuận ở trong tâm, do Bụt và tổ tiên truyền lại. Chúng ta chỉ cần đào sâu thêm một chút là dòng nước ngọt sẽ phun lên. Ta không cần phải đợi tới lúc chuyển hóa tất cả những buồn đau và lo sợ rồi mới có an lạc.

Thời đại của chúng ta là thời đại trong đó mọi người có nhiều lo lắng và sợ hãi. Chúng ta đã được đào tạo và huấn luyện để sống trong lo lắng. Chúng ta lo lắng nhiều quá, đến nỗi đã mất đi khả năng an trú trong hiện tại. Người nào cũng tên là Lê Thị Lo, người nào cũng tên là Nguyễn Văn Sợ. Chứng bệnh của thời đại là lo lắng và sợ hãi. Sở dĩ lo lắng và sợ hãi nhiều quá cũng chỉ vì chúng ta quen sống phiêu lãng trong tương lai nhiều quá. Chúng ta cảm thấy bất an, đi không yên, đứng cũng không yên và khi nằm ngủ lại sợ ngủ không được. Đi học sợ không học giỏi. Ngồi thiền cũng sợ ngồi thiền không thông suốt. Cái lo và cái sợ trấn ngự tâm ta.

Cho nên chúng ta cần phải học pháp môn Bụt dạy. Nếu anh trở về được với giây phút hiện tại và an trú được trong giây phút hiện tại thì anh không còn cần gì nữa mà phải lo. Sang ngày mai, anh đâu có thể làm gì được thêm để cho hôm nay có nhiều hạnh phúc hơn đâu? Trong khi đó thì trong giây phút này anh thở vào được, anh thở ra được, anh mỉm cười được. Anh có đủ tất cả những điều kiện để tạo ra hạnh phúc. Người ngăn cản không cho anh hạnh phúc chính là anh. Khi anh chùi nồi, hay cưa củi hoặc đốt lò, tại sao anh không có hạnh phúc? Tại vì anh cứ nghĩ rằng chùi nồi như vậy cốt để làm một cái gì đó, cưa củi như vậy cũng là để làm một cái gì đó. Anh không thấy rằng cưa củi trước hết là để cưa củi, được làm việc cưa củi thôi cũng đã là hạnh phúc rồi. Học kinh cũng như cưa củi. Khi ta biết làm trong chánh niệm thì cái nào cũng mang lại an lạc như nhau. Học chữ Nho, tiếng Pali, tiếng Phạn làm gì, trong khi một bước chân hoặc một hớp trà cũng có thể tạo thành những giây phút huyền thoại?

Trở về an lạc trong giây phút hiện tại, anh sẽ thấy giây phút đó nuôi dưỡng và chuyển hóa anh. Có được những giây phút như vậy là có an lạc và thanh tịnh. Bí quyết của sự tu tập là mỗi ngày sống được những giây phút như vậy. Đây là phương thuốc đối trị chứng bệnh thời đại của chúng ta, bệnh lo sợ. Những chứng ưu uất (stress), những bệnh tâm thần của ta đều phát xuất từ áp lực của lo sợ. Và sự lo sợ của những người khác lại thúc đẩy nỗi lo sợ của ta. Thấy người ta lo, mình cũng sinh lo, mình không thể thản nhiên được. Từ đó phát sinh ra một nỗi lo tập thể. Thế giới chúng ta đang bị thiêu đốt bởi ngọn lửa của lo sợ, của bất an.

Phương thuốc của Bụt hết sức mầu nhiệm: hãy buông bỏ hết tất cả những lo sợ ấy đi, dầu là lo lắng cho sinh môi, cho tương lai thế giới, cho nạn nhân mãn. Hãy trở về, tự nuôi dưỡng bằng sự sống trong giây phút hiện tại. Rồi anh sẽ thấy anh làm được gì để chuyển hóa tình trạng. Lo lắng suông đâu có ích lợi gì mà chỉ làm bặng hoại thêm tình trạng. Vô ưu và quán chiếu là phương thuốc trị liệu cho anh và thời đại của anh.
!! Bài 24 Niềm tin thể hiện trong đời sống

Hôm nay là ngày 17 tháng 2 năm 1994. Chúng ta ở tại xóm Thượng, trong khóa tu mùa Đông, chủ đề là Phật Pháp Căn Bản. Hôm nay chúng ta học về niềm tin nơi Tam Bảo, tức là nơi Bụt, Pháp và Tăng.

Chúng ta phải học đạo Bụt như thế nào để những điều chúng ta học có thể được biểu hiện thành sự sống. Những điều ta học phải được áp dụng vào đời sống hằng ngày thì đó mới là Phật Pháp đích thực. Trong quá trình tu học đó, ta phải luôn luôn soi lại sự học hành của mình trong tấm gương của Tăng thân. Đôi khi chúng ta chưa thật sự hiểu Pháp, hoặc hiểu sai, do đó ta áp dụng không được. Rồi ta không có đức tin nơi Pháp. Mất đức tin nơi Pháp thì ta sẽ không còn đức tin nơi Bụt, và nơi Tăng.

Có nhiều điều ta tưởng đã hiểu, kỳ thực chưa hiểu. Ví dụ ý niệm về Tích Môn và Bản Môn. Có một thiền sinh nói : ‘‘…Tôi chưa muốn đi vào Bản môn; tôi muốn ở lại trong Tích môn để giải quyết các vấn đề Tích Môn.’’ Nói như vậy là chưa hiểu được giáo lý Tích Môn và Bản Môn, nghĩ rằng đi vào Bản Môn tức là rời bỏ Tích Môn. Sự thật ta không bao giờ rời bỏ Tích Môn cả. Trang đầu của tập thơ Call me by my true name (Hãy gọi đúng tên tôi), tôi viết câu này: ‘‘Nếu ta sống sâu sắc với Tích Môn thì ta tiếp xúc được với Bản Môn. Khi tiếp xúc được với Bản Môn thì ta chưa bao giờ rời bỏ Tích Môn cả. If you live deeply the historical dimension, you touch the ultimate dimension. When you touch the ultimate dimention, you have not left the historical dimension.’’

Cũng như khi nói về năm cái lạy, có vị bảo: ‘‘Lạy thứ ba là lạy nhớ ơn đất nước. Lạy thứ tư là lạy những người mình thương. Lạy thứ năm là lạy những người mình ghét.’’ Ta đâu có lạy người ta thương và người ta ghét đâu? Và ta lạy cũng không phải là để nhớ ơn. Nhớ ơn là một phần nhỏ. Mục đích của lễ lạy ở đây là quán chiếu, là tiếp xúc được với gốc rễ của tổ tiên, đất nước, tiếp xúc được với những người mình thương, và tiếp xúc được với những người mình ghét, để thấy rằng trong ta cũng có những yếu tố và những người đó. Việc chính là quán chiếu và tiếp xúc. Gốc rễ có đó, ta lạy xuống là để tiếp xúc, để thấy được gốc rễ ấy, để đánh tan ảo tưởng bơ vơ, và lạc lõng. Lạy là để thấy người ta ghét, và người ta thương có liên hệ với ta tới mức ta không thể tự tách rời ra khỏi họ được. Đó là quán chiếu.

!! Niềm tin thể hiện trong đời sống

Chúng ta biết rằng đức tin cần thiết cho niềm vui, và cho sự tinh tấn tu tập của chúng ta. Đức tin mang lại cho chúng ta nhiều năng lượng. Người theo đạo Bụt là người có đức tin nơi Tam Bảo. Tam Bảo trước hết là đối tượng của tri giác, của Tưởng. Nếu tri giác sai lầm thì niềm tin của chúng ta sẽ không có cơ sở. Ví dụ tin Bụt là một vị thần linh sáng tạo ra vũ trụ, hay là một đấng có quyền ban phước, trừ họa. Đó là một vọng tưởng về Bụt. Đặt niềm tin trên một vọng tưởng, trên một tri giác sai lầm, đó không phải là chánh tín. Đến khi ta Lâm vào tình trạng khổ đau thì niềm tin đó không đủ để nâng đỡ, che chở và bảo vệ ta. Niềm tin phải căn cứ trên sự quán chiếu. Đức tin với công phu thực tập quán chiếu là một đức tin căn cứ trên kinh nghiệm. Sự sống của ta, thân thể, tâm trí ta, tất cả đều công nhận niềm tin đó là sự thật.

Hàng ngày chúng ta thường thực tập quay về nương tựa Tam Bảo. Phép thực tập quay về nương tựa chỉ thành công khi ta đạt tới một cái thấy, một kinh nghiệm sâu sắc về Tam Bảo. Trong truyền thống Việt Nam, chúng ta hay nói tự quy y. Tự quy y Phật có nghĩa là quay trở về nương tựa Bụt trong tự thân của mình. Chữ tự này rất đặc biệt. Tự nghĩa là chính ở đây. Quy y là trở về, và nương tựa. Phật là đối tượng của sự trở về, nương tựa. Và Phật có mặt nơi tự thân của mình. Vì vậy nếu đi tìm một đối tượng quy y ở ngoài ta là đã sai rồi. Phật không ở trong, cũng không ở ngoài, đâu cũng có Bụt cả. Đó là điểm hẹn để ta quay về, nơi chúng ta nương tựa, Bụt có mặt trong trái tim của chúng ta. Người Phật Tử nào cũng nói Phật tức tâm, Bụt là trái tim, là tâm linh ta.

Nếu Bụt không có thật, mà chỉ là một hình tượng do trí óc con người vẽ ra thì sao? Niềm tin nơi Bụt có thể đổ vỡ dễ dàng. Người ta có thể tin Bụt như tin ông già Noel, Ngọc Hoàng, hay Táo Quân không? Tin như vậy nguy hiểm lắm. Nếu tin Bụt, rồi một ngày nào đó khám phá ra rằng Bụt chỉ là một sản phẩm của trí óc con người, thì niềm tin đó rất nguy hiểm. Khi Lâm vào cơn nguy biến, mà trong niềm tin lại có một dấu hỏi đặt ra thì chúng ta sẽ bơ vơ và đau khổ.

Vấn đề này được đặt ra cho tất cả các tôn giáo. Có người bàn rằng: ‘‘Câu hỏi có Trời Phật hay không là một vấn đề quan trọng thật. Nhưng chúng ta hãy cứ tin đi, có lỗ lã gì đâu? Nếu chúng ta tin Chúa mà Chúa có thật, thì chúng ta được về thiên đường. Nếu không có Chúa thì ta cũng đâu mất mát gì!’’ Đức tin mà được đặt trên sự tính toán so đo như vậy thì thật bi đát. Cứ tin đi, nếu đúng thì mình lời to, không thì cũng chả lỗ lã gì. Không tin, lỡ có ‘‘ông ấy’’ thật thì lỗ nặng. Trí óc ưa tính toán quá nên con người mới đánh cuộc, và bắt cá hai tay như thế.

Đạo lý Duyên Sinh giúp chúng ta đi vào đức tin một cách vững chãi từng bước một vì đạo lý ấy giúp ta tiếp xúc được với Bụt. Trong Ki Tô giáo, các nhà thần học nói tới bước nhảy thần học (The Theological Leap). Đức Tin phải mang một chút tính chất liều lĩnh. Ví dụ thường được đưa ra là một đứa bé đứng ở trên bờ hồ, bố nó đứng dưới hồ nói: ‘‘Con nhảy đi, con nhảy xuống đi. Có ba đỡ.’’ Đứa bé biết rằng nếu nó nhảy xuống thì thế nào cũng được đón nhận trong vòng tay của ba, nó sẽ được yên ổn. Thế là đứa bé nhảy và ba nó đón lấy con, như vòng tay của Thượng đế. Nếu anh không làm một động tác nhảy vào trong vòng tay của đức tin, thì anh không thể có đức tin. Đức tin được diễn tả như một ân sủng của Thượng Đế ban cho. Đức tin đạt được do một hành động quyết định giữa tin và không tin; vì vậy người ta dùng chữ bước nhảy (Leap).

Trong đạo Bụt, đức tin phát khởi từ những căn bản sự học hỏi về Tam Bảo trong tinh thần duyên sinh và tương tức. Quý vị tới với đạo Bụt là do cửa ngõ của Pháp, hay do cửa ngõ của Tăng. Quý vị tiếp xúc được với Bụt là do quý vị tiếp xúc được với Pháp và với Tăng. Tiếp xúc thực sự được thì niềm tin Bụt của quý vị vững chãi như Thái Sơn.

Pháp là một thân của Bụt (the dharma is a body of the Buddha) và Pháp có mặt ở đây và bây giờ, chứ không phải chỉ 2. 600 năm trước. Có cơ hội tiếp xúc trực tiếp với Pháp ta sẽ thấy được tính cách mầu nhiệm của Pháp. Có cơ hội kiểm chứng, thí nghiệm về Pháp ta sẽ thấy được khả năng chuyển hóa của Pháp. Đức tin nơi Pháp sẽ là đức tin về Bụt. Pháp thân tức là một trong ba thân của Bụt, và may mắn thay ta có thể tiếp xúc thật sự với thân ấy. Pháp thân trước hết có nghĩa là thân giáo lý. Trước khi thị tịch, Bụt dạy rằng: ‘‘Cái thân của tôi đây chẳng qua chỉ là nhục thân. Nhục thân của tôi có thể không còn biểu hiện đối với quý vị, nhưng pháp thân của tôi sẽ ở lại với quý vị mãi mãi.’’ Chữ Pháp thân đã được dùng ngay từ thời đó. Pháp thân của Bụt vẫn còn nguyên, có thể được tiếp xúc qua việc hành trì kinh điển và qua những người đang hành trì kinh điển, tức là tăng thân. Cho nên Pháp và Tăng là hai cửa ngõ để chúng ta có thể tiếp xúc với Bụt. Do đó, đối tượng đức tin của chúng ta rất cụ thể, được làm bằng trí tuệ, kinh nghiệm, và cuộc đời của chúng ta. Và Bụt không còn là đối tượng của riêng tri giác, Bụt trở thành đối tượng của tất cả cuộc sống, của sắc, thọ, tưởng, hành và thức. Bụt không còn là một ý niệm nữa. Nhờ tu tập, nhờ sự chuyển hóa mà khái niệm ngây thơ, sai lạc về Bụt lúc ban đầu đã tan biến. Càng ngày chúng ta càng tới gần bản chất của Bụt.

Bụt có Pháp thân nhưng cũng có Tăng thân. Danh từ Tăng thân này trong quá khứ không thông dụng, bây giờ chúng ta sẽ sử dụng nhiều hơn. Thời Bụt còn tại thế, vua Prasenajit nước Kosala là một người bạn thân, và một vị đệ tử của Bụt. Nhà vua từng nói: ‘‘Bạch đức Thế Tôn, nhìn vào Tăng đoàn, con có đức tin nơi Ngài.’’ Câu đó có nghĩa Tăng đoàn là Tăng thân, một trong những thân của Bụt. Nhìn vào Tăng đoàn, nhà vua thấy những vị khất sĩ trầm tĩnh, an lạc, giải thoát. Họ đi, đứng, nằm, ngồi trong chánh niệm và nhà vua tiếp xúc được với chánh pháp và với Bụt. Chúng ta có thể tiếp xúc với Pháp thân và Tăng thân ngay ở đây và bây giờ. Ngay trong chính con người của chúng ta cũng có Tăng. Như câu kệ ta vẫn đọc: năm uẩn là Tăng, phối hợp tinh cần.

Như vậy, đức tin của chúng ta được căn cứ trên những tiếp xúc cụ thể chứ không phải chỉ trên những ý niệm. Chúng ta phải sử dụng trái tim và trí tuệ thì mới tiếp xúc được với Pháp thân và Tăng thân của Bụt. Có chân pháp thân và có khi không phải đích thực là chân pháp thân. Đôi khi người ta dạy một thứ giáo lý ngược với tam pháp ấn vô thường, vô ngã và niết bàn, pháp đó không phải là chân pháp, mà là tà pháp. Tăng thân cũng vậy. Khi một tăng đoàn tu học, có chánh niệm, có hộ trì sáu căn, có an lạc, giải thoát thì đó là chân Tăng. Ngược lại, một đoàn thể không chánh niệm, không giải thoát và an lạc thì không thể gọi là chân tăng. Phật thân cũng có chân và ngụy. Trong kinh Kim Cương, Bụt nói về Phật thân: ‘‘Nếu tìm ta qua hình sắc, nếu tìm ta qua âm thanh, thì người đó đang hành tà đạo và không bao giờ thấy được Như Lai.’’ Không thấy Như Lai vì chỉ thấy một ngụy thân của Phật, không phải chân thân của Phật.

Tiếp xúc được với chân pháp thân chúng ta tiếp xúc được với Phật thân. Tiếp xúc được với chân tăng thân ta sẽ thấy Pháp thân và Phật thân. Bản chất của Bụt là pháp và Tăng. Nhìn vào một thân chúng ta thấy hai thân khác. Đó là giáo lý tương tức giữa tam bảo, gọi là tam vị nhất thể, tức là ba ngôi cùng một thể tính. Thấy được như vậy rồi thì ta sẽ không còn than vãn tại sao mình sanh ra đời quá muộn, khi Bụt đã nhập diệt 2600 năm về trước rồi. Quý vị sẽ vượt được 2600 năm một cách dễ dàng, có thể tiếp xúc với Bụt bất cứ lúc nào. Pháp và Tăng có đó, cố gắng hành trì thì chân Pháp và chân Tăng càng ngày càng hiển lộ. Cũng như khi ánh sáng mặt trời đã chọc thủng được bức màn sương, mặt trời tiếp tục chiếu rọi thì màn sương sẽ tan. Chúng ta phải chọc thủng tấm màn sương của tà pháp và tà Tăng để cho chân pháp và chân Tăng hiển lộ, và để cho chân Phật hiển lộ. Triratna là ba viên ngọc quý. Chúng ta biết Bụt được kết tinh bằng chân pháp và chân Tăng. Không thể tưởng tượng được có Bụt mà không có pháp, có Bụt mà không có Tăng. Cho nên tất cả các kinh điển luôn luôn nói rằng Bụt bao giờ cũng được bao quanh bởi quyến thuộc của Ngài. Quyến thuộc của Ngài tức là đệ tử, từ các vị đại bồ tát cho đến các vị thanh văn, duyên giác, thánh hiền, các cư sĩ nam Phật tử, và nữ Phật tử. Nhìn vào chân Tăng ấy, người ta tiếp xúc được chân Pháp và chân Phật.

!! Tăng thân và pháp thân

Bây giờ chúng ta hãy tìm hiểu thêm về chân pháp và chân Tăng. Chúng ta biết pháp tức là con đường hành trì, con đường diệt khổ, con đường chuyển hóa. Pháp là con đường của bốn sự thật, của tám sự hành trì chân chánh, của thất giác chi, của Ngũ Lực. Nhưng pháp không phải chỉ là con đường. Pháp là sự thực tập, sự thể hiện con đường đó. Chúng ta có thể nói kinh điển là pháp, giới luật là pháp. Các bộ kinh, luật, luận là pháp, dưới hình thức của những bộ sách (và bây giờ chúng ta có thêm băng cassettes, băng video). Chúng ta có thể lạy xuống trước các biểu tượng đó. Tất cả các thức đó là pháp nhưng chưa phải là pháp. Pháp đích thực là những giáo lý thể hiện qua sự sống, sự hành trì. Nói đâu có sự áp dụng Tứ Diệu Đế và sự hành trì Bát Chánh Đạo trong đời sống là có chân pháp (the living dharma). Chúng ta học hỏi kinh sách, nghe pháp thoại, rồi đi lên bước nữa để thấy những Kinh, Luật, Luận, hay những pháp thoại đó được áp dụng vào trong đời sống hàng ngày. Khi bước sang bước thứ hai này thì chúng ta có chân pháp, có ánh mắt, có nụ cười chánh niệm, có an lạc, có từ, bi, hỷ và xả. Nếu không có tăng thân thì không có sự thể hiện được những điều nói trên, vì vậy bước thứ ba là tăng thân. Bụt ở trong Pháp và Tăng cũng ở trong Pháp. Có chánh niệm thực sự trong Pháp thì đó là chân Pháp. Cho nên Bụt là chánh niệm, chánh niệm là Bụt.

Tăng đoàn từ bốn người trở lên gọi là sangha, nhưng Tăng đoàn đôi khi chỉ mới là hình thức: có đắp y, có ngồi thiền, có đi thiền hành, có ăn cơm im lặng, có tụng giới. Đôi khi hình thức nặng, và nội dung còn nghèo nàn. Nếu ta tiếp xúc với Tăng đoàn mà thấy Pháp và Bụt rất ít, đó là vì tăng thân còn nhẹ về nội dung. Khi Tăng đoàn thực sự hộ trì sáu căn, thực tập chánh niệm, trở thành chân Tăng thì Tăng đoàn sẽ biểu dương được Bụt và Pháp. Tiếp xúc với tăng thân này chúng ta tiếp xúc được với Phật thân và Pháp thân.

Bụt cũng có thể là một pho tượng, một bức họa. Bụt có thể là một người, người đó có yếu tố giác ngộ, có chánh niệm, có từ bi hỷ xả. Chân Phật luôn luôn có Pháp và có Tăng làm bản chất; Chân Pháp luôn luôn có Bụt và có Tăng làm bản chất; Chân Tăng luôn luôn có Bụt và có Pháp làm bản chất. Chúng ta tu tập thế nào để cho ba viên ngọc quý đó càng ngày càng sáng tỏ trong tự tâm của chính chúng ta. Trong bài Quy Nguyện, chúng ta tiếp xúc với Bụt:

<<<
Bụt là thầy chỉ đạo <br>
Bậc tỉnh thức vẹn toàn <br>
Tướng tốt đoan trang <br>
Trí và bi viên mãn
<<<

Tụng những câu đó mà tiếp xúc được với Bụt thực sự thì quý vị tiếp xúc được với Pháp và với Tăng.

<<<
Pháp là con đường sáng <br>
Dẫn người thoát cõi mê <br>
Đưa con trở về <br>
Sống cuộc đời tỉnh thức
<<<

Khi đọc bốn câu đó ta phải tiếp xúc được với chân Pháp chứ đừng nên tụng niệm như là ca hát, chỉ có âm thanh có mặt mà thôi.

<<<
Tăng là đoàn thể đẹp <br>
Cùng đi trên đường vui <br>
Tu tập giải thoát <br>
Làm an lạc cuộc đời
<<<

Tiếp xúc được với Tăng tức là tiếp xúc được với Bụt, với Pháp và chúng ta có chân Tăng.

Tụng niệm là một pháp môn tu tập rất quan trọng. Tụng niệm cũng quan trọng như ngồi thiền. Nếu tụng niệm đúng phép, thì trong khi tụng niệm chúng ta có thể quán chiếu, tiếp xúc với Bụt, với Pháp và với Tăng. Tụng niệm ở đây không có nghĩa là cầu khẩn, năn nỉ. Tụng niệm là thực tập quán chiếu và tiếp xúc.

Đức tin khiến chúng ta đi tìm Bụt. Phật thân có ba thân: Bụt, Pháp và Tăng. Ta đã hiểu Tăng thân cũng là Phật thân. Cho nên ta trở về nương tựa Tăng thân và xây dựng Tăng thân. Săn sóc Tăng thân tức là săn sóc Bụt. Mỗi chúng ta là một phần của Tăng thân. Khi sư chú bước đi từng bước thảnh thơi. Khi sư chú ăn uống có điều độ chừng mực là sư chú đang chăm sóc thân của Tăng và của Bụt. Khi sư chú đang săn sóc một sư anh hay một sư em, giúp cho người đó nở được nụ cười, cho người đó an lạc, là sư chú đang săn sóc Phật thân. Khi sư cô chăm sóc, hóa giải được cho sư chị và sư em, đem lại hạnh phúc thêm cho Tăng đoàn, tức là sư cô đang chăm sóc thân của Bụt. Thành ra không phải chỉ vào thiền đường, dâng hương, lau bụi trên bàn thờ là chăm sóc Bụt. Cầm tay một người sư em, an ủi người sư chị của mình tức là đang chăm sóc Bụt. Đây là giáo lý tương tức của tam thân.

Chính Bụt nói rằng: “Khi các thầy săn sóc cho nhau tức là các thầy săn sóc Như Lai.” Câu chuyện xảy ra ở tại Kosali. Một bữa Bụt đi với thầy A Nan tới một tu viện. Các thầy đi khất thực hết, chỉ có một thầy bị bệnh kiết lị nằm ở nhà. Thầy đó nằm mệt lả, phân chảy đầy cả áo quần và giường chiếu. Bụt với thầy A Nan vào tu viện thấy như vậy, Ngài hỏi: “Các thầy khác đi đâu? Không có ai săn sóc thầy sao?” Thầy nói: “Bạch đức Thế Tôn, các sư anh đi khất thực hết rồi. Lúc đầu anh em săn sóc con, nhưng sau con thấy chứng bệnh kéo dài, tăng thân săn sóc cực nhọc mãi thì tội, cho nên con nói để con tự làm lấy cũng được.” Bụt mới ở lại đó với thầy A Nan. Trong khi chờ các thầy khác đi khất thực về, Bụt và thầy A Nan đi dọn dẹp căn phòng, giặt áo quần của thầy, lấy y mới cho thầy mặc. Khi các thầy đi khất thực trở về, Bụt nói: “Này các thầy, chúng ta đã xuất gia, nếu chúng ta không săn sóc cho nhau thì ai săn sóc chúng ta? Vì vậy các thầy nên nhớ: săn sóc cho nhau tức là săn sóc cho Như Lai.” Khi mà các sư chú săn sóc cho nhau về thể chất, và về tinh thần là các sư chú đang săn sóc cho Như Lai. Khi mà các sư cô hòa hợp với nhau, sống với nhau có nhường nhịn, thương yêu, khoan thứ là các sư cô săn sóc Bụt. Cả khi tăng thân của chúng ta còn là phàm Tăng cũng vậy. Phàm Tăng mà tu tập thì trở thành thánh Tăng.

Pháp thân cũng có ba thân. Trong Pháp thân có Bụt, có Pháp và có Tăng. Khi chúng ta săn sóc Bụt tức là chúng ta săn sóc Pháp thân của Bụt. Chúng ta biết tâm chúng ta là Bụt. Mỗi khi tâm có chánh niệm thì chúng ta làm cho hào quang của Bụt chiếu sáng. Trở về nương tựa Bụt tức là bảo vệ Pháp thân. Đi, đứng, nằm, ngồi trong chánh niệm, hộ trì sáu căn là chúng ta tiếp xúc với Pháp, đó là nuôi dưỡng Pháp thân. Săn sóc và tạo hạnh phúc cho Tăng đoàn là yểm trợ Pháp, tiếp xúc được với Pháp. Điều này được thể hiện trong mỗi giây phút của sự sống.

Tăng thân cũng có ba, có thân Bụt của tăng thân, thân Pháp của tăng thân và thân Tăng của tăng thân. Chúng ta phải thấy thân Bụt ở trong tăng thân, thân Pháp ở trong tăng thân, như vậy mới thấy được thân Tăng ở trong tăng thân. Nguyện một lòng trở về nương tựa tăng thân là vậy. Có người dại dột nói rằng: “Trong tam bảo tôi chỉ quy y Phật bảo và Pháp bảo, còn Tăng vì chưa đáng kính đáng phục nên tôi chưa quy y.” Nói như vậy là chưa hiểu được giáo lý tam vị nhất thể. Và có người lại nói rằng là: “Tôi quy y Tăng nhưng chỉ quy y thánh Tăng thôi. Chỉ có Hội Linh Sơn với Hội Pháp Hoa mới xứng đáng là đối tượng của niềm tin của tôi. Hiện giờ không có thánh Tăng nên tôi không quy y được.” Nói vậy cũng là chưa hiểu. Dẫu tăng thân của chúng ta còn là phàm Tăng, nhưng đó là tất cả tăng thân chúng ta đang có. Tăng thân ở Việt Nam, tăng thân ở Hoa Kỳ, tăng thân ở Thụy Điển, tăng thân ở Đan Mạch, tăng thân ở Nhật Bổn, ở Triều Tiên, chúng ta chỉ có tăng thân ấy. Chúng ta chỉ cần đọc lịch sử thời Bụt tại thế để hiểu tại sao các giới luật đã được thiết lập, thì chúng ta biết rằng chính tăng thân chung quanh Bụt thời đó cũng có đầy chất phàm. Trong tăng thân ta có chất phàm, nhưng cũng đã có chất thánh.

!! Tam bảo là đối tượng tu học

Những viên ngọc ở trong tăng thân là những người đang đi trên con đường, mỗi chặng đường được đánh dấu bằng một quả vị. Những người đang đi vào dòng gọi là hướng nhập lưu. Người đã vào dòng rồi gọi là nhập lưu (tu đà hoàn). Quý vị chưa chứng quả nhập lưu, nhưng nếu đang đi trên đường thì quý vị đã có chất thánh của quả nhập lưu. Đó là hai quả vị thấp nhất trong Tăng đoàn. Tiến lên nữa là quả vị nhất lai. Nhất lai là chỉ cần trở về trong chốn bụi hồng này một lần nữa thôi. Trên đường tới nhất lai là bậc thứ ba của thánh quả. Chứng được quả nhất lai rồi thì ta thuộc về bậc thứ tư của thánh quả. Tiếp đến quả bất lai. Bất lai là không trở lại chốn đầy những khổ đau và hệ lụy nữa. Đang trên con đường bất lai là ta đã có quả vị thứ năm, và đạt được quả vị bất lai rồi đó là thứ sáu. Thứ tư là A la hán, hoặc Ưng cúng (đáng được cúng dường). Bậc A la hán chặt đứt được sinh tử, đi đâu cũng không còn sợ hãi nữa. Trên đường đi tới A la hán là bậc thứ bảy của thánh quả. Đạt tới cái quả vị A la hán rồi là bậc thứ tám của thánh quả. Trong một tăng thân có những viên ngọc quí như vậy. Cố nhiên lẫn lộn với những viên ngọc đó có những uế tạp mà bất cứ một Tăng đoàn nào cũng có. Có những người phạm giới nặng, có những người phạm giới nhẹ và cũng có những người chứng thánh quả. Vì trong tăng thân có từ bi, có trí tuệ và có từ bi hỷ xả nên những yếu tố phàm tục của tăng thân được chăm sóc, được nuôi dưỡng, được chuyển hóa. Một Tăng đoàn với những người có chánh niệm, có giải thoát, những người có nhiều chất nhập lưu, nhất lai, bất lai và có người ứng cúng, thì đó đích thực là Tăng bảo. Khi tiếp xúc với tăng thân ấy, ta tiếp xúc được với Bụt, với Pháp và với Tăng.

Chúng ta không cần đi đâu xa, chỉ cần nhìn vào tăng thân tại Làng Mai. Chúng ta thấy có những người quyết tâm tu học, đóng lại hết tất cả những cửa ngõ phía sau lưng của cõi đời tục lụy, phiền não. Những người đó có thể chưa bước lên được chiếc xe đưa về thánh quả, nhưng đang hướng về nẻo ấy thì họ đã có chất thánh, gọi là nhập lưu hướng. Khi đã vững chãi rồi gọi là nhập lưu quả. Nhập lưu hướng, nhập lưu quả; nhất lai hướng, nhất lai quả; bất lai hướng, bất lai quả; a la hán hướng, a la hán quả; đó là tám bậc thánh ở trong tăng thân. Vì vậy khi thấy còn có chất phàm ở trong tăng thân mà đã chán nản và bỏ đi, tức là ta bỏ luôn chất thánh trong tăng thân. Công trình tu học của chúng ta phải là công trình xây dựng tăng thân. Không xây dựng tăng thân thì chúng ta thiếu sót rất nhiều trong sự tu học. Xây dựng được một tăng thân có hạnh phúc, an lạc, tạo ra được chất thánh ở trong tăng thân thì công đức rất lớn. Đây không phải là công trình riêng của vị chúng trưởng mà là công trình của tất cả mọi người trong Tăng đoàn. Người nào cũng có bổn phận phải nuôi dưỡng tăng thân. Và nuôi Tăng và nuôi pháp là nuôi Bụt, công đức vô lượng. Ban đầu chúng ta đã nói có tam thân. Nhưng vì mỗi thân gồm có ba thân, cho nên tất cả có chín thân. Giáo lý về chín thân là giáo lý của thầy Nhất Hạnh. Khai triển nữa thì giáo lý của thầy là giáo lý của hai mươi bảy thân. Nhưng thuyết hai mươi bảy thân có thể trở nên phiền toái, cho nên ta nói thuyết chín thân cũng đủ. Sau đây là bài tán Tam bảo:

!!! Xưng Tán Bụt

<<<
Phật bảo sáng vô cùng <br>
Đã từng vô lượng kiếp thành công <br>
Đoan nghiêm thiền tọa giữa non sông <br>
Sáng rực đỉnh Linh Phong <br>
Trên trán phóng hào quang rực rỡ <br>
Chiếu soi sáu nẻo hôn mông <br>
Long Hoa hội lớn nguyện tương phùng <br>
Tiếp nối Pháp chánh tông <br>
Xin quy y thường trú Phật đà gia !
<<<

!!! Xưng Tán Pháp

<<<
Pháp bảo đẹp vô cùng <br>
Lời vàng do chánh Bụt tuyên dương <br>
Chư thiên trỗi nhạc tán hoa hương <br>
Pháp mầu nhiệm tỏ tường <br>
Ghi chép rõ ràng thành ba Tạng <br>
Lưu truyền hậu thế mười phương <br>
Chúng con nay thấy được con đường <br>
Nguyện hết sức tuyên dương <br>
Xin quy y thường trú Đạt ma gia !
<<<

!!! Xưng Tán Tăng

<<<
Tăng bảo quý vô cùng <br>
Phước điền hạt tốt đã đơm bông <br>
Ba y một bát bước thong dong <br>
Giới định tuệ dung thông <br>
An trú đêm ngày trong chánh niệm <br>
Thiền cơ chứng đạt nên công <br>
Chúng con tất cả nguyện một lòng <br>
Về nương tựa tăng thân <br>
Xin quy y thường trú Tăng già gia
<<<

Tam bảo là đối tượng của sự thực tập trong đời sống hàng ngày, không phải chỉ là đối tượng của đức tin. Chúng ta hãy thực tập như thế nào để mỗi phút mỗi giây Bụt, Pháp và Tăng sáng thêm trong ta và xung quanh ta. Không nên nhìn Bụt, Pháp, Tăng là ba thực tại riêng biệt. Không chuyển hóa tăng thân, không săn sóc tăng thân là chúng ta không săn sóc Phật thân. Vì vậy Tăng sự tức là Phật sự. Thường thường chúng ta nói làm Phật sự, nhưng kỳ thực làm Tăng sự chính là làm Phật sự. Tổ chức đời sống như thế nào để có hạnh phúc và giải thoát, để chánh niệm có mặt trong từng giây từng phút là làm Tăng sự. Nấu ăn cũng là Tăng sự, giặt áo cũng là Tăng sự, quét nhà cũng là Tăng sự, săn sóc cho các bạn tu cũng là Tăng sự, mà Tăng sự tức là Pháp sự, Pháp sự tức là Phật sự. Những hành động thương yêu chăm sóc của chúng ta phải có chất liệu của Bụt và của Pháp thì mới thực sự là Tăng sự. Ví dụ chúng ta săn sóc một người bạn tu. Nếu chúng ta không có chánh niệm thì từ sự săn sóc đó sẽ nẩy sinh tình cảm vướng mắc. Người kia có thể bị lệ thuộc vào ta, không có ta thì một mình đứng không vững. Sự săn sóc đó có Ìrất it tính chất Tăng sự vì đã gây nên những vướng mắc. Tăng sự phải nằm trong tinh thần chánh pháp. Tăng thân có hạnh phúc, thành quả tu học được tăng tiến thì chất thánh của tăng thân càng ngày càng lớn. Chất thánh của tăng thân ngày càng lớn thì sự có mặt của chân Phật và chân Pháp ngày càng rõ. Đó là giáo lý và sự hành trì tam bảo. Những lúc nguy biến không biết là sống hay chết thì tam bảo phải là nơi nương tựa vững chãi cho chúng ta. Sống hay chết không quan trọng nữa, khi nền tảng sự sống của ta đã là tam bảo.

!! Tu tập trong tích môn thấy được bản môn

Chúng ta biết rằng hàng ngày thực tập, nếu tiếp xúc được với tính vô thường và vô ngã của thực tại là chúng ta đang tiếp xúc với tính niết bàn. Tiếp xúc sâu sắc với tích môn cũng là tiếp xúc với bản môn. Khi ta lễ lạy để tiếp xúc với tổ tiên huyết thống và tâm linh thì ta cũng tiếp xúc được với bản môn. Tiếp xúc với bản môn làm vơi đi nỗi đau khổ của tích môn.

Ban đầu mới lạy xuống, ta có hình ảnh của sự sinh ra và của cái chết đi của mình. Trong Kinh có những câu hỏi: Trước đó có ta hay không? Sau đó sẽ còn ta hay không? Bây giờ ta có hay không? Thường thường chúng ta nghĩ bây giờ thì có ta ở đây, nhưng không biết là trước đó ta đã có hay chưa, và sau đó còn có ta hay không. Đó là một nhận thức sai lầm lớn, nhờ quán chiếu ta mới thấy được. Lạy xuống, ta thấy ta sinh ở thời điểm này và ta sẽ diệt ở thời điểm kia. Quán chiếu sâu thêm, ta sẽ thấy nhận thức ấy tan biến. Cũng như một đợt sóng trồi lên trên mặt biển, nghĩ rằng nó phát sinh ở một nơi, và tới nơi kia nó sẽ tan vào biển cả. Trước đó nó không có, và sau đó nó sẽ không còn nữa. Nếu đợt sóng tiếp xúc được với nước thì thấy rằng lúc nào nó cũng là nước. Không có chỗ bắt đầu, cũng không có chỗ chấm dứt. Chúng ta thấy là mình đã hiện hữu ở trong cha mẹ. Rồi ta cũng là tổ tiên và những thế hệ tương lai. Đối với người xuất gia, các vị tổ sư tuy không phải là cha mẹ nhưng thực sự đã sinh ra dòng mạch tâm linh của mình, ta là con cháu trong một gia đình tâm linh, gia đình này sẽ tiếp tục trong các thế hệ sau.

Sinh mạng của ta không có bắt đầu, cũng không có sự chấm dứt, nó là sự tiếp nối của một dòng lưu chuyển liên tục. Cho nên trong bài hát mừng sinh nhật, happy birthday, nên hát là mừng sự tiếp nối, happy continuation. Thời điểm nào cũng là happy continuation cả. Chúng ta đang sống đời sống hiện tại của chúng ta, nhưng cũng đang sống quãng đời của chúng ta từ các thế hệ trước, và đồng thời đang sống cuộc đời sau nữa. Như vậy thì nỗi sợ sống chết sẽ tan biến. Sống chết là sự tiếp tục. Trong năm cái lạy đó chúng ta đã có thể tiếp xúc được với bản môn.

Hai vợ chồng ông kia giận nhau. Bà đã nói câu gì đó làm ông nổi giận. Ông đau khổ lắm, muốn nói lại một câu làm cho bà đau đớn, để mình nhẹ bớt khổ đi. Tôi đề nghị ông nhắm mắt lại, và nghĩ tới trong 60 năm nữa thì ông sẽ như thế nào và bà sẽ như thế nào. Chỉ cần nửa phút quán chiếu thôi, ông ta đã thấy được rằng trong 60 năm mình với người kia sẽ trở thành tịch mịch. Lúc đó ông sẽ tiếp xúc được với bản môn, không còn trôi nổi ở trên tích môn nữa. Thở một hơi vào, ta quán chiếu mình 100 năm về sau hay là 300 năm về sau. Ta thấy ta và người đang làm cho ta nổi giận vào 300 năm sau. Khi thở ra ta sẽ thấy giận nhau là điên rồ, là uổng phí. Giây phút này mà không nói được với người thương những lời thương yêu dịu ngọt thì thật là ngu dại. Bao nhiêu giận hờn và si mê sẽ tan biến hết. Tiếp xúc với bản môn ta được chuyển hóa ngay tức khắc. Các sư cô, sư chú hãy thí nghiệm phương pháp này. Hãy đứng ở cõi tích môn, tiếp xúc với bản môn để thấy mình chuyển hóa. Và khi đã chuyển hóa rồi thì ta thấy tích môn và bản môn nào khác gì đâu. Bao nhiêu năm nữa thì các sư chú và sư cô sẽ mỗi người một ngả? Giây phút này là giây phút quý báu nhất.
! Bài 04 Niềm vui tương đối

Hôm nay là ngày mùng 2 tháng 12 năm 1993, chúng ta ở tại Xóm Thượng và chúng ta học tiếp về tứ diệu đế.

Trong tiếng Hán-Việt khổ nghĩa là đắng, là không ngọt. Như vậy hạnh phúc được so sánh như vị ngọt, khổ đau như vị đắng. Nhưng giữa ngọt và đắng còn có trạng thái trung tính, không đắng cũng không ngọt. Tam thọ là khổ thọ, lạc thọ và xả thọ; xả thọ là không khổ cũng không lạc. Đắng không những là không ngọt mà cũng có nghĩa là không được trạng thái trung tính nữa. Vậy thì khổ có nghĩa là không lạc mà cũng không xả. Trong tiếng PHạn chữ duhkha cũng có nghĩa là không dễ chịu, không bình thường. Tiếng Anh có thể dịch là ill-being. Ill-being có nghĩa là trạng thái bế tắc, không dễ chịu. Ngược lại là well-being, tức là trạng thái trong đó ta cảm giác thư thái, nhẹ nhàng, dễ chịu.

!! Niềm vui tương đối

Chúng ta phải sử dụng nguyên tắc nhị đế và duyên khởi để học hỏi về tứ diệu đế. Trong bước đầu tu học chúng ta đi vào qua ngưỡng cửa tục đế. Càng quán chiếu và tiếp xúc sâu xa với sự thật tương đối, sẽ tới lúc chúng ta tiếp xúc được với chân đế. Trong tục đế, khổ đối lập với vui. Như vậy, công nhận sự có mặt của khổ cũng là công nhận sự có mặt của vui. Theo thuyết duyên khởi thì cái khổ được làm bằng những thứ không phải là khổ, trong đó có vui. Chúng ta đừng vội vàng nói rằng việc tu học là vượt cả khổ cả vui. Muốn bước ngay vào sự thật chân đế mà không đi ngang qua con đường tu tập trong tục đế là một sai lầm nguy hiểm. Thí dụ ta đọc bài thơ sau đây:

<<<
Thiên hạ đua nhau nói khổ, vui <br>
Có chi là khổ, có chi vui? <br>
Vui trong tham dục, vui là khổ <br>
Khổ để tu hành, khổ ấy vui… <br>
Nếu biết có vui là có khổ <br>
Thà rằng đừng khổ cũng đừng vui.
<<<

Bài thơ muốn đứng trên bình diện chân đế mà nói, nhưng không có lợi ích gì, vì đó chỉ là lời nói suông thôi. Tuyên bố ‘‘Thà rằng đừng khổ cũng đừng vuiì rất dễ, nhưng đi tới trình độ đó bằng cách nào? Và tuyên bố xong, trong bụng ta có thể vẫn còn thích vui và sợ khổ như thường, không làm sao dứt được. Chưa đi ngang qua tục đế mà đã muốn nhảy tới chân đế là sai lầm.

Hãy khoan nói vượt thoát cả vui lẫn khổ, chúng ta hãy nói chuyện trong thế giới có khổ và có vui. Trong thế giới tương đối đó chúng ta biết đời sống có nhiều nỗi khổ. Chúng ta muốn chuyển hóa những nỗi khổ này để đạt tới những niềm vui, dầu chỉ là những niềm vui tương đối. Nếu chưa đạt được niềm vui tương đối thì làm sao ta có thể đạt tới niềm vui tuyệt đối, vượt cả khổ lẫn vui?

Ví dụ hôm nay chúng ta cảm thấy một nỗi khổ mà hôm qua không có. Chúng ta công nhận ngày hôm qua ta không khổ mà hôm nay ta khổ rồi ta so sánh trạng thái không khổ hôm qua với trạng thái khổ hôm nay. Rồi ta tâm nguyện muốn trở lại sống trạng thái không khổ, bằng cách học hỏi những phương pháp thực tập. Đó là bước đầu học hỏi và tu tập.

Chúng ta không nên nói lý thuyết rằng khổ không có thật, khổ chỉ là giả tướng mà thôi. Nói như vậy chỉ là tự an ủi và trốn tránh. Vui cũng giả, khổ cũng giả, nói vậy rồi thôi, ta không chịu làm gì hết ! Sự thật là chúng ta phải làm một cái gì, phải thực tập để chuyển hóa cái khổ cho thành không khổ. Trong khi thực tập ta mới tiếp xúc, quán chiếu và dần dần thấy được tự tánh của khổ cũng như tự tánh của không khổ. Nhờ đó ta sẽ đạt tới sự thật chân đế, vượt trên khổ và vui.

Cũng như khi ta có bệnh nhức đầu. Ta công nhận bệnh nhức đầu này là khổ, ta nhất định chữa trị, để đạt tới cái trạng thái không nhức đầu, không khổ. Chứ ta không thể nói rằng nhức đầu là giả tướng, không có thật, thôi đừng lo nghĩ về chuyện nhức đầu nữa. Không lo chuyện nhức đầu thì đầu vẫn nhức như thường. Tu tập là phải làm cái gì để chuyển hóa bệnh nhức đầu, để trở về tình trạng không nhức đầu. Dầu cái khổ là tương đối và cái vui cũng là tương đối, nhưng trước hết ta phải công nhận có khổ, có vui để tìm đường chuyển hóa. Phương pháp của chúng ta là bắt đầu nhìn vào hiện tượng khổ như một khổ thọ.

!! Khổ thọ

Vào khoảng 100 năm sau khi Bụt nhập diệt, có phái Ẩm Quang Bộ, hay Ca Diếp Di Bộ (Kasyapiya), có khi gọi là Ca Diếp Nhi Bộ. Phái này chủ trương rõ ràng rằng khổ trước hết là khổ thọ. Pain, first of all is painful feeling. Điều này rất dễ hiểu. Chúng ta biết thọ là một trong năm uẩn. Ta hãy vẽ lên bảng một trái quít và chia trái quít ra làm năm múi. Múi thứ nhất là sắc, tức là cái thân thể chúng ta. Múi thứ hai là thọ, tức là những những cảm giác của chúng ta. Múi thứ ba là tưởng, tức là các tri giác của chúng ta. Múi thứ tư là hành và thứ năm là thức. Chúng ta biết trong các cảm thọ có khổ thọ, chúng ta phải tìm trong năm uẩn xem những căn do nào tạo ra khổ thọ, và có thể thấy ngay các căn do đó trong sắc và tưởng.

Trước hết chúng ta thấy nếu cơ thể mất quân bình thì chúng ta có khổ thọ. Máu trong đầu chảy không đều làm chúng ta nhức đầu, răng bị hư thì nhức răng. Những khổ thọ bắt nguồn từ sắc uẩn, ta thấy rất dễ. Tình trạng mất thăng bằng trong cơ thể, tự nó là khổ hay không, chúng ta chưa biết, nhưng đó là nguyên do tạo ra khổ, ít nhất là khổ thọ. Nhưng nhiều khi chúng ta thấy khổ thọ không phát xuất từ thân thể mà từ tâm. Mà tâm gồm đủ thọ, tưởng, hành, thức, trong đó Tưởng là phần rất quan trọng khi ta đi tìm căn do của khổ.

Chữ Tưởng trong năm uẩn là nhận thức, là tri giác của ta. Tri giác gồm chủ thể tri giác và đối tượng tri giác. Tri giác sai lầm gọi là vọng tưởng. Viễn ly điên đảo mộng tưởng, là xa lìa những tri giác sai lầm. Điên đảo nghĩa là trên dưới lộn ngược, up side down, trắng thấy là đen, người ta thương mà tưởng người ta ghét. Những tri giác sai lầm là nguyên do của khổ thọ. Nhìn sợi dây thành con rắn nên sợ, sợ cho nên khổ. Không phải sợi dây làm ta khổ, mà chính con rắn không có thật làm ta khổ, nghĩa là tri giác cũng có thể làm ta khổ.

Ngoài sắc thân và tri giác còn có thiên nhiên, có xã hội. Ngoại giới cũng tác động với năm uẩn tạo nên khổ thọ. Khi nói con người được tạo tác bằng năm uẩn thì ta dễ hiểu lầm rằng đó là năm uẩn của mỗi người, tách biệt với thế giới, với xã hội bên ngoài. Hiểu như vậy là sai giáo lý đạo Bụt. Năm uẩn không có nghĩa là một hợp thể của riêng một người. Vì tưởng có nghĩa là tưởng về một cái gì. Tri giác là tri giác về một đối tượng. Khi nhìn thấy trời xanh thì trời xanh là đối tượng của tri giác. Khi nhìn người bạn, người bạn là đối tượng tri giác. Vì vậy trời xanh, mây trắng, núi cao, sông dài, con người, con thú, tất cả đều là đối tượng của Tưởng, đều ở trong Tưởng hết. Khi thực tập bài năm uẩn là Tăng, phối hợp tinh cần, ta đừng tưởng năm uẩn là cái gì nằm ở trong con người của mình mà thôi. Mỗi uẩn đều gồm có chủ thể và đối tượng. Thân thể của chúng ta chẳng hạn có liên hệ trực tiếp với thế giới, với khí hậu, với mặt trời, mặt trăng. Vì vậy, sắc uẩn của ta khi đưa tới một khổ thọ là đã phối hợp với các điều kiện vật lý ở bên ngoài. Tưởng cũng vậy. Tưởng là tri giác mà tri giác là tri giác về trời đất, thiên nhiên, xã hội, con người… Đối tượng của tri giác là tất cả vũ trụ. Năm uẩn của chúng ta đều có đối tượng bao gồm cả vũ trụ. Không thể nói năm uẩn của ta tách biệt ra khỏi vũ trụ.

Nhắc lại quan điểm của phái Ca Diếp Di Bộ cho rằng khổ trước hết là một khổ thọ. Khổ là đối tượng của Thọ, nhưng khổ cũng là đối tượng của Tưởng và của Sắc. Thí dụ trong Kinh nói sinh ra là khổ. Chúng ta thử xét sinh có phải là khổ hay không. Chúng ta có một ý niệm về sinh, một tri giác về sinh. Tùy theo tri giác đó như thế nào mà chúng ta khổ nhiều hay là khổ ít. Nhìn lại cuộc đời của chúng ta, cuộc đời của một số người mà ta biết, chúng ta thấy từ khi sinh ra cho đến khi chết đi, đau khổ rất nhiều, hạnh phúc rất ít. Nhận xét đó đưa tới ý niệm sinh ra là khổ. Ý niệm đó căn cứ trên trên kinh nghiệm thật của con người.

Nhưng đó không phải là sự thật duy nhứt, vì ngoài nó ra, còn có những sự thật khác. Như khi thái tử Siddharta sinh ra thì người ta không có cảm tưởng khổ, tất cả hoàng cung đều mở tiệc ăn mừng, người ta thấy rằng sinh là một hiện tượng rất mầu nhiệm. Tất cả tùy tri giác của chúng ta, tuỳ thuộc Tưởng của chúng ta.

Rồi khi chúng ta tu tập, đạt tới cái thấy của chân đế, chứng nhập sự thật không sinh không diệt, thì lúc đó tri giác của chúng ta hoàn toàn thay đổi. Khi ý niệm sinh đã mất rồi, hiện tượng mà trước đó ta gọi là sinh không làm ta sợ hãi nữa. Ban đầu, chúng ta rất sợ hãi. Khi đã đạt tới vô sinh, đạt tới nhận thức bất sinh bất diệt rồi, thì nhìn sinh và diệt chúng ta không còn sợ hãi nữa. Đó là ta đã tiếp xúc được với chân đế, ta đã vượt thoát cái tưởng về sinh diệt.

Cho nên khổ thọ tùy thuộc rất là nhiều vào tri giác, nghĩa là vào nhận thức của chúng ta. Từ 2500 năm nay người ta thường đặt câu hỏi là: khổ chỉ là khổ thọ, hay khổ bao trùm cả các đối tượng của sắc, tưởng, hành, thức? Nhiều trường phái chủ trương không phải chỉ khổ thọ mới là khổ, tất cả mọi hành đều là khổ. All formations are duhkha. Chỉ có Ca Diếp Di Bộ cho rằng khổ chỉ là khổ thọ. Những phái khác, sau này rất đông, chủ trương rằng sắc, tưởng, hành và thức đều là khổ hết. Ví dụ Pháp Uẩn Túc Luận của Hữu Bộ, và Phân Biệt Đế Luận (Sacca Vibhanga) của tạng Pali đều quả quyết tất cả là khổ. Tất cả những hiện tượng vật chất, sinh lý; tất cả những sắc, tưởng, hành, thức; tất cả các nghiệp, nghiệp thiện, nghiệp ác, nghiệp không ác không thiện, đều là khổ hết. Sắc, thọ, tưởng, hành, thức đều là đối tượng của tưởng. Trời xanh, núi cao là đối tượng của tưởng, sắc thân, xã hội là đối tượng của tưởng; tất cả những nhận thức đó đều là khổ hết. Cái bàn là khổ, cái nhà là khổ, mặt trời là khổ, mặt trăng là khổ, con sông là khổ. Tất cả những hiện tượng nào được gọi là hữu vi đều khổ. Đó là khuynh hướng chính trong đạo Bụt từ thế kỷ thứ hai sau khi Bụt nhập diệt cho tới bây giờ. Thời đó, riêng chỉ có Ca Diếp Di Bộ chủ trương khổ chỉ là khổ thọ, và các thứ khác có thể đưa tới khổ thọ vì nhận thức sai lầm của chúng ta về chúng.

Để biết thêm về các bộ phái có quan điểm khác nhau thế nào chúng ta có thể tham khảo hai tác phẩm. Các tác phẩm này ghi lại những điểm mà các bộ phái Phật giáo không đồng ý vì kiến giải khác nhau. Ở Bắc tông thì có Dị Bộ Tôn Luân Luận của Thế Hữu (Vasumitra). Dị Bộ Tôn Luân Luận ghi chép lại những chủ trương khác nhau giữa 18 bộ phái, từ khoảng 100 năm sau khi Bụt nhập diệt. Trong truyền thống Nam tông có tác phẩm Kathavatthu, dịch là Luận Sự, ghi lại 219 điểm. Luận sự (Points of Controvers) tức là những chủ đề đưa ra để đàm luận giữa các bộ phái khác nhau.

Điểm thứ 111 trong Luận Sự nói: ‘‘Sự chứng nhập khổ đế có phải là kết quả của sự lặp đi lặp lại câu cái này là khổ phải không? Hành động lặp đi lặp lại câu cái này là khổ, đây là khổ, có tuyệt đối cần thiết để chứng nhập sự thật thứ nhất hay không?ì Đó là chủ trương của nhiều phái trong đó có các phái Đông Sơn Trú Bộ, Tây Sơn Trú Bộ, Vương Sơn Bộ và Nghĩa Thành Bộ. Tư liệu trên cho ta biết rằng ngay khoảng 100 năm sau khi Bụt nhập diệt thì khuynh hướng tụng đọc, lặp đi lặp lại câu ‘‘Đời là khổ, cái này là khổ, cái kia là khổì đã tràn lan. Khuynh hướng đó tạo nên một hình ảnh bi quan về đạo Bụt. Khi hành trì tứ diệu đế trong kinh, nhiều người bắt đầu bằng thị chuyển, bằng cách lặp đi lặp lại câu ‘‘ữời là khổì rất nhiều lần. Người ta tưởng làm như vậy sẽ chứng nhập vào chân lý khổ theo lời Bụt dạy. Cũng như nhiều người cứ niệm ‘‘Nam Mô A Di Đà Phật, Nam Mô A Di Đà Phậtì, nhưng trong lúc đó thì trong đầu nghĩ những chuyện khác. Cho nên việc lặp câu ‘‘cái này là khổì trở thành một công thức rất máy móc. Hồi đó, 100 năm sau khi Bụt nhập diệt, có một số bộ phái chủ trương đạo nhân thanh cố khởi, tức là sự chứng nhập đạo là do âm thanh mà phát khởi ra. Như vậy lặp đi lặp lại câu: cái này là khổ, đời là khổ, họ hy vọng chứng đạo. Chủ trương này đã được nói tới trong những lời phê bình của một vị xuất gia tên là Đại Thiên (Mahadeva). *

Những điểm phê bình của Đại Thiên cho thấy trong thời đại đó nhiều người thực tập thị chuyển tứ diệu đế bằng cách lặp đi lặp lại và nhắc đi nhắc lại với nhau về cái sự thực gọi là khổ. Có thể từ phép thực tập này nên có chủ trương tất cả là khổ. Khuynh hướng đó ảnh hưởng đến cả kinh điển về Tam Pháp Ấn. Cho nên trong Phật giáo Nam truyền ba Pháp ấn gồm có: vô thường, khổ, và vô ngã trong khi ở Phật giáo Bắc Truyền, đó là vô thường, vô ngã, niết bàn. **

Pháp ấn là những bản tính của sự thật trong thế giới này. Thực tại như là cái bàn, mà nói cái bàn này vô thường, vô ngã thì hiểu được. Nói cái bàn này là khổ thì khó hiểu lắm. Ta có thể nói rằng cái bàn có tác dụng gây đau khổ, thí dụ khi ta ham muốn cái bàn quá, không có nó thì ta khổ. Nỗi khổ đó do nhận thức của mình về cái bàn, do sự thèm khát của mình về cái bàn mà sinh ra, chứ không phải là tự thân của cái bàn.

Vậy khổ trước hết là khổ thọ. Các pháp khác, đối tượng của tưởng, có thể là tăng thượng duyên tạo nên khổ thọ, nhưng không phải là khổ thọ. Các pháp khác đi qua nhận thức sai lầm của tưởng thì thành khổ thọ, nhưng nếu tưởng không sai lầm thì các pháp không phải là khổ. Vậy ta có thể nói rằng các pháp hữu vi có tính vô thường, vô ngã và có tác dụng gây đau khổ. Nếu chúng ta nhìn qua cái tưởng sai lầm, tất cả các pháp hữu vi đều có thể gây ra đau khổ.

!! Năm thủ uẩn

Trong lý luận cho rằng tất cả đều khổ người ta thường nói gốc của khổ là do năm uẩn. Hầu hết các bộ phái nói rằng khổ không phải chỉ là đối tượng của thọ mà là đối tượng của tưởng, khổ không phải chỉ là khổ thọ, khổ là do tất cả các uẩn. Năm uẩn có phải là khổ hay không? Năm uẩn có phải là nguyên do trực tiếp của khổ hay không? Trong kinh Tam Chuyển Pháp Luân Bụt nói vướng mắc vào năm uẩn là khổ. Người ta căn cứ vào câu đó, nhưng quên đi những chữ ‘‘vướng mắc vàoì !Nếu năm uẩn mà khổ thì diệt hết năm uẩn là hết khổ chăng? Nghĩ như vậy rất nguy hiểm. Trong Kinh Đại BảoTích có một đoạn rất hay, Bụt kể: ‘‘Có một ông kia cầm cục đá ném con chó. Con chó đau quá, chạy theo cục đá mà sủa. Nó không biết rằng nguyên nhân làm nó đau là người ném đá, chứ không phải là cục đá. Cũng vậy, những người mê tưởng năm uẩn là nguyên do của khổ, không biết nguyên nhân của khổ là nhận thức sai lầm của họ về năm uẩn. ì

Trước sự bất đồng quan điểm của các bộ phái, nếu muốn thiết lập lại tư tưởng gốc của đạo Bụt chúng ta nên theo lối những nhà khảo cổ. Họ đi đào xới, họ tìm ra được những bức tượng hay những tác phẩm cổ đã gẫy nát, đã bể vỡ ra nhiều miếng. Họ đem sự hiểu biết và óc thông minh của họ mà ráp lại, và họ có thể tái tạo được hình dạng của pho tượng ngày xưa. Đôi khi pho tượng mất một phần thì họ căn cứ vào phong cách nghệ thuật của những phần khác, của thời đại đó, để tạo lập lại phần bị mất cho phù hợp với nghệ thuật của toàn thể. Trong khi học Kinh, chúng ta cũng phải làm như vậy. Chúng ta dùng hai dụng cụ là nhị đế và duyên khởi trong khi đọc Kinh thì có thể thiết lập lại được nguyên văn hoặc nguyên ý của Bụt. Nhiều khi do sự truyền trì mà có những Kinh bị biến dạng, giống như những pho tượng đã bị vỡ.

Một trong năm uẩn là Tưởng, tức là tri giác, mà tri giác gồm đối tượng của tri giác và chủ thể của tri giác. Đối tượng của tri giác là tất cả vũ trụ, tất cả năm uẩn. Những đối tượng đó khổ hay không là tùy theo Tưởng, theo tri giác của ta. Trong Kinh Tam Chuyển Pháp Luân Bụt có đưa ra một vài ví dụ về khổ: sinh ra là khổ, già là khổ, bệnh là khổ, chết là khổ, muốn mà không được là khổ, ghét nhau mà phải gần nhau là khổ, thương nhau mà phải xa nhau là khổ. Nói tóm lại chính sự vướng mắc vào năm uẩn là khổ. Có danh từ thủ uẩn, upadana skandhas. Thủ có nghĩa là vướng mắc. Khi vướng mắc vào năm uẩn thì những đối tượng đó tạo khổ đau, còn nếu đối với những uẩn ấy mà chúng ta không bị thủ thì không sao. Không phải thủ uẩn thì chúng ta có thể gọi bằng một tên mới là xả uẩn (upeksa skandhas).

Một người phát tâm xuất gia là phải từ bỏ cả gia đình, cha mẹ và anh em của mình. Khi nhìn vào ta có thể coi đó là khổ, vì những người mình thương mà mình không được sống gần là khổ. Thương cha mẹ và anh em mà phải bỏ cha mẹ và anh em ra đi là khổ. Nhưng có thể người đó thấy rằng xuất gia có nghĩa là sẽ có một cơ hội giúp bồ đề tâm của mình phát triển, do đó sau này mình sẽ độ được những người thân của mình. Với tâm niệm như vậy thì trong lòng không đau khổ gì nữa, mà niềm hy vọng lớn hơn. Cho nên tất cả đều do Tưởng, do nhận thức của ta. Nhiều người không xuất gia, họ lấy chồng, lấy vợ, sinh con, rồi không có thì giờ để chăm sóc cho cha mẹ. Không xuất gia cũng đâu được gần gũi cha mẹ? Có nhiều người xuất gia được thảnh thơi, nhẹ nhàng, họ có nhiều cơ hội gần gũi và giáo hóa cho cha mẹ, anh em họ. Những người đó đâu phải là những người khổ? Cho nên cái khổ tùy thuộc vào nhận thức và tri giác. Cũng vậy, nguyên do cái đau khổ của con chó không phải là cục đá, mà là người ném đá. Chúng ta đọc Kinh, đọc Luận, phải sử dụng những dụng cụ nhị đế và duyên khởi để tìm hiểu, đừng đọc gì tin ngay đó: y kinh giải nghĩa, tam thế Phật oan.

!! Hành trì thị chuyển

Vậy chuyển hóa cái khổ như thế nào? Khi chúng ta thấy không an lạc thì phải biết quán chiếu và nhận thức được thực chất cái khổ của mình. Cách thực tập đó gọi là thị chuyển. Chúng ta nhận thức bằng chánh niệm. Phải nhận thấy được bản chất và nội dung của niềm đau khổ. Như người đau bụng thì phải biết đó là chứng bệnh đau bụng nào. Nếu ho lao thì phải biết là bệnh ho lao đến thời kỳ nào. Đó là nhận diện khổ, thực tập về chân lý thứ nhất, khổ đế. Chân lý thứ nhất liên hệ với chân lý thứ ba là diệt, tức là hạnh phúc. Tiếp tục bằng việc so sánh khổ và không khổ: ngày xưa tôi không bệnh, bây giờ tôi có bệnh này. Người kia không khổ, tôi có nỗi khổ này. Nhìn vào cái này khổ, ta thấy cái kia là diệt. Đó là nhận thức duyên khởi. Phải nhìn sâu bằng chánh niệm chứ không phải là chỉ nói suông là đủ.

Có chánh niệm rồi, nhìn vào khổ một cách sâu xa ta thấy được tập. Trong Kinh nói tập là sự vướng mắc, tham Đi. Nhưng quán chiếu ta sẽ thấy rằng không phải chỉ có Đi nhiễm là nguyên do gây khổ. Ham muốn, vướng mắc tạo ra khổ, nhưng còn có những nguyên do khác. Si mê và giận dữ cũng là những nguyên do gây khổ. Đi tìm nguyên do của khổ, chúng ta thấy có ái dục, sân hận, nghi ngờ, kiêu mạn, ác kiến (tham, sân, si, mạn, nghi, kiến). Khổ do tri giác sai lầm của chúng ta mà có. Tri giác sai lầm là vọng tưởng, vô minh. Vì vô minh cho nên mới có sân giận, nghi ngờ, mới có ác kiến, có kiêu mạn và ái dục. Cho nên vô minh là gốc rễ của khổ đau, gây ra những phiền não khác như tham, sân, mạn, nghi, và ác kiến.

Dùng ánh sáng của duyên sinh soi chiếu, khi nhìn trong khổ ta phải thấy lạc. Lạc là mặt bên kia của thực tại khổ. Nhức đầu, đau răng là khổ. Những lúc không nhức đầu, không đau răng có thể gọi là diệt, tức là sự vắng mặt của nhức đầu và đau răng. Khi nhức đầu hay đau răng chúng ta muốn trở lại trạng thái diệt, không nhức đầu, không đau răng. Nhìn lại, đôi khi cái diệt ở sẵn trong ta mà ta không thấy, cho nên có diệt cũng như không, có hạnh phúc mà như không có hạnh phúc. Khi nhức đầu ta đau khổ, mà khi không nhức đầu ta lại không thấy hạnh phúc, không biết đấy là diệt. Những lúc đau răng thì khổ và ta nghĩ không đau răng là sướng. Nhưng đến khi không đau răng ta vẫn không biết sung sướng. Con người thường sống trong quên lãng như vậy. Sống trong hạnh phúc cũng không nhìn thấy hạnh phúc, và sống trong khổ đau cũng không biết đó là khổ đau. Không nhận diện được đau khổ nên ta gánh cái khổ suốt đời.

Khi đưa ánh sáng chánh niệm vào khổ ta nhận diện được khổ, đưa ánh sáng chánh niệm vào diệt thì nhận diện được hạnh phúc. Đây là sự thực tập hàng ngày. Trong những bài tập ở làng Hồng có một câu hỏi: ‘‘có những niềm vui nào trong đời sống hàng ngày mà chúng ta có thể sử dụng để nuôi dưỡng thân tâm của mình, tạo nên hạnh phúc cho mình và cho mọi người? Trong đời sống hàng ngày có những cơ hội để ta nuôi dưỡng mình và nuôi dưỡng người bằng những niềm vui đó hay không?ì Đó là thực tập quán chiếu về diệt. Không nên nghĩ rằng trong ta không có sẵn diệt. Trong ta vốn có diệt, tức là vốn có hạnh phúc, có những điều kiện của hạnh phúc. Ta có hai mắt đang sáng, có hai chân đang khỏe, ta có hai lá phổi không bị ung thư, ta có thể đi thiền hành, có thể thở, có thể mỉm cười. Nếu không cảm thấy hạnh phúc, là vì ta coi thường trạng thái diệt mà ta đang có. Chỉ khi nào hạnh phúc mất đi, cái diệt không còn nữa, thì lúc đó ta mới than trời than đất. Vì ta không để tâm chú ý tới, nên cái diệt có đó cũng như không. Thật sự là đã có mặt của chân đế thứ ba, có mặt của diệt, của niềm vui, an lạc bây giờ và ở đây. Vì không có chánh niệm nên ta không tiếp xúc được với hạnh phúc. Đó là bi kịch lớn của cuộc đời: con người đánh mất khả năng sống hạnh phúc. Con người chỉ biết than khổ thôi. Con người không có khả năng tiếp xúc với hạnh phúc, thưởng thức hạnh phúc, vì không biết sống trong chánh niệm. Có chánh niệm ta có thể tiếp xúc với hạnh phúc đang có sẵn để ngày mai không hối tiếc. Trong cuốn Bông Hồng Cài Áo, tôi nói có bà mẹ là một tặng phẩm mầu nhiệm mà nếu ta không thấy sung sướng thì dù có làm ngọc hoàng thượng đế chắc cũng không sung sướng. Có mẹ nhưng không ý thức rằng mình có mẹ, thì cũng như là không có mẹ. Vậy nên chánh niệm chiếu sáng sự thật thứ nhất là Khổ và cũng chiếu sáng cả sự thật thứ ba là Diệt. Cho nên sự tu tập của chúng ta không phải chỉ là tiếp xúc với khổ, nhận thức cái khổ và chuyển hóa cái khổ mà thôi. Chúng ta phải tiếp xúc cả với trạng thái không khổ, nuôi dưỡng cái không khổ, và tự nuôi dưỡng mình bằng những trạng thái không khổ. Phải thực tập chuyển hóa khổ và thực tập an lạc cùng lúc. Khi nói chuyện với các nhà trị liệu tâm lý, tôi thường hỏi: tại sao khi gặp người bệnh thì các ông, các bà cứ nói về những chuyện khổ đau của người ta thôi? Tại sao quý vị không tìm cách tiếp xúc với những hạt giống hạnh phúc của người bệnh? Hãy giúp cho họ tiếp xúc được với hạt giống của niềm an lạc trong nội tâm và trong đời sống chung quanh họ, như vậy trị liệu dễ hơn. Tại sao quý vị không mời bệnh nhân của quý vị đi thiền hành, dự thiền trà hay giúp họ tiếp xúc được với những niềm vui sẵn có? Đó cũng là một cách thực tập trị liệu.

!! Rác và hoa

Khi chúng ta quán chiếu, khi chúng ta dùng năng lượng của chánh niệm để tiếp xúc với khổ và với trạng thái không khổ của mình, thì bắt đầu từ những niềm vui và nỗi khổ hời hợt, chúng ta dần dần thấy trong khổ có thể tìm thấy vui, và trong vui có khổ. Nhờ thế mà tiếp xúc được với mặt kia của thực tại, tức là chân đế. Do đó càng đi sâu trong quá trình quán sát ta càng đạt tới cái niềm vui chân thật.

Ngoài khổ thọ và lạc thọ, chúng ta có những xả thọ. Khi nói đến diệt ta có thể phân biệt hai trạng thái: vui và không khổ, tức là lạc thọ và xả thọ. Trong đời sống hàng ngày, chúng ta rất lơ là, quên lãng những xả thọ. Dùng chánh niệm để tiếp xúc với xả thọ, tự nhiên chúng ta biến xả thọ thành lạc thọ. Trạng thái không nhức răng, không đau đầu, hành động bước những bước chân trên trái đất, thở không khí trong lành, đó là những xả thọ có thể biến thành lạc thọ. Đó là tạo tác niềm vui để chuyển hóa khổ đau.

Hãy ví khổ như rác, và hạnh phúc như những đóa hoa. Chúng ta biết rằng hoa để đó lâu ngày sẽ trở thành rác. Hạnh phúc, an lạc của chúng ta nếu không được nuôi dưỡng sẽ biến thành đau khổ rất dễ dàng. Và đứng trên bình diện tục đế, thì hoa nào một ngày kia thế nào cũng thành rác. Ngược lại, chúng ta có thể dùng rác để bón cho cây nở hoa. Chuyển hóa khổ đau chính là biết cách biến rác trở lại thành hoa. Một mặt phải bảo vệ hoa, mặt khác phải chuyển hóa rác, chúng ta cần thực tập đồng thời cả hai. Có những điều kiện của hạnh phúc thì chúng ta phải nhận thức, nuôi dưỡng, bảo trì. Mặt khác, khi hoa trở thành rác, vì tất cả đều vô thường, thì chúng ta phải tìm cách chuyển hóa rác trở lại thành hoa. Bụt Thích Ca Mâu Ni vốn cũng có một cơ thể, cũng có một đời sống tâm lý như mọi người. Nhưng Ngài khác chúng ta ở chỗ là khi những đóa hoa ở trong Ngài biến thành rác thì Ngài biết chuyển hóa chúng lại thành hoa. Chúng ta không biết bảo trì hạnh phúc, không biết chuyển hóa khổ đau. Bụt không sợ hãi, còn chúng ta sợ hãi.

Trong quá trình tu tập và chuyển hóa trên, chúng ta thấy được một điều, là hoa với rác không rời nhau. Có hoa thì có rác, có rác thì phải có hoa. Đó là nguyên lý bất nhị. Do đó chúng ta nhìn hoa và rác bằng con mắt không phân biệt, không sợ hãi. Bụt nhìn phiền não Ngài thấy bồ đề. Chúng ta chạy trốn khổ đau để tìm hạnh phúc, chạy trốn thứ này đi tìm thứ khác, vì chúng ta dùng con mắt nhị nguyên. Chúng ta chưa thấy được rằng sở dĩ có hạnh phúc vì có khổ đau, và có khổ đau vì có hạnh phúc. Trong khi đó Bụt nhìn bằng con mắt bất nhị. Ngài thấy rõ ràng hạnh phúc với khổ đau nương vào nhau, vì cái này có nên có cái kia.

Thực tập bảo trì hoa và chuyển hóa rác, chúng ta học được tính cách bất nhị. Nhìn vào trong hoa, chúng ta sẽ thấy những cọng rác tương lai, nhìn vào đống rác chúng ta thấy những bông hoa sẽ được tưới bón. Hạnh phúc và khổ đau cũng vậy. Quá trình tu tập quán chiếu về khổ đế và diệt đế giúp chúng ta dần dần tiếp xúc được với chân đế. Ta không thấy sợ cái gọi là khổ nữa. Mà cũng không vướng mắc vào cái gọi là lạc nữa. Chúng ta vốn là những người phàm phu, muốn chạy trốn khổ, muốn đuổi theo lạc. Nhưng khi thực tập đạo Bụt chúng ta tìm ra một sự thật, đó là hoa và rác nhất thể, khổ đau và hạnh phúc nương nhau mà hiện diện. Chúng ta tiếp xúc được với chân đế của khổ và của diệt.

!! Niềm vui xuất thế

Tóm lại việc thực tập của chúng ta bắt đầu bằng quán chiếu khổ và lạc trong phạm vi tục đế. Nhờ quá trình thực tập đó, dần dần chúng ta tiếp xúc được với chân đế của khổ và lạc. Khi thấy được bản chất tương tức và duyên sinh của khổ và lạc rồi, chúng ta đạt tới niềm an vui, sự vững chãi và thảnh thơi mà lúc đầu chúng ta không có.

Bụt là bậc giác ngộ, đã nhìn thấu suốt được bản chất của khổ nên không còn sợ khổ nữa, đã nhìn thấu suốt bản chất của lạc rồi thì không bị vướng mắc vào lạc nữa. Ngài đạt tới niềm vui thanh thoát, vững chãi và an nhiên, không sợ hãi. Niềm vui đó là niềm vui chân thật, niềm vui của niết bàn: Sinh diệt diệt dĩ, tịch diệt vi lạc. Lạc trong câu này, là lạc ở bình diện chân đế, siêu việt khổ và lạc của tục đế rồi.

Nhưng chúng ta không quên rằng chân đế không xa lìa tục đế. Và cũng không nên quên rằng người bình thường không thể bỏ quá trình tu tập ở cõi tục đế, không thể nhẩy thẳng vào vùng ánh sáng hiểu biết của chân đế. Trong đạo Phật có nhiều danh từ nói về hai mặt thực tại: một mặt thuộc về tục đế, một mặt thuộc về chân đế. Tông Thiên Thai có danh từ tích môn để chỉ tục đế, và bản môn chỉ chân đế. Chúng ta có danh từ hữu lậu nói về tục đế. Hữu lậu (Asrava) có nghĩa là nước còn chảy ra, còn rỉ ra, bị sa xuống, còn đi vòng quanh. Ngược lại là vô lậu (Anasrava). Ngoài ra còn dùng các từ thế gian và xuất thế gian. Hữu lậu thuộc về thế gian, vô lậu thuộc về xuất thế gian.

Do sự thực tập cho nên niềm vui thế gian chuyển hóa từ từ, trở thành vững chãi hơn, thảnh thơi hơn, để sau cùng thành niềm vui xuất thế gian. Niềm vui xuất thế gian không còn là vui đối nghịch với khổ nữa. Sự giải thoát này khiến những thứ mà trước đây ta gọi là khổ, là sinh, lão, bệnh, tử, thì nay được nhận ra không còn là khổ nữa. Nhận thức của ta đã thay đổi, ta đã phá tung phiền não. Nếu cần sinh ra thì sinh, đến lúc già thì già, nếu phải bệnh thì bệnh, rồi khi chết thì chết. Người giác ngộ đã nhìn thấy trên bề mặt tục đế có sinh, lão, bệnh, tử, nhưng trong chiều sâu chân đế thì không còn sinh, lão, bệnh, tử nữa.

Cho nên khi tụng Tâm Kinh, chúng ta đọc những câu rất khó hiểu như là: không có mắt, tai, mũi, lưỡi, thân, ý; không có sắc, thanh, hương, vị, xúc, pháp; không có khổ, tập, diệt, đạo, không có trí, không có đắc, không có sở đắc. Đó là từ sự thật thế gian đã đi sang xuất thế gian, từ thế giới hữu lậu chuyển qua cõi vô lậu.

Chân lý thứ ba ban đầu được nhận thức như là sự vắng mặt của khổ đau. Khi nhìn trên bình diện sự thật xuất thế gian thì Diệt không phải chỉ là sự vắng mặt của khổ đau mà thôi, nó là sự vắng mặt của cả cái ngược lại với khổ đau, nó vượt thoát tính cách nhị nguyên giữa khổ và vui. Trong Kinh thường nói các vị bồ tát cưỡi trên những đợt sóng sinh tử mà đi, là ý nghĩa như vậy.

Tu tập đạo lý tứ đế về phương diện thế gian cho đủ sâu sắc thì có thể đạt tới đạo lý tứ đế trên phương diện xuất thế gian. đạo lý tứ đế có thể diễn bày như là đạo lý thế gian hướng thượng, đạo lý tứ đế cũng có thể diễn bày như là đạo lý xuất thế gian siêu việt. Nhưng hai mặt đó không chống đối nhau. Thực tập trong cõi tục đế là con đường dẫn tới chân đế.

!! Chú thích

Đại Thiên nêu ra năm nhận xét để phê bình về một vị A la hán, ông đã tạo ra sóng gió lớn trong Tăng đoàn.

* Phê bình thứ nhất là dư sở dụ. Dư sở dụ có nghĩa là tuy thầy chứng quả A la hán rồi nhưng mà vẫn có thể bị những loài không phải loài người, tới dụ dỗ trong giấc mơ. Dầu thầy chứng quả vị A la hán rồi, ông nói, mà trong giấc mơ vẫn còn thấy ôm một nàng tiên và vẫn bị xuất tinh. Một bậc A la hán vẫn có thể bị kẻ khác dụ dỗ, gọi là dư sở dụ.
* Phê bình thứ hai là vô tri. Tuy rằng đã chứng A la hán rồi nhưng còn có nhiều thứ thầy không biết. Ví dụ tôi đưa bông hoa này ra hỏi tên gì, thầy đâu có nói được. Cũng như trên đời có nhiều cái thầy không biết, vậy một vị A la hán có những cái không biết, gọi là vô tri. Các thầy phía Thượng Tọa Bộ bác bỏ lời phê phán trên bằng sự phân biệt hai loại không biết. Một thứ là nhiễm ô vô tri, thứ hai là bất nhiễm ô vô tri. Nhiễm ô vô tri là không biết do sự mê mờ, vô minh. Nếu tôi không biết tên bông hoa này, điều đó không dính líu gì tới sự giác ngộ của tôi, không phải vì vô minh mà không biết, đó chỉ là bất nhiễm ô vô tri. A la hán có thể còn những bất nhiễm ô vô tri mà không vướng nhiễm ô vô tri.
* Phê phán thứ ba là do dự. Do dự tức là vẫn còn nghi ngờ. Nơi con người của A la hán vẫn còn những điểm nghi hoặc, chưa giải quyết được hết các nghi ngờ.
* Thứ tư là tha linh nhập. Tha linh nhập nghĩa là thầy đắc quả A la hán rồi mà tự mình không biết, phải có người khác chỉ cho mới biết.
* Điểm thứ năm là đạo nhân thanh cố khởi, tức là thầy phải lặp đi lặp lại hoài: “đời là khổ, cái này là khổ,” nếu không thì không thấy giải thoát.

Câu đạo nhân thanh cố khởi được truyền lại trong lời phê phán trên, cho thấy cách hành trì này rất phổ biến trong thời đại đó. Cách hành trì phổ thông này có thể ảnh hưởng tới việc lập thuyết của các luận sư đương thời, và việc sao chép kinh điển có thể vì vậy nên bị sai lạc đi.

Ba Pháp ấn theo đạo Bụt Bắc truyền là vô thường, vô ngã và niết bàn. Nhưng theo đạo Bụt Nam truyền là vô thường, khổ và vô ngã. Pháp ấn tức là những tính cách đích thực của thế giới thực tại theo giáo pháp của Bụt. Trong Kinh có một đoạn được nhắc lại ở nhiều nơi:

<<<
– Này các vị khất sĩ, sự vật là thường hay là vô thường? <br>
– Bạch đức Thế Tôn, sự vật là vô thường. <br>
– Sự vật vô thường, vậy là khổ hay là không khổ? <br>
– Bạch đức Thế Tôn, sự vật vô thường cho nên chúng là khổ. <br>
– Sự vật là vô ngã hay là không vô ngã? Nếu sự vật là khổ thì ta có thể nói là cái này là ngã được không? <br>
– Bạch đức Thế Tôn, không được. Sự vật là khổ thì ta không thể nói rằng cái này là ngã được.
<<<

Lý luận trong đoạn trên là “vì vô thường cho nên khổ,” “vì khổ cho nên vô ngã.” Đoạn kinh trên được nhắc lại hàng mấy trăm lần trong Kinh điển bộ phái Theravada cũng như bộ phái Sarvastivada. Đoạn này có thể đã bị ảnh hưởng của tư trào thời đại đó, khi ý niệm về khổ trở thành quá quan trọng. Kết quả là Tam Pháp Ấn thay vì gồm vô thường, vô ngã, niết bàn, đã trở thành vô thường, khổ và vô ngã, trong Phật giáo Nam truyền.

Nhưng cũng có những kinh bản trong đó nói Tam Pháp Ấn gồm Vô Thường, Vô Ngã và Niết Bàn. Trong bộ Kinh A Hàm, truyền thống Bắc tông, còn lại một Kinh định nghĩa Tam Pháp Ấn là vô thường, vô ngã và niết bàn, định nghĩa này được lặp lại bốn, năm lần. Chỉ còn lại một Kinh đó thôi, tất cả những Kinh khác đều nói là vô thường, khổ, và vô ngã.

Ngoài ra, ngài Long Thọ (Nagarjuna), sống vào thế kỷ thứ hai sau Thiên Chúa, đã nói tới Tam Pháp Ấn, và thầy cũng nói gồm vô thường, vô ngã và niết bàn. Ngài Long Thọ đã tham khảo đầy đủ rất nhiều các văn bản kinh tạng Phật giáo nguyên thuỷ. Ngài sinh trước thầy Phật Âm (Buddhaghosa) và thầy Thế Thân (Vasubangdu) 300 tuổi. Hai tác phẩm luận nổi tiếng nhất trong giới Phật học bấy giờ là Thanh Tịnh đạo Luận (Visuddhi Maga) do thầy Phật Âm trứ tác, và tác phẩm A Tỳ Đạt Ma Câu Xá Luận (t. PHạn) của thầy Thế Thân. Ta biết rằng Đại Trí Độ Luận (Mahaprajnaparamita) cuả thầy Long Thọ ra đời 300 năm sớm hơn hai cuốn kia.
! Bài 17 Pháp ấn

Hôm nay là ngày 20 tháng giêng năm 1994, chúng ta ở tại xóm Thượng và học tiếp về bát chánh đạo.

!! Pháp ấn

Trong bài trước chúng ta đang học về chánh định và do đó đã bàn tới chánh kiến. Học về chánh định ta phải nói tới tam tam muội, tức là ba cái định quan trọng, có khi được gọi là tam giải thoát môn. Nhưng muốn hiểu về ba cánh cửa giải thoát, ta cũng cần học về tam pháp ấn. Tam pháp ấn thuộc về lĩnh vực của chánh kiến.

Pháp ấn là khuôn dấu của chánh pháp. Khuôn dấu chứng thực tính cách chính thống và đích thực. Giáo lý đích thực của Bụt thì phải mang ba dấu ấn chứng nhận đó. Tiếng Anh có thể dịch là the three dharma seals. Trong Đại tạng có Kinh Pháp Ấn. Ba pháp ấn vô thường, vô ngã và niết bàn liên hệ tới không, vô tướng và vô tác, tức là ba giải thoát môn. Vô thường (impermanence) tiếng Phạn là anitya. Vô ngã (non-self) tiếng Phạn là anatma. Niết bàn tiếng Phạn là nirvana. Giáo lý nào có ba khuôn dấu này là đích thực giáo pháp của Bụt, không thể nhầm lẫn với giáo pháp ngoại đạo.

Danh từ Tam pháp ấn có khi cũng dùng để nói tới tam giải thoát môn. Ba cánh cửa giải thoát (the three gates of liberation) là không, vô tướng và vô tác. Vô thường, vô ngã thuộc về thế giới hiện tượng, nghĩa là về tướng (laksana), và niết bàn thuộc về thế giới bản thể, về tánh (svabava). Tướng là hữu vi (samskrita), tánh là vô vi (asamskrita).

Đạo Bụt Nam truyền không chú trọng nhiều đến tam pháp ấn, nhất là không nhấn đủ mạnh tới tam giải thoát môn, hay tam tam muội. Ba trạng thái định (samadhi) là không tam muội, vô tướng tam muội và vô tác tam muội. Đạo Bụt Bắc truyền như ta đã biết nhấn mạnh tới tam pháp ấn và tam tam muội.

Trong đạo Bụt Nam truyền, Tam pháp ấn được trình bày là vô thường, khổ và vô ngã. Theo tôi đây là do tình trạng thất truyền. Sự thất truyền này là bắt đầu từ sự chắp nối nhầm lẫn trong một đoạn kinh, sau đó qua sự truyền thừa, tất cả những đoạn kinh khác về cùng một đề tài đều lặp lại điều sai lầm đó. Đoạn kinh thuật lời Bụt như sau:

<<<
– Này các vị khất sĩ, sự vật là thường hay là vô thường?  <br>
– Bạch đức Thế Tôn, sự vật là vô thường. <br>
– Này các vị khất sĩ, sự vật vô thường thì là khổ hay là vui?  <br>
– Bạch đức Thế Tôn, sự vật vô thường cho nên là khổ.  <br>
– Này các vị khất sĩ, nếu sự vật là khổ thì có nên nói cái này là ta, cái này là của ta hay không?  <br>
– Bạch đức Thế Tôn, vì sự vật là khổ cho nên ta không thể nói được cái này là ta hay là của ta.
<<<

Đoạn kinh đó được nhắc lại hàng trăm, hàng ngàn lần trong kinh điển. Chỗ nào có nói tới vô thường và vô ngã là có nói đến khổ, và về sau cứ tiếp tục như vậy. Cho nên khi nói với các vị Phật tử Nam tông rằng tam pháp ấn là vô thường, vô ngã và niết bàn thì họ không chấp nhận. Họ bảo trong Kinh nói rằng tam pháp ấn là vô thường, khổ và vô ngã, chứ không phải vô thường, vô ngã và niết bàn.

Điều này không có nghĩa là Kinh điển Bắc tông khi nói về vô thường, vô ngã không nói tới khổ. Các đoạn đối thoại giữa Bụt và các thầy khất sĩ cũng giống hệt như trong kinh ở Nam tông:

<<<
– Này các vị khất sĩ, sự vật thường hay là vô thường?  <br>
– Bạch đức Thế Tôn, sự vật vô thường.  <br>
– Này các vị khất sĩ, nếu sự vật vô thường thì là khổ hay là vui?  <br>
– Bạch đức Thế Tôn, khổ.  <br>
– Này các vị khất sĩ, nếu sự vật là khổ thì ta có nên nói nó là ta hay là của ta không?  <br>
– Bạch đức Thế Tôn, không.
<<<

Tuy nhiên, chúng ta có thể chứng minh giáo lý tam pháp ấn chắc chắn là vô thường, vô ngã và niết bàn. Trong kinh tạng Bắc tông, còn Kinh Tạp A Hàm, Kinh số 262, quyển thứ mười lặp đi lặp lại năm lần công thức vô thường, vô ngã và niết bàn.

<<<
Nhất thiết hạnh vô thường  <br>
Nhất thiết pháp vô ngã  <br>
Niết bàn tịch diệt.
<<<

Ba câu đó nghĩa là đứng về phương diện thế giới hiện tượng thì ta thấy có khổ đau vì vô thường và vô ngã, nhưng đứng về phương diện bản tánh thì vẫn có vắng lặng, vẫn có bình yên. Mặt khác, tác phẩm Đại Trí Độ Luận (Mahaprajnaparamita) của thầy Long Thọ sáng tác vào khoảng thế kỷ thứ hai, sau Thiên Chúa giáng sinh, cũng nói rất rõ rằng Tam pháp ấn là vô thường, vô ngã và niết bàn.

Thật ra lý luận vì vô thường cho nên khổ, vì khổ cho nên vô ngã không đủ vững chắc, và có thể gây hiểu lầm về vô thường và vô ngã. Vô thường và vô ngã nằm ở một bình diện khác với khổ. Ví dụ như cái bàn này. Cái bàn này là thực tại. Cái bàn này là vô thường, nói vậy chúng ta hiểu được. Cái bàn này là vô ngã, đúng. Nhưng cái bàn này là khổ thì ta khó quan niệm được. Nói rằng vì vô thường cho nên khổ, vì khổ cho nên vô ngã, lý luận đó nghe không thuận. Có thể nói rằng vì sự vật vô thường và vô ngã mà chúng ta không biết, cứ cho là thường, là có ngã cho nên ta khổ, nói như vậy xuôi hơn.

Khi nghiên cứu kinh điển, ta phải dùng trí phán đoán suy xét để có thể loại bỏ những sai lầm lưu cữu trong lịch sử. Ban đầu chúng ta có Đạo Bụt Nguyên Thỉ (Original Buddhism), sau thời gian một trăm năm thì đạo Bụt ấy biến thành Đạo Bụt Bộ Phái (Multiple Schoolsí Buddhism). Hai trăm năm sau khi Bụt nhập diệt, giáo đoàn phân liệt ra, tối thiểu là mười tám bộ phái, nên gọi là Đạo Bụt Bộ Phái. Hai truyền thống trong số các bộ phái đó còn để lại rất nhiều kinh điển mà chúng ta có thể so sánh, đó là truyền thống Hữu Bộ (Sarvastivada) và truyền thống Đồng Diệp Bộ (Tamrasatiya). Sau này, Đạo Bụt Đại Thừa, phát sinh vào khoảng thế kỷ thứ nhất trước công nguyên, gọi các Bộ Phái là Tiểu Thừa, và tự gọi mình là Đại Thừa. Những trường phái phân liệt ra vào khoảng từ một trăm tới ba trăm năm sau khi Bụt nhập diệt đều gọi là Đạo Bụt Bộ Phái cả. Và Đạo Bụt Bộ Phái không phải là chỉ có trong Đạo Bụt Nam Truyền, Đạo Bụt Bắc Truyền cũng có Bộ Phái, phân hệ từ thời đại vua Asoka (A Dục). Trong hai hệ phái, Hữu Bộ và Phân Biệt Thuyết Bộ, Hữu Bộ (Savastivada) truyền lên miền Bắc, vùng Kashmir, phát triển tại đó một ngàn năm. Vặn tự sử dụng trong Hữu Bộ là chữ Sanskrit. Trong khi đó, Phân Biệt Thuyết Bộ được chính thức ủng hđo, phát triển tại nơi gốc, và một phần được truyền qua Tích Lan. Đạo Bụt truyền qua Tích Lan thuộc về Đồng Diệp Bộ, bộ phái các thầy mặc áo vàng màu đồng đỏ, gọi là Xích Đồng Diệp Bộ. Sau họ bỏ tên đó, dùng tên Theravada, nghĩa là Thượng Tọa Bộ, cho có tính cách chính thống hơn.

Xích Đồng Diệp Bộ thừa hưởng văn hệ Abhidharma, tức là Luận Bộ (A Tỳ Đàm) của Phân Biệt Thuyết Bộ. Trong khi đó Hữu Bộ tại miền Bắc cũng rất hưng thịnh, trước tác nhiều bộ luận. Những bộ luận lớn là Tỳ Bà Sa Luận, đã được phiên dịch ra chữ Hán, tồn tại cho tới hôm nay.

Đạo Bụt Bộ Phái không phải chỉ có mặt trong Đạo Bụt Nam Truyền Tích Lan, mà ở phương Bắc cũng có. Việt Nam, Trung Hoa, Nhật Bản cũng được thừa tiếp Đạo Bụt Bộ Phái. Giới luật của các khất sĩ, nữ khất sĩ cũng đều là giới luật được trao truyền từ Đạo Bụt Bộ Phái. Từ Kashmir (chữ Hán là Ca Thấp Di La), Hữu Bộ đã đưa đạo Bụt với những Kinh A Hàm vào Trung Hoa và các xứ Á đông. Tại Việt Nam chúng ta có thể đọc Kinh Nikaya từ chữ Pali do Xích Đồng Diệp Bộ truyền lại, và chúng ta có thể so sánh với các Kinh A Hàm bằng chữ Hán.

Khi so sánh về sự hành trì cũng như về kinh điển, chúng ta mới thấy Đạo Bụt Bắc Truyền, dầu là gốc Đạo Bụt Bộ Phái, cũng còn giữ được giáo lý chân truyền về tam pháp ấn: vô thường, vô ngã và niết bàn. Chứng cớ thứ nhất đã nêu ra là trong Tạp A Hàm, Kinh 262, vô thường, vô ngã và niết bàn là ba pháp ấn. Chứng cớ thứ hai là thầy Long Thọ, vào thế kỷ thứ hai, đã nói rõ ràng tam pháp ấn là vô thường, vô ngã và niết bàn. Vậy nghiên cứu Đạo Bụt Bộ Phái và Đạo Bụt Đại Thừa chúng ta có thể tìm lại được Đạo Bụt Nguyên Thỉ. Đó là công việc chúng ta đang làm và phải làm.

Vậy pháp ấn đầu tiên, con dấu đầu tiên, là nhất thiết hạnh vô thường, tất cả mọi hiện tượng được tập hợp nên đều vô thường. Tất cả các pháp hữu vi đều vô thường. Hữu vi là những pháp thuộc thế giới hiện tượng. Nếu một giáo lý, một học thuyết nào không mang dấu ấn này thì không phải là Phật pháp

Nhưng giáo lý vô thường (impermanence) có khác với ý niệm về vô thường vẫn có ở ngoài đời. Theo nguyên tắc tương tức và tương nhập, giáo lý vô thường phải phản ảnh những giáo lý khác của đạo Bụt, nó không được đi ngược với những giáo lý khác trong đạo Bụt. Trên thế giới có rất nhiều nguồn tư tưởng nói đến tính vô thường. Ví dụ khi đức Khổng Tử đứng trên bờ sông và nhìn xuống nước, ngài cũng thấy dòng sông là vô thường: ‘‘Thệ giả như tư phù, bất xả trú dạ?’’ nghĩa là ‘‘trôi chảy hoài, ngày đêm không thôi, như thế này ư?’’ Như vậy đạo Khổng cũng dạy về vô thường. Triết học Tây phương cũng có cái thấy về vô thường. Heraclite nói: ‘‘Không ai có thể tắm hai lần trong một dòng sông’’. Chúng ta xuống sông bơi một lần rồi đi lên, khi xuống lại lần thứ hai thì dòng sông đã khác rồi. Tóm lại, các bậc hiền giả nhiều đời đã nhìn thấy thế giới hiện tượng là vô thường.

Nhưng vô thường không tất yếu đưa tới khổ, như lý luận cho rằng hễ vô thường là khổ. Nếu xét kỹ thì vô thường có thể đem lại niềm vui. Vô thường nghĩa là sự vật không duy trì được tính chất đồng nhất bất biến, chúng luôn luôn thay đổi. Như vậy vô thường là đặc tính đích thực của sự sống. Nếu không có vô thường thì không có sự sống. Ví dụ như một hạt ngô. Nếu hạt ngô thường tại thì nó không bao giờ có thể trở thành cây ngô được cả. Nếu sự vật thường tồn thì không có sự sống. Một Phật tử người Anh học Phật và thực tập Phật pháp, về nhà nói chuyện giáo lý cho gia đình nghe. Anh đã nói theo lý luận rằng vì sự vật vô thường (impermanent) cho nên mình khổ. Đứa con gái hỏi: ‘‘Ba nói cái gì lạ vậy? Nếu mà mọi sự vật cứ mãi mãi không thay đổi, con làm sao lớn lên thành thiếu nữ được?’’

Sự thật đơn giản như vậy. Nếu sự vật không vô thường thì em bé không bao giờ trở thành cô thiếu nữ. Cô bé tuy không học kinh sách nhưng cô hiểu Bụt nhiều hơn là ông bố. Người cha thấy trong vô thường mùi vị của bi quan, nhưng chính cô bé thấy được rằng nhờ sự vật vô thường cho nên có sự sống. Nếu sự vật không vô thường thì chúng ta làm gì có hy vọng một ngày mai bệnh ta sẽ lành hoặc ta có thể thay đổi một chế độ độc tài? Cho nên vô thường đem lại niềm tin rằng ta có thể chuyển đổi được tình trạng, rằng ngày mai trời lại sáng. Do đó vô thường không nhất thiết phải là nguyên nhân của khổ.

Nguyên nhân của khổ là sự vật vô thường mà chúng ta tưởng là thường. Trong kinh Bảo Tích có câu chuyện con chó bị ném cục đá, nó chạy theo cục đá mà sủa, vì tưởng cục đá là nguyên do làm nó đau. Cũng vậy, vô thường không gây ra khổ, mà chính vì nhận thức sai lạc cho những gì vô thường là thường tại cho nên ta khổ. Khi có sức khỏe mà không ý thức được tính cách vô thường của thân thể thì ta có thể đánh mất sức khỏe. Ý thức về vô thường giúp ta biết bảo vệ sức khỏe, biết ăn, uống, làm việc một cách điều độ và giữ gìn thân thể của mình. Vậy ý thức về vô thường có thể đưa tới hạnh phúc. Nhiều người đã sống qua tuổi trẻ nhưng chưa bao giờ cảm thấy hạnh phúc trong tuổi trẻ của mình, vì họ không có ý thức về vô thường. Mình tưởng như mình sẽ trẻ hoài, ai ngờ ngoảnh qua ngoảnh lại vài cái, tuổi trẻ đã đi đâu mất.

Cho nên thực tập vô thường quán giúp cho ta biết quý trọng từng giờ phút của sự sống. Và khi ta đã biết quý trọng từng giờ phút của sự sống, thì ta cũng biết chăm sóc và vun tƯới, để nuôi dưỡng những gì hiện ta đang là và đang có. Tuổi trẻ như thế mà người thương cũng thế. Ý thức được rằng mình có một người thương hay mình đang thương một người, ta đang có hạnh phúc. Nhưng ta phải biết rằng tình thương đó cũng vô thường. Nếu người đang thương yêu không nuôi dưỡng hiểu biết và tình thương của chính mình thì tình thương cũng mòn mỏi rồi tiêu diệt. Nếu người được thương yêu không biết bảo trì tính dễ thương và tươi tắn của mình thì cũng sẽ đánh mất lòng thương yêu.

Cho nên có ý thức về tính vô thường ta biết sống từng giờ, từng phút trong chánh niệm, biết duy trì lòng thương của ta, và tính chất đáng yêu của ta. Khi hai người kết hôn và về ở với nhau, họ có thể có tình thương nồng nhiệt trong những năm đầu. Nhưng nếu họ không sống trong ý thức vô thường, cứ nghĩ rằng mình luôn luôn là mình, người kia luôn luôn là người kia, thì hạnh phúc sẽ không bền vững được. Sống không có ý thức về vô thường, sống không chánh niệm, không biết bồi đắp tình thương, thì có thể một ngày kia, người ta sẽ ‘‘anh đi đường anh, tôi đường tôi, tình nghĩa đôi ta có thế thôi.’’

Thành ra vô thường quán rất quan trọng. Thứ nhất, nó cho ta biết cái gì đang có trong giây phút hiện tại là quý giá và đẹp đẽ, ta phải trân trọng, bảo tồn cho ta và cho những người xung quanh ta. Thứ hai, khi thấy tình trạng hiện tại không được như ý thì ta cũng không chán nản. Sự vật vô thường, nếu ta biết cách chuyển hóa thì ngày mai tình trạng sẽ thay đổi. Trước ngày bức tường Bá Linh đổ, rất nhiều người cứ nghĩ rằng bức tường Bá Linh sẽ ở đó cả ngàn năm. Đến khi bức tường Bá Linh đổ họ mới thấy rằng bức tường Bá Linh cũng vô thường. Và sau bức tường Bá Linh còn nhiều thứ cũng sẽ đổ theo, vì niềm tin vào một chủ thuyết cũng đã sụp đổ. Trong đời sống hàng ngày của mỗi người tình trạng cũng vậy. Ta có niềm tin vào một người, hay ta được một người tin, nhưng nếu ta không thực tập quán chiếu vô thường, không thực tập sống chánh niệm, thì niềm tin đó có thể tan rã. Phải nhìn vào sự sống trong từng giây từng phút và dùng ánh sáng chánh niệm chiếu rọi để thấy được tính vô thường, để thấy mình đang tiến hay lùi trong sự xây dựng hạnh phúc và an lạc. Nếu vững chãi và an lạc đang giảm sút thì ta phải tìm biết những nguyên do để kịp thời cứu chữa và thay đổi.

!! Vô thường là vô ngã

Hiểu vô thường trong tinh thần tương tức và tương nhập thì ta mới hiểu đúng giáo lý đạo Bụt. Vô thường cũng chỉ là vô ngã đứng về phương diện thời gian mà nói, nhưng hai tính đó đích thực là một. Ngã tức là tính đồng nhất. Vô thường là tính thay đổi. Khi một cái gì thay đổi, nó không còn tính cách đồng nhất của nó, do đó nó vô ngã. Phải hiểu vô thường là vô ngã thì ta mới thực sự hiểu vô thường được. Nếu nói vô thường là bước thứ nhất, sau khi học bước đó rồi thì mới đi bước thứ hai, mới hiểu vô ngã, nói vậy là chưa hiểu đạo Bụt. Theo đạo Bụt, một giáo pháp trùm chứa tất cả các giáo pháp khác. Nhất pháp nhập nhất thiết pháp, nhất thiết pháp nhập nhất pháp, one dharma enters all dharmas, all dharmas enter one dharma, đó là lời Kinh Hoa Nghiêm. Nhiều giòng tư tưởng khác cũng nói tới vô thường. Nhưng giáo lý vô thường trong đạo Bụt thật đặc biệt vì ở các truyền thống khác ít ai nói tới tính vô ngã.

Vô thường là một chiếc chìa khóa Bụt trao cho chúng ta để mở cửa thực tại. Bụt dạy chúng ta phải sử dụng cái chìa khóa đó để đi vào thực tại. Nếu chỉ đàm luận, khảo cứu về vô thường mà không thực tập vô thường quán trong đời sống hàng ngày thì chúng ta không sử dụng chiếc chìa khóa như Bụt ước muốn. Thay vì dùng chiếc chìa khóa để mở cửa thực tại thì chúng ta đem cái chìa khóa đó đặt trên bàn thờ và sì sụp lạy. Dù ta có lạy mỗi ngày một trăm lẻ tám lạy, thì cái chìa khóa đó cũng không có ích lợi gì cả. Cho nên vô thường ở đây không phải là một lý thuyết, một triết học, mà là một phép sống, gọi là vô thường quán (contemplation on impermanence). Mà quán vô thường thì quán vào những lúc nào? Chúng ta quán trong khi ăn cơm, trong khi rửa chén, trong khi giặt áo, trong khi tiếp xử với bạn bè với anh chị em, với bản thân và vạn vật quanh ta.

Bàn tay cầm chiếc chìa khóa vô thường là chánh niệm. Dùng hơi thở chánh niệm ta tiếp xúc với mọi sự vật, quán chiếu và thấy được tính vô thường của mọi sự vật. Quán chiếu như vậy không phải là để than thở rằng vạn vật là vô thường, không có gì đáng lưu tâm, thôi đừng làm gì nữa cho khỏe. Đó là một thái độ sai lầm rất lớn về vô thường. Vô thường là một cơ hội cho sự sống và cho sự chuyển hóa. Nhờ vô thường mà chúng ta có thể thực hiện được mọi tự do. Chúng ta có thể làm cho khổ trở thành vui, chúng ta có thể thay đổi tình trạng xã hội. Đạo đế được thiết lập trên căn bản vô thường. Đạo đế là để chuyển hóa sự vật, nếu sự vật không vô thường thì đạo đế dùng để làm gì? Cho nên vô thường không phải là những nốt nhạc sầu thảm, tiêu cực. Nếu anh, nếu chị nghĩ tới vô thường như những điệu nhạc sầu thảm, thì anh và chị hoàn toàn không hiểu giáo lý vô thường. Rất ít người học Phật chịu thấy điều đó. Trong khi ấy giáo lý rất minh bạch. Chúng ta mới học quán chiếu mà đã thấy được rằng vô thường đích là vô ngã. Không vật gì có tính đồng nhất; cái này liên hệ tới cái kia. Từ lúc ta bước vào thiền đường này gần một tiếng đồng hồ đã đi qua, và ta đã thay đổi! Đứng về phương diện cơ thể và đứng về phương diện tâm thức, ta đã thay đổi. Không khí và máu huyết trong ta, các tế bào trong ta đã thay đổi. Ta không giữ được tính đồng nhất của ta trong hai mươi phút liên tiếp. Cho nên ta vô ngã, và ta biết rằng ta được tạo thành bằng những yếu tố không phải là ta. Hãy nhìn cây ti-dơn ngoài kia, ta cũng được cấu tạo thành bằng chất liệu của cây đó. Nếu không có cây ti-dơn ở đó thì ta đã khác. Cây ấy đã tặng cho ta rất nhiều niềm vui. Cây đó đã nuôi dưỡng ta trong mười mấy năm nay. Nếu không có sư anh, sư chị, sư cô và sư chú thì ta sẽ khác, và như vậy sư anh, sư chị, các sư cô và sư chú đã nuôi dưỡng ta, đã làm cho ta khác. Vì vậy ta biết ta được làm bằng bao nhiêu yếu tố không phải là ta (the self is made of non-self elements). Đó là vô ngã. Và ta phải thấy và biết rằng hạnh phúc, an lạc của ta tùy thuộc nơi những yếu tố không phải ta. Sư em hạnh phúc được là nhờ sư chị. Sư chị hạnh phúc được là nhờ sư em. Nếu một trong hai người không có hạnh phúc thì người kia cũng khó có hạnh phúc. Vì vậy hạnh phúc không phải là vấn đề của mỗi cá nhân. Điều này là tuệ giác phát xuất từ vô thường quán hay vô ngã quán. Cho nên ta phải tu tập như thế nào để cho cha mình, mẹ mình và những người quanh mình đừng đau khổ, thì lúc đó ta mới có hạnh phúc.

Đi tìm hạnh phúc riêng tư là điều sai lầm phải tránh. ‘‘Tôi phải bỏ nhà đi, tôi phải bỏ cha, bỏ mẹ, để đi tìm tự do, để đi tìm bản ngã và hạnh phúc cá nhân của tôi, tôi chỉ còn cách đó.’’ Nói vậy không đúng. Vì tuy muốn bỏ đi nhưng không ai thật sự ra đi được một mình! Trong tâm tư ta sẽ mang theo hết các thứ đi theo mà ta không biết. Dầu có trốn đi biệt tích thì tất cả vẫn đeo theo bên ta. Tàng thức của ta chuyên chở theo tất cả, không bỏ sót lại một cái gì. Cho nên vô thường quán hay vô ngã quán giúp ta thấy được cách ta sống, cách ta hành xử như thế nào trong đời sống hàng ngày, để ta có thể thực sự xây dựng an lạc và hạnh phúc.

Vô thường và vô ngã là một. Thực tập quán vô thường thâm sâu thì tự nhiên ta thấy được lẽ vô ngã. Thực tập vô ngã cho sâu sắc thì tự nhiên ta thấy được lẽ vô thường. Đó là tính cách mầu nhiệm của nguyên lý tương tức tương nhập trong đạo Bụt. Giáo lý Duyên sinh (interdependence, co-production) trong đạo Bụt giải bày sự hình thành của các hiện tượng nương vào nhau mà có mặt. Cái này có thì cái kia có, cái này không thì cái kia không. Cái này sinh thì cái kia sinh, cái này diệt vì cái kia diệt. Cái này như thế này vì cái kia như thế kia. Duyên sinh cũng là vô ngã và vô thường, nhìn từ một góc cạnh khác. Hiểu vô thường là duyên sinh thì mới là hiểu vô thường đúng mức.

Quán sát một hiện tượng nào đó trong thời gian và không gian, chúng ta có thể tưởng rằng nó bắt đầu ở đây và chấm dứt ở kia. Nghĩ như vậy là sai. Vì mỗi hiện tượng trong không gian và thời gian luôn luôn xúc tiếp và trao đổi với bên ngoài, với môi trường quanh nó. Hiện tượng trao đổi này xảy ra trong từng giây từng phút. Đó gọi là duyên sinh. Vì vậy vô thường cũng chỉ là duyên sinh mà thôi. Tu học, mỗi ngày mở tấm lòng ta ra cho những điều kiện tốt đi vào nuôi dưỡng và chuyển hóa cho ta thành ra tốt đẹp hơn, đó là thuận theo tính duyên sinh. Còn nếu ta khép cái vỏ sò của mình lại kín bưng, tức là ta đã không thấy tính duyên sinh của chính mình.

Thay vì nói vô thường, vô ngã, duyên sinh người ta có thể nói đến Không. Không trước hết là không có đồng nhất tính, nghĩa là vô ngã. Nếu Không có nghĩa là Vô ngã, thì Không cũng có nghĩa là duyên sinh.

!! Không, giả và trung

Trong Đại Trí Độ Luận có một bài kệ rất hay mà thầy Trí Giả thuộc phái Thiên Thai đã sử dụng để lập nên pháp môn tam quán là Không, Giả, và Trung. Bài kệ như sau:

<<<
Nhân duyên sở sinh pháp  <br>
Ngã thuyết tức thị không  <br>
Diệc danh vi giả danh  <br>
Diệc danh trung đạo nghĩa.
<<<

Dịch:

<<<
Các pháp do duyên sinh  <br>
Tôi gọi chúng là không  <br>
Cũng gọi là giả danh  <br>
Cũng gọi là trung đạo
<<<

Chúng ta hãy tìm hiểu từng câu. Nhân duyên sở sinh pháp tức là những hiện tượng, do nhân và duyên sinh ra (all phenomena that are produced by conditions). Ngã thuyết tức thị không nghĩa là tôi tuyến bố rằng chúng đều là không. Duyên sinh nghĩa là không, đó là lời thầy Long Thọ. Nhưng cái không này không phải là ngược lại với cái có. Chữ không này chỉ có nghĩa là duyên sinh, là vô ngã và vô thường. Câu thứ ba: Diệc danh vi giả danh. Giả danh là có một cái tên, nhưng chỉ là cái tên giả. Một cái danh để gọi của một sự vật mà ta tưởng là không thay đổi là thường là ngã. Trong khi đó sự thực thay đổi từng giờ, từng phút. Cho nên ta nói cái tên ấy là giả danh, vì cái danh bất biến không gọi đúng được cái thực tại luôn thay đổi. Hơn nữa gọi tên một sự vật là giới hạn sự vật đó trong thời gian và không gian, cắt nó ra khỏi ngoại cảnh, che lấp mất những liên hệ giữa nó với những hiện tượng khác trong vũ trụ.

Khi chúng ta gọi tên một đóa hoa, tên gọi đó phân cách rõ ràng bông hoa và tất cả các thứ không phải là bông hoa. Bông hoa không thể nào là gốc cây được. Bông hoa không thể nào là cÒn gió hay là đám mây được. Nhưng sự thật thì đóa hoa cũng đồng thời là gốc cây, là đám mây, là mặt trời, là trái đất. Vì đóa hoa là vô ngã, vì đóa hoa là vô thường, vì nó là duyên sinh vì hoa là không, cho nên khi ta dùng danh từ hoa để gọi nó là ta đã bắt đầu sự sai lầm. Vì vậy mỗi tên gọi là một giả danh. Mọi sự vật là một giả danh.

Những điều trên có thể được diễn tả bằng ý niệm trung đạo. Trung đạo tức là không phải có mà cũng không phải không. Ý niệm về không cốt để giúp ta thoát khỏi vọng tưởng là có những thực thể riêng biệt, nhưng chúng ta cũng dễ bị vướng ngay vào ý niệm không này. Đưa ra ý niệm về trung đạo là để cho ta thoát ra khỏi cả ý niệm về không lẫn về có. Trung đạo nghĩa là không có cũng không không. Ở một thiền viện kia có treo bốn chữ hữu vô nhị vong, tức là cả hữu cả vô đều biến mất. Siêu việt có và không thì mới đạt tới trung đạo.

Đạo Bụt có khi nói thế giới hiện tượng là vô thường, có khi nói là vô ngã, có khi gọi là duyên sinh, có khi gọi là không. Và trung đạo xét cho cùng cũng chỉ là không, là duyên sinh, là vô ngã, là vô thường. Hiểu vô thường là trung đạo tức là hiểu vô thường khá sâu sắc. Và chúng ta lại còn nhận thức về tương tức. Tương tức nghĩa là cái này và cái kia là một. Bông hoa là mặt trời, bông hoa hiện hữu cùng với mặt trời. Tương tức như vậy cũng chỉ là duyên sinh thôi. Vậy tương tức cũng là trung đạo, là vô ngã, là không và là vô thường.

Vô thường, hay vô ngã, hay duyên sinh, hay là không, hay là tương tức, tất cả đều là những chìa khóa để mở cửa thực tại. Mở cửa thực tại trong mỗi giây mỗi phút bằng sự quán chiếu. Nếu không có niệm và không có định thì cả chùm chìa khóa sẽ cũng không được sử dụng. Trong vô minh, trong ảo tưởng thường và ngã, chúng ta khổ đau. Bụt đưa chìa khóa vô thường và vô ngã cho chúng ta quán chiếu để chúng ta phá tan địa ngục đau khổ.

!! Niết bàn và vô tác

Khi dùng chìa khóa vô thường và vô ngã để mở cửa thực tại thì chúng ta có cơ hội tiếp xúc được với bản thân thực tại, gọi là niết bàn. Niết bàn có mặt ngay bây giờ mà không phải là một đối tượng có thể tìm kiếm ở tương lai. Cây đèn này, chiếc bình này, hay bông hoa này đều có tính niết bàn. Nó có tính vô thường, tính vô ngã và tính niết bàn cùng một lúc. Giống như là một đợt sóng trên đại dương. Đợt sóng trên đại dương thuộc về thế giới hiện tượng. Trong thế giới của sóng có cao, có thấp, có lên, có xuống, có bắt đầu, có chung cuộc, có đợt sóng này và đợt sóng kia, có ngã và phi ngã. Nhưng nhìn vào nước ta có thể nhận ra được một tính khác của sóng : nước vốn không cao, không thấp, không sinh, không diệt, không có đợt này đợt kia. Mà sóng không cần biến đi rồi thì mới thành nước. Sóng là nước ngay tự bây giờ và ở đây. Vì vậy chúng ta thấy niết bàn ở ngay trong hiện tại. Chúng ta đang an trú ở trong niết bàn. Kinh Pháp Hoa nói : các pháp từ xưa nay vẫn an trú trong niết bàn (chư pháp tùng bản lai, thường tự tịch diệt tướng)

Bụt đã giao cho chúng ta chiếc chìa khóa quán chiếu vô thường và vô ngã. Càng tiếp xúc với thực tại vô thường và vô ngã thì ta càng tiếp xúc sâu sắc với niết bàn, đạt tới niềm an lạc không sợ hãi, gọi là vô úy. Nếu chúng ta đang lo sợ về cái chết, đó là vì ta đang còn vọng tưởng dựa trên ý niệm về thường và ngã. Chúng ta khổ vì vô minh, nghĩ thực tại là thường, là ngã. Dùng chánh niệm và chánh định sống trong ý thức về vô thường và vô ngã, ta đạt tới niết bàn, đi tới tình trạng vô úy và an lạc. Chúng ta không cần phải chạy đi tìm hạnh phúc và an lạc ở đâu nữa, đó là giáo lý niết bàn (You are already where you want to go.)

Trong đạo Bụt có giáo lý vô tác (nothing to be done), có khi gọi là vô nguyện. Vô nguyện tức là không còn muốn gì nữa hết không có dự án nào cần được thực hiện nữa hết, vì tất cả đã được hoàn thành sẵn rồi. Trong bài thơ ‘‘Bướm bay vườn cải hoa vàng’’, tôi có viết một câu mà chính lúc viết tôi cũng không có ý thức rõ rệt:

<<<
Công trình xây dựng ngàn đời <br>
Nhưng công trình em ơi, đã được ngàn đời hoàn tất.
<<<

Sự tu học thấm vào con người ta, cho đến khi ta viết ra một câu thơ thì ta viết tự nhiên như vậy thôi, không có chủ định thuyết pháp, cũng không có chủ đích nói về thế giới hiện tượng và thế giới bản thể.

<<<
Vườn cải hoa vàng, chính mắt tôi vừa thấy sáng qua. <br>
Tôi không ngủ mơ đâu, <br>
Ngày hôm nay đẹp lắm, thật mà <br>
Em không về chơi trò bắt tìm nơi quá khứ <br>
Chúng mình còn đây, hôm nay, và ngày mai nữa, <br>
Đến đây <br>
Khi khát ta cùng uống ở một giếng nước thơm trong. <br>
Ai nói cho em nghe rằng Thượng Đế đã bằng lòng <br>
cho con người khổ đau đứng dậy hợp tác cùng người? <br>
Chúng ta đã từng nắm tay nhau từ muôn vạn kiếp, <br>
Khổ đau vì không tự biết là lá là hoa <br>
Em hát ca đi. Bông cúc cười theo em bên hàng dậu, <br>
Đừng bắt chúng tôi nhúng hai tay vào vôi cát, <br>
Những ngôi sao trời không bao giờ xây ngục thất cho chính mình.
<<<

Những điều bài thơ nói ra, nếu đọc lại với nhận thức về tam pháp ấn ta sẽ thấy hàm chứa ý tưởng ‘‘vạn pháp an trú trong niết bàn’’. Ta không cần đi tìm, không cần phải thực hiện gì cả. Khi trở về tiếp xúc được với bản thể và với tự tánh của chính ta thì tự nhiên ta đạt tới an lạc.

Có môn học gọi là Eschastology, có thể dịch là Mạt Thế Luận, nghiên cứu về chung cuộc của vũ trụ, của con người (the final destination of man and of the cosmos). Trong những truyền thống tôn giáo khác như CÒ Đốc giáo, môn này rất được quan tâm. Người ta giả định thời gian như một đường thẳng. Thời gian và không gian làm khung cho tất cả mọi thứ, như vậy thì mỗi vật và mỗi người đều có một chung cuộc. Nhưng đứng trên quan điểm Tam Pháp Ấn, chúng ta thấy rằng ý niệm về thời gian và không gian chỉ là những sản phẩm của trí óc, của vọng tưởng. Niết bàn mà chúng ta theo đuổi, nó có ngay trong hiện tại, bây giờ và ở đây. Thành ra danh từ ‘‘nhập niết bàn’’ cũng dễ gây hiểu lầm. Chúng ta ai cũng đang ở trong niết bàn mà không biết, đi tìm ở đâu, nhập vào đâu nữa? Vô tác, hay vô nguyện nghĩa là không có đối tượng để chạy đuổi theo. Vô tác là Apranihita, nghĩa là không đặt phía trước mình một đối tượng để chạy theo. Tiếng Pháp là Non-poursuite, tiếng Anh là Wishlessness.

Trong đạo Bụt lại có ý niệm vô đắc (non-obtaintion: nothing to be obtained). Có thể nói một cách đơn giản là ta đã là cái gì mà ta muốn trở thành rồi (you are already what you want to become). Đó là tinh thần vô tác, vô nguyện, vô đắc, và đó là giáo lý niết bàn. Là một cđau bé ba tuổi đã là tuyệt mơy rồi, anh không cần phải chờ thành một cđau sinh viên 22 tuổi. Là một chú sa di, đã là mầu nhiệm lắm rồi, sư chú không cần phải trở nên một vị thượng tọa thì mới an vui. Nghe thầy Minh Đức hỏi các sư cô ở chùa Đức Viên : ‘‘Sau khi làm đại đức, thì sẽ lên chức gì nữa?’’ Các sư cô nói: ‘‘Lên thượng tọa’’ Thầy lại hỏi: ‘‘Sau thượng tọa, thì lên làm gì?’’ Các sư cô nói: ‘‘Lên hòa thượng.’’ Rồi thầy hỏi: ‘‘Sau hòa thượng thì lên cấp gì nữa?’’ Các sư cô trả lời không được. Thầy đã trả lời : ‘‘Lên ngồi trên bàn thờ!’’

Làm sa di đã mầu nhiệm lắm rồi, đâu cần phải chờ đợi khi lên làm tỳ kheo? Làm tỳ kheo mầu nhiệm lắm rồi, không cần chờ lên giáo thọ. Mà giáo thọ cũng mầu nhiệm lắm rồi, không cần phải chờ làm đại giáo thọ hay hòa thượng. Khi trở về được và an trú trong bản tính niết bàn của mình thì hạnh phúc tràn đầy, ta không cần phải tìm kiếm gì nữa, đó là giáo lý vô tác, hay vô đắc.

Trong Kinh Tứ Thập Nhị Chương (Kinh Bốn Mươi Hai Đoạn), một trong những Kinh sớm nhất đã lưu nhập ở Việt Nam, có câu: ngã pháp hành vô hành hạnh, tu vô tu tu, chứng vô chứng chứng. Nghĩa là: Pháp của tôi là thực hành cái vô hành, tu tập cái vô tu, chứng ngộ cái vô chứng.

Đó là tu tập theo tinh thần vô tác.

!! Tám chữ tháo tung

Có thể nói rằng chánh kiến là cái thấy sâu sắc về vô thường, vô ngã và niết bàn. Đó là những chìa khóa để sử dụng trong đời sống hàng ngày. Sau khi đã nghe về ba pháp ấn rồi ta phải đi đứng, nói năng, ăn cơm, làm việc như thế nào để quán chiếu ba đặc tính đó của vạn vật. Sống và tu học hàng ngày như vậy thì đúng chánh pháp, còn nếu không thì ta sẽ phụ ơn Tam Bảo.

Chúng ta phải nhớ rằng vô thường và vô ngã, niết bàn là ba phép quán. Sống có niệm và có định trên ba pháp ấn này thì chúng ta sẽ chắc chắn có tuệ. Về chánh định, chúng ta nói đến tam tam muội, tức là không, vô tướng và vô tác. Không, vô tướng và vô tác, có khi được gọi là tam giải thoát môn (ba cánh cửa giải thoát). Chúng ta dùng hình ảnh chìa khóa vì hình ảnh này gợi ý mở cửa giải thoát. Sống tu học theo pháp môn này, ta an trú trong niệm về không, niệm về vô tướng, niệm về vô tác và cũng an trú trong định về không, định về vô tướng, và định về vô tác. Không, vô tướng và vô tác cũng là kết quả của sự quán chiếu về vô thường, vô ngã và niết bàn. Quán chiếu vô thường, vô ngã và niết bàn thì chúng ta cũng bắt đầu thấy và hiểu được không, vô tướng và vô tác. Thấy sâu vào bình diện hiện tượng là thấy được bình diện bản thể. Trong tướng chúng ta thấy tánh, trong tánh chúng ta thấy tướng.

Niết bàn (nirvana) nghĩa là sự tắt ngấm (extinction), sự vắng mặt(absence). Trước hết là sự tắt ngấm của các ý niệm, những ý niệm về thường về ngã. Rồi đến những ý niệm về sinh và diệt, về có, về không, về ta, về người, về một, về nhiều. Những ý niệm này đều căn cứ trên ý niệm về thường và về ngã mà được tạo tác và chúng cũng tạo tác ra bao nhiêu khổ đau. VƯợt thoát vô minh về thường và về ngã thì ta sẽ không còn sợ sinh và sợ diệt nữa. Cho nên niết bàn giúp chúng ta phá hết những ý niệm, bắt đầu phá từ ý niệm về thường và về ngã, nhờ tu tập quán chiếu hàng ngày.

Đạo Bụt nói tới tám ý niệm là sinh, diệt, thường, đoạn, tới, đi, nhiều, một. Tám phép quán chiếu để phá tan tám ý niệm đó gọi là bát bất. Đó là giáo lý trung đạo bát bất, tám cái chẳng phải của giáo lý trung đạo (the eight no of the middle way). Không sinh cũng không diệt, không thường cũng không đoạn, không tới cũng không đi, không một cũng không khác, đó là giáo lý bát bất. Có một người tới học với Trúc Lâm Đại Sĩ. Sau khi đã được Trúc Lâm Đại Sĩ giảng giải cho đủ rồi mà người ấy còn muốn hỏi thêm. Trúc Lâm mới đọc hai câu thơ:

Tám chữ tháo tung trao bạn hết còn chi đâu nữa để trình bày?

Tám chữ tháo tung là bát tự đả khai. Khi những khái niệm về thường, ngã, sinh, diệt đã bị phá tan thì niết bàn hiển lộ.

Niết bàn là sự tháo tung của tất cả những khái niệm đó, nhưng cũng là sự tháo gỡ của cả những khái niệm ngược lại. Chúng ta phải thấy rằng niết bàn không những là sự dập tắt của tất cả các ý niệm về thường, về ngã, mà còn là sự dập tắt của cả những ý niệm về vô thường và vô ngã nữa. Bụt cho chúng ta những giáo lý về tam pháp ấn nhưng nếu chúng ta tiếp nhận rồi ôm giữ chúng như những khái niệm cố định thì chúng ta đã làm sai lời Bụt dạy. Sử dụng vô thường như là một chiếc chìa khóa thì được, nhưng kẹt vào ý niệm vô thường thì cũng là sai lạc.

Vô thường cũng có hai mặt là thế gian và xuất thế gian. Ban đầu ta học hỏi về vô thường, nói về vô thường, thực tập về vô thường. Nhưng quán được vô thường rồi thì ta không nói về vô thường nữa, vì cái định vô thường của ta đã trở thành định vô thường của xuất thế gian (lokuttara). Khái niệm về thường ta cần vượt thoát, mà khái niệm về vô thường ta cũng cần phải vượt thoát. Khái niệm về ngã ta cần vượt thoát, mà khái niệm về vô ngã ta cũng cần phải vượt thoát. Khái niệm về duyên sinh cũng vậy, về không cũng vậy, về trung đạo cũng vậy, ta đều cần phải vượt thoát.

Kinh Bảo Tích có nói : Thà rằng bị kẹt vào ý niệm có còn hơn bị kẹt vào ý niệm không. Thuốc men nếu không được sử dụng một cách thông minh có thể gây tai hại. Bụt dạy trong Kinh Người Bắt Rắn là phải học hỏi và hành trì giáo lý một cách thông minh. Chấp về thường và về ngã gây khổ đau; nhưng chấp vô thường, vô ngã cũng có thể gây khổ đau. Nếu ta không biết sử dụng vô thường và vô ngã như những chiếc chìa khóa để quán chiếu thì các ý niệm vô thường và vô ngã có thể sẽ là trở ngại cho bước đường tu học. Cho nên niết bàn có nghĩa vượt thoát mọi khái niệm, cũng là vượt thoát những khổ đau và phiền não do các khái niệm ấy gây ra. Vì vậy ta gọi là niết bàn tịch diệt. Tịch diệt tức là sự vắng lặng. Vắng lặng gì? Sự vắng lặng của tất cả các cặp ý niệm: sinh- diệt, có – không, thường – vô thường, ngã – vô ngã.

Giả thử chúng ta đang ở trong một buổi họp. Chúng ta tranh luận với nhau bằng ngôn từ, bằng ý niệm, chúng ta mệt quá. Mở cửa bước ra ngoài, chúng ta thấy không khí mát mẻ, chim hót, thông reo, hoa nở. Có âm thanh, có hình ảnh, có đủ tất cả, nhưng ta rất an lạc, rất dễ chịu. Trong phòng họp có quá nhiều ý niệm lý luận, tranh chấp và sân si, nơi ấy ta không tìm thấy an lạc. Ngoài trời, chúng ta cũng nghe các âm thanh, cũng thấy những hình ảnh, cũng thấy những cảnh sinh hoạt, nhưng rất khác trong phòng họp. Ở ngoài có sự yên vắng, thảnh thơi. Niết bàn là như vậy. Niết bàn không có nghĩa là vắng mặt sự sống, vắng mặt thực tại. Niết bàn là có sự sống, có thực tại, nhưng sự sống và thực tại vượt thoát những khái niệm, vượt thoát những khổ đau do các khái niệm gây ra. Niết bàn là ở đây, niết bàn là bây giờ, đó gọi là hiện pháp niết bàn (drstà-dharma nirvana).
 ! Bài 03 Pháp thoại đầu

Hôm nay là ngày 28 tháng 11 năm 1993, ở tại Xóm Hạ, chúng ta học về Tứ Đế, tức là bốn sự thật. Tứ đế có khi gọi là tứ diệu đế hay là tứ thánh đế, tứ chân đế. Chữ PHạn satya là Đế. Aryasatya là chân đế hay là thánh đế hoặc diệu đế. Chữ arya nghĩa là cao quý. Chữ Đế trong chữ Hán gồm chữ ngôn, lời nói, và chữ đế nghĩa là vua. Diệu đế có nghĩa là sự thật mầu nhiệm. Tứ Diệu Đế (catvary aryasatyani) là bốn sự thật rất quan trọng, mầu nhiệm và chân thật. Tứ Diệu Đế là đề tài giảng pháp chính thức đầu tiên của Bụt sau khi thành đạo mà nay còn chép lại. Và chúng ta sẽ thấy, đó là những điểm căn bản của đạo Bụt.

!! Pháp thoại đầu

Sau khi thành đạo dưới gốc cây bồ đề, Bụt nghĩ đến chuyện đi giảng dạy. Vì Ngài biết việc tu hành không nhắm giải thoát cho riêng mình, mà còn giải thoát cho mọi người và những loài chúng sinh khác. Bụt lưu lại nơi cây bồ đề một thời gian khá lâu, nhiều tuần lễ, để chứng nghiệm trạng thái an lạc, tự do của người đạt đạo. Đồng thời Ngài cũng nghĩ cách mang tuệ giác của mình hiến tặng cho mọi người, trong đó sẽ có cha mẹ, có những người thân, và những người đang đau khổ hoặc sẽ đau khổ. Trong thời gian đó Bụt ở trong Xóm Uruvela, tiếp xúc với người dân trong Xóm, người lớn cũng như trẻ con. Ngài chia sẻ những điều chứng ngộ của mình với các thí chủ nuôi Ngài trong những tuần lễ đó.

Bài pháp thoại chính thức đầu tiên Ngài đã giảng ở một khu vườn gọi là Vườn Nai, Lộc Uyển, phía bắc thành Ba la nại (Benares). Ngài giảng cho năm người bạn tu khổ hạnh cũ của Ngài, trong đó có Kiều Trần Như, Kondanna. Lúc đầu Ngài muốn tìm gặp hai vị thầy cũ của mình. Vì Ngài nghĩ nếu gặp những vị thầy từng dạy mình về tứ thiền, tứ vô sắc định, thì có thể giúp họ đạt tới quả vị A La Hán rất nhanh chóng. Nhưng sau khi thặm hỏi, Ngài biết cả hai vị thầy đều viên tịch, cho nên Ngài nghĩ tới năm người bạn đã cùng tu khổ hạnh với Ngài trước đây. Trước đây khi thấy Ngài bỏ lối tu khổ hạnh và bắt đầu ăn uống trở lại bình thường thì họ rất buồn. Họ cho là Ngài đã thoái chí, bỏ cuộc, nên họ lìa bỏ Ngài mà đi. Nghĩ có thể giúp họ được nên Ngài vượt sông lên miền Bắc tìm tới Vườn Nai. Khi Bụt tới, năm người bạn cũ không muốn gặp. ‘‘Chính Siddhatta này trước đã bỏ cuộc, bây giờ còn tới đây làm gì?’’ Vì thế họ không chào đón, niềm nở như ngày xưa. Nhưng lúc nhìn thấy dáng điệu, phong thái của Ngài khi bước vào, họ không thể tiếp tục thờ ơ được. Rồi người nào cũng tự động ra tiếp đón vồn vã. Người thì lấy nước cho Ngài rửa chân, người thì cầm giúp bình bát cho Ngài, người thì đỡ áo cho Ngài, và mọi người ngồi xuống chung quanh Ngài. Lúc đó Ngài mới nói rằng:

– Này các bạn, tôi sẽ dạy cho các bạn đạo giải thoát. Năm người bạn hỏi: – Siddhatta, làm sao anh có thể dạy đạo cho chúng tôi trong khi anh đã bỏ lỡ dở đời tu học? Bụt nói: – Tôi đã giác ngộ đạo giải thoát và tôi có thể dạy lại cho các bạn. Những người kia hỏi lại để biết chắc Bụt đã chứng ngộ thật hay không, thì Bụt nói: – Này các bạn, các bạn biết tôi rất nhiều, tôi đã từng nói dối các bạn lần nào chưa? – Chưa, Siddhatta chưa bao giờ nói dối chúng tôi cả. – Ngày xưa đã bao giờ tôi nói là tôi giác ngộ chưa? Bây giờ tôi nói tôi đã đạt đạo, tôi đã giác ngộ, và tôi sẽ dạy cho các bạn. Nghe xong câu đó tất cả năm người bạn cũ đều quỳ xuống sẵn sàng nghe lời Bụt.

Bài giảng này được coi là bài thuyết pháp đầu tiên, nói về tứ diệu đế, chép trong Chuyển Pháp Luân Kinh, Đại Chuyển Pháp Luân Kinh hay Tam Chuyển Pháp Luân Kinh. Pháp luân là cái bánh xe giáo pháp, và chuyển pháp luân có nghĩa là bắt đầu quay bánh xe pháp. Bánh xe giáo pháp vốn có sẵn rồi nhưng cần phải chụyển. Bụt nói bài thuyết pháp đầu tiên, giống như hành động nắm lấy bánh xe giáo pháp mà xoay mạnh, và từ giờ phút đó thì bánh xe pháp tiếp tục quay. Cho đến ngày hôm nay bánh xe pháp vẫn quay. Và những người học trò của Bụt có bổn phận phải giúp cho bánh xe pháp đó tiếp tục xoay chuyển. Pháp Luân Thường Chuyển nghĩa là bánh xe Pháp luôn luôn chuyển động.

!! Bốn sự thât

Kinh này có nhiều bản, bằng tiếng Pali, chữ Hán, chữ PHạn. Một trong những bản chữ Hán là Phật Thuyết Tam Chuyển Pháp Luân Kinh, kinh số 110 trong Đại Tạng Đại Chánh. Trong Đại Tạng Đại Chánh có thể đọc thêm kinh số 109 tức là Chuyển Pháp Luân Kinh và Kinh 99 tức là Kinh Tạp A Hàm. Trong Tạp A Hàm thì kinh thứ 379 là kinh nói về Tứ đế. Trong tạng Pali, ta có thể đọc Samyutta Nikaya số 420.

Chuyển Pháp Luân Kinh là Dharma-cakra pravartana (Pravartana tức là chuyển, Dharma-cakra là bánh xe Pháp). Kinh này nói về bốn sự thật mầu nhiệm, bốn sự thật cao quý. Tiếng Anh gọi là The Four Noble Truths. Trong Kinh này Bụt nói về bốn sự thật là khổ, tập, diệt và đạo (duhkha, samudaya, nirodha, marga). Khổ tức là sự thật thứ nhất mà chúng ta phải nhận ra, phải tìm hiểu. Tập tức là những nguyên do đưa tới khổ, những thức ăn vật chất, tinh thần đã được tiêu thụ và đã đưa tới đau khổ. Đó là sự thật thứ hai cần phải nhận diện, cần phải chuyển hóa. Sự thật thứ ba là Diệt. Diệt ở đây là sự vắng mặt, sự trừ diệt của các nguyên do đã đưa tới khổ. Và sự thật thứ tư là Đạo. đạo tức là con đường, là thức ăn, là các phương pháp thực tập dẫn tới cái sự vắng mặt của những nguyên nhân gây khổ. Theo văn pháp chữ Hán, Khổ là sự thật thứ nhứt, duhkha. Sự thật thứ hai là Tập, nói cho đủ là khổ-tập. Khổ-tập tức là những nguyên do, những gốc rễ, những thực phẩm đã tập thành, dẫn tới đau khổ, PHạn ngữ là duhkha samudaya (the making of the suffering). Và Diệt là khổ-tập-diệt, tức là sự vắng mặt, sự tiêu diệt của những nguyên do đưa tới khổ đau. Và sự thật thứ tư là Đạo, con đường. Con đường nào? Con đường đưa tới sự tiêu diệt của những nguyên nhân gây đau khổ, nói đầy đủ theo văn pháp Hán là khổ-tập-diệt-ữạo. Vậy muốn nói cho đầy đủ, ta nói: Sự thật thứ nhứt là khổ. Sự thật thứ hai là khổ-tập. Sự thật thứ ba là khổ-tập-diệt. Sự thật thứ tư là khổ-tập-diệt-ữạo.

!! Bốn sự thật tương tức

Tiếng PHạn cũng có thể viết như vậy: duhkha, duhkha samudaya, duhkha samudaya nirodha, duhkha samudaya nirodha marga. Khi trình bày như vậy chúng ta thấy được tính nhất quán của tứ diệu đế, tức là bốn sự thật liên hệ với nhau. đạo có liên hệ tới khổ. Mà nếu sự thật về đạo không liên hệ tới sự thật về khổ thì đó không phải là cái đạo mà Bụt đã nói. Dầu hay cách mấy nhưng nếu không có khả năng chuyển hóa đau khổ thì đạo đó ta không cần. Mà hễ đạo liên hệ tới khổ thì tất liên hệ tới khổ-tập, tức là những nguyên do gây ra đau khổ. Và nếu liên hệ tới khổ-tập thì tất liên hệ tới khổ-tập-diệt, tức là ước muốn làm cho khổ đau vắng mặt. Muốn cho khổ đau vắng mặt thì những nguyên do của khổ đau phải vắng mặt. Vì vậy Diệt có nghĩa rõ ràng là sự vắng mặt của khổ đau và của những nguyên do đưa tới khổ đau. Muốn hết khổ mà cứ tiếp tục duy trì những nguyên nhân gây khổ thì làm sao khổ hết được? Cho nên sự tiêu diệt, sự vắng mặt của những nguyên do gây đau khổ sẽ đưa tới sự vắng mặt của khổ. Và Bụt dạy có một con đường, có các phương pháp dẫn đến sự vắng mặt của những nguyên nhân tạo khổ đau, gọi là Đạo. Do đó, pháp thoại về Tứ Đế, về Chuyển Pháp Luân, là một tiếng nói của hy vọng, của tinh thần lạc quan. Giáo lý Tứ Diệu Đế xác nhận sự có mặt của đau khổ, nhưng đồng thời xác nhận sự có mặt của an lạc, xác nhận khả năng chuyển hóa đau khổ để dẫn tới hạnh phúc. Vì sự vắng mặt của khổ đau chỉ có nghĩa là sự có mặt của an lạc mà thôi. Hai diệu đế Khổ, Tập miêu tả tình trạng hiện thực; hai diệu đế Diệt, đạo miêu tả tình trạng lý tưởng, niềm hy vọng cho ta hướng tới. Sự thật về Khổ đối chiếu với sự thật về Diệt, tức là an lạc, sự vắng mặt của khổ. Tiếp theo là Tập, nguyên do đưa tới khổ, đối chiếu với Đạo, con đường thực tập giáo lý đưa tới diệt khổ và khởi sinh an lạc. Trong Tứ Đế có hai cặp nhân quả. Sự thật thứ hai là nhân của sự thật thứ nhứt. Sự thật thứ tư là nhân của sự thật thứ ba. Ngay trong bài pháp thoại đầu tiên, chúng ta đã thấy giáo lý đạo Bụt tích cực và lạc quan, đầy tin tưởng vào khả năng giải thoát của con người.

Bài pháp đầu tiên này nói về bốn sự thật mầu nhiệm và con đường của tám sự hành trì chân chính. Cho nên bài thuyết pháp này đã chứa đựng những tinh ba tuệ giác của Phật giáo rồi, không cần đợi tới hàng trăm hàng ngàn bộ Kinh mà Bụt nói sau này. Và trong những kinh kế tiếp, nói ra trong suốt 45 năm hành đạo của Bụt, tứ diệu đế vẫn là nguyên tắc chỉ đạo cho sự tu học của giáo đoàn. Và con đường của tám sự hành trì chân chánh, bát chánh đạo, vẫn là con đường căn bản cho việc tu tập. Do đó kinh này chúng ta phải học rất kỹ lưỡng.

!! Trung đạo

Trong Kinh Chuyển Pháp Luân, chúng ta cần nhấn mạnh vài điểm. Thứ nhất là Bụt đã nêu ra giáo lý Trung đạo. Đây là một điểm cần thiết để gỡ rối cho năm đệ tử đầu tiên thoát khỏi quan niệm cố hữu là phải sống khổ hạnh thì mới tu tập đàng hoàng được. Trước họ vẫn nghĩ người nào không khổ hạnh, người nào tu mà còn vui cười là không tu đàng hoàng. Bụt đã có kinh nghiệm về sự tu khổ hạnh với năm thầy kia rồi. Bụt thấy rằng cách sống ép xác và khổ hạnh đó không đưa tới đâu cả. Và Ngài biết rằng nếp suy tư của năm người bạn vẫn còn kẹt ở ý tưởng tự hành xác, nên Bụt muốn giúp họ thoát ra. Vì vậy khi mở đầu pháp thoại, Bụt nói rằng: ‘‘Này các thầy, có con đường trung đạo. Con đường trung đạo đó giúp chúng ta khỏi kẹt vào hai thái cực. Thái cực thứ nhất, đắm mình trong dục lạc, thì đạo nghiệp không bao giờ thành tựu được. Chỉ lo hưởng thụ các dục lạc, chôn lấp cuộc đời trong tiền tài, sắc dục, danh vọng, ăn uống và ngủ nghê (tài, sắc, danh, thực, thụy) là kẹt vào một cực đoan. Cực đoan thứ hai là ép xác, khổ hạnh, hủy hoại sức khỏe và năng lượng tinh thần của mình, cũng không thể thành đạo. Cho nên người tu hành phải tránh xa hai cực đoan trên. Đó gọi là trung đạo. ì

!! Tính cách nền tảng

Điểm thứ hai nên chú ý là giáo lý về bốn sự thật và về bát chánh đạo có tính cách nền tảng, phổ quát, bao trùm tất cả Phật Pháp, vượt cả thời gian. Suốt 45 năm hành hóa, giáo lý về tứ diệu đế và bát chánh đạo tiếp tục được xiểng dương như xương sống của đạo Bụt. Hồi Bụt sắp nhập diệt, Ngài nằm dưới hai cây sala, có một người tên là Subadha tới tỏ ý muốn trở thành đệ tử xuất gia của Ngài. Subadha đến nặn nỉ thầy A Nan. Thầy A Nan nghĩ Bụt gần tịch diệt mà còn có người tới muốn xin xuất gia thì mệt cho Ngài quá, thầy không muốn cho vào. Trong khi thầy A Nan và ông Subadha nói qua nói lại thì Bụt nghe thấy. Bụt bảo thầy A Nan cho ông ấy vào, và Subadha được Bụt cho xuất gia. Subadha hỏi: ‘‘Bạch đức Thế tôn, con muốn biết các vị đạo sư nổi tiếng đương thời tại các nước Ma Kiệt Đà, hay Kosala, các vị đó đã thật chứng ngộ chưa?ì Chúng ta nhớ rằng lúc đó thời giờ của Bụt còn rất ngắn, có thể chỉ mấy chục hơi thở nữa thôi, vậy mà ông ta lại hỏi những câu như vậy. Bụt trả lời: ‘‘Này Subadha, chuyện mấy ông đó có giác ngộ hay không, nó không quan trọng, vấn đề quan trọng là thầy có muốn giác ngộ hay không? Nếu thầy muốn tu hành để giác ngộ thì thầy phải thực tập con đường bát chánh đạo. Vì ở đâu có bát chánh đạo thì ở đó có tuệ giác và an lạc.

Câu nói đó chứng tỏ bát chánh đạo, giáo lý giảng trong bài pháp thoại thứ nhất, được nhắc lại trong pháp thoại sau cùng của Bụt. Bài pháp thoại cuối cùng rất ngắn, chỉ mấy phút trước khi Bụt nhập niết bàn mà thôi. Cho nên chúng ta hiểu và nhớ rằng con đường của tám sự hành trì chân chính, bát chánh đạo, là xương sống của giáo lý đạo Bụt.

!! Tính cách nhập thế

Điểm thứ ba chúng ta để ý trong bài pháp thoại đầu tiên là tính cách nhập thế của đạo Bụt. Trong bát chánh đạo có chánh ngữ, chánh nghiệp, chánh mạng, v.v.. Chánh ngữ tức là sử dụng ngôn ngữ từ bi, trung thực. Chánh mạng tức là sử dụng các phương tiện sinh sống chân chính, không vi phạm đức từ bi. Nếu Bụt tính chỉ dạy đạo cho một số người sống ở trong rừng, xa lìa thế tục, không cần nói chuyện với ai, không phải làm nghề nghiệp gì để sống ở đời, thì chắc Bụt không cần dạy về chánh ngữ và chánh mạng. Nhưng Bụt đã giảng giáo lý chánh ngữ, chánh nghiệp và chánh mạng. Nghĩa là giáo lý này không phải chỉ để dành cho mấy vị thầy tu sống với nhau trên núi, giáo lý này là cho cả thế gian. Vì sống trong xã hội nên ta phải sử dụng ngôn ngữ, phải có nghề nghiệp sinh sống chân chính. Người xuất gia cũng phải có phương tiện sinh sống chân chính, là sự tu học, và công việc hoằng hóa, cứu độ của mình. Đi bộ trong hình thức thiền hành để xin ăn, đó là phương tiện sinh sống và hoằng hoá của người xuất gia. Người tại gia cũng phải có những phương tiện sinh sống hợp pháp, phù hợp với từ bi và trí tuệ. Bát chánh đạo có chánh ngữ, có chánh mạng, chứng tỏ rằng đạo Bụt là để dạy cho tất cả mọi người trong xã hội. Và như vậy đạo Bụt là đạo đi vào cuộc đời, đạo nhập thế, chứ không phải là đạo của người chán đời, từ bỏ cuộc đời. Đó là những điều ta phải thấy được trong Kinh Chuyển Pháp Luân, bài pháp thoại đầu tiên của Bụt.

!! Nghệ thuật nghe pháp thoại

Khi học Kinh chúng ta phải cẩn thận lắm. Chúng ta phải dùng trí tuệ, dùng kinh nghiệm, dùng khổ đau của chính ta để học, chứ đừng dùng trí năng (intellect) mà thôi. Trí năng mà chúng ta thường dùng để học tại các trường trung học, đại học, nếu tiếp tục đem dùng thì không thể hiểu được Kinh. Chúng ta phải để cho lời Kinh thấm sâu vào trong tâm thức thì mới có thể thâm nhập kinh tạng được. Nghe pháp thoại là tu tập. Có người nghĩ rằng nghe pháp thoại là học giáo lý, còn thực tập là việc khác để làm sau. Sự phân biệt đó không đúng. Nói pháp thoại cũng vậy. Có những người giảng pháp nhưng không nói từ những khổ đau có thật, từ các điều chứng đắc, từ kinh nghiệm riêng của chính họ. Những bài pháp thoại nếu chỉ hoàn toàn dùng trí năng, chỉ gồm kiến thức sách vở, thì người nghe cũng chỉ tiếp nhận bằng trí năng của họ mà thôi. Một người nói pháp thoại chân thật phải nói từ kinh nghiệm của mình, từ khổ đau của mình, từ tuệ giác của mình. Nói như vậy có thể khơi động những hạt giống khổ đau, những kinh nghiệm sống, những hạt giống tuệ giác có sẵn trong người nghe. Người nghe cũng phải nghe bằng phương pháp đó. Không chỉ dùng đến trí năng. Người nghe phải để lời pháp thoại như hạt mưa rơi xuống và thấm vào mạch đất tâm của mình. Lời pháp thoại khơi mở những khổ đau, kinh nghiệm, và các hạt giống tuệ giác nơi mình. Mưa xuân nhẹ hạt đất tâm ướt, hạt đậu năm xưa hé miệng cười. Hạt đậu năm xưa tức là những hạt giống của khổ đau, của tuệ giác, của kinh nghiệm. Cho nên tại Làng Hồng, chúng ta ngồi nghe pháp thoại như một phép thực tập, chứ không phải dự một lớp học lý thuyết. Vì nếu chúng ta biết nghe, biết phơi mở mảnh đất tâm của mình cho pháp thoại thấm vào như những giọt mưa, thì những hạt giống của kinh nghiệm, của khổ đau và của tuệ giác sẽ được tưới tẩm. Chúng ta có thể thấy, có thể được chuyển hóa ngay trong khi nghe. Trong thời của Bụt đã có những người biết nghe như vậy, nên được chuyển hóa, đạt tới giác ngộ ngay trong khi nghe pháp. Vậy chúng ta không nên nghĩ rằng nghe pháp thoại là học lý thuyết, sau khi nghe lý thuyết rồi mới bắt đầu tu.

Nghe lại bài pháp thoại đầu tiên của Bụt ta thấy ba đặc tính nêu trên rất rõ. Thứ nhất là Bụt đưa ra con đường trung đạo. Tu học không phải là do ép xác mà thành công. Tu học cũng không phải hưởng thụ dục lạc. Nét thứ hai là giáo lý về bốn sự thật mầu nhiệm và con đường của tám sự hành trì chân chính có tính cách vượt thời gian, bao trùm tất cả đạo Bụt. Và nét thứ ba là giáo lý đạo Bụt ngay từ đầu đã có tính cách nhập thế, áp dụng cho tất cả mọi người. Và qua những đặc tính đó, chúng ta thấy được tấm lòng từ bi của Bụt. Bài pháp thoại này chứng tỏ Bụt đã quán chiếu, đã thấy rõ tâm ý của năm người bạn cũ, nên Ngài nói rất sát với tâm lý của họ. Lòng từ bi ấy chúng ta thấy rất rõ trong bài pháp thoại này. Tính cách khế cơ của giáo pháp, chúng ta cũng thấy ngay trong bài pháp thoại này. Cố nhiên Bụt thấy những hạt giống tiềm ‘‘n trong lòng năm người đệ tử đầu tiên, cho nên khi nói Ngài biết rằng cơn mưa chánh pháp sẽ thấm vào tâm họ.

!! Khổ và lạc

Học mà không cẩn thận chúng ta có thể có khuynh hướng lý thuyết hóa giáo pháp của Bụt. Lý thuyết hóa giáo pháp là một điều không có lợi cho đạo, cho bản thân mình hay cho người khác. Rất nhiều người trong chúng ta thích lý thuyết hóa. Chúng ta muốn chứng minh giáo lý này là đúng, là hay, là chân lý, chứ không thao thức tìm hiểu và hành trì giáo lý ngõ hầu đem lại an lạc cho mình và cho người. Chúng ta chỉ muốn làm những nhà truyền giáo. Chúng ta chỉ muốn khoe với người khác rằng ta có một tôn giáo rất đặc biệt, rất hay ho; rồi tìm mọi cách để chứng minh rằng tất cả những điều Bụt nói đều là chân lý tuyệt đối cả. Ví dụ Bụt nói sự thật thứ nhất là khổ. Ta bèn dùng tất cả tài năng của mình, ngôn ngữ của mình để chứng minh rằng tất cả đời này đều là khổ hết. Và cứ thế, tốn biết bao nhiêu giấy mực, bao nhiêu thời giờ để chứng minh một sự thật mà Bụt không cần chứng minh, là cuộc đời này có khổ. Nhưng đời có khổ mà cũng có vui. Bụt cũng nói có khổ thọ và có lạc thọ. Các lý thuyết gia mới tìm cách chứng minh thêm rằng cái lạc thọ đó chẳng qua cũng chỉ là khổ thôi. Khuynh hướng muốn giải thích, chứng minh, biện luận và bênh vực này nằm trong tất cả chúng ta, và nhiều thế hệ liên tiếp đã làm công việc lý thuyết hóa đó.

Có sự phân biệt ba loại khổ là khổ khổ, hoại khổ và hành khổ. Có người không hiểu chữ khổ khổ, nói rằng đã khổ rồi lại chồng chất thêm cái khổ nữa, cuộc đời chỉ có khổ thôi, không có gì là niềm vui nữa. Thực ra đây chỉ là một cách phân loại có thể giúp ta dễ tìm căn nguyên của khổ. Loại đầu tiên, khổ khổ (duhkha duhkhata) có nghĩa là một cảm thọ khó chịu (unpleasant feeling), chữ Hán là khổ thọ. Như đau răng, cảm giác đau nhức vì răng hư, hoặc khi bị người ta chọc giận, chúng ta đỏ mặt tía tai, tức muốn vỡ ngực, đó là những khổ thọ. Trời lạnh quá mà không có đồ ấm, không có lò sưởi, ta run lên cầm cập, cảm thọ đó là một khổ thọ. Khổ thọ là loại khổ thứ nhất, khổ khổ.

Loại khổ thứ hai là hoại khổ (viparunamam duhkhata). Hoại khổ nghĩa là có những thứ vốn không khổ, nhưng khi tiêu hoại thì sẽ tạo ra khổ. Ví dụ lá gan của ta, bây giờ không có bệnh, nhưng thế nào cũng sẽ yếu, sẽ già, cũng sẽ mất khả năng làm tiêu chất cholesterol, thì lá gan đang hàm chứa hoại khổ. Từ ý tưởng này người ta dễ đưa tới những cách nhìn bi quan. Những thứ bây giờ tốt cách mấy cũng mang sẵn mầm khổ ở trong, vì đó cũng là hoại khổ. Bây giờ anh cười đó, anh vui đó, nhưng một ngày kia anh cũng khóc, cho nên nỗi vui của anh không có thật, chỉ nỗi khổ có thật mà thôi. Đó gọi là hoại khổ. Tất cả các pháp có sinh có diệt, cho nên khổ là tính chất phổ biến của vạn pháp.

Thứ ba là hành khổ (samskara duhkhata). Hành là các hiện tượng kết tập mà thành, dịch tiếng Anh là formation. Chúng ta đã học ‘‘chư hạnh vô thường’’ (all formations are impermanent). Vô thường, thay đổi thì thế nào cũng đưa tới sự tan rã, vì vậy nên khổ. Trong các hành, các hiện tượng, đều chứa sẵn hạt giống của khổ đau cả, đó gọi là hành khổ.

Cắt nghĩa như vậy thì người ta thấy tất cả đều là khổ, và những thứ mà chúng ta gọi là lạc, là không khổ, đều không có thật. Cách giải thích đó đem một đám mây u Đm tới che phủ cả giáo lý tứ diệu đế. Khổ bao trùm tất cả. Nhưng nếu đem bó đuốc của đạo lý duyên khởi mà soi chiếu, thì chúng ta thấy thế nào? Ta sẽ thấy rằng khổ cũng là một hiện tượng được tập thành, được kết tạo bởi những thứ không phải là khổ. Trong những thứ đó tất nhiên có lạc. Chúng ta đã biết, nếu không có bên trái thì không có bên mặt, nếu không có trên thì không có dưới, đó là lý duyên khởi. Làm sao chúng ta có thể công nhận chỉ có mặt khổ thôi, và bỏ mặt không khổ? Nguyên lý duyên khởi sửa chữa nhận thức sai lầm này. Khổ cũng do duyên sinh. ‘‘Thử hữu tức bỉ hữu, thử vô tức bỉ vôì, nếu không hề có cái không khổ thì làm sao có cái khổ? Nếu không có ngày thì làm sao có đêm? Nếu chưa bao giờ biết ấm thì ta biết thế nào là lạnh? Chưa bao giờ no cả thì làm sao biết thế nào là là đói? Vì vậy sự có mặt của khổ chứng tỏ có tình trạng không khổ. Đó là giáo lý duyên khởi, rất đơn sơ và rõ ràng.

Hơn nữa, sau khi nói sự thật thứ nhất là khổ, Bụt lại nói sự thật thứ ba là Diệt. Diệt là sự vắng mặt của khổ đau, tức là không khổ. Tại sao người ta lại muốn bảo hoàng hơn vua, và nói tất cả chỉ có khổ thôi? Sự thật thứ ba là hết khổ, tức là an lạc. Bụt có nói về an lạc rất nhiều. Ngài nói tới hiện tại lạc trú, nghĩa là trú trong an lạc ngay ở đây, ngay giờ phút hiện tại. Đó là một lời tuyên bố rất mạnh mẽ. Cho nên chúng ta phải dẹp bỏ khuynh hướng tìm cách lý luận, chứng minh tất cả chỉ là khổ, là một điều Bụt không chủ trương. Bụt chỉ muốn nói rằng ta phải công nhận sự có mặt của những đau khổ, phải tiếp xúc trực tiếp với những đau khổ, phải quán chiếu chúng thì mới tìm ra đường thoát. Bụt không bao giờ nói rằng: ‘‘Tất cả đều là khổ, anh không có đường thoát !’’

Về sự thật thứ nhất, Bụt nói khổ cần phải được nhận thức, cần phải được công nhận. Đây không phải chỉ là một lời diễn tả thực tại, mà chính là một ánh đuốc soi đường. Kinh Chuyển Pháp Luân nói: đây là khổ, cái này là khổ. Nghĩa là phải nhận diện cái khổ. Đây là một lời khuyên thực tập chứ không phải là một lý luận. Nếu anh khổ mà không nhận diện được thực trạng đau khổ thì anh làm sao đi xa hơn được. Nếu anh bị ho lao mà không biết rằng anh có cái khổ ho lao thì bệnh lao sẽ càng trầm trọng. Vì vậy, việc đầu tiên là phải nhận thức tình trạng khổ của anh. Nỗi khổ của anh là nỗi khổ nào, anh phải nhận diện. Người say thường nói rằng: ‘‘Tôi đâu có say !’’ Người đang giận thì nói: ‘‘Tôi đâu có giận !’’ Thái độ thông thường của chúng ta là như vậy. ‘‘Việc gì đâu mà tôi phải giận? Tôi như thế này mà anh nói tôi say à?’’ Thường thường chúng ta cũng không mấy ai công nhận nỗi đau khổ của mình. Muốn nhận diện khổ đau chúng ta phải sử dụng năng lượng của chánh niệm. Chúng ta phải sử dụng tuệ giác. Chúng ta phải nhờ đến tăng thân. Chúng ta phải biết nương vào thầy, vào bạn và vào sự quán chiếu của chúng ta, để có thể nhận diện niềm đau, nỗi khổ của chúng ta. Phải biết đó là niềm đau, nỗi khổ nào. Đó là hành động đầu tiên để chuyển bánh xe pháp.

!! Tam chuyển

Đối với mỗi sự thật có ba bước hành động, trong kinh gọi là tam chuyển. Thứ nhất là thị chuyển, nghĩa là nhận diện cái khổ: Đây đích thực là cái khổ của tôi! Nếu muốn giúp đỡ một người bạn, ta nói: “Đây đích thực là cái khổ của anh. Anh nhìn lại xem có phải không?” Công việc đầu tiên của bác sĩ là chỉ cho bệnh nhân biết anh ta có bệnh. Và bệnh nhân phải công nhận anh ta có bệnh thì bác sĩ mới có thể cộng tác được. Không phải tự dưng mà nhận diện được cái khổ. Phải có kiến thức, phải có kinh nghiệm, phải thực tập. Phải lắng nghe, phải nhìn kỹ thì mới nhận diện được cái khổ thật của mình.

Hành động thứ hai là khuyến chuyển, nói rằng: Nỗi khổ này tôi muốn được liễu tri. Liễu tri là hiểu thấu. Ta biết rằng mình có chứng bệnh đó rồi, cần phải thấy rõ bản chất của bệnh. Hành tướng của bệnh như thế nào? Bệnh nặng tới cấp độ nào rồi? Căn bệnh phát tác buổi sáng như thế nào? Buổi trưa như thế nào? Buổi chiều như thế nào? Trong giấc ngủ, bệnh phát hiện ra sao? Đó là liễu tri về cái khổ. Đã nhận diện rồi nhưng phải tìm hiểu rõ hơn. Đó là hành động thứ hai để bánh xe pháp quay thêm, gọi là nhị chuyển.

Và thứ ba là chứng chuyển, là chứng nghiệm rằng cái khổ này đã được liễu tri. Chứng ở đây có nghĩa là đã tu tập, đã thấy được, đã liễu tri được cái khổ. Chuyển thứ nhất đưa tới cái chuyển thứ hai, chuyển thứ hai đưa tới cái chuyển thứ ba.

Tóm lại, đối với sự thật thứ nhất ta phải đi qua ba giai đoạn hành trì. Giai đoạn hành trì đầu tiên là nhận diện. Giai đoạn hành trì thứ hai là phải phát tâm sâu sắc muốn hiểu, muốn chuyển hóa. Và thứ ba là hiểu được bản chất, hành tướng của niềm đau khổ. Đó là tam chuyển.

Đối với sự thật thứ hai là khổ tập, cũng có tam chuyển. Trước hết là thực tập nhận diện những nguyên do xa gần đã đưa tới khổ. Phải quán chiếu mới thấy được các yếu tố kết tập. Có thầy có bạn giúp đỡ thì ta quán chiếu được rõ hơn. Đây là sự hình thành của khổ đau: vì tôi ăn, tôi uống món đó, vì tai tôi nghe tiếng đó, mắt tôi nhìn ngắm cái đó, tôi hấp thụ những thực phẩm đó hàng ngày, nên bây giờ tôi có căn bệnh này, niềm đau khổ này. Phải thấy đây là một việc thực tập.

Khuyến chuyển tức là phát khởi tâm niệm đoạn trừ những căn nguyên trên. Tôi biết thân thể tôi bệnh hoạn đau đớn như vậy là vì tôi đã ăn như vậy, đã uống như vậy, đã ngủ như vậy, đã làm việc như vậy. Bây giờ phải ngưng đừng ăn như vậy, đừng uống như vậy, đừng sống đời sống hàng ngày theo kiểu đó nữa. Tập này cần phải đoạn, đó là khuyến chuyển của sự thật thứ hai. Nếu ước muốn đó không đủ mạnh thì không bao giờ thực hiện được chuyện diệt khổ. Ý muốn tiêu diệt mầm mống của đau khổ phải rất mạnh. Phải cương quyết chấm dứt. Tiếp theo, chứng chuyển là thực chứng Tập này đã được đoạn.

Diệt cũng có ba chuyển. Diệt là sự vắng mặt của đau khổ, tức là hạnh phúc, là xác nhận sự có mặt của an lạc. Trước đây, ta không mang nỗi đau khổ mà ta đang mang bây giờ. Chung quanh ta có những người không mang nỗi đau khổ này. Đó là xác nhận có trạng thái không bệnh, có tình trạng giải thoát, an lạc, có hạnh phúc. Nếu không nhận diện được nỗi khổ thì ta không có năng lực diệt khổ. Người mắc bệnh nhức đầu, biết xác nhận mình có đau đầu, đó là sự thật thứ nhất. Rồi xác nhận nguyên do vì sao mình bị nhức đầu là sự thật thứ hai. Xác nhận rằng có tình trạng không đau đầu chính mình đã hưởng trong quá khứ và mình sẽ được hưởng trong tương lai nếu mình chịu chữa bệnh, xác nhận có những người không đau đầu xung quanh mình đó là sự thật thứ ba. Sự an lạc này, sự thật về diệt này, cần phải được chứng, cần phải được thực hiện. Tôi muốn trở lại trạng thái an lạc cũ, tôi muốn sống trong trạng thái an lạc như anh, vì anh đang không có căn bệnh như tôi, đó là khuyến chuyển. Và thứ ba, chứng chuyển, là trạng thái diệt bệnh đã được chứng nghiệm. Đây, tôi đã đạt tới an lạc rồi, tôi không còn đau đầu nữa.

Và đạo cũng có ba chuyển. Chuyển thứ nhất là nhìn thấy đây là con đường, đây là phương pháp diệt khổ. Xác nhận có một con đường, một phương pháp, nhận rõ con đường đó và phương pháp đó giúp cho ta thoát khổ đau và đạt tới an lạc. Chuyển thứ hai là đạo này cần được tu tập, đó là khuyến chuyển. Thao thức, ước muốn thực tập, vì ta biết rằng chỉ có thực tập mới đưa tới chuyển hóa. Không thể cầu một đấng thiêng liêng nào tu hộ cho mình chuyển hóa, ta phải tự mình tu. Nếu muốn tới thì ta phải đi bằng hai chân của ta. Thứ ba là tu chứng đạo. đạo đã thực tập rồi thì cố nhiên diệt đã chứng, tập đã đoạn và khổ đã liễu tri.

Trong bài pháp thoại đầu tiên của Bụt, chúng ta thấy ngay đạo Bụt không phải là một tôn giáo thờ cúng. Không cầu xin một đấng thiêng liêng nào ban hạnh phúc và cởi bỏ khổ đau cho mình, ta phải tự đi bằng hai chân ta trên con đường diệt khổ. Mỗi diệu đế có ba hành động, nhân với bốn sự thật thành mười hai. Gọi là Tam chuyển và Thập nhị tướng.

Bụt nói với năm vị đệ tử rằng: ‘‘Các thầy, ngày xưa khi tôi chưa rõ diện mục của khổ, tập, diệt và đạo, thì tôi chưa nói tôi là người hoàn toàn giác ngộ. Nhưng giờ đây, tôi đã nhận rõ được diện mục của khổ, tôi đã liễu tri khổ. Tôi đã nhận diện được tập, tôi đã đoạn trừ tập. Tôi đã nhận diện được diệt, tôi đã chứng được diệt. Tôi đã nhận diện được đạo, tôi đã tu thành đạo. Bây giờ tôi mới nói tôi là người chứng ngộ. ’’ Đó là một câu trong Kinh Tam Chuyển Pháp Luân. Phật lại nói: ‘‘Này năm thầy khất sĩ, vì tôi có thể thấy được bằng thực chứng ba chuyển và mười hai tướng trong bốn sự thật này, cái thấy và sự tu chứng đó đã đem lại trí tuệ, đem lại ánh sáng, cho nên tôi mới tuyên bố trước tất cả các chư thiên, các loài ma, các bậc sa môn, các vị bà la môn trong tất cả các thế gian, là tôi đã diệt hết phiền não và đã được giải thoát, chứng ngộ quả vị giác ngộ hoàn toàn. ’’ Câu nói đó cũng ở trong Kinh Tam Chuyển Pháp Luân. Ta có thể thấy ban đầu năm vị đệ tử không tin Bụt đã giác ngộ, nhưng sau họ phải tin rằng Bụt đã giác ngộ vì Bụt đã nhận thức sâu sắc về bốn diệu đế. Không phải Ngài nhận thức bằng trí năng, mà bằng kinh nghiệm và thực chứng, vì Ngài đã đi qua tam chuyển, thập nhị tướng.

Muốn giảng về tứ diệu đế, chúng ta cũng phải trải qua tam chuyển và thập nhị tướng. Như vậy thì người nghe không những tin ngay mà có thể giác ngộ ngay. Câu này được lặp lại hai lần: ‘‘Này quý vị, khi tôi chưa thấy biết thực sự tam chuyển và thập nhị tướng của bốn sự thật thì tôi chưa bao giờ nói rằng tôi giác ngộ hoàn toàn. Nhưng giờ đây tôi đã thấy biết thực sự được tam chuyển và thập nhị tướng của bốn sự thật, cho nên tôi mới tuyên bố trước mặt tất cả mọi loài rằng tôi là bậc giác ngộ hoàn toàn. ’’ Thấy biết thực sự là một câu trong Kinh, như thực tri kiến. Tri là biết, kiến là thấy. Biết không phải bằng trí năng, mà biết bằng kinh nghiệm, biết bằng cái thấy của mình. Understanding and seeing things as they are, gọi là như thực tri kiến. Như thật là yathabhutam.

!! Tứ diệu đế là phép thực tập

Tứ diệu đế không phải là một lý thuyết, tứ diệu đế là một công trình thực tập. Khi chúng ta nói ‘‘cái khổ có thật’’ chúng ta không đưa ra một lời tuyên bố suông. Đây là cái khổ, đây là hành tướng của cái khổ. Cái khổ này cần phải được nhận diện, cái khổ này cần phải được liễu tri. Cái khổ này tôi muốn thấy rõ và hiểu rõ bản chất, nội dung và hành tướng của nó. Cái khổ này tôi đã thấy rõ, tôi đã thấy được hành tướng, nội dung và bản chất của nó. Đó là những bài thực tập chứ không phải là những lời tuyên giảng. Nếu không cẩn thận, chúng ta sẽ chỉ lặp lại những lời nói suông, chúng ta có thể sẽ nẩy sinh ý muốn chứng minh và lý luận rằng trong đời tất cả đều là khổ. Việc đó tốn thì giờ, tốn cả cuộc đời chúng ta, và phí công Bụt dạy.

Sự thật thứ nhất, khổ đế, là một phép thực tập. Sự thật thứ hai, tập đế, là một phép thực tập. Sự thật thứ ba, diệt đế, là một phép thực tập. Sự thật thứ tư, đạo đế, là một phép thực tập. Và Bụt đã thực tập qua ba chuyển và mười hai tướng cho nên Bụt nói bài pháp thoại này với tất cả sức mạnh của một người giác ngộ.

Trong một Kinh khác, Kinh Tập Sanh, Bụt nói như sau: ‘‘Cái gì đã xảy ra cho ta, nếu ta quán chiếu sâu sắc vào tự thân nó, là ta đã bắt đầu đi trên đường giải thoát. ’’ Câu này có nghĩ là khi ta nhận diện khổ, khi thấy được khổ tập rồi, là con đường đưa tới an lạc đã bắt đầu. Khổ có chứa đựng tập, khổ chứa đựng diệt, và khổ chứa đựng đạo. Đó là nguyên tắc tương tức ta phải dùng vào bài học tứ diệu đế.

Đạo Bụt nói tới khổ, duhkha, nhưng chữ khổ nói tới trong đạo Bụt không giống ý niệm khổ những người khác nói. Vì cái khổ Bụt nói liên hệ tới tập, diệt và đạo. Có thể nhiều tôn giáo và truyền thống khác cũng nói tới khổ. Nhưng nghĩa chữ khổ họ nói tới không cùng nghĩa với chữ khổ trong đạo Bụt. Nếu không hiểu gì về tập, diệt và đạo thì ta chưa hiểu được chữ khổ mà Bụt nói đến. Đó là nguyên tắc tương tức phải nắm vững trong khi học giáo lý. Khi giảng dạy về khổ đế mà không làm cho người ta thấy được trong khổ đế có chứa đựng hạt giống của diệt, của đạo và của tập đế, thì cái khổ đó không phải là cái khổ mà Bụt nói đến. Ta phải dùng ngọn đuốc nhân duyên soi vào để hiểu được giáo lý chân thật của Bụt.

Chúng ta phải hiểu rằng khổ đế được trình bầy trong quá trình tu tập và chuyển hóa chứ không phải là để than thở. Rất nhiều kinh điển như Kinh Tập Sanh đã nói rõ, là diệt và đạo nằm sẵn trong sự quán chiếu về khổ và khổ-tập. Một sự thật chứa sẵn đủ ba sự thật kia, hiểu như vậy mới đúng nguyên tắc duyên khởi của đạo Bụt. Ngày xưa khi còn trẻ, tôi nói rằng tứ đế là nguyên tắc của sự thực tập, theo nguyên tắc trị liệu của y khoa. Điều đó đúng. Nhưng nay tôi thấy tứ diệu đế không phải chỉ là nguyên tắc của sự thực tập. Tứ diệu đế là bản thân của sự thực tập.

!! Nhị Đế

Chúng ta mới chỉ dùng tới ngọn đuốc duyên khởi để soi sáng bốn sự thật. Còn ngọn đuốc thứ hai nữa là nhị đế. Những điều chúng ta vừa nói ở trên về tứ diệu đế nằm trong phạm vi tục đế. Đó là lãnh vực của sự thật tương đối, trong đó có khổ, có lạc, trong đó ý tưởng, khái niệm và ngôn từ được sử dụng. Đứng trên phương diện chân đế thì chúng ta phải hiểu tứ diệu đế cách khác. Trong thế giới của sự thật tuyệt đối thì không có khổ mà cũng không có lạc. Nói cách khác, cái vui của chân đế không phải là cái vui của tục đế. Nhưng chúng ta đã biết chân đế không trái ngược với tục đế. Khi thực tập trong phạm vi tục đế một cách sâu sắc rồi, ta sẽ thấy chân đế tự nhiên hiển lộ.

Trong phạm vi tục đế, sự thực có giá trị tương đối. Khổ là ngược lại với vui, cái vui đó có thể trở lại thành khổ, rồi khổ đó trở lại thành vui, v. v… Trong phạm vi tục đế, chúng ta thường nói sinh ra là khổ, già là khổ, chết là khổ, thương nhau mà không được gần nhau là khổ, ghét nhau mà cứ phải nhìn mặt nhau mỗi ngày là khổ, đó là những cách diễn tả về cái khổ. Nhưng đó là thuộc lãnh vực tục đế. Chúng ta nên nhớ tục đế chỉ là những sự thật có giá trị tương đối. Ví dụ sinh là khổ. Đó là một sự thật khi chúng ta nhìn vào cuộc đời một con người từ khi sinh ra cho đến khi chết. Nhưng ngược lại, ta cũng thấy khi một người mẹ sinh con ra thì cả nhà cả họ đều mừng vui. Khi một người như là Siddhata được sinh ra là cả hoàng cung làm lễ ăn mừng. Như vậy thì sinh cũng có thể là vui chứ không phải chỉ là khổ và sinh nhật vốn là một ngày vui. Trong phạm vi tục đế, tùy theo cái cách nhìn của chúng ta mà một hiện tượng được nhận thức là vui hay là khổ.

Trời lạnh có thể làm chúng ta bị cảm, chúng ta khổ, chúng ta chết, thì ta nói lạnh là khổ. Nhưng nếu chúng ta biết đốt lò sưởi, biết cách mặc áo cho ấm, thì không khí lạnh kia sẽ trở thành dễ chịu, có thể làm cho ta vui. Cũng một câu nói kia mà người này nổi sùng, còn người khác mỉm cười, thì không phải câu nói đó gây khổ, mà cách tiếp nhận làm cho ta khổ hay không khổ. Thành ra khổ không phải chỉ là những thực tại khách quan mà còn là những thực tại chủ quan. Có những điều chúng ta cho là khổ nhưng người khác không coi là khổ. Có những điều chúng ta cho là vui nhưng người khác không cho là vui. Đó là phạm vi của tục đế, của sự thật tương đối.

Đứng trong phạm vi tuyệt đối, cái vui và cái khổ có một kích thước khác. Ví dụ hai con gà sắp bị nhốt trong lồng để đem làm thịt. Ở trong lồng, hai con đang tranh nhau những hạt ngô, hạt lúa. Con này nói với con kia: ‘‘Ăn cái hạt lúa này ngon hơn. Hạt bắp này hôi quá. ì Hai anh bàn nhau cái gì là vui, cái gì là khổ, không biết cái khổ thật sự của cả hai là sắp bị cắt tiết. Mà đối với một con gà thì sự kiện không bị đem ra làm thịt là niềm vui lớn nhất. Triết lý về khổ vui của hai con gà nằm trong giới hạn tương đối. Chúng ta nhìn từ quan điểm khác để thấy được cái mà hai con gà không thấy. Thoát ra khỏi lồng, không bị làm thịt, đó mới là niềm vui thật sự.

!! Tịch Diệt

Chúng ta đọc lại những câu kệ:

<<< 
chư hạnh vô thường <br>
thị sinh diệt pháp <br>
sinh diệt diệt dĩ <br>
tịch diệt vi lạc
<<< 

Các hiện tượng đều là vô thường, đều là những hiện tượng có sinh và có diệt. Khi cả sinh và diệt đều được diệt hết, thì trạng thái tịch diệt đó là niềm an lạc chân thật. Trong thế giới có sinh diệt, trong hiện tượng giới, thế giới của tích môn, sinh là một niềm vui, diệt tạo ra khổ đau.

Nhưng trên quan điểm chân đế, khi cả sinh và diệt đều biến mất thì cảnh tịch diệt này mới là niềm vui đích thực. Chữ diệt trong cặp đôi sinh diệt chắc chắn không cùng nghĩa với chữ diệt trong tịch diệt. Cái diệt của chân đế vượt ra ngoài cả sinh lẫn diệt, khác cái diệt trong phạm vi tục đế. Nên chữ diệt ở trong chân đế không cùng một nghĩa như chữ diệt trong tục đế. Trong phạm vi chân đế, đôi khi ta không thể dùng ngôn ngữ thông thường. Điều này rất quan trọng, chúng ta phải thấy rõ.

Tâm Kinh Bát Nhã nói không khổ, tập, diệt, đạo. Kinh Tam Chuyển Pháp Luân nói có khổ, tập, diệt, đạo. Tâm Kinh nói ngược lại điều Kinh Tam Chuyển Pháp Luân nói vì Tâm Kinh đứng trên bình diện chân đế mà nói. Như vậy Tâm Kinh không đối nghịch với Kinh Tam Chuyển Pháp Luân. Kinh Tam Chuyển Pháp Luân nói trong phạm vi tục đế, nhưng khi ta thực tập sâu sắc thì cũng nhìn thấy như Tâm Kinh, là không có khổ, tập, diệt, đạo.

Chúng ta hãy nhớ khổ là một cái tướng, một pháp, mà tất cả các pháp tướng đều có tính vô thường và vô ngã. Hiện tượng khổ không thể có nếu không có hiện tượng tập, không có hiện tượng diệt, hiện tượng đạo. Chúng ta biết rằng cái khổ nói tới trong đạo Bụt hàm chứa tập, diệt và đạo. Nếu không có tập, diệt và đạo thì khổ cũng không có. Cho nên Tâm Kinh đã nói cái khổ tự nó không có, nghĩa là không có cái khổ như là một thực tại độc lập với diệt, với tập và với đạo.

Chúng ta hãy nhìn bông hoa. Bông hoa này không thể có mặt nếu không có ánh sáng mặt trời, đám mây, cơn mưa và trái đất. Mặt trời, đám mây, trái đất và tâm thức của chúng ta đều có trong bông hoa này. Bông hoa riêng biệt, độc lập, chính nó không thể có, nên nói là không. Khi nói không khổ, tập, diệt, đạo là Tâm Kinh nói trên bình diện chân đế.

Nếu chúng ta thực tập sâu sắc bài học trong tục đế thì tự nhiên sự thật trong chân đế hiện ra. Nếu thực tập sâu sắc tam chuyển và thập nhị tướng của tứ diệu đế thì ta cũng thấy được sự thật nói trong Kinh Bát Nhã: không khổ, tập, diệt, đạo, không trí cũng không đắc vì không có sở đắc.

Đã nhìn rõ về chữ khổ như vậy, thì hiểu diệt cũng như vậy. Đứng trên bình diện chân đế thì cái diệt trong tịch diệt không phải chỉ là sự vắng mặt của cái khổ tương đối mà cũng là sự vắng mặt cả cái vui tương đối. Thực tập sâu xa thì cái diệt nói trong tứ diệu đế là cái diệt vượt thoát ra cả khổ và không khổ. Diệt đó là tịch diệt, không phải chữ diệt đối lại với chữ sinh trong câu thứ hai, mà là sự vắng mặt của cả hai cái sinh và diệt. Tịch diệt vi lạc là chân đế.

Khi học tứ diệu đế và giảng giải tứ diệu đế, chúng ta có thể bắt đầu bằng tục đế. Rồi trong quá trình tu học và giải bày, chúng ta từ từ đi sang phạm vi chân đế. Mà chân đế với tục đế tiếp nối với nhau, chứ không phải trái ngược nhau. Nếu ta thấy có chống đối, có mâu thuẫn, là tại vì chúng ta chưa thấy được tính cách nhất quán của tục đế và chân đế.

Học tứ diệu đế mà dùng đạo lý duyên khởi và nhị đế soi sáng thì ta sẽ không đi lầm đường. Đây là phương pháp học mới, dù đã truyền lại từ ngàn xưa, một phương pháp rất cần thiết. Sau này học về bát chánh đạo, ngũ cặn, ngũ lực, thất bồ đề phận ta cũng sẽ học theo phương pháp đó. Tôi đã học phương pháp này từ những lời Bụt dạy. Kinh Tạp A Hàm S. N. 5, 436, gọi là Gavampati Sutra, kể chuyện một số vị khất sĩ đang nói với nhau rằng: ‘‘Người nào thấy được sâu sắc sự thật về khổ thì có thể thấy luôn được sự thật về tập, về diệt, về đạo. ì Khi thầy Gavampati nghe như vậy thì thầy xác nhận rằng: ‘‘Này các thầy, chính tai tôi nghe đức Thế Tôn nói: ai thấy rõ được cái khổ thì thấy luôn cả tập, cả diệt, cả đạo. Ai thấy rõ được tập thì thấy cả khổ, diệt, và đạo. Ai thấy rõ được đạo thì thấy được khổ, tập, và diệt. ì

Kinh đó chứng tỏ rằng duyên khởi là phương pháp ta phải sử dụng trong suốt hành trình học hỏi và tu tập. Nếu người ta hỏi trong đạo Bụt có nói về khổ, nhưng cái ý nghĩa về chữ khổ như thế nào thì quý vị đã biết câu trả lời rồi. Không hiểu ý nghĩa của tập, diệt, đạo, thì không hiểu được ý nghĩa chữ khổ trong đạo Bụt. Đó cũng gọi là phương pháp tương tức.
! Bài 06 Quá trình văn tư tu

Hôm nay là ngày mùng 9 tháng 12 năm 1993, chúng ta ở tại Xóm Thượng và học tiếp về tứ diệu đế. Chúng ta đang nói về chánh kiến, tức là cái thấy chính xác, trước hết là cái thấy về bốn sự thật là khổ, tập, diệt và đạo. Hôm nay chúng ta quán chiếu về sự thật thứ tư là đạo.

Đạo tức là con đường (marga). Có con đường đưa chúng ta thoát khổ đau, có con đường chuyển hóa khổ đau. Dịch ra tiếng Anh một cách đơn giản thì khổ là ill hay là ill-being (duhkha). Tập là sự tập hợp của những nguyên do đưa tới khổ, có thể dịch là arising (samudaya). Diệt là cessation, tức là chấm dứt, không tạo tác ra khổ nữa. đạo là the way. Có thấy đạo thì mới có chánh kiến.

Chúng ta đã biết rằng khi quán chiếu về khổ một cách sâu sắc ta có thể thấy tập, thấy diệt và thấy đạo. Khi nhìn vào tập, chúng ta cũng thấy khổ, thấy diệt và thấy đạo. Nhìn vào diệt, chúng ta cũng thấy khổ, thấy tập và thấy đạo. Và bây giờ nhìn vào đạo, chúng ta cũng thấy rõ khổ, tập và diệt. Cho nên đạo chỉ có thể thấy được từ sự đau khổ. Nếu không nhận ra khổ thì không thể nào tìm ra đạo.

Người ta thường không hiểu đúng về đạo. Họ nghĩ rằng có một con đường tu hành, nhưng bây giờ còn trẻ, mình chưa tu làm gì vđoi. Đợi khi nào 60 hoặc 70 tuổi rồi tu cũng không muộn. Hoặc nghĩ rằng đạo là để dành cho những người già cả và những kẻ chán đời. Họ không biết rằng đạo là con đường chuyển hóa, giúp mọi người thoát khổ. đạo vốn có nghĩa là con đường đi. Ở Đông Phương chúng ta nói đến đạo làm người, đạo làm cha, đạo làm thầy. Người con có đạo làm con, người vợ có đạo làm vợ, người chồng có đạo làm chồng, v.v.. Trong sách Minh Tâm Bảo Giám có câu ‘‘mạc đãi lão lai phương học đạo, cô phần đa thị thiếu niên nhânì, nghĩa là đừng có đợi đến già rồi mới học đạo, tại vì cứ nhìn vào nghĩa địa thì biết, ở trong ấy có rất nhiều nấm mồ của những thiếu niên. Như vậy dù ở tuổi tác nào, ở vị trí nào chúng ta cũng cần học đạo. Và đạo mà Bụt dạy là đạo giải thoát, đạo sống an lạc.

Nhầm lẫn quan trọng hơn nữa là nhiều người nói về đạo như một lý thuyết, hay những hý luận cho vui. Nghĩ rằng về già mới cần học đạo, đó không phải là chánh kiến. Hý luận về đạo lại là một tà kiến khác. Nhiều người nói về đạo rất lưu loát, nhưng các lý thuyết họ nói không dính líu gì đến đời sống của họ cả. Trong giới Phật tử Việt Nam có rất nhiều người nói tới đạo một cách rất say mê, nhưng đạo ấy không được thể hiện trong đời sống và trong sự tu học của họ. Bài hát đạo ca: ‘‘Tôi là thiền sư buồn, ngồi tụng dưới ánh trăng… ì dùng những danh từ đạo Bụt, kỳ thực không có nội dung đạo, chẳng qua chỉ là những ý tưởng uỷ mị, lãng mạn về thiền, về đạo mà thôi. Có rất nhiều trường hợp trong đó chúng ta hiểu lầm về đạo như vậy.

!! Quá trình văn tư tu

Cái nhìn về đạo chân chính bắt đầu từ văn, tư và tu, gọi là tam học. Vặn là học hỏi. Những đệ tử của Bụt gọi là thanh văn (sravaka), là người nghe giáo lý để tu học. Khi nghe giảng dạy về giáo lý, khi đọc Kinh, khi pháp đàm, ta thực tập văn học. Vặn học tức là học nghe. Học nghe, ta phải có thái độ cởi mở, phải thao thức muốn hiểu, muốn thực hành, như thế mới gọi là văn học. Còn nếu nghe để đàm luận, nghe chỉ để phê phán và chỉ trích, nghe để chứa chấp kiến thức rồi khoe khoang, đó chưa phải là văn học.

Tư là suy gẫm, tư duy, quán chiếu những điều mình nghe. Ta nghe một điều gì, dù điều đó từ một vị đạo sư nổi tiếng nói ra ta cũng phải tư, tức là phải thẩm xét giá trị ứng dụng của những điều đó. Ta không mù quáng nghe theo vô điều kiện. Sau khi nghe rồi, phải tư. Trong khi đang nghe, không tư, nghe là nghe mà thôi. Nghe xong rồi lúc đó mới quán chiếu, mới suy tư (reflecting). Tư là đem kinh nghiệm, đem trí tuệ, đem khổ đau của mình ra để mà xét nghiệm. Xem thử những điều mình nghe có thể trả lời được những nỗi đau khổ, những thắc mắc, những thao thức của đời mình hay không, như thế gọi là tư học.

Nghe giống như gieo hạt giống vào đất. Thực tập là tưới tẩm cho hạt giống có thể nẩy mầm. Thực tập là tu, giai đoạn thứ ba gọi là tu học. Nếu không đem ra thực tập thì việc nghe không có lợi ích nào cả. Trong quá trình văn, tư, tu về đạo ta sẽ thấy được bản chất của đạo là làm bằng khổ, ta thấy khổ ở trong đạo. đạo Bụt phát sinh là vì cuộc đời khổ đau, cho nên cuộc đời khổ đau là chất liệu làm ra đạo. Sự tỉnh thức, sự thương yêu phát sinh từ khổ đau. đạo và khổ tương tức. Trong quá trình văn, tư và tu chúng ta thấy khổ và tập ở trong đạo. Chúng ta biết rằng tập, những nguyên do làm ra khổ, nếu chuyển hóa được, thì khổ sẽ vắng mặt. Ba yếu tố khổ, tập và diệt có thể nhìn thấy trong đạo. Tâm Kinh nói: ‘‘Không đạoì, có nghĩa là đạo không có ở ngoài khổ, tập và diệt. Không có cái này thì không có cái kia. Năm chữ ‘‘không khổ, tập, diệt, đạoì thuộc về chân đế, đó là sự thật vô lậu. Ngay trong quá trình tiếp xúc với mặt tục đế, ta đã thấy được bản chất của đạo, và chuyển hóa được tập. Nếu thấy cho rõ thì ta ngừng lại ngay, tự nhiên đi tới diệt. Chuyển hóa tập, thành tựu diệt sẽ làm vơi khổ, khiến cho cái khổ biến đi.

Nhờ quá trình văn, tư và tu mà lời nói và hành động của ta mỗi lúc mỗi tương ứng. Ví dụ một người giảng giải rất hay về năm giới, nhưng vẫn chưa thực tập năm giới một cách vững chãi. Nhờ quá trình văn, tư và tu nên sự thực tập năm giới càng ngày càng vững; và lời nói của ta đi đôi với hành động, ngôn hành tương ưng. Nói theo Vương Dương Minh là tri hành hợp nhất.

!! Đạo vượt ngoài ngôn ngữ

Đạo bắt đầu bằng văn, tức là nghe, đọc và thâu nhận một số kiến thức. Rồi nhờ quán chiếu, suy gẫm và áp dụng trong đời sống hàng ngày nên những kiến thức và ý niệm ban đầu biến dần thành tuệ giác thực sự. Vì vậy chúng ta tránh nói tới đạo như là một chủ thuyết. Nhìn vào một con người có văn, có tư và có tu thì ta thấy sự thể hiện của đạo. Ta thấy người đó sẽ đạt tới diệt, buông bỏ được tập, và chuyển hóa được khổ. Quá trình tu học lúc đầu dựa vào ngôn ngữ, dựa vào ý niệm. Nhưng sau khi thực chứng, chúng ta sẽ không còn kẹt vào ngôn từ và ý niệm, sẽ tiếp xúc trực tiếp với bản môn. đạo siêu việt ngữ ngôn, như trong đạo Đức Kinh có câu: đạo khả đạo, phi thường đạo, (ữạo mà có thể đàm luận thì chưa phải đạo chân thường). Có những người tới hỏi đạo cốt để chất vấn và cãi lý về đạo, ta chỉ nên mỉm cười. Lý luận về đạo mất thì giờ, không có lợi ích gì. Ngồi uống trà với nhau còn có đạo vị hơn.

Bước đầu học đạo cần phải có những khái niệm về vô thường và vô ngã, về khổ, tập và diệt. Ban đầu ta cũng có thể dùng lý luận để dẹp trừ những tà thuyết. Nhưng sau đó ngôn từ và lý luận cũng được vượt luôn và lúc đó người tu học sử dụng chính sự sống của mình. Ta sống đời sống hàng ngày cách nào để cho người khác thấy chánh ngữ, chánh nghiệp, chánh mạng, chánh tinh tấn, chánh định và chánh kiến trở nên có mặt. Kinh thường kể những câu chuyện về những nhà triết học cứ muốn đàm luận và cãi lý với Bụt về những đề tài như vô thường, vô ngã, và niết bàn. Mỗi lần Bụt thấy một nhà triết học tới ngồi sẵn sàng để đấu lý như vậy thì Ngài chỉ mời ngồi uống trà. Hỏi thì Ngài không nói. Chúng ta nhớ lại câu chuyện một nhà triết học tới hỏi Bụt về vấn đề có ngã hay không có ngã. Bụt ngồi im không nói gì. Sau đó ông ta đi mất. Thầy A Nan thắc mắc, thì Bụt bảo: ‘‘Ông ấy đi tìm một học thuyết để chống đối hoặc ủng hđo, chứ không đi tìm pháp môn tu học. Nói không có ngã, ông sẽ bị kẹt, mà nói có ngã ông cũng bị kẹt. Không nói là đỡ cho ông ta hơn. ì

Đạo vượt lên trên ngữ ngôn, ý niệm và lý luận. Nói như vậy không có nghĩa là ngữ ngôn và khái niệm không có ích lợi. Khi người ta thao thức học hỏi để tu tập thì ngữ ngôn và khái niệm là những bảng chỉ đường có thể sử dụng được. Cũng như bản đồ của một thành phố tuy không phải là thành phố nhưng có thể giúp ta đi trong phố xá mà không lạc đường. Khi đạo đã là sự thật trong đời sống hàng ngày rồi thì sự tu học trở thành rất tự nhiên, rất nhẹ nhàng, không nặng về hình thức. đạo có tính cách vô hành. Vô hành là không làm gì cả. Kinh Tứ Thập Nhị Chương, xuất hiện ở Việt Nam vào thế kỷ thứ ba, có câu: ngã pháp hành vô hành hạnh, tu vô tu tu, chứng vô chứng chứng, (cái pháp của ta là hành cái hạnh vô hành, tu cái tu vô tu và chứng cái chứng vô chứng). Ý nghĩa câu đó là đạo vượt thoát các hình thức và ý niệm.

Đạo đế cũng có phần hữu lậu và phần vô lậu. Phần hữu lậu là thế gian (lokya), là phần hướng thượng, dần dần bớt khổ thêm vui. Phần vô lậu là xuất thế gian (lokottara) là phần vượt thoát hoàn toàn biên giới của ngôn từ, ý niệm, khổ và vui.

!! Kinh chánh kiến

Chánh kiến thường được diễn tả là thấy được tam bảo, thấy được thiện ác, v.v.. Nhưng trước hết chánh kiến là phải thấy được bản chất về bốn sự thật. Cái thấy về bốn sự thật là căn bản của chánh kiến. Trong tam tạng kinh điển có nhiều Kinh nói về chánh kiến, cái thấy chân thật (samyak dr3/4sti). Có một Kinh do thầy Xá Lợi Phất giảng, gọi là Kinh Chánh Kiến (Samaditthi sutta). Kinh này là kinh thứ 9 ở Trung bộ (M. 9). Thầy Xá Lợi Phất đã nói nhiều Kinh về đề tài tứ diệu đế, trong đó có Kinh gọi là Dấu Chân Voi, Tượng Tích Diệu Kinh. Con voi chúa đi trước để lại những dấu chân rất lớn. Những con đi sau có thể bước lên trên dấu chân đi trước; nhưng không có dấu chân con thú nào lớn bằng dấu chân con voi. Giáo lý tứ diệu đế cũng vậy, bao gồm tất cả các giáo lý khác. Kinh Chánh Kiến ở Trung Bộ có một Kinh tương đương bằng Hán văn, đó là Kinh 344 ở Tạp A Hàm. Học Kinh này ta thấy thầy Xá Lợi Phất dạy một sư em tên là Ma Ha Câu Thi La và một số các thầy khác về cái thấy chân chính.

Theo thồầy Xá Lợi Phất chánh kiến trước hết là sự phân biệt những gốc rễ lành và những gốc rễ không lành, thiện căn và bất thiện căn (wholesome roots anh unwholesome roots). Quán chiếu thì chúng ta sẽ thấy có ba loại gốc rễ lành là: vô tham (absence of greed), vô nhuế (absence of anger) và vô hại (absence of violence), tức là cái rễ không tham đắm, cái rễ không giận hờn và cái rễ bất bạo động. Bất bạo động (ahimsa) tức là vô hại. Vô hại tức là không muốn gây đổ vỡ cho mình, cho người và cho thiên nhiên). Những gốc rễ bất thiện là tham, nhuế và hại. Chữ tham có nhiều nghĩa. Nó có nghĩa là vướng mắc, là thèm khát, không bao giờ thỏa mãn. Ngược lại với tham là tri túc, tức là bằng lòng với tình trạng vừa đủ, để có an lạc cho thân tâm.

Các thầy khác hỏi: Có chánh kiến về các phương diện khác không? Thầy Xá Lợi Phất trả lời: Có chứ, ví dụ chúng ta nói đến chánh kiến về phương diện các loại thức ăn. Chúng ta phải phân biệt bốn loại thức ăn.

!! Bốn loại thức ăn

Loại thức ăn thứ nhất là đoàn thực, tức là những thức ăn đi vào miệng của chúng ta. Chánh kiến cũng là biết phân biệt những đoàn thực có hại và những đoàn thực không có hại. Chúng ta phải biết những thức ăn và thức uống nào gây tàn phá và làm mất sự điều hòa trong cơ thể. Khi chúng ta ăn những món hiền lành và bổ dưỡng thì chúng ta cũng biết. Đó gọi là chánh kiến. Ta thực tập chánh kiến ngay trong đời sống hàng ngày, trên bàn ăn và trong khi nấu ăn, chứ không phải chỉ thực tập trong thiền đường mà thôi. Trước khi ăn chúng ta nói: ‘‘chỉ xin ăn những thức ăn có tác dụng nuôi dưỡng và ngăn ngừa tật bệnhì, đó là chánh kiến áp dụng khi ăn và khi nấu ăn.

Nói về đoàn thực, Bụt đã dùng hình ảnh của hai vợ chồng nhà kia ăn thịt con. Hai vợ chồng này mang đứa con trai duy nhất đi qua sa mạc. Họ nghĩ rằng số lương thực đem theo là đủ cho chuyến đi. Nhưng chưa ra khỏi sa mạc họ đã hết thực phẩm. Hai vợ chồng biết rằng cả ba người sẽ chết đói. Cuối cùng họ phải đành tâm ăn thịt đứa con để có thể sống mà ra khỏi sa mạc. Họ vừa ăn thịt con vừa khóc. Bụt hỏi rằng: ‘‘Này các thầy, khi hai vợ chồng đó ăn thịt đứa con thì họ có thấy thích thú gì không?ì Các thầy thưa: ‘‘Bạch đức Thế Tôn, làm sao thích thú được khi biết mình đang ăn thịt con. ì Bụt dạy: ‘‘Trong đời sống hàng ngày, trong khi tiêu thụ, chúng ta cũng phải biết thức ăn của mình đã có thể được tạo ra bằng sự đau khổ cùng cực của kẻ khác, của những loài sinh vật khác. ì Hai tay nâng bát cơm đầy, dẻo thơm một hạt đắng cay muôn phần.

Ăn không có chánh niệm, ta tạo khổ đau cho mọi loài và khổ đau cho chính bản thân ta. Khi ta hút thuốc, uống rượu, ăn nhiều thức béo vào, là ta đang ăn bộ phổi của ta, đang ăn buồng gan, trái tim của ta, tự đang ăn thịt ta. Nếu là cha, là mẹ thì lúc đó ta đang ăn thịt con ta tại vì các con cần có cha mẹ mạnh khỏe, tươi vui. Và nếu cha mẹ trong khi ăn uống mà tàn hại thân thể của chính mình thì chính cha mẹ đang giết con. Thành ra ăn như thế nào để đừng tạo ra những khổ đau cho các loài và đừng tạo khổ đau cho chính mình, đó là chánh niệm và chánh kiến. Đạo Bụt trong cả Nam Tông và Bắc Tông đều tin rằng chúng sanh từ đời này sang đời khác thay phiên lần lượt làm cha làm mẹ của nhau. Vì vậy mỗi khi ăn thịt, chúng ta hãy có ý thức rằng có thể ta đang ăn thịt cha mẹ hay con cái của ta. Do đó chúng ta đã tập ăn chay và tập không sát sanh.

Loại thức ăn thứ hai là xúc thực. Chúng ta có sáu căn là mắt, tai, mũi, lưỡi, thân và ý. Chúng tiếp xúc với sắc, thanh, hương, vị, xúc và pháp. Ta phải thấy rằng việc tiếp xúc đó có đem chất độc vào người hay không. Ví dụ như khi ta xem truyền hình, mắt ta tiếp xúc với hình sắc. Phải thực tập chánh kiến xem chương trình truyền hình kia có đưa vào trong tâm ta những độc tố như sợ hãi, căm thù và bạo động hay không. Có những phim mang lại cho lòng ta sự hiểu biết, lòng từ bi, chí quyết tâm muốn giúp người, quyết tâm không làm những điều lầm lỗi. Ta biết ta có thể xem phim đó. ĨAy là ta thực tập chánh kiến. Người lớn cũng như trẻ em, trong khi xem phim, phải biết thực tập chánh kiến. Phải biết rằng có những chương trình truyền hình chứa đựng rất nhiều độc tố như bạo động, căm thù và dục vọng. Ngay cả những phim quảng cáo cũng khơi động thèm khát, dục vọng hay sợ hãi của người ta. Khi xem một tờ báo không có chánh niệm, chúng ta có thể tiếp nhận rất nhiều độc tố. đọc xong ta có thể mệt nhoài vì những điều ta đọc có thể khiến chúng ta chán nản, lo lắng và ghê sợ. Chính những câu chuyện hàng ngày cũng có thể mang nhiều độc tố. Đó là xúc thực.

Chánh kiến phát sinh ra chánh niệm và chánh niệm cũng làm phát sinh chánh kiến. Tôi biết rằng nhìn, nghe và tiếp xúc với những gì thì thân tâm tôi sẽ khỏe khoắn, nhẹ nhàng và an lạc và tôi quyết định mỗi ngày tiếp xúc với những chất liệu đó. Còn những thứ làm tôi mệt, tôi buồn, tôi lo, tôi giận thì tôi sẽ tránh không tiếp xúc. Đó là chánh niệm về xúc thực, có được nhờ chánh kiến về xúc thực. Bụt dạy rằng con người rất dễ bị thương tích, trên cơ thể cũng như trên tâm hồn. Bụt đã dùng hình ảnh một con bò bị lột da dẫn xuống sông. Dưới sông có hàng vạn loài sinh vật li ti bu lại hút máu và rỉa thịt con bò. Và khi ta đưa con bò tới đứng gần một bức tường hay một thân cây cổ thụ, cũng có những sinh vật li ti sống trên bức tường và trong cây cổ thụ bay ra, bám vào con bò để hút máu. Nếu chúng ta không giữ gìn thân và tâm bằng chánh kiến và chánh niệm thì các độc tố trong cuộc đời cũng bám lại và tàn phá thân tâm ta. Năm giới mà chúng ta tiếp nhận và hành trì là bộ da bao bọc thân thể và tâm hồn ta. Nếu không hành trì năm giới là chúng ta không thực tập chánh kiến. Và trong mỗi chúng ta vốn đã có hạt giống của chánh niệm. Thực tập chánh niệm cũng như tạo ra những kháng thể để chống lại sự thâm nhập của các độc tố kia.

Loại thức ăn thứ ba là tư niệm thực. Đó là những nỗi ước ao ta muốn thực hiện cho đời ta. Mong muốn làm giám đốc một hãng buôn lớn, hay mong muốn đậu bằng tiến sĩ, những mong muốn như thế thâm nhập vào người ta giống như một thức ăn. Mong muốn là một loại thực phẩm gọi là tư niệm thực. Ước muốn mạnh sẽ giúp ta năng lượng để thực hiện hoài bão. Nhưng có những loại tư niệm thực làm cho ta khổ đau suốt đời. Như danh, lợi, tài và sắc. Muốn được mạnh khỏe và tươi vui, muốn được giúp đỡ cho gia đình và xã hội, muốn bảo vệ thiên nhiên, tu tập để chuyển hóa, để thành một bậc giác ngộ độ thoát cho đời v.v.. thì đó là loại tư niệm thực có thể đưa tới an lạc, hạnh phúc. Về tư niệm thực, Bụt kể chuyện một người bị hai lực sĩ kéo xềnh xệch trên mặt đất để đi tới một hầm lửa. Hai lực sĩ khiêng người kia ném xuống hầm lửa đang bốc cháy. Bụt nói rằng khi ta bị những tư niệm thực bất thiện chiếm cứ, bị danh, lợi, tài và sắc lôi cuốn thì cũng như ta bị những chàng lực sĩ kéo đi liệng xuống hầm lửa. Do đó người tu học phải có chánh kiến, phải nhận diện được tư niệm thực trong ta là loại nào.

Loại thức ăn thứ tư là thức thực. Chúng ta là sự biểu hiện của thức, gồm có y báo và chánh báo. Chánh báo là con người gồm năm uẩn của ta và y báo thuộc hoàn cảnh chung quanh ta. Vì hành động tự nhiều kiếp xưa nên bây giờ ta có chánh báo này, với y báo này. Chánh báo và y báo đều là sự biểu hiện của tâm thức. Khi làm công việc nhận thức, tâm cũng giống như cơ thể đón nhận các món ăn. Nếu trong quá khứ tâm thức ta đã tiếp nhận những thức ăn độc hại, thì nay tâm thức ta biểu hiện ra y báo và chánh báo không lành. Những gì ta thấy, nghe, ngửi, nếm, tiếp xúc, suy tư, tưởng tượng, tất cả những thứ ấy đều như muôn sông chảy về biển tâm thức. Và những vô minh, hận thù và buồn khổ của ta đều trôi về biển cả của tâm thức ta. Vì vậy ta phải biết mỗi ngày chúng ta nhận vào tâm thức của ta những món ăn nào. Chúng ta cho tâm thức ăn Kinh Kim Cương, Kinh Pháp Hoa hay là chúng ta cho nó ăn tham, sân, si, mạn, nghi và tà kiến? Chúng ta cho nó ăn từ, bi, hỷ, xả hay là chúng ta cho nó ăn trạo cử, hôn trầm, giãi đãi, phóng dật?

Về thức thực, Bụt đã dùng hình ảnh một người tử tù và ông vua. Buổi sáng vua ra lệnh lấy 300 lưỡi dao cắm vào thân thể của một tử tội. Tới buổi chiều vua hỏi: ‘‘Người tù đó bây giờ sao?ì – ‘‘Tâu bệ Hạ, nó còn sống. ì- ‘‘Vậy thì đem nó ra, lấy 300 lưỡi dao đâm qua người nó một lần nữa. ì Và buổi tối, vua hỏi: ‘‘Kẻ đó bây giờ ra sao?ì- ‘‘Còn sống. ì- ‘‘Hãy lấy 300 mũi dao đâm qua thân thể nó một lần nữa!ì Bụt dùng ví dụ đó để nói chúng ta cũng đang hành Hạ tâm thức của ta y như thế. Mỗi ngày chúng ta đâm 300 mũi dao của độc tố vào trong tâm thức ta. Những mũi dao của tham lam, giận dơư, ganh tỵ, hờn giận, thù oán, vô minh.

Bốn ví dụ kể trên được chép trong Kinh Tử Nhục. Tử Nhục là thịt của đứa con. Bốn ví dụ nghe rất ghê sợ, có tác dụng rặn bảo chúng ta phải tỉnh táo giữ gìn chánh kiến.

Thầy Xá Lợi Phất nói: ‘‘Người có chánh kiến là người hiểu được bản chất của bốn loại thực phẩm như trênì. Nếu anh chưa biết được cái bản chất của bốn loại thực phẩm là anh chưa có chánh kiến. Sau khi thầy Xá Lợi Phất nói về bốn loại thực phẩm, các thầy khác lại hỏi tiếp: ‘‘Có thể nói về chánh kiến dưới một phương diện khác nữa hay không?ì Thầy Xá Lợi Phất trả lời: ‘‘Có, chánh kiến là cái thấy của chúng ta về bốn sự thật, gọi là tứ đế. Phải thấy được khổ, phải thấy được tập, phải thấy được diệt, phải thấy được đạo. ì Các thầy hỏi thêm, thì thầy Xá Lợi Phất nói tiếp về chánh kiến qua mười hai nhân duyên. Các thầy lại hỏi thêm nữa, và thầy Xá Lợi Phất nói rằng chánh kiến có thể nhìn dưới khía cạnh hữu lậu và vô lậu. Phần hữu lậu là thế gian và phần vô lậu là xuất thế gian. Phần thứ nhất là hướng thượng, phần thứ hai là lậu tận. Khi nào diệt hết phiền não thì gọi là lậu tận, tức là vượt ra khỏi biên giới của khổ đau. Những điều này cũng được nói tới trong nhiều Kinh khác *.

Chúng ta phải bắt đầu bằng phần thế gian. Chánh kiến (right view) là cái đi ngược lại với tà kiến (wrong view). Tà kiến là nói rằng không có nhân quả, không có thiện ác, không có cha mẹ, không có tình nghĩa. Chánh kiến là biết có nhân có quả, có phân biệt thiện ác, có đời trước đời này, có cha có mẹ, có tình có nghĩa, v.v.. Chúng ta phải bắt đầu từ phần đạo đức thế gian, theo lời thầy Xá Lợi Phất dạy. Chánh kiến gồm khả năng nhận diện những thiện căn và những ác căn ở trong ta, khả năng thấy được bản chất của tứ diệu đế, khả năng có thể thấy được bốn loại thực phẩm, và khả năng có thể thấy được mười hai duyên khởi.

!! Tưới tẩm hạt giống chánh kiến

Làm thế nào để đạt được chánh kiến? Trước hết chúng ta phải học. Quá trình văn, tư, tu (nghe- suy nghiệm- thực tập) bắt đầu bằng văn, nghĩa là phải học, phải tập lắng nghe. Chánh kiến có thể trao truyền được không, hay là tự mình phải đạt lấy? Ta nhớ rằng chánh kiến đã có sẵn hạt giống ở trong mỗi người. ựThầy giỏi và bạn giỏi là những người có thể khơi động được hạt giống của chánh kiến ở trong ta. Người dạy ta có chánh kiến không, và đã chứng đạt tới mức nào? Chánh kiến của người ấy đã vững chãi chưa hay chỉ là một số khái niệm học được từ các thầy khác hay trong Kinh sách? Học không phải là thâu thập kiến thức. Học lý thuyết mà không chứng nghiệm thì cũng như con tằm ăn lá dâu mà không làm được tơ, không có ích lợi gì cả.

Chánh kiến có thể thụ nhận, có thể trao truyền. Nhưng việc trao và nhận cần nhiều điều kiện. Người dạy ta về chánh kiến, cuốn sách ta đọc, cuốn Kinh ta tụng phải có khả năng thức động những hạt giống chánh kiến trong ta. Hạt giống chánh kiến có sẵn. Bụt dạy tất cả mọi người đều có hạt giống của tuệ giác. Cho nên khi được nghe, được tiếp xúc với những dấu hiệu của chánh kiến thì tự nhiên ta sẽ hiểu. Những kinh nghiệm khổ đau của ta cũng giúp ta tiếp nhận chánh kiến. Chánh kiến chỉ có thể trao truyền trong những thời gian và địa điểm thích hợp, bằng ngôn ngữ từ ái, khế cơ, những ngôn ngữ có khả năng đánh thức được hạt giống chánh kiến có sẵn trong người nghe. Người nghe lúc đầu có thể chỉ hiểu bằng trí óc thôi, điều nghe chưa thấm vào tâm thức hoặc chưa thể nghiệm được, vì còn thiếu kinh nghiệm sống. Nhưng hạt giống chánh kiến chứa sẵn trong tâm một ngày kia sẽ nẩy mầm. Khi kinh nghiệm đau khổ đã chín mùi thì chỉ cần nghe một câu nói hay một bài pháp thoại là người ấy đã có thể chuyển hóa. Cho nên tạo ra những điều kiện giúp ta tiếp nhận chánh kiến là điều rất quan trọng.

Nhiều người thấy mình đã sẵn sàng để tiếp nhận chánh pháp, nhưng vẫn phải chuẩn bị một thái độ thích đáng. Nghe một bài pháp, phải để cho giáo pháp có cơ hội thấm sâu trong tâm thức để tiếp xúc, đánh thức và tưới tẩm những hạt giống chánh kiến ở trong mình. Nếu chỉ dùng trí năng để tiếp nhận chánh kiến thì sẽ không có kết quả bao nhiêu. Tôi thường nói với thiền sinh là nghe pháp thoại (văn) là một phép thực tập mà việc thực tập thì không phải chỉ cần đến trí năng. Phải thực tập với thân, tâm và cả tàng thức của mình. Tàng thức như mặt đất, gọi là đất tâm (tâm địa). Trong đất tâm của ta có những hạt giống của chánh kiến. Khi nghe pháp đừng dựng lên những bức tường trí xảo. Không suy đoán, không so sánh, không bình luận.

Trong giai đoạn văn ta chưa cần tư. Khi nghe pháp thoại hãy khoan dùng trí năng phân biệt, mà phải đưa cả thân tâm ra. Khi nghe pháp, ta phải để mặt đất tâm mở rộng thênh thang cho mưa pháp thấm nhuần. Mưa xuân nhẹ hạt đất tâm ướt, hạt đậu năm xưa hé miệng cười. Đất tâm thấm ướt thì hạt giống tuệ giác ở trong ta mới nẩy mầm được. Cho nên ngồi nghe pháp thoại phải như ngồi thiền, phải ngồi cho chững chạc, thanh thản, và chỉ lắng nghe thôi. Mở rộng tấm lòng không thành kiến để tiếp nhận lời pháp thoại. Nghe mà đã có định kiến rồi thì không tiếp nhận được nữa. Lúc nghe chúng ta đừng đem so sánh những lời đang nghe với ý kiến có sẵn của mình. Đừng vừa nghe vừa phê phán: giống, khác, đúng, sai và lấy các định kiến của mình làm tiêu chuẩn. Bị bức tường trí não và thành kiến ngăn chặn, những điều ta nghe không thấm vào lòng ta được nữa. Cho nên bí quyết của nghe (văn) là lòng trống, là không tâm. Nghe, tiếp nhận và thấu hiểu rồi, sau đó mới tư và tu, nghĩa là mới suy ngẫm, chiêm nghiệm và đem vào cuộc sống.

Vào thời Bụt còn tại thế, nhiều người tới nghe Bụt giảng lần đầu, trong khi nghe đã tỉnh thức ngay. Họ giác ngộ tức thời trong khi nghe Bụt nói, nhờ họ đã từng đau khổ và đã dầy công tu tập. Chỉ văn thôi là đã chứng. Ba việc văn, tư và tu diễn ra trong cùng một khoảnh khắc. Vì ở trong con người của những kẻ ấy những cơ năng của giác ngộ đã đầy đủ rồi, chỉ còn một chỗ nào đó còn bị kẹt mà thôi. Bây giờ nghe một bài pháp thoại thì tự nhiên chỗ bị kẹt đó được tháo gỡ, và sự thật bung ra.

Chánh kiến có thể được nói tới như là nhân hay là quả. Chánh kiến tiếp nhận vào là nhân. Tư và tu lại mang chánh kiến tới như kết quả của sự thực tập. Khi tiếp thụ chánh kiến như là nhân, thì phần ý niệm và danh từ còn quan trọng. Khi thành tựu kết quả thì chánh kiến là tuệ giác, vượt khỏi danh từ và khái niệm, chánh kiến tức là giác ngộ, là bồ đề.

Vào buổi khuya thành đạo, Bụt đạt tới cái thấy hoàn toàn, vô thượng chánh đẳng chánh giác, thì cái thấy của Ngài là tuệ giác xuất thế gian. Nhưng khi bắt đầu giảng cho các thầy về tứ diệu đế là Bụt bắt đầu phải dùng ý niệm và ngôn từ. Ý niệm về khổ, về tập, về diệt, về đạo. Đọc trong Kinh chúng ta thấy rằng sau khi Bụt thành đạo Ngài đã ở lại bờ sông Ni Liên Thuyền 49 ngày. Trong 49 ngày đó, Ngài sống trong vô ngôn và vô niệm, nhưng đồng thời Ngài cũng bắt đầu thiết lập các ngôn từ và ý niệm để chuẩn bị giảng dạy. Chúng ta thấy bài thuyết pháp đầu tiên về tứ đế và bát chánh đạo đã được xây dựng một cách rất kỹ lưỡng, rất đẹp đẽ và rất thích hợp với năm người đệ tử đầu. Nhưng đó chỉ là cái bình để đựng nước thôi. Nước chánh kiến đã có sẵn rồi. Muốn hiến nước cho người, phải đem tặng trong một cái bình. Và tứ diệu đế, bát chánh đạo là bình nước tuệ giác đầu tiên mà Bụt đem chia sẻ cùng nhân loại.

Thầy Thái Hư, sống đầu thế kỷ này bên Trung Quốc đã dùng các danh từ giáo lý bản chất và giáo lý ảnh tượng. Giáo lý ảnh tượng là giáo lý được trình bày qua ngôn từ và khái niệm, còn cái giáo lý mà ta sống là giáo lý bản chất. Thầy dùng hình ảnh của một thân cây. Trời nắng, cây chiếu bóng trên mặt đất. Chỉ cho người kia cái bóng cây: đây là bóng cây, nếu anh tìm tới gốc và nhìn lên anh sẽ thấy cây. Giáo lý ảnh tượng như bóng cây, giáo lý bản chất là cây. Cây là tuệ giác chân thật, bóng cây là khái niệm và ngôn từ diễn tả tuệ giác. Nhất thiết tu đa la giáo như tiêu nguyệt chỉ, tất cả giáo lý trong các kinh điển đều là ngón tay chỉ mặt trăng. Ngón tay chỉ mặt trăng không phải là mặt trăng nhưng nếu không có ngón tay chỉ thì ta không biết phương hướng nhìn về mặt trăng. Khi nương vào giáo lý ảnh tượng để tu tập, một ngày kia ta thấy được giáo lý bản chất.

Duy Biểu Học (thường gọi là Duy Thức Học) nói về các phiền não như tham, sân, si, mạn, nghi và kiến. Không cần dùng chữ tà kiến, vì kiến đã có nghĩa là cái thấy sai lầm rồi. Kiến nghĩa là một cái thấy phiến diện, thấy một mặt. Đứng về phương diện thế gian mà nói thì có chánh kiến, có tà kiến, chánh kiến đối lập với tà kiến. Nhưng khi đạt trình độ xuất thế gian thì tất cả mọi kiến đều là tà kiến. Ví dụ như vô thường là chánh kiến, thường là tà kiến; ngã là tà kiến, vô ngã là chánh kiến. Nhưng đứng về phương diện xuất thế gian thì thường là tà kiến mà vô thường cũng trở thành tà kiến. Vô thường là thứ thuốc trị bệnh giúp ta khỏi vướng mắc vào cái thấy về thế giới mà ta nghĩ là trường tồn. Nhưng nếu ta lại vướng mắc vào ý niệm vô thường thì vô thường cũng là một cái thấy (kiến) sai lầm. Vô thường là cái ta chứng nghiệm trong đời sống, không phải chỉ là một khái niệm. Học Phật, chúng ta hay bị vướng vào những ý niệm vô thường và vô ngã. Với tuệ giác siêu việt thì ý niệm về thường phải được vượt qua mà ý niệm về vô thường cũng phải được vượt qua. Ý niệm về ngã phải vượt mà ý niệm vô ngã cũng phải vượt. Cũng như trong Kinh Bảo Tích nói: ‘‘thà rằng bị kẹt vào ý niệm hữu, còn hơn là bị kẹt vào ý niệm khôngì. Không là một thứ thuốc để trị bệnh hữu nhưng nếu ta bị bệnh không thì không còn thuốc nào để chữa. Tóm lại, tu tập chánh kiến trước hết là học hỏi và tiếp nhận những ngôn từ và những khái niệm chuyên chở tuệ giác. Rồi nhờ quá trình văn, tư và tu mà tuệ giác đó lớn lên dần dần. Và khi đã đạt được tuệ giác thì không những tất cả các khái niệm về tà kiến mà cả những khái niệm về chánh kiến cũng được thắng vượt. Kinh Pháp Môn Căn Bản (Mula pariyaya, Trung bộ 1) nói rất rõ về sự vượt thắng ý niệm và tà kiến, đứng trên lập trường xuất thế. Không những ý niệm ‘‘ta có tự ngãì là một tà kiến mà cả ý niệm ‘‘ta không có tự ngãì cũng là một tà kiến.

Tuệ giác đạt được nhờ chánh kiến càng lớn thì hành động của chúng ta càng sáng. Chánh tư duy, chánh ngữ, chánh nghiệp, chánh tinh tấn, chánh định v.v.. , tất cả đều tùy theo chánh kiến. Phẩm chất của bảy phần kia trong bát chánh đạo đều tùy thuộc phẩm chất của chánh kiến. Cho nên Kinh Tạp A Hàm 785 cũng như trong Kinh Thánh Đạo, Majjhima Nikaya 117, đều nói rằng chánh kiến đứng hàng đầu. Việc tu tập chánh kiến lúc đầu giúp ta phân biệt chánh kiến và tà kiến. Cuối cùng nhờ chánh kiến ta biết rằng tất cả các kiến đều là tà kiến. Cho nên chánh kiến tức là vốn liếng tu học, vốn liếng hành trì của chúng ta. Nếu vốn liếng đó phong phú thì tất cả những sự hành trì trong các lãnh vực chánh tư duy, chánh ngữ, chánh nghiệp, chánh mạng, chánh tinh tấn, chánh niệm và chánh định cũng sẽ giàu có. Học hỏi như thế nào để cho những hạt giống chánh kiến trong tâm được đánh thức, được nẩy mầm, thì lúc đó những điều chúng ta học hỏi mới thật sự là chánh kiến.

!! Chú thích

Các Kinh căn bản nói về bát chánh đạo đều phân biệt hai mặt của bát chánh đạo. Hai mặt ấy là hữu lậu và vô lậu. Xin tham khảo Kinh Thánh đạo (Trung A Hàm 189), Kinh Tạp A Hàm 785 và Kinh Maha cattarisaka (Trung Bộ 117). Kinh Tạp A Hàm 785 rõ nhất.

Theo gốc chữ, lậu tức là cái sự rỉ chảy, sự trôi lăn. Vô lậu tức là chấm dứt sự rỉ chảy, sự trôi lăn. Lậu có thể dịch là sự đi vòng, asrava. Lậu do đó có nghĩa là phiền não, thành ra asrava là klesa (phiền não). Khi nào mà chúng ta diệt hết tất cả phiền não thì gọi là lậu tận, tức là hoàn toàn giải thoát, vượt ra khỏi biên giới của khổ đau. Xuất thế gian thì mới gọi là lậu tận. Trong sáu phép thần thông thì lậu tận thông là cao nhất. Lậu tận thông tức là gột sạch hết tất cả phiền não, còn các thần thông khác như thiên nhãn thông và thiên nhĩ thông thì không quan trọng bằng
! Bài 14 Quán chiếu cảm thọ

Hôm nay là ngày mùng 9 tháng giêng năm 1994, chúng ta ở tại Xóm Hạ và học tiếp về chánh niệm. Chúng ta đang chiêm nghiệm về Kinh Quán Niệm Hơi Thở và Bốn Lĩnh Vực Quán Niệm, tức là thân, thọ, tâm, và pháp.

Lĩnh vực quán chiếu thứ hai cảm thọ. Chúng ta phải tập quán chiếu cảm thọ trong những lúc bình thường, khi cường độ cảm thọ chưa mạnh quá. Có như vậy, lúc gặp cảm xúc mạnh, ta mới có khả năng quán chiếu thành công. Nếu không, khi những cảm thọ có cường độ mạnh nổi lên, ta sẽ không đủ sức và có thể bị tràn ngập, áp đảo và tê liệt.

Quán chiếu cảm thọ phải biết dùng hơi thở. Quán niệm bằng hơi thở phải trở thành một thói quen. Muốn thuần thục, ta phải thực tập ngày này sang ngày khác, tháng này sang tháng khác. Cho nên không thể đợi khi có một cảm xúc mạnh ta mới bắt đầu sử dụng phép quán niệm. Nhờ thực tập, phép quán niệm hơi thở trở thành một vốn liếng có sẵn, nhờ kinh nghiệm tu tập mà thành.

Biết áp dụng hơi thở chánh niệm chưa đủ. Ngoài ra ta còn phải biết cách quán niệm tư thế của thân thể. Trong đời sống hàng ngày, ta luyện cách đi, cách đứng, cách nằm, cách ngồi. Thân thể là một đối tượng để quán chiếu, nhờ đó ta có thể chăm sóc và điều phục được các cảm thọ. Hơn nữa, ngoài cơ thể mà ta gọi là nhục thân, ta còn có một thân khác cần phải chăm sóc và quán chiếu, đó là tăng thân, nghĩa là đoàn thể tu học của ta. Đó cũng là thân ta.

Nhưng tăng thân không phải tự nhiên mà có, tăng thân là do chúng ta xây dựng nên. Trong đời sống hàng ngày, ta phải bồi dưỡng tăng thân ta. Mỗi lời nói, mỗi hành động ta, mỗi cái nhìn và mỗi nụ cười của ta đều có thể được sử dụng để xây dựng tăng thân. Xây dựng tăng thân tức là xây dựng bản thân. Người nào cũng có những lúc gặp khó khăn. Tăng thân là một cái lưới cứu ta khỏi chết đuối trong những lúc khó khăn nhất. Cho nên ‘‘Con về nương tựa Tăng’’ là một phép thực tập quan trọng. Không cần đó là một thánh Tăng; tăng thân ta nếu chỉ là phàm Tăng thì cũng đủ quý giá rồi. Nhờ có sự thực tập chánh niệm, nên Bụt và Pháp có mặt trong Tăng, để Tăng có thể được xứng đáng gọi là Tăng bảo.

Quán chiếu hơi thở, quán chiếu thân thể, sử dụng những phương pháp như đi thiền, ngồi thiền, nằm thiền (total relaxation), tất cả đều có tác dụng đối trị các cảm thọ mạnh. Và nhất là phải biết sống với tăng thân. Nếu ta sống trong tăng thân mà không hòa hợp được, nếu ta hành xử như một giọt dầu trong một bát nước, thì tăng thân không có nghĩa gì. Do đó Kinh và Luật luôn luôn nói tới hình ảnh tăng thân như nước với sơưa hòa hợp. Nước với sơưa chứ không phải là nước với dầu. Hòa hợp tăng có nghĩa là một tăng thân đích thực mà bản chất là sự hòa hợp.

!! Nhận diện các tâm hành

Cảm thọ chỉ là một trong số 51 loại tâm hành, tức là những hiện tượng tâm lý (mental formations). Tâm hành (citta samskara) có khi được gọi là tâm sở. Giận là một tâm hành, lo là một tâm hành, buồn là một tâm hành, thương, ghét và chán nản là những tâm hành. Tất cả những tâm hành ấy đều có hạt giống và có gốc rễ trong chiều sâu tâm thức ta. Những tâm hành nhẹ nhàng có tác dụng giải phóng, chuyển hóa và đưa chúng ta lên cao là những tâm sở thiện. Có những tâm hành có tác dụng gây đổ vỡ, gọi là tâm sở bất thiện. Có những tâm hành có tính cách phổ biến, gọi là tâm sở biến hành và những tâm hành phát hiện trong những trường hợp riêng lẻ, gọi là tâm sở biệt cảnh. Lại có những tâm hành bất định, có khi thiện, có khi bất thiện, gọi là tâm sở bất định. Ví dụ như tâm hành miên (buồn ngủ) có khi là tốt, có khi không tốt. Tâm hành hối cũng có khi tốt và có khi không tốt. Nếu chúng ta đã làm một hành động gây đổ vỡ, buồn đau cho người khác mà chúng ta biết hối hận thì tâm hành hối là một tâm hành thiện. Ta tự dặn lòng từ rày về sau sẽ không nói và không làm như vậy nữa. Nhưng nếu niềm hối hận đó biến thành một Đm ảnh, gây ra mặc cảm tội lỗi, khiến cho ta tê liệt không tiến thêm được nữa trên đường đạo nghiệp, thì tâm hành đó trở nên bất thiện. Hối trong trường hợp này được coi là một tâm hành bất định.

Một tâm hành bất định khác tên là tầm. Tầm có nghĩa là tư duy. Khi tư duy có thể giúp mình thấy được rõ ràng hơn thì tâm hành tầm là một tâm hành thiện. Nhưng nếu đầu ta cứ miên man nghĩ hết chuyện này sang chuyện khác, ta cứ tự để phiêu lưu trong thế giới tư tưởng suông, không thiền tập, không thiền hành được thì tầm trở thành một tâm hành bất thiện. Từ cũng vậy. Từ là so sánh, quyết trạch, tư lượng. Từ có khi có ích lợi, có khi lại là chướng ngại. Từ nhị thiền trở đi các tâm hành ‘‘tầm’’ và ‘‘từ’’ có thể làm cho ta không đi sâu được vào thiền quán. Vì thiền quán là tiếp xúc sâu sắc để chuyển hóa, để nhìn rõ, mà tư duy có thể kéo những sợi tơ dài làm cho đầu ta trở thành một cuộn chỉ rối. Lúc đó tầm và từ là một tâm sở bất thiện.

Có nhiều tâm sở thiện nằm trong chiều sâu tâm thức ta và có thể đã do các thế hệ cha ông và thầy tổ trao truyền lại. Ví dụ như tâm hành bất hại (ahimsa, non-harming). Không muốn gây ra một đổ vỡ và hư hại nào trong sự sống, dù một cành cây nhỏ cũng không muốn làm gẫy, đó là bất hại. Bất hại là từ bi. Một tâm hành khác là tàm. Tàm tức là hổ thẹn, mắc cở, biết hổ, biết thẹn nhờ có chánh kiến. Thấy mình không đáp ứng được sự trông đợi của thầy, của tổ, của cha mẹ, anh em và bằng hữu thì trong lòng hổ thẹn, đó là tàm. Ví dụ khác là tâm hành vô sân. Vô sân tức là sự vắng mặt của giận hờn. Ai nói gì cũng cười hề hề không giận, đó là tâm hành vô sân, đó là sự hoan hỉ nguyên chất. Người học tâm lý học Phật giáo thuộc lòng những tâm hành thiện: tín, tàm, quý, vô tham, vô sân, vô si, cần, khinh an, bất phóng dật, hành xả, bất hại.

Có những tâm hành được gọi là bất thiện, chúng làm cho tâm ta rối lên, mê mờ, đen tối đi, và trói buộc ta lại. Tâm hành bất thiện cũng gọi là phiền não, có khi gọi là hoặc, chữ Phạn là klesa. Hoặc là những phiền não, những mê mờ. Mê hoặc là đưa ta đi lầm đường lạc lối. Thơ Vũ Hoàng Chương có câu trông ra bến hoặc bờ mê.

Hoặc có khi gọi là lậu (astrava). Lđau là ngược đầu trở lại, là đi vòng trở lại, là quanh quẩn. Lđau có nghĩa là nứt rạn, như nước ở trong bình nứt rỉ ra gọi là lậu. Những tâm hành có tác dụng đi xuống, làm cho mình sa xuống thấp, và quanh quẩn trong buồn giận, sầu đau, v.v.. đều gọi là lậu. Khi được chuyển hóa rồi tình trạng được gọi là vô lậu. Vô lậu là không còn nứt rạn nữa.

Có những phiền não căn bản, và có những phiền não thứ yếu. Những phiền não căn bản là tham, sân, si, mạn, nghi, kiến. Những phiền não nhẹ hơn như vô tàm, vô quý, trạo cử, hôn trầm, thất niệm, phóng dật, bất chánh tri. Ngoài các tâm hành thiện và bất thiện, chúng ta phải biết tên năm tâm hành phổ quát gồm có tác ý, xúc, thọ, tưởng và tư. Những tâm hành đặc biệt là dục, thắng giải, niệm, định và tuệ. Các vị đã học Duy Biểu Học, xưa gọi là Duy Thức, thì đã biết được tên gọi cũng như là bản chất của từng tâm hành đó.

Vậy thì trong lĩnh vực tâm thức, có 51 loại hiện tượng tâm lý có thể phát hiện trong ta. Mỗi khi một tâm hành phát hiện, ta phải dùng ánh sáng chánh niệm để nhận diện nó. Trước hết là sự nhận diện đơn thuần. Buồn thì biết mình đang buồn. Chỉ cần tự biết là mình đang buồn, dùng ánh sáng ý thức để soi rõ và nhận diện nỗi buồn.

<<<
Hôm nay trời nhẹ lên cao,  <br>
Tôi buồn không hiểu vì sao tôi buồn.
<<<

Ban đầu thì tôi không hiểu vì sao tôi buồn. Nhưng nếu là thực tập chánh niệm và phát khởi được niệm, định và tuệ, thì ta sẽ biết tại sao ta buồn. Rồi chỉ cần mỉm một nụ cười thì nỗi buồn đó sẽ tan. Quán chiếu tâm hành bắt đầu bằng việc nhận diện đơn thuần, nhận biết sự có mặt của tâm hành. Nhận diện tâm hành trên ý thức không phải dễ. Nỗi buồn có thể lôi kéo ta từ bên này sang bên kia, từ suy tư này tới hoài niệm khác. Tâm hành buồn lại kéo những tâm hành khác tới, như các diễn viên qua lại trên một sân khấu vắng người. Người tu tập phải có mặt để nhận diện những tâm hành nào đang xuất hiện, đừng bao giờ để sân khấu tâm ý bị bỏ trống vô chủ. Cho nên học đi, đứng, nằm, ngồi trong chánh niệm để biết cái gì đang xảy ra là một thực tập cần thiết. Phương pháp đơn giản là mỗi khi buồn, ta dùng hơi thở, dùng bước chân, v.v.. để phát khởi chánh niệm và nhận diện sự có mặt của tâm trạng buồn. ‘‘Tôi đang buồn và tôi biết rằng tôi đang buồn’’. Tình trạng có thể đổi khác lập tức. Thay vì để cho tâm hành buồn độc diễn, ta đưa vào thêm một tâm hành khác, gọi là niệm. Tâm hành niệm là một trong năm loại tâm hành biệt cảnh. (biệt cảnh là particular, còn biến hành là universal. ) Đối tượng của chánh niệm bây giờ là nỗi buồn: ‘‘Tôi đang thở vào và tôi biết rằng tôi đang buồn, tôi đang thở ra và tôi mỉm cười với nỗi buồn của tôi’’. Buồn ơi chào mi !

Tu tập là như vậy. Thay vì tìm cách đàn áp và triệt tiêu cái buồn, ta phát khởi nhận thức về sự có mặt của cái buồn. Chánh niệm là một vùng năng lượng bao bọc lấy nỗi buồn và rọi ánh sáng vào đó. Nhà có chủ, chùa không phải là chùa Bà Đanh. Biết chăm sóc các tâm hành ta sẽ chuyển hóa được những tâm hành bất thiện và nuôi dưỡng được những tâm hành thiện.

Ý thức là sân khấu, trên đó những tâm hành được phát khởi. Phần dưới của tâm, cái phần vô thức, tiềm thức, chúng ta gọi là tâm địa, đạo Bụt gọi là tàng thức. Tàng có nghĩa là cất giữ. Mọi tâm hành đều ở sẵn trong tàng thức với tính cách những hạt giống, gọi là chủng tử (bija). Cái buồn, trước khi phát hiện, đã nằm sẵn trong tàng thức rồi. Nghe đọc một câu thơ: ‘‘trời nổi gió heo may’’ chẳng hạn, thì tự nhiên cái hạt giống buồn được tưới tẩm, và tâm hành buồn phát hiện.

Tâm địa tức là đất tâm có chức năng gìn giữ tất cả những hạt giống. Có những hạt giống hạnh phúc bị chôn vùi từ lâu trong đất. Một buổi sáng hạt giống của niềm vui nẩy mầm. Sự phát hiện của niềm vui này do công trình thực tập, tưới tẩm của chính ta, của tăng thân, bây giờ mới gặp hoàn cảnh thuận lợi. Mưa xuân nhẹ hạt đất tâm ướt, hạt đậu năm xưa hé miệng cười.

Quán niệm tâm hành trước hết là ý thức, nhận diện, và săn sóc tâm hành đó. Chánh niệm cho chúng ta thấy được sự có mặt của tâm hành không những trên sân khấu của ý thức, mà cả sau hậu trường của tàng thức nữa. Tàng thức là phần thâm sâu của ý thức, nói nó là một cũng được, là hai cũng được. Khi nhìn một em bé nói, cười, đi, đứng hoặc nhảy nhót, ta nhìn vào phần hiện tượng. Quán sát kỹ cách em nói, cười, đi và nhảy, ta đi sâu được vào những cội nguồn và gốc rễ, và thấy được những hạt giống mà ban đầu ta chưa thấy. Ta thấy được xã hội em bé đó sống, thấy được cha mẹ, ông bà, chủng tộc của em bé. Nhìn vào hoa trái ta thấy được gốc rễ.

Nghe một bà mẹ hát câu ru con, ban đầu ta chỉ cảm thấy man mác buồn thôi, nhưng khi tiếp xúc được với chiều sâu của tiếng ru rầu rầu đó, ta có thể thấy, trong âm hưởng của nó, những thế kỷ giặc giã, hàng ngàn năm sống trong áp bức, nô lệ và đói khổ. Ta thử nghe hai câu của Hoàng Cầm:

<<<
Tiếng bà ru cháu buổi trưa,  <br>
chan chan nắng hạ võng đưa rầu rầu.
<<<

Chánh niệm, thiền quán cho chúng ta thấy và tiếp xúc được với chiều sâu của các tâm hành. Một nỗi buồn vô cớ, nhẹ nhàng, có thể là dấu hiệu của một nỗi sầu vạn cổ đã được nhiều thế hệ tổ tiên trao truyền lại.

!! Quán chiếu về tưởng để vượt thoát mê lầm

Tưởng là một tâm hành rất quan trọng, đã được tách riêng ra một yếu tố của năm uẩn. Chúng ta hãy nhớ lại năm uẩn: sắc, thọ, tưởng, hành và thức. Sắc là hình hài ta. Thọ gồm những cảm thọ dễ chịu, khó chịu và trung tính. Tưởng là tri giác. Thọ là một tâm hành, tưởng là một tâm hành khác. Hành ở đây là tất cả 49 tâm hành còn lại, còn thức là phần tàng thức, là tâm địa, chỗ chôn giữ hạt giống của tất cả 51 loại tâm hành.

Tưởng là một tâm hành, cũng có hạt giống ở sâu trong tàng thức. Nghe tiếng bà ru cháu, mười người nghe có mười cái tưởng khác nhau. Người nghe có thể từ thành phố lại, từ thôn quê tới, hoặc từ ngoại quốc về thăm. Nếu dùng máy thâu âm, ta có thể xác định được tính cách khách quan của âm điệu những câu hát ru. Nhưng những người cùng nghe câu hát ru đó có thể có những nhận thức khác nhau. Có người từng nghiên cứu về nhạc dân tộc ở Phi châu, từng nghe những tiếng ru của các bà mẹ Phi châu, bây giờ trong cái tưởng của họ có sự so sánh những điệu hát ru. Chúng ta chỉ nghe với kinh nghiệm của một người đã từng được mẹ ru. Hoặc ta đã từng nghe tiếng ru em của một bà mẹ miền Nam, và bây giờ đây ta đang nghe tiếng ru miền Bắc hay miền Trung. Vậy cái tưởng, cái tri giác của ta về tiếng ru đó, có tính cách chủ quan. Còn nếu đang nghe lời hát ru mà lòng còn mải lo lắng thì nghe tiếng ru đó, ta không để ý tới, ta không thấy thấm thía, ta chỉ thấy những âm thanh thoảng qua.

Tri giác của ta có thể chứa đựng nhiều sai lầm. Hành động, lời nói và tâm trạng, tất cả đều căn cứ trên tưởng. Tri giác mang nhiều tính chủ quan, trong đó có những chất liệu phiền não như thèm muốn, giận dữ, si mê và tà kiến. Căn cứ trên tri giác ấy, ta buồn, vui, khổ đau hoặc hạnh phúc. Cho nên quán chiếu về tưởng rất quan trọng.

Nếu chúng ta có một ý niệm về hạnh phúc, thì ý niệm hạnh phúc cũng là một cái tưởng. Trong đầu ta và cả trong tiềm thức của ta, có một ý niệm là hạnh phúc chỉ có thể có khi ta đạt được cái này hay cái kia. Trong hầu hết các trường hợp, quan niệm có sẵn của ta về hạnh phúc chướng ngại đầu cho chính hạnh phúc. Có một anh chàng tin chắc nếu không cưới được cô gái ấy thì đời anh không còn đáng sống nữa. Anh tin chắc đến nỗi không ai có quyền nói khác. Mấy năm sau anh có thể sẽ tìm ra sự thật là người đàn bà kia chỉ có thể làm cho anh đau khổ không ngừng trong quá trình yêu thương.

Khi vướng vào một quan niệm về hạnh phúc rồi, ta có thể khổ đau vì quan niệm đó. Nếu không chiếm được cái này, không thực hiện được cái kia, thì đời ta không có nghĩa gì nữa! Trong khi có cả hàng ngàn hoặc hàng vạn điều kiện của hạnh phúc ở ngay đây mà ta không tiếp xúc được, mà ta tiếp tục dẫm đạp lên. Thành ra cái ý niệm về hạnh phúc, cái tưởng về hạnh phúc của ta, là chướng ngại chặn đường hạnh phúc của ta.

Tri giác trước hết là tri giác sai lầm, là vọng tưởng. Trong Phật học, kiến hoặc tà kiến là tiếng dùng để chỉ cho tri giác sai lầm. Vì vậy tưởng thường được đồng nhất với vọng tưởng, cũng như kiến thường được đồng nhất với tà kiến. Khi nhìn thấu được bản chất của tri giác rồi, ta thoát khỏi tri giác, bấy giờ nhận thức ta được gọi là trí, cái thấy đạt đạo. Trạng thái đó không gọi là tưởng – cũng không phải là phi tưởng. Chánh niệm soi chiếu để ta nhận diện được cái tưởng của ta. Tiếp tục quán chiếu các tâm hành, đến một ngày đó ta sẽ thấy được gốc rễ sâu xa của các tâm hành. Và quá trình tu tập để nhận diện và quán chiếu là đi thiền, ngồi thiền, ăn cơm im lặng; là công phu, là mỗi bước chân, mỗi hơi thở, từng giây phút đều được sống trong chánh niệm, trong tỉnh thức. Và điều đó chính ta phải tự mình làm lấy, người khác không ai làm hộ cho ta được.

Chúng ta hãy tưởng tượng hai người hàng ngày sống bên nhau, mỗi người có tri giác (tưởng), những nỗi vui và buồn riêng của mình. Nằm sâu trong tàng thức mỗi người là những hạt giống nhận thức về hạnh phúc và về khổ đau. Tiếp xúc với hoàn cảnh và với người kia tạo thành những cái tưởng, và căn cứ trên những cái tưởng ấy mỗi người đoán định và hành xử đối với người kia. Người kia cũng có những vui, buồn, và những nhận thức riêng đưa tới những cái tưởng có thể là rất khác và những cái tưởng ấy của hai người có thể chống đối nhau. Những đau khổ của chúng ta trong đời sống chung thường được phát sinh ra từ những cái tưởng của ta, từ những hình ảnh và ý niệm mà mỗi người có về chính mình và về người kia, trong đó có đầy dẫy sai lầm.

Công phu tu học bắt đầu bằng việc quán chiếu cái tưởng của mình. Cũng như phải buông bỏ quan niệm sẵn có của mình về hạnh phúc mới có thể đạt được hạnh phúc chân thật. Sự thật là chúng ta có thể đang có đủ mọi điều kiện để sống hạnh phúc. Nhưng chính vì cái tưởng cho rằng muốn có hạnh phúc thì phải được thế này, được thế kia, cho nên ta bị kẹt và không có hạnh phúc. Tất cả nỗ lực tu học của chúng ta đều nhắm tới phá tan cái tưởng đó. Đối tượng của sự tu học là phá vọng tưởng, vọng tưởng về sanh và diệt, về có và không, về đến và đi, về nhiều và một; đó là những vọng tưởng căn bản. Phải dùng nguồn năng lượng chánh niệm của ta trong đời sống tu tập hàng ngày để phá vỡ những cái tưởng ấy. Đó là giải thoát. Đi thiền, ngồi thiền, ăn cơm im lặng, học kinh, thực tập hơi thở đều để làm chuyện đó. Tri giác về mình đầy dẫy sai lầm và tri giác về người đầy dẫy sai lầm. Nếu những tri giác đó vẫn còn nguyên vẹn không thay đổi gì, thì đó có nghĩa là ta chưa thực tập quán chiếu về tưởng.


!! Niềm tin phải vững mạnh

Trong quá trình tu học, ta cần hiểu biết về chủ đích và phương pháp, phải vững tin vào mục đích cũng như phương pháp tu học, phải tin vào thầy và bạn, và phải chuyên cần trong việc thực tập. Thái độ của người tu không khác gì thái độ của một người vào bệnh viện: phải tin thầy, tin thuốc. Tôi xin kể cho quý vị nghe chuyện một bệnh nhân theo phương pháp rửa ruột trong một dưỡng đường bên Đức, để so sánh với sự tu tập của mình như thế nào.

Mỗi ngày, vào lúc sáu giờ sáng, bệnh nhân thức dậy uống một ly nước đầy pha một thìa sulphate de magnesium đã ngâm suốt đêm. Uống xong phải vận động để nước muối đi xuống ruột già càng mau càng tốt. Cứ một giờ đồng hồ lại uống một cốc nước đầy. Mỗi ngày uống ít ra là ba lít nước. Người ấy nhịn đói hoàn toàn ít nhất là trong năm ngày đầu. Sang tới ngày thứ ba, những độc tố lâu nay bám vào thành ruột bắt đầu tan loãng để bài tiết ra. Người bệnh mệt không thể cựa quậy được, có thể nằm trên giường mà không thò chân xuống đất đứng dậy được, tưởng như mình sắp chết. Mỗi ngày uống ba hoặc bốn lít nước là để cho thận và gan lọc cho độc tố được tống ra ngoài bằng nước tiểu. Nhịn đói là để cơ thể có dịp nghỉ ngơi, để ruột non và ruột già có cơ hội khôi phục khả năng làm việc của chúng. Bác sĩ cho mình uống thuốc trợ gan và trợ thận. Nếu người bệnh nói: ‘‘tôi đâu có đau gan mà phải uống thuốc gan, đâu có đau thận mà phải uống thuốc thận,’’ tức là không hiểu phương pháp của thầy thuốc. Chữa bệnh phải tin thầy, tin thuốc. Phải hiểu biết tại sao bác sĩ yêu cầu mình phải uống thuốc trợ thận và trợ gan. Tu học cũng thế. Tại sao ta nên đi thiền hành chung với đại chúng, tại sao đi riêng một mình không đủ? Vì khi đi thiền hành chung với tăng thân, tác động sẽ khác. Tại sao cần phải dự pháp đàm? Nghe thầy dạy ta hiểu rồi, tại sao phải có mặt trong buổi pháp đàm làm chi? Lý do là ngồi trong pháp đàm, dẫu ta không nói, mà những điều người khác nói phù hợp với nhận thức ta cũng có tác dụng làm lớn niềm tin của ta và giúp ta thấy ta rõ hơn lên. Bác sĩ còn bảo bệnh nhân bơm ruột, đi bộ và tập thở ngoài trời mỗi ngày mấy tiếng. Ăn thì ăn rất ít mà nhai thì phải nhai rất kỹ, một miếng bánh mì 30 gram mà nhai suốt cả giờ. Tất cả những việc đó đều khó làm theo, nhưng bệnh nhân phải hiểu tác dụng của từng phương pháp trị liệu, và phải tin chắc rằng thực tập theo lời thầy thuốc dặn là quan trọng. Có niềm tin, ta sẽ có rất nhiều chuyển hóa ở trong cơ thể, còn nếu niềm tin bạc nhược, ta sẽ không làm đúng những lời khuyến cáo và chỉ đạt tới một phần tư hoặc một phần năm kết quả.

Trong thiền viện cũng vậy. Các vị giáo thọ biết ta cần phải làm gì. Thí dụ họ đề nghị hai anh em bạn tu tới gặp riêng nhau ít nhất sáu buổi để trò chuyện, giải tỏa tâm tư theo phương pháp làm mới (beginning anew). Một sư chú nói: ‘‘Không cần, tới gặp người ấy làm gì mất công, tôi ở trong phòng một mình quán chiếu còn tốt hơn.’’ Từ chối không gặp vì ta nghĩ rằng gặp người ấy ta không cảm thấy dễ chịu. Làm sao cảm thấy dễ chịu được khi cái tưởng của ta về người đó đã có chất chứa ác cảm và sai lầm? Ta từ chối vì ta không thấy được rằng vị giáo thọ, hay vị thầy của cả hai người, đã biết rằng hai người thực sự cần gặp nhau. Như thế là người ấy không có đủ niềm tin nơi pháp môn của thầy. Nếu thầy bảo hai anh em nên thực tập làm mới với nhau ít nhất là sáu lần thì ta phải đi gặp nhau sáu lần, chứ không nên ngại mệt.

Mỗi bước chân, mỗi hơi thở, mỗi thực tập trong đời sống hàng ngày của ta đều có mục đích, và ta phải có đức tin vững chãi vào sự thực tập thì mới dẫn tới những chuyển hóa chân thật. Một bước chân thôi, mà bước được đúng theo phương pháp thầy chỉ bảo, cũng đã đem lại kết quả. Niềm tin vững chãi vào sự thực tập, lùm lùm được biểu lộ ra. Khi ta đi, người khác nhìn thấy có chánh tinh tấn trong bước chân của ta đi. Khi ta ngồi, người khác nhìn thấy có chánh tinh tấn trong khi ta ngồi.

Cái tưởng do những điều kiện trong quá trình phát triển tâm lý và những điều kiện lịch sử trong xã hội và trong gia đình mình đưa tới. Cái tưởng của mỗi người là con đẻ của những điều kiện, những nhân duyên, từ tổ tiên, từ giáo dục, từ các thói quen lâu đời. Phải sẵn sàng chiếu rọi ánh sáng chánh niệm vào trong cái tưởng để thấu hiểu được cội nguồn và bản chất của nó. Trong thiền viện, phương pháp Làm Mới Tăng Thân nếu được thực tập đúng cách sẽ chuyển hóa cái tưởng của mỗi người và của mọi người. Khi hai người ngồi xuống để lắng nghe, mỗi người đã có sẵn cái tưởng đối với người kia và đối với mình. Cái tưởng nào cũng có thể rất sai lầm. Hai người cùng ngồi lắng nghe nhau bằng chánh niệm thì cái thấy mới sẽ phát sinh. Cái thấy đó có thể giải toả được cho chính mình và cho người kia, nhất là khi có người bạn thứ ba hay một vị giáo thọ có mặt. Đem lòng từ bi, đem nụ cười, đem thêm sự vững chãi tới để giúp cho hai người bạn có cơ hội nhìn vào cái tưởng của chính họ, đó là cống hiến quý hóa nhất của một tăng thân.

Làm Mới (Beginning Anew) không phải là một buổi họp trong đó ta cố tranh đấu cho ý kiến của ta được mọi người chấp nhận. Nếu trong một buổi họp ta chỉ lo chuẩn bị vận động cho ý kiến của ta, thì thay vì cái tưởng của ta sẽ tan rã trong môi trường ấy nó lại sẽ nằm ỳ không chuyển hóa. Làm thế là đi ngược lại với tinh thần ‘‘Làm Mới- beginning anew’’. Cũng vì sư chú đã chuẩn bị tới họp để bảo vệ một cái tưởng, trong khi mục tiêu chính của sự thực tập là để phá cái tưởng ấy. Phải xem người anh, người chị hoặc người em kia là cơ hội giúp cho chính ta chuyển hóa.

Sự thực tập của ta không phải là sẽ có lợi lạc cho một mình ta, mà cho tất cả mọi người trong đại chúng và cho những thế hệ Phật tử thực tập trong tương lai. Nếu ta thành công thì bao nhiêu thế hệ sau này sẽ được thừa hưởng. Khi ta tới với một thiền viện, tức là ta đã chấp nhận một tăng thân, chấp nhận một gia đình. Khi quý vị tiếp nhận một Pháp danh hay một Pháp tự, quý vị trở thành con cháu một nhà. Quý vị tiếp nhận những châu báu, những truyền thống, những tinh hoa của đạo pháp để tự nuôi dưỡng mình. Quý vị có bổn phận phải trao truyền lại những châu báu ấy cho các thế hệ tương lai. Sự mong ước của các vị tổ sư và các thầy là trao truyền, chứ không phải chỉ là chữa trị cho chính bản thân. Sự tiếp nối của đạo pháp, của tuệ giác và của sự chuyển hóa, đó là nơi nương tựa cho tất cả mọi người. Nếu không thành công, ta sẽ phụ ơn đức của Bụt, của tổ, của thầy và của tăng thân. Cho nên ta đừng bỏ phí một giây phút nào trong đời sống hàng ngày. Chỉ có mình mới có thể đánh mất đời sống của mình mà thôi. Tuần trước tôi có nói rằng sự thực tập của chúng ta rất cụ thể. Chúng ta sống đời sống hàng ngày như thế nào để mỗi giây phút của đời sống trở thành một kỳ sử cho chính chúng ta và cho các con cháu của chúng ta. Chúng ta không cần phải leo lên núi Thứu mới có thể sống được huyền sử. Chúng ta chỉ cần đi bộ với nhau ở Làng Mai, ngồi ăn cơm với nhau, rửa chén, quét nhà với nhau trong chánh niệm và an lạc là chúng ta đã có thể tạo nên huyền sử. Tôi mong rằng tất cả quý vị ở đây đều đang tham dự vào trong huyền sử đó, đừng có đứng bên ngoài. Bằng bước chân, bằng hơi thở, bằng nụ cười, bằng sự hành trì tu tập hàng ngày của mình, ta đóng góp một phần xây dựng tịnh độ cho chính bản thân ta, và cho các thế hệ tương lai.
! Bài 19 Quán không trong năm lễ

Hôm nay là ngày 27 tháng giêng năm 1994, chúng ta ở tại xóm Thượng và học tiếp về bát chánh đạo.

Chủ nhật vừa rồi chúng ta học về năm lễ. Ở Việt nam, cúng lễ tổ tiên không phải chỉ mỗi năm một lần. Chúng ta lạy ông bà, cha mẹ trong những đám cưới, đám hỏi, những ngày giỗ, ngày tết. Lễ là để tiếp xúc với gốc rễ của mình. Trong chùa mỗi ngày chúng ta đều lễ. Chúng ta lễ Bụt, lễ các vị tổ sư, lạy thầy, lạy chúng, v.v..

!! Quán không trong năm lễ

Trong khi thực tập năm lễ, chúng ta cũng phải biết thực tập về Không quán và Không tam muội. Trước khi lễ, ta chắp tay, thực tập hơi thở để quán chiếu về chủ thể của sự lễ lạy là người lễ và đối tượng của lễ tức là người được lạy. Trong các thiền viện Việt nam, mỗi khi chắp tay chuẩn bị lễ ta phải quán tưởng như sau:

<<<
Năng lễ, sở lễ, tánh không tịch. <br>
Cảm ứng đạo giao nan tư nghì.
<<<

dịch:

<<<
Trong tự tính chân như <br>
Không chủ thể đối tượng <br>
Đệ tử kính lạy Bụt <br>
Trong giao cảm nhiệm mầu.
<<<

Năng lễ, sở lễ, tánh không tịch tức là bản chất của người lễ và bản chất của vị được lễ, cả hai đều không.

Trong khi lễ; chúng ta thực tập quán không. Không ở đây có nghĩa là giữa hai bên, người lạy và người được lạy, có sự tương duyên tương sinh. Chủ thể và đối tượng không phải là những gì tồn tại và độc lập ngoài nhau. Khi cúi xuống lễ tổ tiên, ta phải thấy rằng tổ tiên có liên hệ mật thiết với ta. Ta không thấy cái ngã riêng biệt của ta đối lại với cái ngã riêng biệt của tổ tiên. Ta thấy được tính chất vô thường, vô ngã của ta và của tổ tiên, ông bà và cha mẹ. Thấy được tính tương quan, tương duyên và vô ngã giữa ta và ông bà, cha mẹ, thì lễ mới thành công. Quý vị đã từng thực tập và đã thực tập thành công, quý vị đã thấy mình hòa nhập được vào dòng sống tổ tiên, ông bà, cha mẹ và con cháu của mình. Cái ngã của ta tan biến. Khi cái ngã của ta và của tổ tiên ta tan biến thì có sự cảm thông mầu nhiệm và năng lượng của tổ tiên mới truyền qua cho mình được. Đó là ý nghĩa của câu thứ hai: Cảm ứng đạo giao nan tư nghì.

Con đường cảm ứng, giao tiếp (communication, communion) mầu nhiệm không thể tưởng tượng được, không thể đàm luận và diễn tả được, đó gọi là nan tư nghì. Khi còn bị giam khóa trong bản ngã của mình, ta chỉ thấy mình là mình, cha mẹ là cha mẹ, mỗi người là một hải đảo hay một tháp ngà riêng. Nhưng khi lạy xuống để quán tưởng ta sẽ thấy được rằng cái ta là do những yếu tố không ta tạo nên. Sự có mặt của ta ở đây tức cũng là sự có mặt của tổ tiên, ông bà, cha mẹ và sông núi. Tự nhiên cái ngã tan đi. Trong trạng thái tan biến đó của cái ngã thì năng lượng của đất nước, của tổ tiên và của ông bà mới truyền sang cho ta được. Đó gọi là cảm ứng đạo giao nan tư nghì.

Có những người thực tập một ngàn tám mươi lễ mỗi ngày. Lễ như vậy được vài ba tuần thì tan hết nỗi khổ, niềm đau, và sự cô đơn của họ. Mỗi khi lạy xuống như thế, cái vỏ bản ngã của họ lại tan rã thêm. Nếu chúng ta lễ như tế sao mà không quán chiếu về tính cách vô thường, vô ngã và tương tức thì sẽ không có thành quả gì. Cho nên lễ là một phương pháp thực tập rất hay. Chúng ta hãy quán tưởng chúng ta đang lạy Bụt Thích Ca Mâu Ni là Thầy của chúng ta, là người khai sáng của đạo Bụt.

Chúng ta đứng trước Bụt Thích Ca Mâu Ni quán tưởng: Lạy Bụt, ngài với con, hai bên đều trống rỗng, không bên nào có một thực thể riêng biệt. Chính nhờ như vậy mà ngài với con mới có sự thông cảm nhiệm mầu. Ít có một tôn giáo nào mà tín đồ hướng về đức giáo chủ để nói một câu nói như vậy. Đối với một số các tôn giáo khác, đó là một thái độ kiêu căng và bất kính rất lớn. Chỉ có trong đạo Bụt người đệ tử mới có thái độ như vậy, vì năng lễ và sở lễ tánh không tịch cho nên cảm ứng đạo giao mới nan tư nghợi. Khi lạy xuống, nếu ta chuẩn bị tâm tư kỹ lưỡng chừng nào, thì kết quả càng lớn chừng ấy. Có nhiều bậc cha mẹ thuộc thế hệ mới, thấy mình phải ngồi lên để mấy đứa con lạy xuống thì không chịu. Sống trong thời đại dân chủ, mỗi người có nhân phẩm, ngồi lên bắt con lạy xuống như vậy thì khó chịu lắm. Trong chùa cũng vậy, có nhiều thầy bây giờ không muốn người ta lạy mình. Một phần các thầy nghĩ mình không có đủ đức độ, để Phật tử lạy thì tổn phước. Như vậy là chưa đạt giáo lý của Bụt.

Các vị mới xuất gia hay được thầy bổn sư dạy về việc này. Khi mang hình tướng của người xuất gia, mình có thể trở thành đối tượng cho nhiều người cung kính. Và đó là điểm đáng lo trong đời sống xuất gia. Người ta khởi lòng cung kính tam bảo, thấy tướng mạo đoan trang của người xuất gia, họ muốn đảnh lễ. Nếu ta không có chánh niệm thì chỉ trong vòng vài năm, ta có thể bị hư liền. Ta tưởng mình là quan trọng lắm. Người mới tu mà bị Phật tử tới lạy thì cảm thấy rất xốn xang. Biết mình đức độ chưa có bao nhiêu, học hỏi chưa được bao nhiêu, giới luật chưa tinh nghiêm, mà phải ngồi đó để cho người ta lạy thì trong lòng rất khó chịu. Ta có thể hiểu được tâm trạng các bậc làm cha mẹ bị bắt buộc ngồi như hai pho tượng để các con sì sụp lễ. Nhưng chúng ta nên hiểu đây là một sự thực tập rất quan trọng. Cha mẹ là đại diện cho tất cả các thế hệ tổ tiên, ông bà. Những người trẻ họ có nhu yếu hướng về cội nguồn, họ cũng cần một biểu tượng để lạy. Nếu không ngồi cho họ lạy thì có thể họ sẽ quên mất gốc rễ, và không tiếp xúc được với ông bà và tổ tiên của họ. Cho nên dù quý vị là những bậc cha mẹ chưa đến tuổi già, quý vị cũng nên ngồi cho đàng hoàng để cho con cháu lạy. Trong khi ngồi đàng hoàng, quý vị có thể thực tập hơi thở chánh niệm và tưởng nhớ tới tổ tiên, thấy rằng các con mình đang hướng về các thế hệ tổ tiên để tìm nương tựa chứ không phải đang thần tượng hóa mình. Các cháu phải hiểu lạy đây không phải là lạy cái ngã của cha mẹ. Các cháu đang lạy với lòng biết ơn bao nhiêu thế hệ tổ tiên trong quá khứ đã mở nước, dựng nước, xây dựng nên nếp sống văn hóa của dân tộc. Người xuất gia hay mới xuất gia cũng vậy. Chúng ta mặc nhật bình hay áo tràng, tuy tuổi tu còn ít, đức độ còn kém, nhưng khi người ta tới lạy cũng phải ngồi cho thật trang nghiêm. Người ta không lạy cái ngã của mình đâu mà sợ. Người ta đang lạy Tam bảo. Họ lạy dòng sinh mệnh tâm linh, họ lạy Bụt và chư tổ qua con người mình. Cho nên ta phải ngồi cho thật đàng hoàng, phải tập thở cho chánh niệm. Phải quán chiếu rằng họ lạy đây không phải là lạy mình, lạy cái ta của mình, mà họ đang lạy truyền thống tâm linh của họ. Thấy được như thế thì ta có thể ngồi rất an nhiên và tự tại. Cái lạy đó sẽ không bao giờ làm cho ta trở thành kiêu căng. Còn nếu ta không quán chiếu ‘‘Năng lễ, sở lễ tánh không tịch’’ thì người ta chỉ cần lễ chừng ba lễ là mình mất hết công đức từ lúc mới tu cho đến lúc này. Không những mất hết công đức mới mà còn mất vào vốn cũ nữa!

Đó là bí quyết tôi thường truyền trao lại cho những người mới tu. Dù mới tu có hai ba ngày nhưng nếu có hai ba trăm người tới đảnh lễ ta cũng phải ngồi rất yên, rất trang nghiêm cho họ lạy. Trong khi người lễ, ta phải quán chiếu vô ngã, duyên sinh và vô thường. Được trao truyền bí quyết đó rồi thì ta có thể cứu được đời tu của ta. Những điều đơn giản và căn bản như vậy mà ta không được tiếp nhận, thì ta rất dễ đánh mất giới thân huệ mạng. Mỗi khi bị người ta lạy, tôi không sợ hãi chút nào cả. Tôi ngồi đó. Tôi thấy những cái lạy của người ta không động gì tới tôi, không làm cho tôi có thêm một chút tự hào nào hết. Có khi ngồi trên pháp tọa để truyền giới, năm trăm, bảy trăm người, cả ngàn người lễ xuống để nhận giới, tôi thấy được tâm trạng thiết tha thành khẩn của những người thọ giới. Họ đang hướng về tam bảo, hướng về mấy ngàn năm lịch sử của chất liệu tâm linh. Tôi ngồi đó để làm cái gạch nối giữa tổ tiên tâm linh và những người thọ giới. Cái lạy của họ không làm tôi khởi lên một tâm niệm ngã mạn, tự hào, tự phụ, nhờ vậy tôi chưa bao giờ bị sập vào bẫy cống cao. Tôi thoát được cái bẫy sập là nhờ thực tập không quán, và vô ngã quán.

!! Quán không trong khi ăn

Vậy trong khi lạy ta thực tập không quán, không như một cánh cửa giải thoát. Khi ăn cơm ta cũng thực tập không quán. Tiếp xúc với tăng thân, ta thấy tăng thân là mình, mình là tăng thân. Với thức ăn ta cũng quán như vậy, ta là thức ăn, thức ăn là ta. Ôm bình bát, lấy thức ăn, nào đậu que, nào cơm chiên, bỏ vào bình bát, trong lúc đó ta làm gì? Nếu sư chú không quán nhân duyên, không quán không, thì sư chú làm gì trong những lúc đó? Chính lúc đó là lúc ta thực tập. Xúc mấy thìa cơm bỏ vào bình bát, ta phải thấy cơm, phải thấy tính cách duyên sinh của cơm, phải thấy tính cách vô thường, vô ngã của cơm. Phải thấy cơm là chất liệu nuôi dưỡng mình, và chính mình được làm bằng cơm. Bài pháp thoại tôi đang nói cho quý vị nghe đây cũng được làm bằng cơm. Nếu biết cách, ta có thể biến khoai tây thành pháp thoại. Mà khoai tây cũng có thể làm ra chất độc. Khi miệng ta phun ra những sân si và buồn giận, thì khoai tây biến thành sân si và buồn giận.

Ta chỉ cần thực tập một phép quán thôi, vì thực tập một là thực tập tất cả. Phải thực tập tính cách không của mình và của thức ăn. ‘‘Năng ăn, sở ăn, tánh không tịch’’, nghĩa là người ăn và thức ăn cả hai tính chất đều không tịch. Vì vậy sự giao cảm giữa ta và thức ăn không thể nghĩ bàn được.

Ôm bình bát đi vào thiền đường ta nghĩ gì? Ta thực tập thiền hành, đi từng bước chân thảnh thơi. Mỗi bước chân có liên hệ đến sự an lạc của cả thế giới. Nếu trong khi ôm bình bát bước đi mà tâm ta không có chánh niệm, bước chân ta không thảnh thơi, thì đi như vậy uổng quá. Vì đó là cơ hội ta dâng hiến chất liệu an lạc, hạnh phúc và hòa bình cho thế giới. Nếu trong ta có hòa bình và an lạc thì ta mới có thể đóng góp vào hòa bình và an lạc của thế giới. ‘‘Peace always begins with me’’ là như vậy. ‘‘I walk for you’’, mỗi bước chân ta đi ta bước cho tất cả mọi người. Bước chân vững chãi, an lạc thì cả thế giới được hưởng.

Vào tới thiền đường, đặt bình bát, ngồi xuống, lúc đó các bạn tu cũng đang thực tập lấy cơm, bước từng bước vào thiền đường. Đã ngồi xuống rồi, chúng ta làm gì? Không lẽ chỉ ngồi chờ hay sao? Có thể mười lăm phút sau, có khi nửa giờ sau người chót trong đại chúng mới lấy cơm xong. Trong mười lăm phút hay nửa giờ đó, nếu ta nghĩ ngợi quẩn quanh, nhớ tiếc quá khứ, lo lắng tương lai thì ta không xứng đáng ngồi trong thiền đường. Thời giờ ngồi đó là thời giờ thực tập. Trong thời gian này ta thực tập tiếp xúc với tăng thân, tiếp xúc với giây phút hiện tại. Ta nhìn một sư anh hay một sư chị đang đi vào, theo dõi từng bước chân của người đó, mỉm cười với bông hoa trước bàn thờ, lúc nào cũng an trú trong hiện tại. Đó là những lúc ta có thể thực tập vô thường quán, vô ngã quán và nhân duyên quán. Những lúc đó là những lúc ta đang nuôi dưỡng hiểu biết và từ bi. Mười lăm phút hay nửa giờ đó ta không bỏ phí. Ngoài đời người ta phải nối đuôi sắp hàng để đợi vào rạp hát hay đợi mua vé xi-nê. Trong những lúc đó họ có thể bồn chồn, nóng nảy. Nhưng trong các thiền viện, những lúc như vậy là những lúc ta thực tập. Chúng ta tu tập cho không tam muội có mặt trong ta. Khi đã tiếp xúc được với cái Không rồi thì những hiện tượng như tới, lui, sống, chết, có, không, v.v.. không còn làm động tới tâm mình nữa.

Sự chuyển hóa của ta tùy thuộc vào việc hành trì mỗi ngày. Một ngày nào đó, một người thân của chúng ta sẽ qua đời, một người thương của chúng ta sẽ bỏ chúng ta đi, hay chính bản thân ta sẽ bệnh, sẽ chết. Những chuyện đó sẽ xảy ra, thế nào cũng phải xảy ra. Nếu chúng ta không thực tập bây giờ thì làm sao ngày ấy ta có thể sẵn sàng tiếp nhận những gì xảy ra với tâm trạng bình thản được? Chúng ta đi vào cánh cửa giải thoát nhờ không quán và không tam muội. Vậy trong mười lăm phút hay nửa giờ ngồi trước bình bát, chúng ta nên thực tập không khác gì khi ta ngồi thiền. Ngồi thiền ta cũng chỉ làm như vậy. Ngồi an trú trong hiện tại, tạo ra an lạc và hạnh phúc ngay trong giờ phút này.

!! Quán vô tướng

Tam muội thứ hai là Vô Tướng. Cũng như Không tam muội, Vô Tướng tam muội cũng được tạo tác bằng tuệ giác về vô thường và vô ngã. Tướng là tướng trạng, tướng mạo (appearance) của sự vật. Tướng là đối tượng của tri giác. Đối tượng là tướng, mà chủ thể là tưởng. Tướng và tưởng không thể rời nhau mà có. Không có đối tượng tồn tại biệt lập ngoài tưởng, tức là ngoài tri giác của chúng ta. Trong kinh Kim Cương có câu: Ở đâu có tướng thì nơi đó có sự đánh lừa. Phàm sở hữu tướng giai thị hư vọng. Chúng ta bị cái hư vọng đánh lừa. Câu tiếp theo: Nhược kiến chư tướng phi tướng tức kiến Như Lai. Nếu thấy được cái phi tướng ở nơi cái tướng tức là thấy được thực tại mầu nhiệm, thấy được Như Lai.

Thực hiện điều này cũng không khó lắm đâu, nếu ta biết sử dụng những chiếc chìa khóa vô thường và vô ngã. Hãy quán chiếu về vô thường, hãy quán chiếu về vô ngã. Ta sẽ thấy được tính chất vô tướng của các tướng. Chúng ta thử quán chiếu về một bông hoa. Chúng ta có tri giác (tưởng) về bông hoa nên thấy tướng của bông hoa. Tôi từng nói rằng hoa được làm bằng những yếu tố không phải là hoa. Sở dĩ ta bị kẹt vào tướng hoa vì nghĩ rằng cái tướng hoa tách rời khỏi những cái tướng khác. Ta tưởng rằng hoa chỉ là hoa thôi, hoa đâu có thể là những cái không phải là hoa được. Mặt trời là khác, đám mây là khác, phân rác là khác, đại địa là khác. Nhưng nhìn cho kỹ thì ta thấy rằng hoa là mặt trời, hoa là đám mây, hoa là đại địa. Nhìn vào mặt trời, nhìn vào phân rác, nhìn vào đại địa ta cũng có thể thấy hoa. Đó là thấy cái phi tướng của tướng. Người làm vườn nhìn vào đống rác mà thấy được hoa, đó là thấy được cái phi tướng của cái tướng. Người làm vườn dùng phân hữu cơ là người có thể thấy được tính cách bất nhị của phân rác và hoa trái. Nhìn vào trong phân rác họ thấy hoa trái, nhìn vào hoa trái họ thấy phân rác. Nếu áp dụng được cách nhìn đó trong mọi lĩnh vực khác của tri giác thì ta sẽ chứng ngộ.

Người làm chính trị cũng có thể thực tập như vậy. Người làm kinh tế cũng có thể thực tập như vậy. Nếu những nhà chính trị, những nhà kinh tế, những nhà giáo dục thực tập lối nhìn vô tướng, thì thế giới của chúng ta sẽ có một tương lai tốt đẹp hơn. Ví dụ một số người trẻ vào tù vì ăn cướp hoặc giết người. Khi bắt những người ấy giam lại, ta nên quán chiếu về vô tướng và vô ngã. Chúng ta đã tổ chức cuộc sống trong xã hội như thế nào cho nên hoàn cảnh mới sinh ra những lớp trẻ như vậy? Bây giờ chỉ biết giam giữ họ trong tù hay đem giết họ đi, thì ta đâu có giải quyết được vấn đề! Nếu cách thức tổ chức sinh hoạt của xã hội của ta cứ tiếp tục thế này thì chúng ta sẽ tiếp tục tạo ra hàng trăm, hàng ngàn, hàng trăm ngàn người trẻ như vậy, để bỏ vào tù.

Khi vị quan tòa, nhà chính trị hay nhà giáo dục nhìn vào một người trẻ phạm tội, họ phải thấy Tương tức, thấy Vô ngã, thấy Không, để hiểu rằng sở dĩ cái này như thế này là tại vì cái kia như thế kia. Nếu đời sống thành phố quá nhiều bạo động, quá nhiều tội ác, quá nhiều những cô gái ăn sương, thì các nhà giáo dục, và chính trị phải quán chiếu vô thường, vô ngã, vô tướng, và tương tức, để thấy rõ tại sao tình trạng đã đi tới như vậy. Chúng ta có nên chỉ đổ tội cho những người trẻ đó hay không, hay phải thấy trách nhiệm của chúng ta trong học đường, trong gia đình và trong xã hội? Những điều ta nói, những việc ta làm, cách ta tiếp xử trong đời sống gia đình, trong phạm vi học đường và xã hội đã đóng góp những gì để tạo ra những người trẻ như vậy? Có những bạn trẻ mới mười tám tuổi đã tự bắn vào đầu vì thấy sống không có ý nghĩa, không có niềm vui, không có lý tưởng nữa. Mà xã hội có rất nhiều những người trẻ như vậy. Đi vào con đường ma túy, ăn cướp, bặng đảng cũng là một loại tự tử.

Khi một thương gia, một nhà kỹ nghệ để hết thời giờ ra làm giàu, ông ta phải quán chiếu các hậu quả của thái độ ấy trên đời sống gia đình, trên vợ con mình, và trên xã hội. Việc kinh doanh của mình có thể làm đổ vỡ gia đình, tàn phá xã hội và thiên nhiên. Một nhà chuyên môn làm quảng cáo phải quán chiếu những phim ảnh, và bài quảng cáo của mình. Họ thường khai thác những thị dục và các mối sợ hãi tiềm ẩn trong tâm lý của công chúng. Có người làm trong ngành quảng cáo đã thú thật rằng công việc của họ không đúng với những chánh kiến, chánh tư duy và chánh ngữ của họ. Nếu họ muốn trung thực với chánh kiến, chánh tư duy và chánh ngữ thì họ sẽ mất việc làm. Ông ta nói: ‘‘Bạch thầy, nếu mà con nói đủ những cái tốt và cả những khía cạnh tiêu cực của sản phẩm này thì không ai mua hết. Con sẽ mất sở, và hãng của con cũng sẽ vỡ nợ.’’ Cho nên trong sinh hoạt xã hội, ngôn từ và hành động của chúng ta nếu không căn cứ trên nguyên tắc tương tức, tương nhập, vô thường, vô ngã, không và vô tướng thì chúng ta sẽ tạo rất nhiều tội ác.

!! Áp dụng quán vô tướng trong cuộc sống

Trẻ em trong xã hội ta phải đi học mười mấy năm mới ra trường. Chúng học đủ thứ ở trong trường. Nhưng có thể sau mươi, mười lăm năm, ra trường rồi các em vẫn chưa biết cách sống. Nhờ đâu mà mọi người biết đọc và biết viết? Vì mọi người đều đã đến trường để học đọc và học viết. Tại sao chúng ta không biết đối trị với cơn giận và hòa giải với những người chúng ta thương yêu? Vì chúng ta chưa bao giờ được học những nghệ thuật đó trong một trường nào cả. Tại trường, vì chúng ta không được học những nghệ thuật đó, nên chúng ta không biết thở, không biết cười, không biết hóa giải nội kết, không biết chuyển hóa còn giận. Vì vậy ta phải tìm cách đưa những thực tập này vào dậy trong các trường mẫu giáo, các trường tiểu học và trung học. Mục đích của học đường bây giờ chỉ là để cung cấp cho ta một số kiến thức và kỹ thuật để có thể sinh nhai. Trường học không dạy cho chúng ta nghệ thuật tạo hạnh phúc cho mình, cho những người mình thương, và cho xã hội. Cho nên chúng ta cần vận động, hô hào, và khuyến khích cách mạng nền giáo dục quốc gia. Làm thế nào từ những năm mẫu giáo, các cháu đã có thể học đi, học cười, học nói, học làm cho mình và mọi người hạnh phúc. Học chữ, học toán cũng khó lắm chứ, vậy mà các em cũng học được. Học thở, học cười, học chuyển hóa cơn giận cũng khó. Nhưng chúng ta cũng sẽ làm được. Các em đang còn nhỏ như mặng non, thế nào cũng uốn nắn và tập dượt được. Khi một em bé nổi giận, sắp gây gỗ, chứi bới và đánh lộn, em bé đó không tự biết phải làm gì để có thể thoát ra khỏi cơn giận dữ. Điều đó cô giáo phải dạy, thầy giáo phải dạy. Phải dạy cho tới nơi tới chốn. Đến khi em ấy lớn lên, mười lăm, hai mươi tuổi, em mới biết nghệ thuật sống với gia đình, sống với người khác, và sống trong xã hội.

Trước đây tôi có đề nghị lập ra một học viện cho những người đến tuổi thành lập gia đình, để cho những người này có cơ hội học những nghệ thuật sống chung. Hai người trẻ lấy nhau, thành vợ chồng rồi, nhưng có thể vẫn còn vụng về, gây ra nội kết cho nhau, tưới tẩm những hạt giống giận hờn, và mặc cảm trong nhau. Nếu không biết gì hết về nghệ thuật tu tập và sống chung thì họ sẽ mang lại khổ đau cho nhau. Đến khi sinh con, họ cũng sẽ gieo vào các con rất nhiều hạt giống của khổ đau. Khi sinh ra đời, ta mang đủ những hạt giống khổ đau và hạnh phúc. Nếu may mắn thì những hạt giống tốt được tưới bón, còn nếu không may thì chính gia đình, xã hội, học đường sẽ chỉ tưới tẩm những hạt giống khổ đau, thất vọng, buồn khổ và giận hờn trong ta mà thôi. Đến khi lập gia đình, vì không biết phương pháp nên ta lại tưới tẩm những hạt giống xấu của nhau. Sinh con ra, ta cũng sẽ gieo hạt giống xấu cho con, và góp phần làm lớn thêm nỗi khổ đau chung của xã hội. Có khi con thù ghét chính cha mẹ, rồi thù ghét mọi người. Và khi đến lượt được dựng vợ gả chồng thì họ cũng làm khổ lẫn cho nhau. Cái vòng luân hồi tiếp tục lẩn quẩn như vậy. Cho nên lập ra một học viện như thế là cần thiết lắm. Các bạn trẻ vào học một hoặc hai năm và thực tập trong một tăng thân, để có một ít bản lãnh làm vốn liếng thành lập gia đình, sinh con đẻ cái.

Nếu không có tuệ giác về vô ngã, về vô tướng, và về không, thì trong lúc đau khổ ta sẽ chỉ biết trách cứ người này, người khác. Hay ta có thể phạm tội giết người. Sở dĩ người ta giết người vì họ nghĩ rằng người ấy là nguồn gốc nỗi khổ đau của họ. Có khi ta tự giết mình vì ta không có khả năng đối diện với quá nhiều khổ đau. Ta không biết rằng trong ta có người, trong người có ta, không thể chỉ có một nguyên cớ duy nhất tạo nên đau khổ của mình. Vô tướng mới nghe, ta thấy giống như là một triết lý, như là đang nói chuyện trên mây, nhưng quả thật rất thực tế và thiết yếu cho đời sống. Nhìn sâu vào đứa con, ta thấy các yếu tố xã hội, văn hóa, giáo dục, tổ tiên, và đất nước đã làm ra đứa con ấy. Cái thấy đó là cái thấy vô ngã, cái thấy vô tướng, khiến ta phát khởi lòng thương. Ta biết rằng nếu thấy được gốc rễ của khổ đau, thấy được những điều kiện nào đưa con mình tới tình trạng bất như ý như thế, thì ta mới biết hiểu, biết thương, biết cách chuyển hóa, và đứa con sẽ có hy vọng chuyển hóa.

Vậy vô tướng ở đây có nghĩa là phá tướng, nghĩa là vượt ra khỏi cái tướng. Tướng là ý niệm cạn cợt, sai lầm. Nhìn đứa con mà thấy được tất cả xã hội, thấy được cả môi trường văn hóa, và kinh tế; cách nhìn đó gọi là cách nhìn vô tướng. Vô tướng có nghĩa là vô ngã và cũng hàm nghĩa vô thường. Ví dụ ta nói về ông bà, và tổ tiên. Nếu bị kẹt vào ngã và tướng ta sẽ nghĩ là ông bà, và tổ tiên không còn nữa. Nhưng quán chiếu vào tự thân qua cánh cửa vô thường, vô ngã và vô tướng ta thấy tất cả các thế hệ ông bà, và tổ tiên đang có mặt trong con người ta. Ta vẫn tưởng là Bụt và các vị bồ tát không còn nữa. Nhưng đã được trao truyền giáo lý vô tướng mầu nhiệm, ta thấy trong ta có Bụt, có Pháp, có Tăng. Nhờ đó ta thấy được tính không sinh không diệt của Bụt, của Pháp và của Tăng. Mỗi giây phút ta có thể tiếp xúc với Bụt, Pháp và Tăng. Đó là vô tướng. Nói rằng mình vô phước, sinh ra đời thì Bụt đã nhập diệt trên 2500 năm rồi, nghĩ như vậy là suy nghĩ theo lối hữu tướng. Bụt không bị giam khóa trong hình hài của một con người sinh ra ở Ca Tỳ La Vệ cách đây 2600 năm. Bông hoa cũng vậy. Bông hoa không thể bị giam khóa vào trong cái tướng trạng ta đang nhìn thấy đây. Vì vậy ta phải thấy được bông hoa ngoài cái tướng của bông hoa.

Mười mấy năm trước, ba của bé Phòng đã tới Làng Mai làm lễ cầu siêu cho bé. Trong bài thuyết pháp hôm ấy tôi đã nói tới vô tướng. Sau đó tôi cùng ba của bé Phòng đi thiền hành một vòng trên xóm Thượng. Tôi đã dặn: ‘‘Bây giờ thầy trò mình đi thiền hành như thế nào để có thể thấy được bé Phòng ngoài cái tướng của bé Phòng mà trước giờ mình vẫn thấy. Đi như thế nào để có thể thấy được bé Phòng trong mỗi lá cây, mỗi ngọn cỏ, mỗi bông hoa nhỏ, và mỗi hơi thở của mình.’’

Đời Lý có một vị thượng thư tên là Đoàn văn Khâm. Sư phụ ông viên tịch, các đệ tử than khóc rất nhiều. Ông đã làm một bài thơ phúng điếu thầy, trong đó có hai câu:

<<<
Đạo lữ bất tu thương vĩnh biệt, <br>
Viện tiền sơn thủy thị chân hình.
<<<

dịch :

<<<
Các bạn đừng nên thương cảm quá <br>
Núi sông trước viện chính là thầy.
<<<

Đạo lữ tức là các bạn tu của tôi ơi. Bất tu là không nên. Thương vĩnh biệt là đau thương quá về sự vĩnh biệt. Thầy tịch rồi nhưng đừng có đau thương, đừng khóc lóc quá, đừng bị kẹt trong tướng trạng của thầy. Phải thấy thầy trong tính vô tướng của thầy. Viện tiền sơn thủy thị chân hình, những hình dáng núi sông mà chúng ta thấy ở trước thiền viện, đó là chân hình của thầy. Các bạn hãy lau nước mắt đi, hãy nhìn núi, nhìn sông ở trước thiền viện. Hãy mỉm cười. Thầy chúng ta đang còn đó. Chân lý về vô tướng, và tuệ giác về vô tướng giúp ta thoát khỏi những ý niệm có, không, sinh, diệt, còn, mất, giúp ta giải thoát được những sầu đau, thất vọng. Vì vậy vô tướng là một trong ba cánh cửa giải thoát.

Phàm sở hữu tướng, giai thị hư vọng, cái gì có tướng, đều là sự đánh lừa. Nhược kiến chư tướng phi tướng, tất kiến Như Lai. Nếu thấy được cái phi tướng ở nơi cái tướng tức là thấy được Như Lai. Đó là tinh túy của Kinh Kim Cương.

Thầy và tổ có lòng từ bi rất lớn. Sau khi nói tới không tam muội sợ người mới học bị kẹt vướng vào ý niệm không. Các vị dạy thêm rằng sau khi đã học Không Tam Muội rồi, phải học Không Không Tam Muội. Sau khi học vô tướng tam muội ta cũng hay nghĩ rằng cái tướng này không có, cái đó cũng sai. Chân tướng của tướng không phải có mà cũng không phải không. Sau khi đã nghe về vô tướng tam muội thì phải biết thêm về Vô Tướng Vô Tướng Tam Muội. Cửa giải thoát thứ ba là vô tác tam muội cũng vậy, phải được bổ túc bằng Vô Tác Vô Tác Tam Muội. Tất cả gọi chung là Tam Trùng Tam Muội.

Như ta đã biết, Tam giải thoát môn được khai triển và chú trọng rất nhiều trong đạo Bụt Bắc Tông. Giáo lý không, vô tướng và vô tác có mặt trong kinh điển Pali, nhưng trong truyền thống Nam Tông, giáo lý này không được khai triển đầy đủ.

Nếu chúng ta không tu tập theo ba cánh cửa giải thoát, ba thứ định không, vô tướng và vô tác, thì chúng ta không thể dễ dàng phá tung những chướng ngại, và cố chấp để đi vào thế giới của giải thoát, của tự do.
! Bài 15 Quán pháp trong pháp

Hôm nay là ngày 13 tháng giêng năm 1994, chúng ta ở tại Xóm Thượng và học tiếp về chánh niệm trong bát chánh đạo. Hôm nay chúng ta đi sang lĩnh vực thứ tư của bốn niệm xứ, là quán niệm về pháp.

Trong Kinh Quán Niệm Hơi Thở, Bụt dạy chúng ta bốn bài tập dùng hơi thở để quán chiếu về thân, bốn hơi thở khác để quán chiếu về thọ, bốn hơi thở quán chiếu về tâm, và cuối cùng là bốn hơi thở để quán chiếu về các pháp. Nói đến Pháp có người hiểu là giáo pháp của Bụt, tuy không sai nhưng không đúng hẳn. Pháp ở đây là một từ để chỉ tất cả mọi hiện tướng gồm sắc pháp và tâm pháp, cố nhiên có giáo pháp ở trong đó. Pháp ở đây gồm pháp thế gian, pháp xuất thế gian, tất cả các đối tượng của tâm. Chúng ta biết có 51 tâm hành, vậy cũng có 51 loại pháp là đối tượng của các tâm hành.

Thí dụ các tâm hành xúc, tưởng và tác ý. Tác ý tức là chú tâm để ý tới, ví dụ nghe tiếng chim hót, ta nhìn lên, đó là tác ý. Những đối tượng làm cho ta tác ý là pháp. Xúc cũng vậy. Khi con mắt ta tiếp xúc với trời xanh thì con mắt là căn mà trời xanh là trần. Cặn và trần tiếp xúc với nhau phát sinh ra thức, vậy xúc cũng có đối tượng của xúc. Xúc luựôn luôn là xúc một cái gì. Tưởng cũng vậy. Tưởng là tri giác. Khi ta nhìn vào đèn, hình ảnh của đèn trong mắt ta là một tri giác, đèn là đối tượng của tri giác. Đối tượng của tưởng thường gọi là tướng. Trong từ Hán Việt, chữ tướng (laksana) viết thêm chữ tâm bên dưới thành chữ tưởng. Chúng ta tạo tác ra các tướng về sự vật ở trong tâm. Núi, sông, trời, biển đều là những tướng, đều là đối tượng của tưởng, và đều thuộc về phạm vi của pháp. Tất cả những gì mà chúng ta nhận thức được trong thế giới đều được gọi là pháp. Chúng ta có những tâm hành như giận, sợ, hay là buồn. Đối tượng của các tâm hành cũng đều gọi là pháp. Tóm lại, pháp là một từ bao hàm tất cả mọi hiện tượng do thân và tâm ta tiếp xúc, kể cả những hiện tượng không phải sinh lý và vật lý, gọi là các pháp Không Tương Ưng, mà ta sẽ nói tới sau.

!! Quán pháp trong pháp

Quán chiếu về pháp tức là lấy hơi thở có chánh niệm rọi sáng vào đối tượng hiện đang ở trong tâm, gọi là quán pháp ở trong pháp (contemplation of dharmas in dharmas). Đạo Bụt có danh từ trạch pháp, có nghĩa là khảo sát, nhìn sâu, tìm cho ra bản chất của các pháp (investigation of dharmas). Trạch pháp là một trong thất bồ đề phận, còn gọi là thất giác chi, bảy yếu tố đưa tới giải thoát (the seven factors of enlightenment-bodhyanga). Quán niệm pháp trong pháp tương đương với trạch pháp của thất bồ đề phận.

Có danh từ nữa là ngũ đình tâm quán tức là năm phép quán có tác dụng làm lắng lại cái tâm rong ruổi của mình. Trong ngũ đình tâm quán trước hết ta có Sổ tức quán là phép đếm hơi thở. Nhân duyên quán là quán về tính cách tương tức tương nhập của sự vật. Từ bi quán, còn gọi là niệm Phật quán, nhất là trong các truyền thống tu tịnh độ. Niệm Phật cho đúng thì thế nào cũng phát hiện và nuôi dưỡng được chất liệu từ và bi. Bất tịnh quán có nghĩa là quán về tính chất bất tịnh, mặt trái của những chiếc huy chương. Sự vật có thể là danh, có thể là lợi, có thể là tài, là sắc. Nhìn một bên ta thấy hấp dẫn nhưng phía sau ta thấy bất tịnh. Sau chót là Giới phân biệt quán. Giới là các hiện tượng, các pháp. Phân biệt là tìm hiểu, quán sát hay quyết trạch.

Vậy thì quán pháp ở trong pháp tương đương với giới phân biệt quán của Ngũ đình tâm quán và trạch pháp giác chi trong bảy giác chi. Trong bộ Trung A Hàm có Kinh Đa Giới (Bahudhatuka sutta). Bhahu là đa, dhatuka là giới. Kinh này cũng có mặt ở Trung Bộ Kinh (Majjhima nikaya). Trong Kinh này Bụt dạy rằng tất cả những sợ hãi, những lo âu và những hoạn nạn của chúng ta đều phát xuất từ sự ngu dốt. Ngu dốt tức là vô minh, sự kiện không thấy được chân tướng của sự vật. Nếu chúng ta khiếp đảm, nếu chúng ta lo âu, nếu chúng ta thấy đời đầy hoạn nạn thì đó là do ta không thấy rõ được chân tướng của vạn pháp. Nếu quán chiếu và quyết trạch được các giới, chúng ta có thể chuyển hóa vô minh và sẽ không còn có cảm giác sợ hãi và bấp bênh nữa. Một hôm, trong khi ngồi thiền, thầy A Nan phát kiến ra rằng tất cả những sợ hãi, lo âu và hoạn nạn của mình đều đã được phát sinh từ sự không thấu hiểu các tâm pháp và sắc pháp. Thầy A Nan lên thưa Bụt điều đó, Bụt bảo thầy nói rất đúng. Muốn vượt thoát khỏi lo sợ và sầu bi thì ta phải quán chiếu về giới và Bụt dạy thầy A Nan thế nào là giới.

Trước hết giới tức là mười tám lĩnh vực của hiện hữu. Con mắt là một giới (gọi là nhãn giới), đối tượng của mắt là một giới (gọi là sắc giới). Cái thấy, là giới thứ ba, nhãn thức giới. Trong lĩnh vực của thấy, vùng đất thứ nhất là con mắt, vùng đất thứ hai là đối tượng của con mắt và vùng đất thứ ba là cái biết phát sinh từ sự tiếp xúc giữa nhãn giới và sắc giới. Đó là ba giới. Rồi đến nghe: nhĩ giới, thanh giới và nhĩ thức giới; ta tiếp tục tính như vậy với tỷ, thiệt, thân và ý, tất cả là sáu căn. Rồi đến sáu trần là sắc, thanh, hương, vị, xúc và pháp. Sau đó là sáu thức : nhãn thức, nhĩ thức, tỷ thức, thiệt thức, thân thức và ý thức. Cộng lại là mười tám giới. Có thể nói là mọi hiện hữu trong vũ trụ đều bao gồm trong mười tám giới. Bụt dạy nếu chúng ta quán chiếu về mười tám giới và thấy được bản chất của mười tám giới thì chúng ta có thể vượt thoát vô minh và mọi sợ hãi, hoạn nạn và lo buồn.

Thầy A Nan hỏi: ‘‘Có thể có một định nghĩa khác về giới hay không?’’ Bụt nói: ‘‘Có thể. Chúng ta có thể quán chiếu về sáu giới: địa, thuỷ, phong, hoả, không và thức.’’

Trước hết là địa, thủy, hỏa, phong: đất, nước, lửa và không khí, gọi là bốn đại (mahabhuta). Giới thứ năm là không, tức là không gian, giới thứ sáu là thức. Nếu quán chiếu từng giới, chúng ta có thể thấy mỗi giới chứa đựng tất cả năm giới khác. Trong địa có thủy, hỏa, phong, không và thức. Trong thức cũng có địa, thủy, hỏa, phong và không, v.v.. Quán chiếu địa, thủy, hỏa, phong, không và thức ở trong tự thân ta, rồi quán chiếu địa, thủy, hỏa, phong, không và thức ở ngoài. Thấy rằng không có biên giới giữa lục xứ bên trong và lục xứ bên ngoài, chúng ta thoát khỏi ý niệm về sống chết.

Thầy A Nan lại hỏi: ‘‘Bạch đức Thế tôn, ngoài cách quán chiếu giới qua mười tám loại và qua sáu loại, có thể quán chiếu về giới bằng cách khác nữa không?’’ Bụt nói: ‘‘Có thể được. Lạc, khổ, hỷ, Ưu, xả và vô minh, cũng là sáu giới.’’

Nhìn cho kỹ lĩnh vực của lạc, của hạnh phúc, chúng ta tiếp xúc, nhận thức cho thấu đáo; nhờ công phu quyết trạch và tìm tòi, ta biết được bản chất của lạc. Quán chiếu sâu sắc để tìm ra bản chất của lạc, ta biết rằng có những thức trước kia chúng ta nghĩ là nhu yếu cần thiết mà kỳ thực chỉ là những ràng buộc làm cho ta mất hạnh phúc chân thật. Biết như vậy thì chúng ta sẽ tự giải thoát khỏi những nhu yếu đó. Về Khổ cũng vậy. Quán chiếu nỗi khổ, không sợ hãi, không chạy trốn, đi sâu vào quán chiếu, ta thấy được bản chất của khổ. Đó gọi là trạch pháp, là giới phân biệt quán. Ưu là sự lo lắng. Lo lắng là chứng bệnh của thời đại chúng ta. Hỷ là niềm vui (having fun, having a good time). Chúng ta nhìn sâu, để xem đó có phải là niềm vui chân thật, có tính cách nuôi dưỡng và chuyển hóa ta không, hay chỉ là những hiện tướng bên ngoài cốt để che lấp sầu đau. Có cô thiếu nữ người Pháp trong một khóa tu ở Paris nói: ‘‘Bạch Thầy, có khi giữa một buổi dạ hội nhảy múa quay cuồng, đang cười cười, nói nói với các bạn, tự nhiên con khựng lại. Con thấy chuyện nhảy múa cười cợt chẳng qua chỉ là một lớp màn mỏng dùng để che đđay những khối lo lắng và buồn khổ nằm ở trong lòng con mà thôi.’’ Cái hỷ này không phải là chân hỷ, không phải là niềm vui đích thực. Xả tức là sự buông bỏ. Quán chiếu sâu xa, ta thấy rằng xả là điều kiện tất yếu của hạnh phúc. Trong trại tỵ nạn Song Kla có một bà than rằng vàng dấu trong người bị hải tặc lấy hết cả. Bà chỉ còn giữ được có một chỉ vàng, lên tới bờ bà khóc: ‘‘Còn mỗi một chỉ vàng làm sao tôi sống được đây?’’ Một ông khác cũng bị cướp hết, chỉ còn cái quần đùi. Ông cười, nói: ‘‘Bây giờ chỉ còn cái quần sà-loỏng tôi làm sao sống đây?’’ Ông ta vừa nói vừa cười rất vui vẻ, trong khi bà kia, vẫn còn có một chỉ vàng, rất đau khổ. Chúng ta có hạnh phúc khi không bị vướng mắc vào những thứ mà ta tưởng là điều kiện thiết yếu của hạnh phúc. Điều kiện thiết yếu của hạnh phúc là tự do. Xả là tự do. Khi trong tâm còn ôm ấp, tham đắm, vướng mắc, ta không có tự do, mà không có tự do thì không có hạnh phúc.

Bụt lại dạy phương pháp quán chiếu về sáu giới khác là dục, ly dục, sân, vô sân, hại, và bất hại. Trước hết là sự quán chiếu về dục, tức là về sự thèm khát và đối tượng của thèm khát. Rồi quán chiếu ly dục, để đạt tới tự do lớn hơn. Vướng vào năm dục thì ta trở nên nô lệ cho năm sự thèm khát là: tài, sắc, danh, thực và thụy. Rồi ta quán chiếu về giới thứ ba là sân. Khối lửa sân hận cháy thầm suốt ngày suốt đêm trong người làm ta đau khổ. Ôm ấp một mối giận hờn và oán trách trong lòng thì ta là người đau khổ trước, còn kẻ được xem là đối tượng của cơn giận, ta không biết họ có đang khổ hay không. Vô sân (the absence of anger) là nền tảng cho từ bi. Lĩnh vực thứ năm, hại (harming) tức là làm hư hoại, tan nát, hại mình, hại người, hại thiên nhiên và những hình thái khác của sự sống xung quanh. Ăn chay là thực tập bất hại. Có người ăn chay chỉ vì muốn thêm sức khỏe, vì sợ ăn chất béo. Nhưng trong khi ăn chay ta có thể nuôi dưỡng đức từ bi. Thấy cắt cổ một con thú để máu chảy ra mà làm tiết canh, ta không chịu nổi. Lúc đầu có thể ta đã chịu nổi, vì khi sinh ra và lớn lên ta đã thấy sát sinh nên thành quen mắt. Nhưng khi tập quán chiếu, ta thấy rằng trong trường hợp ta bị cứa cổ như vậy, thì ta đau khổ lắm. Do đó ta nhìn vào con vịt, con gà hay con cá đang bị giết, ta thấy trong lòng không an ổn. Khi thấy người ta đẩy từng con bò, con này rồi tới con kia vào lò sát sinh, hoặc khi thấy hàng trăm, hàng ngàn con gà đang bị đẩy vào máy để bị cắt cổ và nhổ lông, tự nhiên ta thấy lòng đau sót. Nhiều người thấy một lần như vậy thì phát nguyện ăn chay luôn. Thế giới đầy dẫy những căm thù, bạo động. Chiến tranh là do chúng ta không nuôi dưỡng lòng từ bi. Ăn chay là một trong những phương pháp nuôi dưỡng lòng từ bi của chúng ta. Ăn chay là thực tập bất hại (non harming). Ngoài ra chúng ta phải nhìn cây cối, sông nước, bầu không khí để thấy rằng cây cối, sông nước, địa cầu cũng cần phải được bảo vệ, vì tất cả đều có sự sống. Bất hại (ahimsa) là một đức rất lớn trong đạo Bụt. Khi chúng ta thiếu tâm bất hại, chứng kiến sự giết chóc và tàn hại đời sống mà không động lòng, thì chúng ta không có hạnh phúc. Không có tình thương thì không có hạnh phúc.

Ngày xưa có một thi sĩ viết về bát canh thịt :

<<<
Thiên bách niên lai uyển lý canh <br>
Oán thâm như hải, hận nan bình <br>
Dục tri thế thượng đao binh kiếp <br>
Thí thính đồ môn dạ bán thanh.
<<<

dịch :

<<<
Ngàn năm qua một bát canh <br>
Oán sâu biển cả hận thành non cao <br>
Muốn hay nguồn gốc binh đao <br>
Lắng nghe quán thịt tiếng gào thâu đêm.
<<<

Chỉ cần nhìn vào trong bát canh và miếng thịt trong đó, ta sẽ thấy niềm oán hận của các loài bị tàn sát; nỗi oán hận này sâu như biển, lớn như núi. Nếu muốn biết được bản chất của chiến tranh ở trên thế giới, chỉ cần nửa đêm thức dậy lắng nghe tiếng gào thét của những con vật đang bị sát hại ở nhà đồ tể. Cho nên nếu có nhiều người biết thực tập ăn chay đàng hoàng thì chiến tranh sẽ giảm. Có rất nhiều nhà chính trị, kinh tế và khoa học đang nghiên cứu những cách thức làm giảm bớt chiến tranh. Nhưng chúng ta phải biết rằng chiến tranh chỉ có thể giảm bớt khi tâm từ bi của chúng ta phát triển. Ăn chay để tâm từ bi và tâm bất hại phát triển trong lòng từ trẻ em đến người lớn, đó là một trong những phương pháp hay nhất để mang lại hòa bình. Có người nói rằng: ‘‘Trời sinh con cá để cho người ăn, tại sao không ăn?’’ Người ta sẽ hỏi lại: ‘‘Trời sinh con người để làm thức ăn cho vi trùng, hay cọp beo, tại sao không để cho vi trùng hay cọp beo ăn?’’.

Bụt lại nói với thầy A Nan rằng ta có thể quán chiếu về ba giới, là dục giới, sắc giới và vô sắc giới, tức là ba cái lĩnh vực của hiện hữu. Đừng tưởng rằng ta chỉ sống trong dục giới. Chúng ta cũng đang sống trong sắc giới, đồng thời cũng sống trong vô sắc giới. Ba yếu tố đều có mặt trong giây phút, trong cảnh sống hiện tại. Vì vậy phải chuyển hóa thân tâm thì mới vượt thoát khỏi khổ đau của tam giới. Kinh dạy rằng ‘‘tam giới bất an do như hỏa trạch’’, nghĩa là trong ba cõi không có sự yên ổn, giống như một cái nhà đang cháy. Tam giới là ba cõi, tạo tác bằng tâm chúng ta. Khi tâm của chúng ta có dục, có sân, có hại thì chúng ta tạo ra căn nhà lửa cháy. Tâm chúng ta ly dục, vô sân và bất hại là chúng ta tạo ra một hồ sen tươi mát, dập tắt được những khổ đau của ba cõi

Sau đó Bụt dạy thầy A Nan rằng ta cũng có thể quán chiếu về hai giới, tức là hữu vi giới và vô vi giới. Có thể hiểu hữu vi giới là bình diện tích môn, còn vô vi giới là bình diện bản môn. Hữu vi tức là lĩnh vực của những hiện tượng tương đối, có sinh, có diệt, có trước, có sau, có trong, có ngoài, có lớn, có nhỏ. Và vô vi giới tức là lĩnh vực của tự do, thoát khỏi những ý niệm sinh, diệt, tới, lui, trước, sau, lớn, nhỏ. Hữu vi giới như là sóng, vô vi giới là nước, không phải là hai thể tính biệt lập. Nói về sóng, chúng ta thấy có cao, có thấp, có sinh, có diệt, nhưng nhìn về phương diện nước, chúng ta thoát khỏi các ý niệm cao, thấp, sinh, diệt. Quán chiếu về hai mặt của thực tại, hữu vi và vô vi, chúng ta cũng có thể vượt thắng sợ hãi, lo buồn và các hoạn nạn. Vì trong Kinh này Bụt dạy về nhiều loại giới để quán chiếu, nên Kinh được gọi là Kinh Đa Giới. Kinh này là Kinh thứ 115 của Trung Bộ và Kinh thứ 181 của Trung A Hàm. Trong Hán Tạng cũng có một Kinh khác tương đương, đó là Kinh Phật Thuyết Tứ Phẩm Pháp Môn Kinh (Đ.C.776)

!! Chánh tinh tấn

Tinh tấn có nghĩa là sự siêng năng, là sự có mặt của một nguồn năng lượng, một sức sống trong ta. Năng lượng để làm gì? Năng lượng để đưa chúng ta đi tới chánh kiến, chánh tư duy, chánh ngữ, chánh nghiệp, chánh mạng, chánh niệm, và chánh định. Đó là Chánh Tinh Tấn. Còn năng lượng đẩy chúng ta đi về nẻo khác, đó tà tinh tấn. Có những người có đức siêng năng có nhiều năng lượng, nhưng đó không phải chánh tinh tấn. Họ được tác động bằng những ước muốn không chân chính, như tài, sắc, danh, v.v.. Càng tinh tấn đi về các nẻo ấy chừng nào thì càng vướng mắc, càng mất tự do. Có khi tuy không bị danh, lợi, tài và sắc thúc đẩy, vì trong lòng chất chứa quá nhiều khổ đau, nhưng người ta không thể ngồi yên được vì ngồi yên thì những đau khổ ngấm ngầm sẽ hiện lên khuấy trộn. Cho nên họ luôn tay làm bất cứ việc gì để quên lãng khổ đau. Không có khả năng đối diện với bất an, đau khổ, họ tìm lãng quên trong công việc, có thể được khen rằng: ‘‘Anh này siêng năng quá!’’. Siêng năng này không phải là chánh tinh tấn. Có nhiều người vùi đầu vào sách cũng vì họ thiếu bình an và hạnh phúc. Nhìn vào thì thấy anh này siêng năng quá, tinh tấn quá. Nhưng kỳ thực không phải. Có trường hợp trong đó ta cần mẫn và tu tập rất đều đặn, nhưng có thể là ta đang đi sai đường mà ta không biết. Đó cũng không phải là chánh tinh tấn. Đôi khi tập thiền, ta đi theo một lối tập càng ngày càng làm cho ta xa lìa cuộc sống thực tế chung quanh. Năng lượng thực tập đó cũng không phải là chánh tinh tấn. Dầu có hành trì chuyên cần đến mấy đi nữa, năng lượng ấy cũng không đưa ta tới chánh kiến, chánh tư duy, chánh ngữ, chánh nghiệp, chánh mạng, chánh niệm và chánh định.

Chánh tinh tấn phải được nuôi dưỡng bằng những chi phần khác của bát chánh đạo. Nếu không có chánh kiến, thì không có chánh tinh tấn. Khi biết con đường tu tập đưa ta tới an lạc đích thật thì tự nhiên trong lòng ta phát sinh niềm hân hoan và phấn khởi. Niềm hân hoan phấn khởi đó tạo ra năng lượng, đưa ta tới chánh tinh tấn. Hơn nữa, trong khi thực tập ta thấy được kết quả của sự chuyển hóa ở chính mình, thấy được kết quả chuyển hóa nơi những người chung quanh, và niềm tin của ta lớn mạnh. Sau khi đi thiền hành một giờ đồng hồ, ta thấy thân tâm khỏe hơn trước. Ta nghĩ phương pháp thiền hành này ta phải nắm vững, mỗi khi trong lòng có sự bất an thì ta phải mang ra dùng. Tin tưởng phương pháp thiền hành, ta khuyên một người bạn tu ‘‘anh nên đi thiền hành đi, một giờ đồng hồ sau về ta sẽ nói chuyện!’’ Người đó đi một giờ đồng hồ về, con người tươi mát hơn và nói chuyện với ta dễ dàng hơn. Ta càng tin vào phương pháp thiền hành. Cho nên ta thấy chánh tinh tấn được nuôi dưỡng bằng chánh kiến, chánh tư duy, chánh ngữ, chánh nghiệp, chánh mạng, chánh niệm và chánh định.

Chúng ta đã có kinh nghiệm là sau khi nghe một bài pháp thoại ta có thể hân hoan, hặng hái và niềm tin của ta nơi pháp môn vững vàng hơn. Nhưng có những người nghe giảng mà dù cố gắng hết sức cũng vẫn thấy buồn ngủ như thường. Trong thính chúng một trăm người, chỉ có mấy người không buồn ngủ. Mấy người này nghe rất chăm chú, bởi vì họ nghe đúng phương pháp. Bài giảng không hào hứng, không hay. Nhưng những người này trong khi nghe họ biết quán chiếu để nhìn cho thấu suốt. Họ thấy rõ được tâm của người giảng, nên họ khám phá ra được những điều mà người khác không thấy. Cũng như khi xem một phim dở, nếu ta xem với tư cách một nhà phê bình nghệ thuật, hay một nhà tâm lý học, ta có thể nhìn thấu rõ kỹ thuật, học vấn, gốc gác và cả tâm địa của người làm phim, nhờ đó ta thấy việc coi phim cũng rất hào hứng. Khi có những điều kiện tâm lý như thế, thì tuy không có ai nhắc mà ta vẫn tinh tấn, vì có một niềm vui đã xuất phát tự bên trong ta.

Nghe một bài giảng hay thì tự nhiên dễ dàng đạt tới định. Định ấy được tạo thành, được nuôi dưỡng bằng niềm vui, bằng cái hay, cái đẹp. Nhưng quanh ta có rất nhiều cái có dáng dấp nhỏ bé, tầm thường, mà thật ra rất mầu nhiệm và vơi đại. Thế mà có khi sống cả một đời chúng ta cũng không nhìn thấy. Hãy nhìn những người quay phim chuyên môn chụp lấy những hình thái sinh hoạt nhỏ bé của sự sống. Họ chụp những bông hoa rất nhỏ, họ quay phim đời sống của loài kiến, hoặc loài ong. Con mắt của họ nhận xét rất tinh tường và họ dùng ống kính để chỉ cho chúng ta thấy biết bao nhiêu chi tiết mầu nhiệm của sự sống xung quanh ta. Chúng ta cũng có mắt như họ nhưng không thấy được những cái ấy, vì ta không kiên nhẫn, không thao thức tìm tòi để tiếp xúc với những mầu nhiệm đó.

Tóm lại, khi sự tu học của chúng ta được dẫn dắt bởi cái thấy đúng, khi chúng ta đạt tới được những kết quả tốt đẹp, chứng nghiệm được những niềm vui trong ta và nơi người xung quanh, thì tự nhiên ta có năng lượng của chánh tinh tấn.

Chánh tinh tấn có thể hiểu theo nội dung của tứ chánh cần. Chữ cần có nghĩa là chăm chỉ (samyak prahàna). Và chúng ta nên hiểu tứ chánh cần theo một quá trình tâm lý. Trước hết, chúng ta tu tập chánh tinh tấn bằng chánh niệm. Khi có một niệm bất thiện khởi lên thì chúng ta phải thực tập thế nào để nó đừng phát hiện trở lại trong tương lai. Trong tâm, chúng ta biết dưới phần ý thức là phần tàng thức. Trong tàng thức đang có những hạt giống bất thiện, không lợi ích cho sự giải thoát. Khi một hạt giống bất thiện được tưới tẩm, nó phát hiện trên mặt ý thức thành một tâm hành bất thiện. Nếu chúng ta để tâm hành ấy y nguyên như vậy, hay tiếp tục nuôi dưỡng nó, thì nó càng ngày càng lớn, và chiếm chỗ thật lâu trong cái phòng khách ý thức. Đến khi rời khỏi ý thức, chìm xuống lại tàng thức và trở lại thành hạt giống thì hạt giống ấy đã được nuôi lớn thêm.

Thấy rõ quá trình đó, để đối trị, ta phải dùng chánh niệm chuyển hóa hạt giống từ trước khi nó phát khởi. Thực tập tứ chánh cần là mỗi khi có một tâm niệm bất thiện, như tham, sân, si, mạn, nghi, hoặc kiến khởi lên thì chúng ta phải biết cách sử lý chúng bằng chánh niệm. Nhận diện một tâm niệm không an lành vừa mới phát khởi : ‘‘Tôi đang bực bội và tôi biết là có sự bực bội trong tôi’’. Đó là cách nhận diện đơn thuần. Chỉ cần nhận mặt thôi, ta cũng có thể làm cho tâm niệm đó tan đi, trở về lại tàng thức, nằm yên nơi gốc của nó. Có trường hợp tâm niệm bất thiện không chịu tan đi. Trong Kinh Song Tầm (Dvedhavitaka), thuộc Trung Bộ 19 (Majjhima nikaya), Bụt dạy chúng ta một phương pháp gọi là thay chốt.

Khi người thợ mộc muốn gắn hai cái đà gỗ với nhau, người ấy đục lỗ và cho một con chốt xuyên qua từ thanh gỗ này sang thanh gỗ kia. Lâu ngày, con chốt bị mục, người thợ muốn rút nó ra, thay nó bằng một con chốt mới. Nếu không thì các cây đà sẽ long ra và nhà sẽ sập đổ. Phương pháp của người thợ mộc ở Ấn Độ thời đó là dùng một cái chốt thứ hai, còn tốt, đóng vào đúng nơi đầu cái chốt thứ nhất. Cái chốt mới sẽ đẩy cái chốt cũ đi ra ngoài để tự mình thay thế. Đó gọi là phương pháp thay chốt. Nếu biết làm phát khởi và nuôi dưỡng một tâm niệm thiện thì ta có thể đẩy tâm niệm bất thiện đi ra, giống như người thợ mộc thay chốt. Chúng ta cũng có thể giúp nhau phát khởi tâm niệm thiện, giúp bạn tu của ta thoát khỏi tâm trạng không lành bằng cách khích lệ, nuôi dưỡng những tâm niệm lành nơi người ấy.

Phương pháp thứ hai là ta quán chiếu để nhận diện những hạt giống bất thiện, khi chúng đã phát hiện lên cũng như khi chúng còn ẩn nấp trong tàng thức. Phép đó gọi là bất tịnh quán, trong ngũ đình tâm quán. Giả dụ một người vừa mới tắm, có ai mang tới xác một con rắn chết mà quàng vào cổ thì người đó biết ngay. Tâm niệm bất thiện cũng giống như vậy. Phải quán chiếu và nhận diện ý niệm bất thiện ngay khi nó mới sinh khởi.

Ngũ căn và ngũ lực là tín, tấn, niệm, định và tuệ, trong đó có tín, là niềm tin. Ta tin vào Bụt, vào Pháp, vào Tăng, tin vào con đường ta đi. Niềm tin đó từ chánh kiến và chánh tư duy mà phát sinh ra. Nhờ niềm tin đó nên chúng ta có năng lực, có niềm vui, có nguồn năng lượng gọi là chánh tinh tấn. Tin nơi con đường ta đang đi, đó gọi là Bồ đề tâm, là ước muốn sâu xa muốn đem an lạc và hạnh phúc để hiến tặng con người và mọi loài. Niềm tin đó đưa tới sự tinh tấn.

Hai yếu tố khác trong bảy giác chi là hỷ mà khinh an cũng góp phần tạo nên chánh tinh tấn. Hỷ là niềm vui, niềm vui trong đời tu học, phát hiện khi ta thấy thành quả tu học của mình và của người khác, khi ta thấy được con đường sáng đang đi. Khinh an là sự thanh thản nhẹ nhàng. Nếu không có niềm vui, không có sự nhẹ nhàng thì chúng ta không thể có tinh tấn. Cho nên chánh tinh tấn chuyên chở trong bản thân các yếu tố khinh an, hỷ và tín.

Chánh niệm và chánh định cũng vậy. Nhờ thực tập chánh niệm mà ta có tín, hỷ và khinh an nghĩa là tinh tấn, và chánh niệm của ta sẽ vững mạnh. Khi biết sống ý thức từng giây phút, tự nhiên ta có định trong đời sống hàng ngày. Định không phải chỉ có nghĩa là trạng thái tâm nhất cảnh khi ngồi thiền, nghĩa là khi đã đi vào định rồi thì trời mưa gió sấm sét ta cũng không nghe. Định còn có những nghĩa khác. Sống đời sống hàng ngày, nấu bếp, quét dọn, giặt giũ mà ta vẫn ở trong định, vì ta đang biết sống trong chánh niệm. Mỗi giây phút có chánh niệm là mỗi giây phút có chánh định. Và đối tượng của định có hai loại. Đối tượng đầu là những gì đang xẩy ra trong giờ phút đó. Ví dụ khi quét nhà thì ta có định trong việc quét nhà, khi rửa chén thì ta có định trong việc rửa chén. Khi chim hót mà ta có định thì đối tượng của định là tiếng chim hót. Khi thông reo thì đối tượng của định là thông reo. Thứ hai là khi ngồi thiền, ta có thể chọn đối tượng của định. Ví dụ trong hai mươi phút hay là bốn mươi phút đồng hồ ta chỉ chuyên chú vào một đối tượng như hơi thở, hoặc một tâm hành, hoặc phát khởi tâm xót thương những loài đang bị giết chóc. Trong khi thực tập, ta không cho những đối tượng khác lọt vào. Đó là Nhất điểm hành (ekagata), tâm ý ta chỉ nhắm vào một đối tượng duy nhất mà thôi.
! Bài 20 Quán vô tác vô nguyện

Hôm nay là ngày 30 tháng giêng năm 1994, chúng ta ở tại xóm Hạ và chúng ta học tiếp về bát chánh đạo.

Chúng ta đang học về tam giải thoát môn, tức là ba cánh cửa đưa tới giải thoát. Cánh cửa thứ nhất là Không. Quán Không, ta phải thấy tính tương quan, tương duyên, tương tức và tương sinh trong mọi sự mọi vật. Thấy như vậy, ta vượt được hàng rào bản ngã, thoát được ngục tù ý niệm về ta và về của ta, và mở được cánh cửa giải thoát. Trong tăng thân, nhìn bằng con mắt Không Quán, ta thấy sự an vui của ta liên hệ tới sự an vui của người, sự an vui của người liên hệ tới sự an vui của ta. Cho nên không là cách nhìn, quán, và tiếp xúc để thực tập chứ không phải chỉ là đề tài để đàm luận, nghiên cứu.

Vô tướng cũng vậy. Tất cả mọi sự mọi vật được biểu hiện qua tướng và vì thường bị cái tướng ấy đánh lừa, nên ta mới sợ hãi, mới giận hờn, mới căm thù. Khổ đau xung quanh ta và trong ta đều do sự kiện ta bị kẹt vào tướng. Kinh Kim Cương nói về bốn loại tướng: ngã, nhân, chúng sinh và thọ mệnh.

Sở dĩ ta bị kẹt vào tướng ngã là vì chúng ta nghĩ có những cái đối lập với ngã tức phi ngã. Khi thấy được trong tướng ngã toàn là những yếu tố phi ngã thì tự nhiên ý niệm về ngã tan biến, và chúng ta thoát ra được khỏi tướng ngã. Tướng thứ hai là tướng nhân. Nhân đây nghĩa là loài người. Cho loài người là một thực tại độc lập, không phải là thú, là cây, là đất đá, chúng ta bị kẹt vào tướng nhân. Chúng ta nói trời sinh ra những con tôm, con cá, con bò, con heo để cho loài người ăn. Ta tưởng cây cỏ, đất đá, không khí, trời, sông, rừng và biển là để cho ta sử dụng thả cửa, ta không cần thương tiếc, không cần bảo vệ. Lo phục vụ tướng người, ta tàn phá các loài động vật, thực vật và khoáng vật. Đạt tới cái thấy vô tướng về người, thấy trong người có hàm chứa các loại động vật, thực vật và khóang vật ta mở được cánh cửa giải thoát thứ hai. Tướng thứ ba là tướng chúng sinh. Chúng sinh ở đây là các loài động vật, các loài có sự sống. Các loài có mạng sống tùy thuộc và được tạo thành bằng những loài gọi là vô tình, không có sự sống. Khi tàn phá không khí, sông hồ, biển cả và rừng cây ta cũng hủy hoại luôn những chủng loại gọi là chúng sinh. Cho nên nhìn vào chúng sinh ta phải thấy các yếu tố không phải chúng sinh. Nhìn vào các yếu tố gọi là vô tình ta phải thấy các chủng loại hữu tình. Trong đời sống hàng ngày mà quán chiếu như vậy thì tự nhiên ta thấy được chúng sinh vô tướng. Sau cùng là tướng thọ mạng, nghĩa là khoảng thời gian của mạng sống, từ khi sinh ra đến khi chết. Ta cứ thường nghĩ sinh mạng ta nằm trong khoảng thời gian đó. Khi quán chiếu, ta thấy mình không từng sinh và cũng sẽ không bao giờ diệt đi, thấy rằng ta không bắt đầu có từ khi sinh ra, cũng không bắt đầu không từ lúc chết đi, nhờ thế pháp quán đưa ta tới cánh cửa giải thoát vô tướng về thọ mạng. Nỗi sợ hãi cái chết được dựa trên ý niệm sai lạc là tướng thọ giả. Kinh Kim Cương chỉ nói về bốn tướng nhưng còn rất nhiều tướng khác nữa mà ta có thể quán chiếu. Nếu không dùng niệm và định để quán chiếu thì ta không mở được ba cánh cửa giải thoát không, vô tướng và vô tác.

!! Quán vô tác vô nguyện

Vô tác có nghĩa là không cần có gì phải làm, không cần có dự án nào để theo đuổi. Người ta thường nghĩ rằng tu tức là theo đuổi dự án ‘‘Đạt được niết bàn’’ hay ‘‘chấm dứt được sinh tử.’’ Đi tu không phải là để lên chức hòa thượng. Mục đích của sự tu học là thoát khỏi sinh tử và đạt tới giải thoát. Nhưng theo giáo lý tam pháp ấn thì chúng ta chưa bao giờ từng bị sinh tử cả. Chúng ta chưa bao giờ bị ràng buộc cả. Chúng ta vô thường, đúng. Chúng ta vô ngã, đúng. Nhưng chúng ta cũng vốn là niết bàn. Cũng như đợt sóng kia vốn là nước. Trở về với bản tánh tự tâm của mình là một cách nói. Kỳ thực mình luôn luôn an trú trong bản tánh tự tâm của mình, không cần trở về. Mục đích của sự tu học là để bừng tỉnh, thấy rằng ta chưa bao giờ sinh, chưa bao giờ diệt. Đã không sinh, đã không diệt thì ta đã sẵn có tính niết bàn. Đâu cần phải có dự án, đâu cần phải thực hiện gì nữa? Đó gọi là vô tác, hay là vô nguyện.

Giáo lý vô nguyện chỉ cho chúng ta thấy tất cả sẵn có đầy đủ trong bản tính tự tâm của mình, ta không cần đi tìm đâu hết. Ta đã là cái mà ta muốn trở thành (we are already what we want to become). Tự nhiên có an lạc ngay trong giây phút hiện tại, đó gọi là hiện pháp niết bàn. Buổi sáng nhìn thấy ánh nắng ta mừng, nghe trời mưa ta cũng mừng, thấy trời đầy sương ta cũng mừng. Ánh nắng, cũng như tiếng mưa rơi, cũng như sương mù đều là những hiện tướng của sự sống. Trong một hiện tướng có những hiện tướng khác. Và tất cả các hiện tướng đều mang tính niết bàn và vô nguyện. Nếu thức dậy mà ta cảm thấy có hòa bình, và an lạc trong thân tâm, thấy ta không còn thiếu thốn gì, không cần đeo đuổi gì nữa, thì lúc đó ta có khả năng tiếp nhận hai mươi bốn giờ đồng hồ mà sự sống hiến tặng.

<<<
Thức dậy miệng mỉm cười, <br>
Hăm bốn giờ tinh khôi, <br>
Xin nguyện sống trọn vẹn <br>
Mắt thương nhìn cuộc đời.
<<<

Ta chỉ có thể tiếp nhận tặng phẩm này một cách trọn vẹn với tâm vô nguyện. Nếu nghĩ rằng có hăm bốn giờ là để làm cái này, hoặc để làm cái kia, thì hăm bốn giờ đó sẽ trở thành một phương tiện, mà không còn là sự sống nữa.

Mỗi việc chúng ta đang làm là sự sống, và có thể cho ta hạnh phúc ngay trong khi ta làm. Khi ta đi thiền, ngồi thiền, hay uống trà, ăn cơm, hoặc quét nhà, tất cả những giây phút kia đều có thể là những giây phút hạnh phúc. Ta không coi chúng như những phương tiện để đạt tới mục đích nào cả. Trong lúc ta bửa củi, sự sống đã mầu nhiệm rồi, ta thấy không cần phải bửa củi xong mới có hạnh phúc. Không cần nước sôi rồi mới có hạnh phúc. Không cần nấu cơm chín rồi mới có hạnh phúc. Như vậy là ta sống trong tinh thần vô nguyện. Cái thấy ấy đạt tới thì cánh cửa vô nguyện giải thoát môn mới mở ra.

Có hôm tôi gặp một phụ nữ người Anh ở một xưởng làm đồ gốm. Bà ta hỏi: ‘‘Thầy có lo về tình trạng thế giới không?’’ Tôi trả lời: ‘‘Tôi có lưu tâm, nhưng mối quan tâm của tôi không làm hại tới sự an vui của tôi.’’ Bà này đang đau khổ, chồng của bà bị bệnh tâm thần. Trong câu hỏi về tình trạng ở trên thế giới, bà muốn nói tới những chuyện xảy ra ở Nam Tư (Yougoslavie), hay ở các nơi khác. Nếu ta để cho những lo lắng đó tràn ngập tâm mình thì chẳng bao lâu ta sẽ bị bệnh như chồng của bà. Tôi im lặng, thở năm bảy lần rồi mới nói: ‘‘Cái quan trọng nhất, bà ơi, là dù rất quan tâm đến tình trạng thế giới, bà cũng đừng để cho những nỗi lo lắng đó tràn ngập tâm của mình, làm cho mình quá ưu sầu. Nếu tâm mình bị tràn ngập lo âu thì mình sẽ bệnh, và nếu bà bệnh thì ai mà chăm sóc, và nâng đỡ cho ông nhà bây giờ? Thành ra bà phải tu tập. Tôi biết rõ những gì đang xảy ra ở Nam Tư, tôi thấy cảnh khổ đau rất tội nghiệp, nhưng tôi không để cho những chuyện đó trở thành những yếu tố đe dọa tôi.’’

Tôi nghĩ rằng điều quan trọng là ta làm được tới mức tối đa những gì ta có thể làm, mà vẫn phải giữ được sự an lạc, và bình tâm của mình. Nếu có thời giờ thiền hành, hay thiền tọa thì chớ bỏ qua. Tâm trạng lo lắng không đưa tới đâu. Dầu ta có lo âu gấp mười lần, hoặc gấp trăm lần, thì tình trạng cũng như vậy thôi. Nếu ta bị bệnh thì tình trạng sẽ xấu hơn. Cho nên điểm quan trọng không phải là ta lo, mà ta làm những gì có thể làm được trong giờ phút hiện tại. Nếu bà không giữ được sự an lạc của bà thì bà không thể nào giúp được ông nhà. Bà cũng không thể nào giúp được cho bất cứ ai và bất cứ nước nào trên thế giới. Cho nên hãy làm những gì trong đời sống hàng ngày mình có thể làm được. Đó là chìa khóa. Khi có thái độ đó thì tự nhiên ta sẽ có an lạc.ì Tôi đã nói tóm tắt những điều đó cho bà người Anh này trong vòng mấy phút.

Ta có thể có hạnh phúc ngay trong giờ phút hiện tại, dầu trong thân và trong tâm ta có điều chưa được như ý. Giáo lý Tịnh Độ nói: dầu còn khổ đau, dầu còn nghiệp chướng, ta vẫn có thể vãng sanh được tới thế giới cực lạc. Đức Phật A Di Đà sẽ không đóng cửa, sẽ không cấm ta vào cõi cực lạc với một ít nghiệp chướng, một ít tham, giận, và si mê. Đó là gọi là đới nghiệp vãng sanh. Đới nghiệp là còn mang nghiệp theo. Nghĩa là tịnh độ hiện tiền, đây là tịnh độ, tịnh độ là đây. Dầu còn một ít lo lắng, sầu khổ, một ít bệnh tật, ta vẫn có thể bước vào được thế giới cực lạc như thường. Cho nên, buổi sáng thức dậy mỉm miệng cười, ta thấy ta có thể có hạnh phúc. Quan trọng là thái độ vô nguyện của ta. Vô nguyện là được như nguyện. Không chờ đợi, không đòi hỏi, ta có thể hạnh phúc trong bất cứ giây phút nào.

!! Áp dụng ba cửa giải thoát

Theo các nhà xã hội học bên Mỹ, vấn đề số một của Hoa Kỳ là bạo động. Người ta bạo động đối với nhau: cha bạo động với con, con bạo động với cha, học trò bạo động với thầy. Người ta bạo động với chính thân thể và tâm hồn của họ. Tự tử, sử dụng ma túy, nghiện rượu, người ta tự tàn phá cơ thể và tâm hồn. Giống như xã hội đang đi về hướng tự hủy một cách tập thể. Và những người có con mắt nhận xét thấy đó là một vấn đề rất lớn. Cặn nguyên của hiện tượng trên là vì con người không có an lạc, con người đang đi tìm quên lãng. Nếu con người có hạnh phúc thì đâu phải đi tìm mấy chất ma túy, và những ông vua ma túy đâu có thể làm ăn được. Sống với bản thân không an lạc, tự ghét bản thân; sống với gia đình không an lạc, hờn oán gia đình; sống với xã hội cũng không an lạc, thù ghét xã hội. Với những đau khổ không biết cách chuyển hóa, người ta trút những đau khổ đó lên cho nhau, làm phát sinh ra bao nhiêu căm thù và bạo động.

Có những thiếu niên mười hai, và mười ba tuổi ở Pháp đã bắt đầu giết người. Trong mấy tuần lễ vừa qua lại có những vụ giết người trong xe lửa. Bên Anh cũng vậy. Bạo động là một dấu hiệu của tình trạng thiếu hạnh phúc, thiếu thăng bằng. Người ta khổ đau nhưng không biết thực tập, không có ai hướng dẫn. Có cơ duyên tu học, ta phải biết trách nhiệm. Trước hết phải làm sao cho chính mình có an lạc, và hạnh phúc, phải học nghệ thuật sống hạnh phúc trong giây phút hiện tại, dầu ta còn có những điều bất như ý. Ta bắt buộc phải có hạnh phúc. Nếu không ta sẽ không thể làm chỗ nương tựa cho bất cứ ai, dầu đó là cha, mẹ, anh, chị, em mình, đồng bào mình hay người trong xã hội quanh mình. Ta cần phải làm thế nào để cho hạt giống an lạc và giác ngộ sinh sôi nẩy nở cho nhiều, cho nhân loại được nhờ. Mỗi ngày hăm bốn giờ đồng hồ của ta là một cơ hội lớn để sống an lạc, và hạnh phúc. Nếu ta cần một dự án, thì dự án đó là làm thế nào để đào tạo thật nhiều những người có khả năng hướng dẫn tu học. Cần có rất nhiều giáo thọ. Trong Đại Giới Đàn sắp tới, Giới Đàn Hương Tích, sẽ có lễ truyền đăng cho mười hai vị giáo thọ mới.

Trong chuyến đi Hoa Kỳ vừa rồi có những buổi thuyết pháp cho công chúng mà số tới dự bốn ngàn người, có những khóa tu trong đó bốn trăm hoặc năm trăm người xin quy y để tiếp nhận năm giới. Đó là hình ảnh cá mẹ sinh cả đàn cá con. Nhưng như thế cũng không có thấm thía vào đâu. Trong chuyến đi Bắc Mỹ đó, số người tới học trực tiếp trong những khóa tu hay những buổi pháp thoại vào khoảng 28.000 người. So với dân số cũng không có nghĩa gì. Dầu có những đài phát thanh đã phát nguyên văn các bài pháp thoại liên tiếp trong mười ngày, những tờ báo lớn như Washington Post, New York Times hay Los Angeles Times đã viết một số những bài khá hay về phương pháp thực tập. Có thể nói hàng triệu người đã được tiếp xúc với giáo lý Bụt. Loài người rất khao khát sống an lạc, rất mong biết được cách chuyển hóa tâm hồn và thay đổi xã hội. Nhưng hiện bây giờ số người có thể hướng dẫn được dân chúng tu tập, chuyển hóa còn ít lắm. Và chúng ta phải thực tập như thế nào để làm cho số người đó nhân lên. Điều này chúng ta có thể làm được.

Nếu cứ để thì giờ mà lo lắng, và ưu sầu thì chúng ta chỉ làm cho tình trạng đen tối hơn. Chưa cứu được thế giới ta đã đánh mất chính ta rồi. Thành ra câu trả lời cho từng người vẫn là phải làm thế nào để mỗi bước chân của mình được thảnh thơi, mỗi giây phút của đời sống hàng ngày có an lạc, hạnh phúc. Người Pháp có một bài hát ‘‘Chúng ta đợi gì không hạnh phúc bây giờ’’ (qu’ est-ce qu’on attend pour être heureux?) Mỗi sư cô, mỗi sư chú, mỗi Phật tử và thiền sinh của chúng ta hãy tự hỏi câu hỏi đó: tại sao chúng ta lại không có hạnh phúc ngay bây giờ? Hạnh phúc trong giây phút hiện tại, hạnh phúc có liền như là cà phê bột chỉ cần chế nước sôi vào là có thể uống.

Tôi còn nhớ một thiếu phụ, tại một khóa tu ở Canada, sau buổi thiền hành đầu tiên đã nói: ‘‘Thưa thầy, từ khi sang Bắc Mỹ đến giờ, trong suốt bao nhiêu năm con chưa bao giờ được đi những bước thong thả như hôm nay.’’ Xã hội đã kéo bà chạy theo như một con chong chóng. Và bà chỉ cần được hướng dẫn thiền hành trong hai mươi phút, là có thể đi vào được trong thế giới của tĩnh lặng, của an lạc. Không cần phải dự một khóa tu ba tháng. Có khi ta chỉ cần một khóa tu ba ngày, hoặc bốn ngày. Và chỉ ngay sau giờ thiền hành đầu tiên là đã có thể nếm được pháp lạc. Sau đó thiếu phụ hỏi: ‘‘Bạch thầy, con có thể về chia sẻ phương pháp thiền hành này cho các bạn con được không?’’ Tại sao không? Các sư cô sư chú được tu tại Làng Hồng bốn năm là đã có may mắn hơn những người như vậy nhiều. Sau bốn năm đó ta đã có khả năng thiết lập một trung tâm tu học để hướng dẫn người khác. Quý vị cũng sẽ làm như tôi, là suốt đời học thêm, và phải luôn luôn thực tập. Càng học và càng thực tập thì cái thấy, cái hiểu của mình về chánh pháp càng sáng, và càng sâu thêm. Đức Khổng Tử nói: ‘‘Học nhi thời tập chi, bất diệc lạc hồ’’, học mà thường được thực tập thì há chẳng phải là niềm vui hay sao? Học với thầy được một ngày thì ta đã tiếp nhận được chất liệu của gia đình tâm linh ta để lại từ mấy ngàn năm. Điều quan trọng là khả năng tiếp nhận, khả năng hấp thụ (assimilation) của mỗi người. Hấp thụ là biến những chất liệu mình tiếp nhận thành sự sống liền. Đừng chất chứa chúng thành những kho kiến thức không dùng vào việc gì được.

Học điều gì ta phải đem ra thực tập. Khi ta học về ba cánh cửa giải thoát: không, vô tướng, và vô tác chẳng hạn, thì phải áp dụng liền. Áp dụng thế nào về cánh cửa thứ nhất là cánh cửa không? Có phải là lên thiền đường ngồi thiền để suy tư về không chăng? Không phải như vậy. Mỗi lần nhìn cây cỏ, đất trời, tiếp xúc với người với vật, phải thấy được tính cách tương tức, tương nhập của tất cả. Phải thấy tính cách mầu nhiệm của không ở trong con người của mình.

Tới cánh cửa thứ hai là vô tướng. Phải thấy được tính cách vô tướng trong cái tướng của người, và vật chung quanh. Thấy được rồi thì những sợ hãi, lo buồn, hờn giận của mình sẽ tan biến, và vô tướng trở thành sự sống hàng ngày.

Cuối cùng là vô tác, vô tác là không cần tìm kiếm. Vô tác không phải là hết ham muốn mà thôi. Có những người hết ham muốn nhưng lòng rất rầu rơi: tôi không thiết gì nữa! Apranihita là không đặt trước mình một đối tượng để chạy theo. Tức là biết dừng lại, và hạnh phúc chỉ đạt được khi ta biết dừng lại. Cho nên nếu có người hỏi: ‘‘Tu để làm gì?’’, có thể ta trả lời: ‘‘Tu là để có hạnh phúc.’’ Người ta hỏi: ‘‘Tu tới bao giờ mới có hạnh phúc?’’ –   ‘‘Phải có hạnh phúc ngay từ bây giờ. Còn nếu không thì không phải là anh đang tu.’’

!! Các cách trình bày khác về pháp ấn

Sau khi đã hiểu cách tu tập Tam Pháp Ấn chúng ta nên biết thêm về các lối trình bầy khác về pháp ấn. Trong văn học Phật giáo cũng có ý niệm Nhị Pháp Ấn. Khổ là một pháp ấn và niết bàn là pháp ấn thứ hai. Ngoài ra còn ý niệm về Tứ pháp ấn, là vô thường, khổ, vô ngã và niết bàn. Và Kinh cũng nói tới một pháp ấn thuộc truyền thống đại thừa, gọi là Nhất Thật Tướng Ấn. Sở dĩ có nhiều cách trình bầy về pháp ấn là do lối nhìn của những thế hệ về sau.

Trong lịch sử phân phái, cuộc phân chia hệ phái đầu tiên xẩy ra một trăm năm sau khi Bụt nhập diệt, thành Thượng Tọa Bộ và Đại Chúng Bộ. Thượng Tọa Bộ là các vị có khuynh hướng bảo thủ, Đại Chúng Bộ là phía các vị muốn cải cách. Thượng Tọa Bộ sau này chia ra Hữu Bộ và Phân Biệt Thuyết Bộ, đó là cuộc phân phái thứ hai. Như chúng ta biết, Hữu Bộ truyền lên miền Kashmir, Phân Biệt Thuyết Bộ ở lại, sau đó lại gửi một chi phái là Xích Đồng Diệp Bộ sang Tích Lan, bây giờ ta gọi là Theravada. Cho nên Hữu Bộ và phái Theravada có cùng một nguồn gốc và kinh điển rất giống nhau. Trong tam tạng Pali, những đoạn văn nói về vô thường cho nên khổ, khổ cho nên vô ngã được lập đi lập lại nhiều lần, cũng giống trong những bộ Kinh A Hàm bằng chữ Hán thuộc văn hệ Bắc Truyền. Điều đó chứng tỏ cách nhìn đó có trước thời phân chia thành hai phái Hữu Bộ và Phân Biệt Thuyết Bộ.

Theo sát các đoạn kinh trên, đạo Bụt Nam truyền giải nghĩa Tam pháp ấn là Vô Thường, Khổ, và Vô Ngã. Cách nhìn đó có thể đưa tới những hiểu lầm, cũng như lối xếp đặt Khổ và Niết Bàn vào làm Nhị Pháp Ấn. Sai lầm căn bản là sự biến đổi vai trò của Khổ, từ một cảm thọ cần nhận diện, thành một bản chất của thực tại. Sau khi đã học về ba cánh cửa giải thoát chúng ta sẽ nhìn lại về vấn đề này trong ánh sáng của tam tam muội.

Khổ đau phát sinh là do chúng ta bị kẹt vào tướng, cho nên Bụt đã dạy phép quán vô tướng. Phương pháp mà Bụt dạy là dùng giáo lý vô thường và vô ngã. Vô thường là một chiếc chìa khóa để mở cửa thực tại, và dùng quán vô thường chúng ta phá vỡ được các tướng trạng. Vô ngã là một chìa khóa khác. Dùng phương pháp vô ngã, chúng ta cũng đi tới vô tướng. Phàm sở hữu tướng giai thị hư vọng, cái gì có tướng là có sự lầm lẫn. Vô thường mà nghĩ là thường thì khổ, vô ngã mà cho là có ngã thì khổ. Trước tiên, khổ ở đây là một cảm thọ do hư vọng gây ra. Nhưng nhiều thế hệ Phật tử sau này đã nâng ý niệm khổ lên thành một tính chất phổ biến tất yếu của thực tại. Vì trong giáo lý tứ diệu đế Khổ đứng đầu. Bản ý của Bụt là: chúng ta phải nhận diện Khổ. Nhận diện Khổ là một chuyện, thái độ giáo điều nói rằng ‘‘Tất cả đều là khổ, không có cái gì là không khổ hếtì là một chuyện khác. Hai cách nhìn đó khác nhau rất nhiều. Nhưng nhiều thế hệ Phật tử đã đi vào con đường thứ hai. Cho nên có lý thuyết về Tam Khổ: Ban đầu Khổ như là một cảm thọ (Dhukha as an unpleasant feeling). Rồi đến Hoại Khổ, vì vạn vật sẽ tàn hoại cho nên khổ (Dhukha as change). Thứ ba Hành Khổ, mọi hiện tượng vì được tập hợp mà thành nên khổ, khổ vì bản chất là Hành (Dhukha as formation). Thuyết Tam Khổ có tính cách giải thích, binh vực cho chủ trương tất cả đều là khổ. Mục đích của Bụt khi giảng Tứ Diệu Đế không phải là biện luận về một chủ thuyết. Mục đích của Ngài là dặn dò rằng có những cái khổ chúng ta phải nhận diện. Những thế hệ sau nghĩ rằng sự giải thoát chỉ đạt được khi ta nhắc đi nhắc lại sự thực thứ nhất ‘‘đời là khổ, đời là khổ, cái gì cũng là khổ, cái gì cũng là khổì nếu không thì không đạt được quả vị A La Hán, không giải thoát, không an lạc. Đọc lại những tác phẩm A-tỳ Đạt-ma, như Tranh Luận Sự (Points of controversy) ta sẽ thấy. Đó là ta hiểu và áp dụng sai Tứ Diệu Đế. Những cái đau khổ gọi chúng là đau khổ đã đành rồi, những cái không đau khổ cũng phải làm cho chúng thành đau khổ luôn!

Đi xa thêm một bước nữa là quan niệm tất cả các Hành- những hiện tượng được tập thành như là núi, sông, cây, cỏ, mặt trời, mặt trăng, cha mẹ, anh em, nụ cười, tiếng khóc, tất cả đều là khổ hết! Hệ luận của một quan niệm như vậy là Niết-bàn hoàn toàn tách biệt khỏi các hành. Nước mà bỏ hết sóng đi thì đâu còn có nước?

Cách nhìn đó dẫn tới ý tưởng cuộc đời là khổ, năm uẩn là khổ, sáu đại là khổ, tất cả là khổ cho nên ta phải dứt bỏ hết. Nhưng ai là kẻ làm công việc dứt bỏ đó? Có một cái Ta biệt lập với năm uẩn, với những cái gọi là Hành không? Hay Ta chẳng qua cũng chỉ là những Hành đó? Cái ta có phải là một thực tại độc lập ngoài những Hành này không? Nói Có tức là chấp vào Hữu Ngã, có một cái Ngã riêng biệt.

Có một cái Ngã nằm ngoài các Hành, có một cái Ngã riêng ở ngoài năm uẩn, đó là một sai lầm căn bản. Đó là hai khái niệm về Ngã mà Bụt đã phá vỡ. Khái niệm thứ ba là Thần Ngã (Atma) tức là yếu tố thiêng liêng có thể đồng nhất hoá với Phạm Thiên (Brahma). Ta là Atma, còn Brahma là Đại Ngã, hai cái đó là một, trở về với nhau gọi là giải thoát, Bụt cũng đã bác bỏ ý niệm đó.

Vậy thì cái Ta này là cái gì, có thể thoát ra ngoài năm uẩn và các Hành được chăng? Có phải sau khi tôi đã buông bỏ tất cả năm uẩn và các Hành rồi thì tôi sẽ bước sang một thế giới khác gọi là Niết-bàn chăng? Vậy Niết-bàn là một thực thể hoàn toàn biệt lập với các Hành chăng? Phải chăng bỏ cái thế giới khổ này, đi tìm tới một thực thể hoàn toàn khác với khổ, đó là nhập Niết bàn? Nghĩ như vậy thì hai Pháp Ấn, Khổ và Niết-bàn, trở thành một giáo lý nhị nguyên. Không phải Bụt dạy Khổ và Niết bàn là nhị nguyên, mà cách nhìn của người ta bị kẹt vào quan điểm nhị nguyên. Chúng ta thấy rất là mầu nhiệm khi phá vỡ được tư tưởng nhị nguyên. Cũng như khi học về Xả, ta cũng phải phá đổ quan điểm nhị nguyên. Tiếng Anh dịch Xả là equanimity tức là không đứng về một phe, đối lập với phe khác. Nếu nói Hành là khổ, rồi ta bỏ các Hành, đi tìm về Niết-bàn hoàn toàn khác biệt với Hành, đó là nhị nguyên, không phải là Xả. Niết bàn nằm trong các Hành, niết bàn chính là Hành.

Bàn luận như trên không phải là để biện giải lý thuyết xem giải thích Tam Pháp Ấn cách nào là đúng, hay Nhị Pháp Ấn cách nào là đúng. Câu hỏi thích đáng phải nêu lên là chúng ta có thực tập Tam Giải Thoát Môn không? Các Tổ, các Thầy nói tới Ba Cánh Cửa Giải Thoát nhưng đã dạy ta phương pháp thực tập. Làm sao để thực tập Không, làm sao để thực tập Vô Tướng, và làm sao thực tập Vô Tác? Chúng ta phải tránh việc học một mớ lý thuyết rồi không bao giờ đem chúng áp dụng trong đời sống hằng ngày. Pháp Ấn có thể là ba, Vô thường, Khổ, Vô Ngã cũng được hoặc Vô thường, Vô Ngã, Niết-bàn cũng được; có thể là hai, Khổ với Niết-bàn cũng được. Hay chỉ là một Nhất Thiết Thực Tướng Ấn cũng được. Điều quan trọng là những giáo lý ấy có thể thực tập được, có thể đem lại giải thoát cho ta được hay không? Điều kỳ diệu là trong Tam Pháp Ấn có Vô thường, Vô Ngã, Niết-bàn, thì Niết-bàn thuộc về phạm vi Thể, và hai phần kia thuộc về phạm vi Tướng. Chính nhờ tiếp xúc với Tướng một cách sâu sắc mà đi tới Thể của các tướng. Đó là nguyên tắc Tùng Tướng Nhập Tánh.

Tam Giải Thoát Môn đã được trình bày như là những phương pháp thực tập và chúng ta có thể thực tập được. Sống như thế nào gọi là có cái nhìn Không? Cách nhìn đó chúng ta thực tập khi thức dậy, khi ăn cơm, khi uống nước, khi tiếp xử với bạn bè. Sống như thế nào, thấy như thế nào, tiếp xử như thế nào có thể gọi là Vô Tướng? Và sống thế nào có thể gọi là Vô Tác? Chúng ta an trú được trong giờ phút hiện tại, có hạnh phúc ngay trong giây phút hiện tại, dầu còn đeo theo một ít nghiệp chướng bên mình. Nếu quý vị nói về Không, Vô Tướng, Vô Tác, đọc một cuốn sách ba ngàn trang về Không, Vô Tướng, Vô Tác mà cuối cùng không áp dụng được trong đời sống thì ba ngàn trang sách đó sẽ không có một ích lợi nào.

Sự hiểu sai và truyền thừa sai xẩy ra khắp nơi, trong Đạo Bụt Nam Truyền cũng như trong Đạo Bụt Bắc Truyền. Chúng ta phải dùng trí thông minh và căn cứ trên kinh nghiệm tu tập, trên những thành công, những thất bại của chúng ta để có thể tiếp xúc với giáo lý đích thực của Đạo.
! Bài 10 Sống giây phút hiện tại

Hôm nay là ngày 23 tháng 12 năm 1993 chúng ta ở tại Xóm thượng và học tiếp về chánh niệm. Chánh niệm là trái tim của sự thực tập, vì vậy ta phải học về chánh niệm thật kỹ. Tất cả những chi phần khác của bát chánh đạo sẽ không thể nào thành tựu khi ta không phát triển chánh niệm. Trong đời sống hàng ngày nhiều khi chúng ta không có mặt, không thực sống trong giờ phút hiện tại. Vì vậy, chánh niệm trước hết là sự có mặt của chính mình trong đời sống.

Trong nền văn học của nhân loại, tác phẩm đầu tiên xuất hiện sớm nhất để dạy chúng ta trở về để sống và an trú trong hiện tại, là Kinh Người Biết Sống Một Mình (Bhaddekaratta sutta). Kinh Người Biết Sống Một Mình dạy nghệ thuật sống trong từng giây từng phút hiện tại. Nguồn năng lượng có thể giúp mình trở về có mặt trong giây phút hiện tại là chánh niệm. Cho nên chánh niệm là sự tu tập để mình có mặt bây giờ, có mặt ở đây. Tâm của chúng ta có thể đang nuối tiếc về quá khứ, đang mơ tưởng chuyện tương lai, hoặc đang bị giam hãm trong những nỗi lo âu, phiền muộn, giận hờn trong hiện tại. Chúng ta không có tự do, không có khả năng tiếp xúc với sự sống đang diễn ra. Chánh niệm là yếu tố giải phóng cho chúng ta.

!! Sống giây phút hiện tại

Trước hết chúng ta định nghĩa chánh niệm là thứ năng lượng đem chúng ta trở về với sự sống. Có những người chỉ biết lo lắng cho tương lai, chỉ mơ ước về tương lai và vì vậy họ không có khả năng sống với sự sống hiện tại. Có những người lại thương tiếc, vướng víu vào quá khứ, chỉ thấy sự sống ở trong quá khứ. Cả hai đều không tiếp xúc được với sự sống trong giờ phút hiện tại. Do đó trong cuộc đời của họ, sự sống không có mặt, dù họ có đủ sáu căn để tiếp xúc được với sáu trần. Thất niệm làm cho họ không có sự sống. Nhà văn Albert Camus dùng văn ảnh ‘‘Sống như một người chết.’’ Một người sống trong thất niệm, không an trú được trong hiện tại, sống không ý thức thì cũng như đã chết.

Tự đánh mất mình trong những tham đắm vật dục, đó cũng không phải là đang sống ý thức trong hiện tại. Bị sắc, thanh, hương, vị, xúc, pháp lôi cuốn, mê mờ không biết mình đang làm gì, không biết mình thực sự là ai, đó cũng không phải là đang sống. Tự tàn phá đời mình và làm khổ những người xung quanh mà không hay, cũng không phải đang sống. Tuy không bị quá khứ, không bị tương lai lôi cuốn, nhưng vẫn sống trong mê tưởng, thì cũng chưa biết an trú trong hiện tại. Sống trong hiện tại là sống tỉnh táo. Sự sống ở đây được nuôi dưỡng bằng chánh niệm. Chánh niệm là hạt giống quý báu ở trong tâm ta. Việc tu tập hàng ngày của chúng ta là để tiếp xúc được với hạt giống đó, giúp nó nẩy mầm, nở hoa và làm đẹp đời mình và đời những người xung quanh.

Kinh Người Biết Sống Một Mình được chú giải và xuất bản bằng tiếng Anh đã mang tên Your Appointment With Life, nghĩa là Cuộc hẹn ước của quý vị với đời sống. Bản dịch sang tiếng Trung Quốc lấy tên là Dữ Sinh Mạng Hữu Ước, nghĩa là có Ước hẹn với sự sống. Chúng ta có ước hẹn với sự sống, chúng ta phải gặp sự sống, đừng để lỡ cuộc hẹn hò này ‘‘do not miss your appointment with life’’. Yếu tố giúp chúng ta khỏi bị lỡ hẹn với sự sống là chánh niệm. Mà ta hẹn hò với sự sống ở đâu, vào lúc nào? Câu trả lời là ‘‘Chúng ta chỉ có thể gặp gỡ sự sống bây giờ và ở đây.’’ Cho nên tu tập là tiếp xúc được với sự sống trong mỗi giây, mỗi phút của đời sống hằng ngày. Nói như dễ hiểu và dường như dễ làm. Nhưng nếu không có thầy, không có bạn và không có tăng thân thì chúng ta sẽ lỡ hẹn liên tiếp với sự sống. Thất niệm níu ta về quá khứ, kéo ta tới tương lai, lôi chúng ta vào những lo lắng, giận hờn, ganh tỵ và bực bội. Chúng ta trở thành nô lệ của những thứ phiền não đó và không còn tự do để gặp mặt sự sống nữa.

Mỗi buổi sáng thức dậy ta hãy tập thở và mỉm cười, nhớ rằng hôm nay chúng ta có hẹn với sự sống (I have an appointment with life today!). Chúng ta hãy thở, mỉm cười và đọc bài kệ:

Thức dậy miệng mỉm cười, hăm bốn giờ tinh khôi, xin nguyện sống trọn vẹn, mắt thương nhìn cuộc đời.

Tôi nguyện sẽ không lỡ hẹn với sự sống ngày hôm nay, bài kệ có nghĩa như vậy. Đó là một lời nguyện, là sự bày tỏ một quyết tâm, thực hiện được chừng nào là tùy công phu tu tập của mình. Trong hăm bốn giờ đồng hồ ta có thể tiếp xúc với rất nhiều mầu nhiệm của sự sống, trong ta và xung quanh ta. Nếu ta có đủ năng lượng của chánh niệm thì tất cả những điều ta thấy và nghe đều có tác dụng giúp ta thực tập như lý tác ý, lay thức ta dậy để ta trở về với giây phút hiện tại. Trước khi đi ngủ, chúng ta hãy thở và kiểm điểm lại xem ngày hôm nay chúng ta đã tiếp xúc được với sự sống tới mức nào. Chúng ta đã để cho những hờn giận, ganh ghét và buồn phiền trấn ngự trong tâm đến mức độ nào? Ta tự hẹn ngày mai sẽ làm khá hơn. Giá trị của tăng thân và của khung cảnh tu học là ở chỗ có thể tạo những hình ảnh và âm thanh giúp ta trở về chánh niệm. Tiếng chuông chùa là một yếu tố hỗ trợ như thế. Tôi trở về được với chánh niệm, tôi được nuôi dưỡng bằng những thức ăn lành mạnh, đẹp đẽ và vui tươi của đời sống, đó là nhờ anh, nhờ chị, nhờ em. Tăng thân gồm tất cả mọi người và mọi cảnh vật có tác dụng giúp ta trở về với chánh niệm.

Vậy thì chánh niệm là có mặt trong cuộc sống. Khi thở một cách có ý thức, thở trong chánh niệm, tự nhiên ta thiết lập được sự có mặt của ta. Tôi đang thở vào và tôi biết là tôi đang thở vào. Tôi đang thở ra và tôi biết là tôi đang thở ra. Phép tu tập đó tuy đơn giản nhưng có thể đem ta trở về với giây phút hiện tại. Chánh niệm là một ngọn đèn chiếu sáng cho ta thấy. Có bông hoa rất đẹp, có bầu trời rất xanh, có cây bồ đề rất tươi tốt, có nụ cười em bé rất ngọt ngào, có người sư chị dịu hiền, có người sư em rất tươi vui. Nhưng khi bị giam hãm trong giận hờn và trong lo lắng, khi đang phiêu lãng trong quá khứ hay tương lai, ta không tiếp xúc được với những vẻ đẹp đó. Nụ cười tươi mát kia, bầu trời xanh kia, vì sao ta không được hưởng? Vì ta không có mặt. Người và cảnh chung quanh đều có thể giúp ta thức dậy trở về với chánh niệm. Người phát thư đi tới hỏi: ‘‘Có ai trong nhà không?’’ Ta trả lời: ‘‘Có, tôi đang ở đây.’’ Với câu nói đó, ta thực tập chánh niệm: Tôi biết tôi đang có mặt bây giờ và ở đây. Người phát thư không biết ta đang thực tập chánh niệm. Nhưng câu trả lời ‘‘Tôi đang ở đây’’ có nghĩa là: ‘‘Tôi đang ở đây, tôi đang thực sự có mặt đây, ông phát thư ạ.’’ Thấy một sư chị đang rửa chén, chúng ta hỏi: Sư chị đang làm gì đó? Tự nhiên sư chị biết đây là một người sư em đang đến giúp mình vượt thoát ra ngoài thế giới của suy nghĩ, của lo lắng, để có thể tiếp xúc lại với sự sống mầu nhiệm. Vì rửa chén trong chánh niệm và thở trong chánh niệm cũng là một phép tu tập. Rửa chén với tâm an lạc cũng giống như đang tắm cho một đức Bụt sơ sinh. Ta đâu cần trở về 2600 năm về trước, ta đâu cần đi tới vườn Lâm Tỳ Ni, ta đâu phải đầu thai thành một vị thị nữ của bà Maya mới có dịp tắm cho đức Bụt sơ sinh? Phép lạ thứ nhất của chánh niệm là làm cho ta có mặt trong sự sống hiện tại.

!! Chánh niệm làm sự sống có mặt

Khi thất niệm, vì ta không có mặt nên những cái khác cũng không có mặt. Cái khác đây là bầu trời xanh thẳm, là hoa đào đang nở rđo, là người anh rất ngọt ngào, là người bạn rất tươi mát, là một em bé rất xinh đẹp. Nếu ta không có mặt thì tất cả những thứ ấy đều không có mặt. Cho nên sự có mặt của ta đem lại sự có mặt của vũ trụ, của sự sống, của tất cả những mầu nhiệm quanh ta. Đời sống có những khổ đau, những bi lụy; nhưng đời sống cũng có rất nhiều nhiệm mầu. Nếu chúng ta chỉ tiếp xúc với khổ đau thì chúng ta sẽ ốm o gầy mòn, nhưng nếu biết cách tiếp xúc với những yếu tố mầu nhiệm, tươi mát và lành mạnh của đời sống thì ta sẽ tự nuôi dưỡng được bằng những chất liệu mầu nhiệm, lành mạnh và tươi mát. Khi được nuôi dưỡng bởi những yếu tố lành mạnh, tươi mát và có tính cách trị liệu rồi, chúng ta mới có khả năng tiếp xúc với khổ đau để chuyển hóa khổ đau. Phép lạ thứ hai của chánh niệm là xác nhận sự có mặt của đối tượng, của người, của vật khác ở ngoài ta

Vật ở ngoài kia là bông hoa đào, là bầu trời xanh. là tiếng chim hót. Đó cũng là sự có mặt của các em bé, của anh, của chị, của mẹ, của cha. Nếu ta không có mặt thì những đối tượng đó cũng không có mặt. Cho nên phép lạ thứ hai của chánh niệm là xác nhận được sự có mặt của đời sống, của tất cả những mầu nhiệm trong giây phút hiện tại. Khi nhìn lên mặt trăng với chánh niệm, chúng ta có mặt đích thực mà mặt trăng đích thực cũng có mặt. Biết mình có đó, biết có mặt trăng ở đó, đây đã là một phép lạ, một phép thần thông rồi. Phép thần thông đó ta có thể tạo ra trong mỗi giây mỗi phút. à, ta đang có mặt và mặt trăng kia cũng đang có mặt; sự có mặt nhiệm mầu, sự có mặt đích thực, chứ không phải là một giấc mộng nữa.

Một trong những vấn đề triết học là ta có mặt hay là không có mặt (To be or not to be). Con người có thật không, hay chỉ là một ảo ảnh? Triết học đi tìm những lý luận để chứng minh rằng con người có mặt thực sự. Ngày xưa triết gia Descartes, muốn chứng minh con người có mặt một cách rõ ràng và chính xác, sau khi suy nghĩ rất nhiều, đã đi đến một công thức nổi tiếng, ông viết: ‘‘Tôi suy nghĩ cho nên tôi có mặt’’ (Cogito ergo sum, I think therefore I am). Đó là dùng lý luận, thứ lý luận toán học, để chứng minh: tôi đang có mặt ở đây. Đặt câu hỏi ta có mặt hay không, đó đã là suy tư. Ta có suy tư, và hễ có cái ta suy tư tức là ta đã có mặt rồi. Cho nên ông kết luận: tôi tư duy, vì vậy cho nên có tôi. Đó là một lý luận chứ không phải là một kinh nghiệm. Trong khi đó sư chú đứng nhìn mặt trăng không tư duy gì cả. Sư chú thấy mình đang có mặt ở đây, đang tiếp xúc với mặt trăng ở kia, và đó không phải là một tư duy. Đó không phải là một lý luận nữa, đó là sự sống đích thực. Nghĩ sâu hơn thì ta thấy rằng càng tư duy chúng ta lại càng không có mặt. Vì khi tư duy, chúng ta đánh mất sự sống trong dòng tư duy. Tư duy trở thành một chướng ngại khiến chúng ta không tiếp xúc thực sự được với sự sống. Cho nên càng không tư duy càng tốt. Bận tư duy rồi thì làm sao sống! Khi bế một em bé mà mình cứ tiếp tục tư duy thì mình đang ôm cái tư duy của mình và đâu có thực sự ôm em bé? Khi nhìn bông hoa mà tư duy thì mình đâu có thực sự ngắm hoa? Vì vậy tôi tư duy là tôi không có mặt (I think, therefore I am not there). Phái thiền Tào Động nói: phi tư duy thị thiền chi yếu giả (không tư duy là điểm thiết yếu của thiền, non thinking is the essential of zen practice).

Năm ngoái ở Làng Mai, chúng ta có cơ hội đọc truyện Kiều với nhau và nghe giảng truyện Kiều qua cái nhìn thiền quán. Chúng ta nói đến hai câu thơ giờ đây đã rất nổi tiếng ở Làng Mai:

<<<
Bây giờ rõ mặt đôi ta,  <br>
Biết đâu rồi nữa chẳng là chiêm bao?
<<<

Bác Tư đã viết hai câu này treo trong thiền đường Cam Lộ. Người đời đi vào sẽ ngạc nhiên: tại sao ở trong một thiền viện lại còn nói đến chuyện đôi ta? Hai chữ đôi ta ở đây còn được đọc qua con mắt thiền quán. Đôi ta là chính mình và sự sống. Như mình với mặt trăng, mình với hoa đào, mình với em bé. Có chánh niệm thì tự nhiên sự có mặt của mình và của các pháp trở thành hiển nhiên: Bây giờ rõ mặt đôi ta. Đó là nhìn rõ sự sống, trong hiện tại, và ở đây.

Nguyễn Du viết hai câu này khi kể lại lúc Thúy Kiều qua thặm Kim Trọng lần thứ hai. Hôm đó gia đình đi ăn giỗ bên ngoại, Kiều đã lấy cớ nhức đầu hay đau bụng gì đó để ở lại nhà. Qua thặm Kim Trọng lần đầu, Thúy Kiều chỉ ngồi một lúc thôi. Kiều hơi thấp thỏm, sợ ở bên này lâu quá, lỡ bố mẹ với các em về không thấy mình ở nhà thì hơi quê. Cho nên Thúy Kiều phải trở về ngay nhưng khi về nhà thì Kiều vẫn chưa thấy ai cả. Nàng bèn vén hàng rào đi qua hàng Xóm lần nữa để gặp lại người yêu. Kim Trọng lúc đó có lẽ vì đã thức khuya học nhiều thành ra thiếu ngủ, anh ta đang ngồi gục đầu dựa lên bàn để ngủ. Trăng đã lên, tiếng chân của Thúy Kiều dẫm trên lối sỏi làm Kim Trọng thức dậy. Mơ mơ màng màng, nhìn lên chàng thấy người đẹp đi tới. Trong cơn mơ màng đó, Kim Trọng không biết đây là sự thực hay trong mộng. Chàng nói: Đây có phải là một giấc mơ không? Em có thực đó hay không? Thúy Kiều đã trả lời:

<<<
Nàng rằng: quãng vắng đêm trường,  <br>
Vì hoa nên phải đánh đường tìm hoa.  <br>
Bây giờ rõ mặt đôi ta,  <br>
Biết đâu rồi nữa chẳng là chiêm bao?

Đọc hai câu đó, nếu biết nhìn bằng con mắt thiền quán ta sẽ thấy rùng mình. Giờ phút này đây chúng ta đang ở bên nhau, đang nhìn thấy mặt nhau, đang nói chuyện với nhau. Nhưng nếu chúng ta không có chánh niệm, không có mặt đích thực thì biết đâu, giây phút đó sẽ chẳng khác gì một giấc chiêm bao. Nếu ta sống không có chánh niệm, không tiếp xúc thực sự với giây phút hiện tại, thì tất cả đều trở thành một giấc mơ hết. Hai câu này có thể viết treo trong thiền viện để những người không hiểu sẽ có cơ hội hỏi: Tại sao trong thiền viện mà lại treo hai câu thơ này?

Khi nhìn mặt trăng, ta phải nhìn cách nào để thấy được mặt trăng và thấy được chính mình đang có mặt, ý thức một cách sâu sắc trong giây phút hiện tại sự hiện diện của mình và của vầng sáng trên cao. Có những người sống tới 70 năm hay 80 năm mà chưa bao giờ biết ngắm trăng trong ý thức tỉnh táo như vậy. Có những người thấy hoa đào nở mỗi năm, mà đến hết đời chưa bao giờ nhìn biết ngắm hoa đào một cách sâu sắc. Cái gì cũng thấy thoáng qua mà thôi. Mẹ của mình, cha của mình, mình cũng chỉ thấy thoáng qua. Em của mình, chị của mình, thầy của mình, bạn của mình, mình cũng chỉ thấy thoáng qua. Cho nên khi nhìn một cành hoa đào, chúng ta phải thở rất sâu, và chúng ta chỉ vào cành hoa: bây giờ rõ mặt đôi ta, biết đâu rồi nữa chẳng là chiêm bao. Ở Làng Mai mỗi tháng tư, hoa mai nở đầy hết đồi núi, tôi thường đi giữa những hàng mai, bông trắng như tuyết. Tôi thở và tiếp xúc trong tinh thần đó. Trong một giây phút, ta thấy mình với hoa mai bất diệt. Hãy thực tập với những bông hoa khác nữa, chứ đừng chờ tới tháng tư. Tại Làng Mai, giữa mùa đông cũng có những bông hoa nở rất kín đáo. Những mầu nhiệm của sự sống có mặt khắp mọi nơi và bất cứ lúc nào. Đừng bỏ lỡ cuộc hẹn của mình với sự sống. Sự sống đó được biểu hiện bằng một bông hoa vàng trong cỏ, hay một trận mưa đầu mùa, tất cả đều mầu nhiệm. Nếu quý vị mất khả năng tiếp xúc với mưa, với gió, với những cành cây trụi lá mùa đông, nếu quý vị không thể tiếp xúc được với trời trong, với mây bạc, với trăng tròn thì quý vị đã lỡ hẹn với sự sống. Cho nên chánh niệm trước hết là đem mình trở về để có mặt trong sự sống. Ý thức sự có mặt của chính mình, ý thức đó làm cho tất cả những cái khác có mặt. Có mặt, luôn luôn có nghĩa là có mặt vừa chủ thể vừa đối tượng. Chủ thể và đối tượng đó gọi là đôi ta.

Ngày xưa ở Trung Hoa có thiền sư Linh Vân, chỉ nhìn hoa đào nở mà giác ngộ. Chúng ta có thể cảm nhận được sự giác ngộ của thiền sư. Ngắm hoa đào thôi mà giác ngộ thì ta phải biết năng lực chánh niệm của thầy mạnh như thế nào. Nếu không thường xuyên tiếp xúc sâu sắc với sự sống trong hiện tại thì không bao giờ ta đạt được một kết quả như vậy. Và đó là một phép lạ mà tất cả chúng ta đều có thể thực hiện trong mỗi giây phút của đời mình. Cho nên 24 giờ tinh khôi là một tặng phẩm lớn của đất trời cho chính chúng ta. Mỗi buổi sáng thức dậy mà không biết mình có 24 giờ đồng hồ để sống, mà tự để mình chết đuối trong giận hờn, buồn bã, ganh tị và lo lắng, tức là sự tu học của mình đã thất bại. Người đời chết đuối đã nhiều, chúng ta vào thiền viện, được hướng dẫn để tu tập, được dạy thiền hành, thiền tọa, biết rửa chén, ăn cơm im lặng, nếu ta không tỉnh thức được thì thật uổng phí công trình của Bụt và của tổ.

!! Chánh niệm là nuôi dưỡng

Khi tiếp xúc được với sự sống thì chính ta được nuôi dưỡng mà đối tượng tiếp xúc của ta cũng được nuôi dưỡng. Đối tượng kia có thể là cây, là lá, là dòng sông, là em bé, là người mình thương, hay là người mình ghét. Khi ta có mặt trong ý thức, vật kia có sự chú ý của ta cũng sẽ có mặt. Chánh niệm là sự chú ý. Khi có chánh niệm, nhìn vào một khu rừng xanh mát thì ta biết rằng khu rừng này đang xanh mát. Nhìn đủ sâu sắc thì ta biết phải làm gì để giữ cho khu rừng này tiếp tục xanh mát. Có những khu rừng bắt đầu chết vì các độc tố con người tạo ra. Nếu khu rừng đang vàng úa thì ta biết rằng phải làm gì để khu rừng có thể tươi mát trở lại. Vì vậy sự có mặt của chánh niệm sẽ đem tới niềm an ủi và cách trị liệu cho đối tượng. Đối tượng của chánh niệm có thể là một người hay một sự vật. Người kia đang sầu héo, đang buồn bã, đang nhức nhối mà nếu có mặt, có chánh niệm, thì chúng ta sẽ nhìn thấy rõ tình trạng sầu héo và buồn khổ ấy. Và chánh niệm có thể giúp chúng ta biết nói gì, làm gì (hay không nói gì, không làm gì) cho người đó bớt khổ và trở nên tươi tỉnh lại. Nếu người đó đang sống bình thường, không sầu khổ, không bệnh tật, mà chúng ta có mặt với chánh niệm, thì người đó có thể có hạnh phúc.

Sống mà không được người thân ở chung quanh chú ý thì khổ. Người sống bên ta có thể khổ vì ta bận bịu quá, lo nhiều công việc quá, và vì vậy không còn thì giờ cho người ấy. Ta không đủ chánh niệm để nuôi dưỡng và ôm lấy người trong tình thương ta. Ta không cần ôm bằng hai cái cánh tay, ta phải biết ôm người thân bằng năng lượng chánh niệm của mình. Tôi biết anh có đó, tôi không quên sự có mặt của anh. Tôi biết em có mặt đó. (I know you are there). Đó là một món ăn rất bổ dưỡng để nuôi nấng người kia. Thiếu sự chú ý của những người mình thương, thì mình chết mòn. Tưởng tượng một ông đang lái xe đi cùng vợ. Ông đang suy nghĩ về chuyện này chuyện khác, hay đang hát, đang ngâm nga một bài thơ. Nhưng mà ông hoàn toàn không để ý tới người đàn bà đang ngồi bên mình. Có thể ông ta cảm thấy người này mình đã biết hết rồi, từ thân tới tâm. Không có gì gọi là mới lạ nơi con người này nữa! Bởi vậy ông chú ý tới những thứ khác. Người đàn bà ngồi bên cạnh, bà sẽ cảm thấy mình bị loại ra ngoài tâm ý của chồng. Ông ta đang nghĩ tới chuyện làm ăn, buôn bán, chuyện này chuyện khác, và ông ta không muốn nghĩ tới mình. Người đàn bà sẽ chết dần mòn trong sầu héo và tủi hờn. Nhưng chúng ta biết trong người đàn bà đó có đủ những niềm vui, những hạnh phúc, những khả năng chưa khai mở. Trong con người nào cũng có những hạt giống như vậy. Cha mẹ có thể đã không giúp con phát triển những hạt giống của hạnh phúc, của tài năng. Thầy, bạn cũng chưa giúp được, cả ông chồng ngồi một bên cũng không giúp được. Ngồi trên xe hơi, người vợ đó thấy mình hoàn toàn bị lãng quên. Chánh niệm có thể mang lại niềm vui, như chất bổ dưỡng có thể tưới tẩm cho tâm hồn những người đang sầu héo.

Phép lạ thứ ba của chánh niệm là nuôi dưỡng chính những đối tượng của chánh niệm. Nếu đối tượng là dòng sông thì chánh niệm giúp nuôi dưỡng và bảo vệ dòng sông. Nếu đối tượng là khu rừng thì nó nuôi dưỡng và bảo vệ khu rừng. Nếu đối tượng đó là một em bé, thì nó nuôi dưỡng và bảo vệ em bé. Vì vậy chánh niệm là gốc của tình thương. Nếu không có chánh niệm thì anh không thể thực sự thương, chị không thể thực sự thương. Nếu không có sự chú ý thì không có tình thương đích thực. Một người có thể gần gũi người khác vì thuận tiện hoặc vì nhu cầu, những nhu cầu tâm lý, sinh lý, hay những nhu cầu xã hội. Đó không phải là tình thương. Tình thương đích thực là sự có mặt của chánh niệm, vì chánh niệm có tính cách nuôi dưỡng.

Năm 1964 tôi làm một bài thơ đề là “Vòng tay nhận thức”. Bài này có chủ đề là đôi ta. Ở đây đôi ta là người làm thơ và cây bông sứ tại chùa Trúc Lâm ở Gò Vấp tỉnh Gia Định. Sáng đó tôi dậy rất sớm. Không ngủ được, tôi ngồi dậy, đi ra cửa sổ. Ngoài cửa sổ tối đen. Cái thất của tôi, do thầy Châu Toàn làm, nền bằng đất. Nền đất nên đi hai chân không rất mát. Đi từ giường ngủ tới cửa sổ, tôi bước trên mặt đất mười mấy bước thì tự nhiên thấy trong người rất tỉnh táo.

<<<
Chuông ngân một đêm dài không ngủ <br>
Hai bàn chân không, tỳ tay cửa sổ <br>
Tôi đợi vườn cây, hoa lá hiện hình ánh sáng chưa về <br>
Nhưng trong lòng đêm thâu tôi biết em còn đó.
<<<

Em ở đây là cây bông sứ trước cửa sổ.

Ở phần sau bài thơ lại có câu:

> Tôi biết là em còn đó vì tôi còn đây

Hễ có chủ thể tức là có đối tượng, có đối tượng là có chủ thể. Khi có chánh niệm ta thấy được sự có mặt của cả hai. Tôi biết là em còn đó vì tôi còn đây có nghĩa là tôi biết rằng sự sống có mặt ở đó vì tôi biết tôi có mặt ở đây. Nhờ tôi có mặt thực sự cho nên Em có mặt. Em tức là sự sống. Khi nhìn một người hay nhìn mặt trăng, nếu ta nói: ‘‘ ta biết ngươi có đó’’, thì đồng thời ta xác nhận sự có mặt của chính ta. Chánh niệm không phải chỉ nuôi dưỡng đối tượng mà cũng để nuôi dưỡng chính mình. Thiền sư thấy được hoa đào, không những làm hoa đào rạng rỡ mà còn làm cho người nhìn hoa rạng rỡ. Nhìn hoa đào không có chánh niệm thì hoa không rạng rỡ được. Không có cái gì rạng rỡ nếu không có chánh niệm. Có cũng như không vậy thôi. Trong đời sống hằng ngày, ta phải nhìn như thế nào, tiếp xúc như thế nào, nói như thế nào, sống như thế nào để có thể nói, không phải bằng lời mà bằng sự sống, rằng: ‘‘Ta biết ngươi có đó’’ Darling, I know you are there. Anh ơi, tôi biết anh có đó, tôi rất trân quý sự có mặt của anh. Chị ơi, em biết chị có đó, và em rất trân quý sự có mặt của chị.

Trong đời sống thường ngày chúng ta ít nói như vậy, chúng ta ít sống như vậy. Đến khi người kia chết hoặc bị tai nạn thì chúng ta khóc lóc. Chúng ta chỉ có khả năng khóc mà thôi, còn trước đó chúng ta không có khả năng chia sẻ hạnh phúc. Tất cả mọi vật đều vô thường. Mặt trăng kia cũng có thể sẽ tan vỡ một ngày nào đó. Người mình đang sống chung, có thể ngày mai không còn nữa. Và chính bản thân mình chưa chắc đã còn có mặt bên người đó ngày mai. Phải tinh tấn hôm nay, kẻo ngày mai không kịp. Chánh niệm giúp chúng ta sống một cách sâu sắc, đích thực ngay trong giờ phút hiện tại, để ngày mai ta không phải tiếc nuối. Tập Bông Hồng Cài Áo là một bài thực tập chánh niệm mà đối tượng của thực tập là bà mẹ của mình. Đối với mẹ ta thực tập như vậy mà đối với con ta cũng thực tập như vậy. Sự thực tập rất đơn giản, rất thực tế.

Vậy chánh niệm là năng lượng làm cho ta có mặt, làm cho vật kia hay người kia có mặt, và nuôi dưỡng đối tượng kia đồng thời nuôi dưỡng mình.

!! Chánh niệm làm vơi đau khổ

Phép lạ thứ tư là, nếu người kia đang chịu đựng khổ đau, chánh niệm sẽ có năng lượng làm vơi nỗi khổ của người. Khổ trong cô đơn, không ai biết tới, không ai để ý tới thì ta khổ thêm rất nhiều. Nhưng khi có một người thấy được nỗi khổ của mình, có thể ngồi với mình, mang chánh niệm ôm lấy niềm đau của mình, và biết hiến tặng cho mình sự có mặt của người đó, thì nỗi khổ của ta vơi bớt đi nhiều. Vì vậy thực tập chánh niệm bên người đang đau khổ cũng là một phương pháp thực tập lòng từ bi.

Tôi biết anh đang khổ, cho nên tôi đang ngồi đây với anh, tôi đang có mặt đích thực bên anh. Điều này có thể nói ra bằng cách nhìn, cách nói, bằng cử chỉ của ta. Nếu ta ngồi gần bên người ấy mà ý nghĩ đặt ở chỗ khác, nói chuyện này chuyện nọ, thì ta không biểu hiện được sự có mặt của ta. Sự có mặt đích thực nâng đỡ người ấy và giúp nỗi khổ niềm đau của người ấy nhẹ đi. Đó là tình thương đích thực. Nếu không có chánh niệm thì không có thứ tình thương đó. Nếu chánh niệm yếu thì tình thương cũng không đủ giúp người bớt khổ.

Chúng ta biết người đang lìa đời rất cần sự có mặt rất vững chãi của một hay nhiều người thân bên cạnh. Trong giờ phút Lâm chung người ta có thể bị sự sợ hãi và cô đơn làm cho đau khổ thêm cả ngàn lần. Nhưng nếu người đang chết thấy được sự có mặt của một người hiểu mình, đang ở đó thực sự với mình thì sẽ cảm thấy vững chãi trở lại, cảm thấy được nâng đỡ, được an ủi, và sẽ ra đi một cách nhẹ nhàng.

Tất cả những điều này có thể học được ở trong kinh điển đạo Bụt. Bụt đã dạy ta hộ niệm cho người Lâm chung như thế nào. Các thầy lớn như thầy Xá Lợi Phất, thầy A Nan… đều đã thực tập. Người tu phải biết thực tập hàng ngày để khi cần thì thể hiện sự có mặt vững chãi và đích thực của mình trong những giờ phút nguy nan đó. Phép lạ là làm cho người sắp lìa đời cảm thấy vững tâm, cảm thấy được an ủi. Họ sẽ thấy các nỗi khổ đau, lo lắng và sợ hãi vơi đi, nhờ sự có mặt đích thực của mình. Sự có mặt đích thực đó được tạo nên bằng chánh niệm. Đó là một chân ngôn có hiệu nghiệm rõ ràng. Những câu chân ngôn chỉ có thể hiệu nghiệm khi thân, khẩu, ý của mình hợp nhất, nghĩa là khi ta có chánh niệm vững chãi. Giáo lý của mật tông là khi thân, khẩu và ý hợp nhất thì người ta có định lực rất mạnh. Đinh lực mạnh làm cho chân ngôn có hiệu nghiệm.

!! Chánh niệm để quán chiếu

Công năng thứ năm của chánh niệm là nhìn sâu. Chữ quán trong Quán Tự Tại, Quán Thế Âm, hay là thiền quán, chỉ quán, có nghĩa là nhìn sâu (deep looking). Thiết lập chánh niệm và duy trì chánh niệm trên một đối tượng thì ta sẽ có thể nhìn sâu vào đối tượng. Nhìn sâu vào bông hoa hay nhìn sâu vào tình trạng của một người, đối tượng của sự quán chiếu của ta, ta sẽ thấy được bản chất của những mầu nhiệm và những khổ đau trong ấy. Đó là quán (vipasýana, phiên âm tiếng Hán Việt là tam ma thiền na).

Bốn công năng trên, bốn tác động trên là giai đoạn Chỉ. Chữ chỉ ở đây có nghĩa là làm ngưng tụ lại (samatha). Chánh niệm làm cho mình ngưng lại, tụ vào một điểm. Ekaggata là nhất điểm tụ, tức là đem năng lượng của chánh niệm quy tụ vào một đối tượng duy nhất. Ngưng tụ rồi, có một năng lượng mạnh mẽ, ta có thể nhìn sâu và nhìn kỹ, đó gọi là quán. Nói như trên không có nghĩa là đến tác động thứ năm ta mới có quán, mới nhìn sâu. Ban đầu, phép lạ của sự có mặt đã là nhìn sâu rồi. Công nhận sự có mặt của kẻ kia, nuôi dưỡng và làm vơi nỗi khổ đau, cũng đã là bắt đầu có quán. Hễ có Chỉ là có Quán. Và chỉ càng mạnh thì quán càng sâu. Có năng lượng của chánh niệm, ngưng tụ được tâm ý, ta chiếu năng lượng ấy trên một đối tượng, làm đối tượng sáng lên. Ta được nuôi dưỡng, đồng thời ta bắt đầu nhìn sâu vào đối tượng.

Chiều sâu của các pháp gọi là tự tánh. Kiến tánh là thấy được tự tánh, đó là công năng thứ sáu của chánh niệm. Tự tánh của bông hoa và tự tánh của người có liên hệ với nhau. Thấy được tự tánh của một bông hoa là thấy được tự tánh của mọi pháp, tức là thấy bản chất chân thật của sự vật (true nature). Bản chất chân thật của một bông hoa, là bản chất vô sinh, vô thường, vô ngã và tương tức. Ta thấy thật chứ không phải chỉ thấy qua những danh từ này. Nhìn sâu cũng có nghĩa là lắng nghe. Quán Thế Âm, chữ quán còn có nghĩa là lắng nghe. Ta quán bằng con mắt mà cũng có thể quán bằng lỗ tai. Người học dược thì phải quán cả hương và cả vị nữa. Học dược phải nếm đủ các loại cây lá, phải ngửi cái loại dược thảo để phân biệt, để nhận diện lá húng là lá húng, lá long não là lá long não, và đôi khi phải nếm bằng lưỡi. Vì vậy quán là dùng tất cả sáu căn, mắt, tai, mũi, lưỡi, thân và ý, chứ không phải chỉ dùng ý mà thôi.

Mục đích của quán là nhìn sâu để thấy được tự tánh. Đối tượng của sự quán chiếu có thể là chính mình. Ta không biết mình là ai, không biết chỗ yếu, chỗ mạnh của mình, không biết mình có một kho châu báu, không biết mình có nhiều khối nội kết, tất cả đều là do không biết tự tánh của chính mình. Phản quán tự tánh tức là đem chánh niệm trở về để nhìn sâu và nhìn kỹ chân tánh mình. Khi đi xem hát ta thường thấy người ta chiếu một chùm ánh sáng vào một nhân vật trên sân khấu. Chùm ánh sáng được chiếu vào người ca sĩ để chúng ta đừng chú ý tới những thứ khác mà chỉ chú ý vào người đó thôi. Chánh niệm cũng giống như thế, đó là năng lượng phát khởi trong tâm. Chúng ta đưa năng lượng ấy vào mắt để quán, đưa vào tai để quán. Và khi quán chiếu như vậy thì chúng ta tập trung trên một đối tượng, như thế gọi là định. Vì vậy trong chánh niệm đã có chánh định. Cũng như trong chỉ có quán, trong quán có chỉ, v.v.. Vì vậy công năng thứ sáu của chánh niệm là thấy rõ. Và thấy rõ tức là tuệ giác. Chúng ta có thể dịch đơn giản là understanding, hiểu. Hiểu đây không phải là kiến thức khái niệm. Hiểu đây là lúc ánh sáng phát sinh, khi khối u mê của chúng ta vỡ ra.

Ví dụ một bà mẹ đang nấu cơm trong bếp đang nghe tiếng con khóc. Trong bà mẹ có hạt giống chánh niệm, bà mẹ bỏ công việc chạy vào. Phép lạ thứ nhất là bà mẹ làm ra là có mặt bên con mình. Bà mẹ ơặm đứa con lên: mẹ đây con ơi, con đừng khóc nữa. Darling, I am here, I am here for you. Bà mẹ có mặt và xác nhận sự có mặt của con. Em bé có thể chưa biết tư duy rõ ràng, nhưng em biết bà mẹ đang có mặt. Chỉ có từng ấy thôi, người mẹ chưa làm gì mà em bé đã thấy bớt khổ. Có thể là em bé đang bị đau, nhưng khi được mẹ ơặm vào lòng, thì dầu vẫn còn đau, em bé đã thấy nhẹ. Sự có mặt của bà mẹ nuôi dưỡng em bé và làm vơi đi nỗi khổ đau của em. Em bé còn nhức đầu, còn đau bụng, hay còn đói nhưng bà mẹ chưa thấy. Nhưng sự có mặt của bà mẹ đã đem tới bốn công năng hay bốn phép lạ đầu tiên. Chỉ cần sự có mặt chánh niệm là bốn công năng đầu đã có thể xẩy ra. Thứ nhất là sự có mặt của mẹ, thứ hai là em bé được công nhận. Thứ ba là chúng ta nuôi dưỡng nhau. Và thứ tư là đứa con cảm thấy mình được an ủi, vì trong lúc này, người mẹ đã có mặt.

Ôm lấy đứa con, bà mẹ bắt đầu nhìn vào đứa con, nhìn kỹ xem tại sao nó khóc. Và bà mẹ tìm ra nguyên do làm em bé khóc. Cái đầu bé nóng, hoặc em bé đói, hoặc là cái tã được quấn chặt quá. Công năng thứ năm là nhìn sâu, nhìn kỹ. Diễn trình ấy là tiếp xúc với khổ đế để tìm ra tập đế. Mà thấy được tập đế rồi, thấy được nguyên do của khổ đau rồi thì bà mẹ có thể giúp em bé một cách dễ dàng. Nếu nó đói thì bà cho nó ăn. Nếu nó nóng thì bà cởi bớt cho nó cái áo. Nếu cái tã chặt quá thì bà nới ra. Tất cả đều được thực hiện dễ dàng một khi có hiểu biết, tức là có tuệ giác. Trong đạo Bụt, tuệ giác là yếu tố giải phóng cho mình. Sự cứu độ trong đạo Bụt là sự cứu độ bằng tuệ giác (salvation by understanding), chứ không phải bằng ơn huệ của một đấng thiêng liêng. Trong những tôn giáo khác, sự cứu độ có thể tới nhờ ân huệ của một đấng thiêng liêng. Nhưng trong đạo Bụt thì sự giải thoát được thực hiện bằng tuệ giác. Mà sở dĩ tuệ giác có được là nhờ công phu thiền quán. Tuệ giác đó không phải từ ngoài tới, mà vốn có hạt giống trong ta. Các vị Bụt và các vị bồ tát trong ba đời và tăng thân mười phương có thể giúp mình chạm tới hạt giống tuệ giác ấy, làm cho nó lớn lên và nở hoa. Đó là giải thoát.
! Bài 12 Tiếp xúc với sự sống nhiệm mầu

Hôm nay là ngày 30 tháng chạp năm 1993, chúng ta ở tại Xóm Thượng và học tiếp về chánh niệm.

Kỳ trước chúng ta đã nói tới Kinh Niệm Xứ và Kinh Quán Niệm Hơi Thở. Hai Kinh đều dạy về phương pháp thực tập chánh niệm và cho chúng ta những chỉ dẫn rất cụ thể. Đó là hai cuốn Kinh gối đầu giường mà chúng ta phải tụng đọc luôn. Kinh Quán Niệm Hơi Thở (sách tiếng Anh: Breathe, You Are Alive), Kinh Niệm Xứ có in trong cuốn Con Đường Chuyển Hóa (sách tiếng Anh: Transformation and Healing,) dạy chúng ta thực tập chánh niệm trong bốn lĩnh vực. Trước hết là lĩnh vực thân thể, thứ hai là lĩnh vực cảm thọ (feelings), thứ ba là lĩnh vực tâm, tức là tâm hành (mental formations) và thứ tư là lĩnh vực pháp, tức là tất cả những đối tượng của tâm hành. Nếu các tâm hành có 51 thứ thì pháp cũng có 51 loại. Kỳ trước chúng ta đã học về quán niệm trong lĩnh vực thân thể. Chúng ta đã học rằng hơi thở có thể là đối tượng đơn thuần của chánh niệm, nhưng hơi thở cũng có thể đồng thời chuyên chở một đối tượng khác.

!! Tiếp xúc với sự sống nhiệm mầu

Khi chúng ta tiếp xúc với hai mắt: ‘‘Tôi đang thở vào và có ý thức về hai mắt của tôi, tôi đang thở ra và mỉm cười với hai mắt tôi’’, thì đối tượng của tâm trong chánh niệm lúc bấy giờ là hơi thở và đồng thời cũng là đôi mắt. Trong khi thở vào, ta quán chiếu hai con mắt trong suốt chiều dài của hơi thở. Và trong suốt thời gian của hơi thở ra ta mỉm cười với đôi mắt của chúng ta. Nếu thành công, nếu cảm thấy dễ chịu, ta có thể lặp lại. Và chúng ta có thể quán chiếu tất cả những bộ phận khác của cơ thể theo lối ấy. Thực tập tiếp xúc và mỉm cười với cơ thể, chúng ta nhận biết, phát sinh lòng ưu Đi, sự săn sóc, và chú ý đến thân thể mình. Khi tôi tiếp xúc, mỉm cười với đôi mắt tôi thì tôi biết rằng mắt tôi còn đó, mắt tôi còn sáng. Hễ mở mắt ra là tôi có thể thấy được trời xanh, mây trắng, và những người sống xung quanh tôi. Cho nên tôi vui mừng vì biết còn hai mắt sáng. Sự quán chiếu đó có thể đem lại tịnh lạc. Nhiều người trong chúng ta có hai mắt sáng nhưng có khi phải đợi đến khi bị đau mắt rồi mới thấy chuyện có hai mắt sáng là một phép lạ mầu nhiệm. Chánh niệm đánh thức chúng ta dậy để chúng ta tiếp xúc được với những mầu nhiệm của sự sống. Và do đó chúng ta mới biết trân quý những gì đang có mặt trong giây phút hiện tại. Nhiều người nghĩ rằng đời họ không có gì đáng kể hết, không có gì đáng gọi là vui hết. Trong khi đó thì họ thực sự may mắn hội đủ những điều kiện có thể cho họ rất nhiều hạnh phúc. Chỉ cần tiếp xúc với những thức ấy thôi là tự nhiên họ có hạnh phúc. Tiếp xúc với đôi mắt chẳng Hạn. Biết rằng có hai mắt sáng mình có thể thấy được bao vẻ đẹp, nhìn ra bao người thân. Người nào bị mù rồi thì mới tiếc rẻ: ‘‘Bây giờ nếu có ông bác sĩ nào mổ mắt, làm cho mắt tôi sáng lại, nhìn được trời xanh mây trắng, thì cũng như là tôi từ địa ngục mà được đưa lên thiên đường.’’ Những người có mắt sáng đều đang ở thiên đường cả, nhưng họ không biết. Chánh niệm giúp chúng ta ngay trong giờ phút hiện tại tiếp xúc với thiên đường của hình ảnh và mầu sắc.

Khi ta thực tập ‘‘Tôi đang thở vào và ý thức về trái tim của tôi, tôi đang thở ra và tiếp xúc với trái tim của tôi’’, thì trong hơi thở ấy, chánh niệm là một năng lượng bao bọc lấy trái tim ta. Tôi có một trái tim và trong đời sống hằng ngày tôi ít khi để ý tới nó. Phần lớn chúng ta đều như vậy. Chúng ta lo toan đủ chuyện nhưng trái tim của ta, chúng ta không thèm đoái hoài tới. Đến khi nó có vấn đề, lúc đó ta mới nghĩ tới nó và như vậy có khi đã trễ. Tôi đang thở vào và tiếp xúc với trái tim tôi, tôi đang thở ra và mỉm cười với trái tim tôi, đó là một chuyến trở về. Sự trở về để tiếp xúc với những điều kiện của tịnh lạc, của hạnh phúc trong ta. Vì trái tim ta không có vấn đề gì cho nên ta mới có thể ăn, uống, nói, cười, đi, đứng bình thường. Khi trở về tiếp xúc với trái tim, ta khám phá ra trái tim ta đang hoạt động một cách bình thường. Nhiều người đêm ngày chỉ mong ước trái tim của họ hoạt động trở lại bình thường. Biết trái tim của ta đang hoạt động bình thường thì ta mừng, đó là một nỗi vui mừng sinh ra nhờ chánh niệm. Bỗng nhiên, ta biết rằng ta phải đối xử với trái tim ta một cách sáng suốt. Trong đời sống hàng ngày ta phải ăn những thức nào và uống những thứ nào không làm hại trái tim. Ta biết khi châm một điếu thuốc lên hút là ta đã không thân thiện, đã khai chiến với trái tim của ta, khai chiến cả với cả hai lá phổi của ta nữa. Khi tiếp xúc với trái tim bằng chánh niệm, bằng sự tỉnh thức, bằng lòng ưu ái, ta biết rằng trái tim của ta đang làm việc ngày đêm không nghỉ. Trái tim ngày đêm bơm hàng ngàn lít máu để nuôi dưỡng tất cả những tế bào trong cơ thể. Ta sẽ thấy thương, thấy trong lòng biết ơn trái tim, và tình thương và lòng biết ơn đó là hoa trái do chánh niệm sinh ra.

Từ niềm ưu ái, tình thương yêu đó, ta nguyện phải sống, phải ăn uống như thế nào, phải kiêng cữ như thế nào để trái tim ta đừng khổ nhọc. Chánh niệm đưa tới ý thức về giới, giới đây là sự gìn giữ và bảo vệ trái tim của mình. Anh phải bảo vệ được hai mắt, bảo vệ được trái tim của anh, nếu không anh làm sao bảo vệ được ai? Khi tiếp xúc với hai lá phổi và với lá gan cũng vậy. Không có lá gan lành mạnh, ta không thể sống. Trong khi đó thì ta thất niệm, hàng ngày nuốt vào trong ta những chất độc làm hại lá gan. Có thể lá gan đang nặn nỉ: ‘‘Thôi ông ơi, tội tôi lắm mà! Đừng có uống rượu nữa!’’ Nhưng ta không nghe thấy lời nặn nỉ ấy, vì đầu ta còn đang mãi nghĩ những chuyện gì đâu đâu. Chúng ta chưa bao giờ trở về lắng nghe lá gan của mình. Bây giờ nghe Bụt dạy, ta thực tập: ‘‘Tôi đang thở vào và tiếp xúc với lá gan của tôi.’’

Chánh niệm về thân thể trước hết là sự trở về với thân thể để nối lại tình thân thuộc lâu nay đã đánh mất. Đối xử với bạn mình, với anh em, cha mẹ mình, ta cũng làm như vậy thôi. Không trở về với chánh niệm thì không thể tiếp xúc, không thể hiểu, không thể thương. Và cũng không biết mình cần chấm dứt ngay những hành động gây đau khổ. Thực tập quán chiếu thân thể là dùng năng lượng của chánh niệm để chiếu rọi, để tiếp xúc và mỉm cười với những bộ phận trong cơ thể.

!! Chuyển hóa xả thọ thành lạc thọ

Kinh Quán Niệm Hơi Thở dạy chúng ta bắt đầu tiếp xúc với hơi thở đơn thuần, sau đó dùng hơi thở ấy để quán chiếu cơ thể, cảm thọ và những pháp khác. Lĩnh vực quán chiếu thứ hai là cảm thọ. Có những cảm thọ dễ chịu, những cảm thọ khó chịu và những cảm thọ trung tính. Trong ta có dòng sông cảm thọ. Cảm thọ này phát sinh, tồn tại và tiêu diệt, rồi cảm thọ khác phát sinh, tồn tại và tiêu diệt, mỗi cảm thọ được ví với một giọt nước trong lòng sông. Trong Kinh Quán Niệm Hơi Thở, Bụt cho chúng ta bốn bài thực tập quán niệm về thân, và theo đó là bốn bài thực tập tiếp xúc với thọ và quán chiếu về thọ. Chúng ta nên có Kinh Quán Niệm Hơi Thở đem theo bên mình, mỗi khi cần thì lấy ra để tham cứu và thực tập. Những Kinh như Kinh này có thể được nghiên cứu, thực tập và khai triển để áp dụng hàng ngày trong đời sống mới.

Chánh niệm là ý thức về sự có mặt của những gì đang xảy ra. Trong bước đầu, ta nhận diện một cảm thọ và biết đó là khổ thọ, lạc thọ hay xả thọ. Khi có một cảm giác dễ chịu, ta biết đây là một cảm giác dễ chịu. Khi có một khổ thọ, ta biết đây là một cảm giác khó chịu. Khi có một cảm giác không dễ chịu cũng không khó chịu, ta biết rằng đây là một xả thọ. Nếu ta duy trì được chánh niệm lâu hơn thì chánh niệm ấy có thể chiếu sâu vào cho ta thấy được những gốc rễ và bản chất của các cảm thọ đang nhận diện và quán chiếu.

Chánh niệm có khả chuyển hóa từ một xả thọ hay một khổ thọ thành một lạc thọ. Khi nhức răng chúng ta có một khổ thọ. Khi quán chiếu cảm thọ đó, ‘‘Tôi đang thở vào và biết rằng tôi đang nhức răng, tôi đang thở ra và mỉm cười với cái răng nhức của tôi’’, ta thấy rằng không nhức răng là một hạnh phúc. Bình thường ta cho tình trạng không nhức răng là một xả thọ. Khi nhức răng, ta mới khám phá ra rằng không nhức răng quả là một lạc thọ. Điều này có liên hệ tới sự thật thứ ba của tứ diệu đế: diệt. Diệt là sự vắng mặt của đau khổ. Sự vắng mặt của đau khổ đã là an lạc, đã là hạnh phúc rồi. Niềm an lạc đó chính là một lạc thọ, nhưng lâu nay đã được ta xếp vào loại xả thọ và ta không thấy được giá trị của nó. Trong đời sống thất niệm, chúng ta cứ nhận lầm rất nhiều lạc thọ là xả thọ. Bây giờ, khi không nhức răng, ta có thể thực tập: ‘‘Tôi đang thở vào và tiếp xúc với tình trạng không nhức răng của tôi, tôi đang thở ra và cảm thấy rất hạnh phúc vì không bị nhức răng’’. Chánh niệm như vậy đã biến xả thọ thành lạc thọ. Kinh Quán Niệm Hơi Thở dạy: ‘‘Tôi đang thở vào và làm cho thân hành của tôi an tịnh.’’ Hành ở đây tức là hiện tượng sinh vật lý, và cũng có nghĩa là sự vận hành của thân thể. Dùng hơi thở chánh niệm ta điều hòa thân hành lại và làm cho thân thể ta thoải mái. Ngồi thiền, nằm thiền hoặc đi thiền đều có tác dụng làm cho thân thể thoải mái.

<<<
Thở vào, tâm tĩnh lặng. <br>
Thở ra, miệng mỉm cười.
<<<

Trong thiền quán, thân với tâm và là một. Thân tĩnh lặng thì tâm cũng được tĩnh lặng. Chánh niệm là cái năng lượng có thể làm êm dịu thần kinh và làm êm dịu thân thể. Bụt dạy ta tiếp đó một bài tập để đem lại sự an lạc trong cơ thể: ‘‘Tôi đang thở vào và cảm thấy an lạc trong thân thể tôi, tôi đang thở ra và cảm thấy an lạc trong thân thể của tôi’’. An lạc không phải chỉ có ở tâm mà còn có ở thân nữa.

Khi thực tập tiếp xúc với thọ, ta cũng dùng hơi thở : tôi đang thở vào và có ý thức tâm hành của tôi. Thọ là một trong 51 tâm hành. Thọ ấy có thể là một lạc thọ, ta tiếp xúc và mỉm cười với nó. Làm như vậy năm hoặc bảy lần, ta sẽ thấy được bản chất của lạc thọ ấy. Có thể đó là một lạc thọ đích thực. Có thể đó không phải là một lạc thọ đích thực. Một lạc thọ giả tạo sẽ đem tới nhiều khổ đau. Chánh niệm cũng là để nhận diện khổ thọ : tôi đang thở vào và tiếp xúc với khổ thọ của tôi, tôi đang thở ra và mỉm cười với khổ thọ của tôi. Đem năng lượng của chánh niệm chiếu vào khổ thọ ta có thể khám phá được bản chất và nguồn gốc của khổ thọ đó. Khi được tiếp xúc với chánh niệm, khổ thọ có thể chuyển hóa trong vòng bốn hoặc năm hơi thở, và không còn là khổ thọ nữa. Chánh niệm không vật lộn, không xua đuổi, không đàn áp; chánh niệm chỉ cần ôm ấp và chiếu ánh sáng vào thôi mà cũng chuyển hóa được các cảm thọ.

Sau hơi thở ý thức tâm hành, Bụt dạy hơi thở an tịnh tâm hành: Tôi đang thở vào và làm an tịnh tâm hành tôi. Tâm hành đang được nói tới ở đây là cảm thọ. Ví dụ ta đang có một khổ thọ vì trong lòng ta đang có sự ganh ghét. Năng lượng ganh ghét làm cho ta bực tức và mất hết an lạc. Trước hết, ta phải thở và tiếp xúc với tâm hành ấy. ‘‘Tôi đang thở vào và tiếp xúc với sự bực tức của tôi, tôi đang thở ra và mỉm cười với nỗi khổ trong tôi.’’ Thực tập như vậy vài lần ta có thể thấy rõ được nguồn gốc của khổ thọ này: sự ganh ghét. Khi thấy được nó rồi, ta tiếp tục quán chiếu và mỉm cười với nó và sau đó khổ thọ sẽ tan đi. Gặp trường hợp khó, phải thực tập lâu hơn thì khổ thọ mới chuyển hóa được.

Khi cơn giận thiêu đốt, khói lửa làm ngột ngạt ‘‘phòng khách của tâm.’’ Trước hết, ta phải nắm lấy hơi thở. Ta thở vào và thở ra để nhìn nhận sự có mặt của khổ thọ ấy. Đó là tiếp xúc. Nhận diện rồi, ta sẽ thấy rằng khổ thọ ấy do cơn giận đem tới. Thở vào và thở ra, ta làm cho khổ đau êm dịu lại. ‘‘Tôi đang thở vào và làm êm dịu khổ thọ của tôi, tôi đang thở ra và làm êm dịu khổ thọ của tôi.’’ Ta có thể thực tập thiền ngồi hay thiền đi, miễn là trong khi thực tập ta biết nắm lấy hơi thở và ôm lấy khổ thọ bằng năng lượng chánh niệm. Như vậy, tâm hành ta sẽ êm dịu trở lại. Chánh niệm là Bụt, là sự hiểu biết, là lòng từ bi, cho nên hễ được chánh niệm bao bọc thì thế nào khổ thọ cũng sẽ êm dịu xuống và chuyển hóa đi. Nếu bà mẹ ôm lấy đứa con đang khóc một cách dịu dàng thì thế nào đứa con cũng sẽ bớt khổ và nín khóc. Xin quý vị học lại Kinh Quán Niệm Hơi Thở. Dầu đã học rồi quý vị cũng nên học trở lại. Kinh Niệm Xứ và Kinh Quán Niệm Hơi Thở trong tương lai phải được cho vào Thiền Môn Nhật Tụng.

Bụt lại dạy chúng ta dùng hơi thở đưa chánh niệm tới để tiếp xúc và quan sát những tâm hành khác, trong đó có tâm hành tưởng. Tưởng tức là tri giác. Ngoài thọ và tưởng, ta còn có tới 49 tâm hành khác. Cuối cùng Bụt dạy chúng ta đem hơi thở chuyên chở chánh niệm để quán chiếu đối tượng của các tâm hành, tức là các pháp. Thân, thọ, tâm, pháp là bốn lĩnh vực quán niệm, mà thuật ngữ là niệm xứ (satipatthana).

Các thế hệ Phật tử kế tiếp cần học hỏi, nghiên cứu, thực tập, khai triển và thể nghiệm Kinh Quán Niệm Hơi Thở để phát triển ra thành những phương pháp hữu hiệu giúp con người của thời đại hôm nay tu tập để vượt thắng khổ đau mới. Kinh Quán Niệm Hơi Thở cũng như Kinh Niệm Xứ là những kho tàng cần được khai thác nhiều hơn nữa. Suốt trong 2500 năm chúng ta chỉ mới sử dụng được rất ít những kho tàng vô giá này. Trong lúc dịch Kinh An Ban Thủ Ý (Quán Niệm Hơi Thở), tôi đã thí nghiệm và đưa ra một số những bài tập cho người ở thời đại chúng ta thực tập, để đối phó với những khổ đau và những thao thức của thế giới hiện nay. Nhưng tôi biết rằng Kinh này còn phải được khai thác một cách tích cực hơn nữa. Có thể chúng ta sẽ cần đến 100 năm hay 200 năm nữa mới khai thác được đầy đủ Kinh Quán Niệm Hơi Thở và Kinh Niệm Xứ. Ta phải chế tác những pháp môn mới cho những thế hệ sau này tu tập. Nếu đọc Kinh Quán Niệm Hơi Thở hoặc Kinh Niệm Xứ trong cuốn Con Đường Chuyển Hóa, thì quý vị đã định được phương hướng khai thác ấy. Một con đường trong khu rừng đã được phát dọn. Các thế hệ tương lai phải biến con đường ấy thành xa lộ để nhiều người có thể được cùng đi một lúc: cả gia đình, cả thành phố hoặc cả quốc dân sẽ có thể cùng thực tập với nhau.

!! Chánh niệm nuôi dưỡng các phần khác của thánh đạo

Khi thực tập chánh niệm, ta thấy được vị trí của chánh niệm trong những chi phần khác là chánh kiến, chánh tư duy, chánh ngữ, chánh nghiệp, chánh mạng, chánh tinh tấn và chánh định. Trong khi tư duy có chánh niệm, ta biết đang tư duy về cái gì. Có thể là ta đang thương tiếc quá khứ, và khi có chánh niệm, thì ta biết đang nghĩ về quá khứ. Đang lo lắng tương lai mà có chánh niệm thì tự nhiên ta biết tâm ta đang lo nghĩ về tương lai, và ta đang tự đánh mất mình trong tương lai. Biết rồi thì tự nhiên chánh niệm đưa ta trở về an trú trong hiện tại. Do đó ta biết vai trò chánh niệm trong chánh tư duy rất quan trọng.

Chánh kiến cũng được nuôi dưỡng bằng chánh niệm. Chánh kiến có thể nhận diện được chánh tư duy. Thầy Xá Lợi Phất nói: ‘‘Khi có tà tư duy thì chánh kiến cho ta biết đó là tà tư duy. Khi có chánh tư duy thì chánh kiến cho ta biết đó là chánh tư duy, và như vậy đã gọi là chánh kiến.’’

Trước đây ta đã biết chánh niệm có nhiều công năng (function). Công năng thứ nhất là làm cho ta (chủ thể) có mặt. Công năng thứ hai là công nhận sự có mặt của đối tượng, của người kia, của sự vật kia. Công năng thứ ba là nuôi dưỡng. Công năng thứ tư là tạo ra an tịnh, có khổ thọ thì làm khổ thọ êm dịu lại, người kia đang đau khổ thì chánh niệm ta cũng giúp cho bớt khổ. Công năng thứ năm là công năng quán chiếu, nghĩa là nhìn sâu. Công năng thứ sáu là công năng giác ngộ, nghĩa là thấu hiểu và công năng kế tiếp là chuyển hóa. Vì vậy cho nên chánh niệm quả thực là thức ăn cho chánh kiến. Chánh niệm tạo ra chánh định, là thức ăn cho chánh định. Trong niệm có định, trong định có niệm. Niệm và Định là hai thứ gần gũi nhất với chánh kiến.

Có chánh kiến ta biết rằng ta đang tà tư duy hay đang chánh tư duy. Tà tư duy là tiếp tục gieo rắc hoặc tưới tẩm những hạt giống không lành trong tâm thức. Chánh tư duy giúp ta gieo rắc và tưới tẩm những hạt giống tốt trong tâm địa. Khi nói năng có chánh niệm, ta biết ta đang nói gì. Tự nhiên ngôn ngữ của ta sẽ chuyển hướng. Đôi khi chánh niệm giúp ta thấy rằng ta đang nói những điều chính ta không muốn nói. Một con ma ở trong ta đang nói. Con ma đó là tập khí, là nỗi giận, là niềm đau có thể đã được trao truyền lại tự hàng ngàn năm trước cho ta. Khi có chánh niệm, ta tự hỏi: mình đang nói gì đây? Đó là một tiếng chuông cảnh tỉnh. Đó là một tia ánh sáng chiếu vào. Tự nhiên ta ngừng lại. Nếu điều đang nói có chứa đựng yêu thương và hiểu biết thì chánh niệm cũng cho ta biết. Chánh niệm giúp ta thêm năng lượng để tiếp tục nói những lời yêu thương và hiểu biết ấy. Thành ra chánh niệm nuôi dưỡng chánh ngữ, phòng hộ cho chánh ngữ, là thức ăn của chánh ngữ. Viết một lá thư, một bài văn hay một cuốn sách, đó cũng là cơ hội thực tập chánh ngữ. Chánh niệm soi sáng cho việc viết lách của chúng ta. Mỗi câu viết trong lá thư, ta có thể đọc lại bằng chánh niệm. Viết xong một lá thư, ta nên đọc lại lá thư để thực tập chánh niệm. Đó cũng là thực tập chánh ngữ. Viết câu nào ta biết ta đang viết câu đó; viết đoạn nào ta biết ta đang viết đoạn đó. Viết sách và viết báo cũng vậy, tất cả đều có thể trau dồi thực tập chánh ngữ.

Chánh nghiệp là hành động của thân thể. Chúng ta biết rằng khi quán thân ta cũng phải ý thức được tất cả những động tác của thân thể. Ví dụ như khi hút thuốc ta phải biết là ta đang hút thuốc. Ta nhận diện đơn thuần: tôi đang hút thuốc và tôi biết rằng tôi đang hút thuốc. Đó là chánh niệm. Còn chuyện thói quen hút thuốc mạnh hơn ta, và tuy ta đã có chánh niệm mà ta cứ tiếp tục hút, đó là chuyện khác. Điều quan trọng không phải ở chỗ anh ngưng hút thuốc ngay lập tức hay không, mà ở chỗ anh có ý thức là anh đang hút thuốc hay không. Chánh niệm trước hết là sự nhận diện đơn thuần. Nếu chánh kiến còn yếu thì ta chưa đủ sức ngưng hút thuốc. Có người nói: tôi có chánh niệm rõ ràng, mà tôi vẫn cứ tiếp tục hút thuốc thì chánh niệm có ích lợi gì đâu? Nói như vậy không đúng. Phép tu là anh phải có ý thức rằng anh đang hút thuốc và anh biết anh đang tự làm hại trái tim và lá phổi của anh. Anh mới thực tập chánh niệm được một vài ngày, trong khi đó hút thuốc là một tập khí hai ba chục năm. Ta nên nhớ thực tập chánh niệm ở đây không phải là ra trận để vật lộn với thói quen hút thuốc của anh. Chánh niệm chỉ là ánh sáng chiếu ra, để anh ý thức rằng anh đang hút thuốc. Nếu anh thực tập chuyên cần như trong tăng thân thì một ngày nào đó chắc chắn anh sẽ chấm dứt hút thuốc. Chìa khóa đem lại sự chuyển hóa nằm ở chánh niệm. Nếu anh uống rượu thì điều đầu tiên tôi đề nghị với anh thực tập là có chánh niệm về việc anh đang uống rượu. Cứ thực tập chánh niệm hàng ngày cho chuyên cần, dầu anh vẫn còn uống rượu. Thực tập chánh niệm, một mình hay cùng các bạn, để thấy càng ngày càng rõ rằng uống rượu đem lại những hậu quả nào cho thân, cho tâm, cho gia đình và xã hội. Anh cứ tiếp tục như vậy, một ngày nào đó anh sẽ đủ sức mạnh để chấm dứt uống rượu. Không nên gây ra cuộc chiến giữa chánh niệm và mặc cảm yếu đuối. Chánh niệm có phong thái của một bà mẹ. Biết rằng con mình hư đốn mà vẫn yêu thương, vẫn chăm sóc, vẫn giúp đỡ. Điều này quý vị cần ghi nhớ. Chánh niệm là sự nhận diện đơn thuần những gì đang xảy ra. Không lên Đn, không trách móc, không tấn công, không tiêu diệt. Chánh niệm nuôi dưỡng, ôm ấp và chuyển hóa. Chánh niệm cũng nuôi dưỡng những phần khác của bát chánh đạo cho đến một ngày nào đó các tập khí có đủ sức chuyển hóa.

Đây là một điều hết sức quan trọng. Tu tập theo đạo Bụt không có nghĩa là tự biến mình thành một chiến trường: phe chánh đánh phe tà. Cuộc tranh đấu này có thể đúng trong một vài truyền thống khác, nhưng trong đạo Bụt thì hoàn toàn sai lạc. Đó là cách nhìn nhị nguyên. Đứa con đang khóc và đang khổ ấy không phải là kẻ thù của bà mẹ. Bà mẹ với đứa con là một. Đứa con hạnh phúc bà mẹ ôm lấy, đứa con khổ đau bà mẹ cũng ôm lấy. Chánh niệm là như vậy. Tình thương là ta mà cái giận cũng là ta nữa. Những yếu đuối trong ta như ganh ghét, nghi kỵ và giận hờn phải được ta chấp nhận là chính ta. Tôi đang thở vào và biết rằng có sự ganh ghét trong tôi, tôi đang thở ra và mỉm cười với sự ganh ghét trong tôi. Đó là hành động nhận diện và chấp nhận. Trong khi thực tập, nếu quý vị thấy có tình trạng chống đối và tranh chấp, thì đó chưa phải là thực tập đúng theo tinh thần đạo Bụt. Sự thực tập ấy còn căn cứ trên cái nhìn nhị nguyên. Cũng như rác và hoa. Những người làm vườn khôn khéo biết biến rác thành phân bón để nuôi hoa. Vì vậy họ không kỳ thị rác, họ gìn giữ rác. Chúng ta muốn có tình thương và có hạnh phúc mà không thấy cần phải xua đuổi và đàn áp nỗi buồn, cơn giận và niềm đau của mình. Nhờ chăm sóc nỗi buồn, cơn giận và niềm đau của ta đúng mức, ta chuyển hóa chúng. Đó là lối nhìn bất nhị, là phương pháp bất nhị.

Kinh thường định nghĩa chánh nghiệp là không tàn hại, nghĩa là không phá hủy, không làm hư hoại và đổ vỡ những gì trong ta và xung quanh ta. Hành động phá hoại và giết chóc là ác nghiệp. Chánh niệm là để biết ác nghiệp là ác nghiệp và thiện nghiệp là thiện nghiệp. Có hai người đang ngắm một con cá đang bơi trong hồ. Một nhà khoa học có thể ngắm con cá để tính toán làm cách nào áp dụng phương pháp của cá bơi để sáng tạo ra loại vỏ tầu thủy có cơ năng chạy nhanh hơn. Trong khi đó, người thứ hai có thể đang nhìn vào con cá để suy tư xem con cá này chiên thì ngon, hay là đem hấp thì ngon hơn. Những thái độ đó biểu hiện tùy theo tập khí mỗi người. Thí dụ nếu như người thứ hai đã đến chùa Làng Mai tu học, đã ăn chay được ba, bốn năm rồi. Anh ta đã có tập khí ăn chay, đã cảm thấy sung sướng trong khi ăn chay và đã bỏ thói quen ăn mặn. Một hôm ra hồ, anh nhìn thấy con cá. Tự nhiên tập khí cũ nhảy ra: con cá này chiên thì sẽ ngon hơn là hấp! Lạ quá! Anh nghĩ, mình đã ăn chay ba, bốn năm rồi, mà cái ông bạn cũ tập khí đó vẫn còn nguyên trong tàng thức, bây giờ lại nhảy ra. Trong trường hợp đó, anh phải làm gì? Tự trách hay không tự trách? Câu trả lời là ta chỉ nên phát khởi chánh niệm, để biết rằng tập khí cũ vẫn còn nấp đâu đó và vừa mới ló đầu ra. ‘‘Tập khí ơi, chào mi!’’ Mỉm cười thì tự nhiên nó tan biến. Lần sau nếu nó xuất hiện nữa thì ta cũng sẽ làm như vậy. Chỉ cần nhận diện đơn thuần mà không cần phải vật lộn với nó. Đến một lúc nào đó, tập khí sẽ được thực sự chuyển hóa. Phép tu trong đạo Bụt là bất bạo động (non- violence). Phương pháp bất bạo động phát xuất từ cách nhìn bất nhị. Khi ta nổi giận, ta đừng tự giận thêm rằng tại sao mình nổi giận. Giận mình vì mình đang giận thì trên cơn giận này còn chồng thêm một cơn giận khác nữa, năng nề thêm.

Chánh nghiệp trước hết là không tàn hại. Chánh nghiệp còn là không trộm cắp và không tà dâm. Đó là hiểu chánh nghiệp một cách đơn giản, gồm ba trong năm giới. Trong năm giới có những giới giúp ta thực tập chánh ngữ và chánh tư duy. Tất cả năm giới đều phát xuất từ chánh niệm và chánh kiến.

!! Năm giới

Giới thứ nhất, không tàn hại, tức là bảo vệ sự sống: Ý thức được những khổ đau do sự sát hại gây ra, con xin học theo hạnh đại bi để bảo vệ sự sống của mọi người và mọi loài. Con nguyện không giết hại sinh mạng, không tán thành sự giết chóc và không để kẻ khác giết hại, dù là trong tâm tưởng hay trong cách sống hàng ngày của con. Hành trì giới thứ nhất, chúng ta thực tập nuôi dưỡng chánh niệm về những khổ đau do sự tàn hại và giết chóc gây ra. Ý thức được rằng quá nhiều khổ đau đã do hành động giết chóc và tàn hại gây ra, con xin nguyện thực tập yêu thương để bảo vệ sự sống của mọi loài, trong đó có các loài động vật, thực vật và khoáng vật. Sự tàn phá đất đá cũng đưa tới sự tàn hại những loài thực vật và động vật. Con nguyện bảo vệ sự sống trong mọi hình thức. Chánh niệm giúp cho ta tự biết là ta đang có một thái độ hoặc một hành động có tính bạo động và tàn hại sự sống hay không. Bảo vệ sự sống, đem lại niềm vui cho tất cả mọi loài, đó là chánh nghiệp.

Ý thức được những khổ đau do sự sát hại gây ra, con xin học theo hạnh đại bi để bảo vệ sự sống của mọi người và mọi loài. Con nguyện không giết hại sinh mạng, không tán thành sự giết chóc và không để kẻ khác giết hại, trong tâm tưởng hay trong cách sống hàng ngày của con. Như vậy giới thứ nhất này bao gồm không những mọi thân nghiệp mà còn mọi ý nghiệp nữa. Trong tư duy ta nếu có một tâm niệm không lành đó cũng đã là phạm giới sát rồi. Nói một lời ác độc xúi xiểm để người ta giết chóc nhau cũng là giết người bằng lời nói. Chúng ta nên biết rằng giới thứ nhất có liên hệ với tất cả những giới khác, và muốn hành trì giới thứ nhất cho sâu sắc ta phải vận dụng tất cả tám chi phần của bát chánh đạo. Chúng ta biết khi còn ôm ấp tà tư duy, người ta có thể giết hại rất nhiều. Khi tin tưởng rằng một chủ thuyết hay một tín ngưỡng nào đó là con đường duy nhất có thể cứu đời, và những ai chống lại chủ thuyết hoặc tín ngưỡng ấy thì nên chết hơn là sống, thì đó đã là phạm giới sát bằng tư duy. Sở dĩ ta có tà tư duy vì ta có tà kiến. Tà kiến tức là nhận thức cạn hẹp của chúng ta và sự vướng mắc của chúng ta vào các ý niệm và chủ thuyết.

Giới thứ hai: Ý thức được những khổ đau do lường gạt, trộm cướp và bất công xã hội gây ra, con xin học theo hạnh đại từ để đem lại niềm vui sống và an lạc cho mọi người và mọi loài, để chia xẻ thì giờ, năng lực và tài vật của con với những kẻ đang thật sự thiếu thốn. Con nguyện không lấy làm tư hữu bất cứ một của cải nào không phải do mình tạo ra. Con nguyện tôn trọng quyền tư hữu của kẻ khác, nhưng cũng nguyện ngăn ngừa kẻ khác không cho họ tích trữ và làm giàu một cách bất lương trên sự đau khổ của con người và của muôn loài. Giới thứ hai có liên hệ rõ rệt tới chánh nghiệp. Hành động bảo vệ công bằng xã hội là chánh nghiệp. Chánh kiến và chánh tư duy giúp cho ta thấy được việc tiêu thụ hàng ngày của ta có gây ra sự tàn hại và bất công hay không. Thực tập bằng lời nói, bằng tư duy, bằng chánh kiến, và bằng cách mưu sinh của ta, tức là chánh mạng. Với giới thứ hai, không những ta không trộm cắp, không khai thác, không chiếm hữu những tài vật không phải là của ta, mà ta còn phải học sống đời sống hàng ngày của ta như thế nào để cho xã hội có công bình. Duy trì một nhà máy làm ô nhiễm nước sông và không khí cũng là một hành vi trộm cắp. Không khí và nước sông là tài sản chung của tất cả mọi người. Làm cho không khí và dòng sông ô nhiễm là phạm giới thứ nhất (không tàn hại) và cũng phạm giới thứ hai (không trộm cắp).

Giới thứ ba là giới không tà dâm: Ý thức được những khổ đau do thói tà dâm gây ra, con xin học theo tinh thần trách nhiệm để giúp bảo vệ tiết hạnh và sự an toàn của mọi người và mọi gia đình trong xã hội. Con nguyện không ăn nằm với những người không phải là vợ hay chồng của con. Con ý thức được rằng những hành động bất chánh sẽ gây ra đau khổ cho kẻ khác và cho chính con. Con biết muốn bảo vệ hạnh phúc của mình và của kẻ khác thì phải biết tôn trọng những cam kết của mình và của kẻ khác. Con sẽ làm mọi cách có thể để bảo vệ trẻ em, không cho nạn tà dâm tiếp tục gây nên sự đổ vỡ của các gia đình và của đời sống đôi lứa. Với giới này không những chúng ta bảo hộ cho chính ta, cho những người thân thuộc, mà còn bảo hộ cho tất cả mọi người. Ta bảo hộ các gia đình và không để cho trẻ em bị hãm hại và lợi dụng. Chánh niệm soi sáng trong đời sống hàng ngày để giúp ta hành trì vững chãi giới thứ ba.

Giới thứ tư là nói và nghe với chánh niệm: Ý thức được những khổ đau do lời nói thiếu chánh niệm gây ra, con xin học theo hạnh ái ngữ và lắng nghe để dâng tặng niềm vui cho người và làm vơi bớt khổ đau của người. Biết rằng lời nói có thể đem lại hạnh phúc hoặc khổ đau cho người, con nguyện chỉ nói những lời có thể gây thêm niềm tự tin, an vui và hy vọng, những lời chân thật có giá trị xây dựng sự hiểu biết và hòa giải. Con nguyện không nói những điều sai với sự thật, không nói những lời gây chia rẽ và căm thù. Con nguyện không loan truyền những tin mà con không biết chắc là có thật, khựông phê bình và lên án những điều con không biết chắc. Con nguyện không nói những điều có thể tạo nên sự bất hòa trong gia đình và đoàn thể, những điều có thể làm tan vỡ gia đình và đoàn thể. Giới này trực tiếp liên hệ tới chánh ngữ, nhưng nói và nghe luôn luôn có liên hệ mật thiết với nhau. Nếu không biết nghe mà chỉ biết nói thì lời nói sẽ không khế hợp với hoàn cảnh và tình trạng, và có thể đưa tới tình trạng ông nói gà bà nói vịt, và sự truyền thông sẽ bị nghẽn lấp. Truyền thông đã bị nghẽn lấp thì cha không còn nói chuyện được với con, vợ không còn nói chuyện được với chồng, anh không còn nói chuyện được với em, và hạnh phúc không thể nào có mặt. Chánh niệm cho ta biết ta có đang sử dụng ái ngữ hay không và có đang biết lắng nghe người kia hay không. Lắng nghe là một phép thực tập sâu sắc có thể làm vơi bớt nỗi khổ của người nói rất nhiều. Lắng nghe là pháp môn vi diệu của bồ tát Quán Thế Âm. Đây là bài quán niệm về pháp môn lắng nghe (Đế thính): ‘‘Lạy đức Bồ Tát Quán Thế Âm, chúng con xin học theo hạnh Ngài, biết lắng tai nghe cho cuộc đời bớt khổ. Ngài là trái tim biết nghe và biết hiểu. Chúng con xin tập ngồi nghe với tất cả sự chú tâm và thành khẩn của chúng con. Chúng con xin tập ngồi nghe với tâm không thành kiến. Chúng con xin tập ngồi nghe mà không phán xét, không phản ứng. Chúng con nguyện tập ngồi nghe để hiểu. Chúng con xin nguyện ngồi nghe chăm chú để có thể hiểu được những điều đang nghe và cả những điều không nói. Chúng con biết chỉ cần lắng nghe thôi, chúng con cũng đã làm vơi bớt rất nhiều khổ đau của kẻ khác rồi.’’

Giới thứ năm là thực tập chánh niệm trong việc ăn uống và tiêu thụ, vì vậy rất quan trọng cho thân nghiệp. Giới thứ năm liên hệ tới các chi phần khác của bát chánh đạo: Ý thức được những khổ đau do sự sử dụng ma túy và độc tố gây ra, con xin học cách chuyển hóa thân tâm, xây dựng sức khỏe thân thể và tâm hồn bằng cách thực tập chánh niệm trong việc ăn uống và tiêu thụ. Trong câu này ta thấy rằng hành động xây dựng sức khỏe và tâm hồn bao hàm chánh tư duy và chánh kiến. Con nguyện chỉ tiêu thụ những gì có thể đem lại an lạc cho thân tâm con, và cho thân tâm gia đình và xã hội con. Con nguyện không uống rượu, không sử dụng các chất ma túy, không ăn uống hoặc tiêu thụ những sản phẩm có độc tố, trong đó có các sản phẩm truyền thanh, truyền hình, sách báo, phim ảnh và chuyện trò. Như vậy, thực tập giới này có liên hệ tới việc hành trì chánh ngữ, chánh tư duy, chánh kiến và chánh mạng. Con biết rằng tàn hoại thân tâm bằng rượu và các độc tố ấy là phản bội tổ tiên, cha mẹ và cũng là phản bội các thế hệ tương lai. Con nguyện chuyển hóa bạo động, căm thù, sợ hãi và buồn giận bằng cách thực tập phép kiêng cữ cho con, cho gia đình con và cho xã hội. Con biết phép kiêng khem này rất thiết yếu để chuyển hóa tự thân, tâm thức cộng đồng và xã hội. Hành động tiêu thụ và ăn uống phải được chánh niệm soi sáng để ta biết đó là chánh nghiệp hay là tà nghiệp. Trong giới thứ năm này ta thấy tính cách tương tức của năm giới, đồng thời thấy tính cách tương tức của tám chi phần trong bát chánh đạo. Kỳ sau chúng ta sẽ thấy tác động của chánh niệm trên chánh mạng, chánh tinh tấn và chánh định.
! Bài 01 Tu phật học phật

Hôm nay là ngày 21 tháng 11 năm 1993, chúng ta khai giảng khóa tu mùa Đông ở tại Xóm Hạ, Làng Hồng. Khóa học của chúng ta là Phật Pháp Căn Bản (Basic Buddhism). Tuy gọi là Căn Bản nhưng chúng ta phải hết sức dụng tâm tu học thì mới hiểu được đến chỗ sâu sắc. Trong bài mở đầu này tôi sẽ trình bày với quý vị về cách chúng ta nên học Phật Pháp như thế nào.

!! Phải học kinh điển một cách khôn ngoan

Chúng ta biết rằng hơn 400 năm sau khi Bụt nhập diệt, kinh điển mới được chép thành văn. Trước đó kinh điển chỉ được truyền tụng bằng miệng, từ thế hệ này sang thế hệ khác, do các vị gọi là kinh sư. Các vị kinh sư ngày xưa thuộc hết các kinh điển và có nhiệm vụ tụng đọc lại cho đại chúng nghe. Có những vị thuộc lòng tất cả tạng kinh. Ngoài các vị kinh sư còn có những vị luật sư. Các vị kinh sư thuộc kinh, những vị luật sư thì nhớ luật. Sự truyền thừa kinh và luật hoàn toàn căn cứ vào trí nhớ. Mãi đến thế kỷ thứ nhất trước Tây lịch kinh điển mới được ghi chép. Vì vậy trong thời gian bốn, năm trăm năm truyền thừa, nhiều điều sai lầm cũng được chép lại, lý do là nhiều thế hệ Phật tử đã nhớ sai, hiểu lầm và hành trì không đúng.

Chúng ta biết rằng ngay chính trong thời Bụt còn tại thế mà nhiều người vẫn không hiểu được lời Bụt dạy, vẫn diễn giải lời Bụt một cách sai lầm. Nhiều khi Bụt phải gọi người đó tới hỏi: ‘‘Thầy nghe như thế nào mà thầy nói như vậy?’’ Không những người ngoài đời hiểu lầm giáo lý của Bụt, mà cả trong giáo đoàn cũng có nhiều người hiểu lầm nữa. đọc kinh Người Bắt Rắn, chúng ta đã thấy chính đệ tử của Bụt đã hiểu lầm Bụt, ngay trong khi Bụt còn tại thế. Vậy thì trong 400 năm, 500 năm sau ngày Bụt nhập diệt, truyền thừa lại những lời của Bụt bằng trí nhớ, bằng cách truyền miệng, thế nào cũng có sai lầm. Sai lầm không những vì nhớ lầm mà thôi, mà còn vì cách hiểu và hành trì không đúng. Khi hiểu sai rồi hành trì sai, thì những lời Bụt dạy truyền lại cũng sai luôn.

Vì vậy chúng ta phải rất cẩn thận trong khi học đạo Bụt, và đừng bị kẹt vào những câu những chữ ở trong kinh. Trong truyền thống Đại thừa có câu ‘‘y kinh giải nghĩa tam thế Phật oan’’, nghĩa là nếu quý vị nương vào kinh mà giải nghĩa từng chữ, từng câu một thì thế nào cũng nói oan cho các đức Bụt trong ba đời. Nhưng cũng phải biết câu thứ hai ‘‘ly kinh nhất tự tức đồng ma thuyết’’, nghĩa là nếu quý vị bỏ một chữ trong kinh đi thì những điều quý vị nói sẽ có thể tương tự những điều ma quỷ nói. Một mặt mình không thể bỏ kinh được, một mặt mình không nên quá chấp vào từng chữ từng câu để cắt nghĩa. Đó là thái độ khôn ngoan của những người học Phật. Phải nương vào kinh, nhưng sử dụng kinh với tất cả sự thông minh và khôn khéo của mình thì mới không bị kẹt quá vào những câu những chữ trong kinh điển.

Theo lời truyền tụng, thì ở Tích Lan vào khoảng thế kỷ thứ hai trước Thiên Chúa giáng sinh người ta đã có ý định ghi chép lại những lời Bụt dạy. Nhưng mãi tới thế kỷ trước Thiên Chúa giáng sinh thì các vị mới thực hiện được việc chép lại kinh điển trên lá bối. Và cũng theo lời truyền tụng trên thì lúc đó ở trong giáo đoàn chỉ còn lại một thầy thuộc lòng được hết tất cả các kinh trong Đại Tạng. Chỉ có một thầy, những thầy khác cũng thuộc nhưng không thuộc hết. Điều này cho người ta thấy nguy cơ thất truyền kinh điển, nên vội tìm cách chép kinh. Người ta cũng kể rằng thầy đó tuy thuộc hết tất cả các kinh nhưng tánh tình không dễ thương. Tuy nhiên mọi người đành phải chịu đựng, chiều chuộng hết mực để thầy ấy ngồi tụng lại tất cả các kinh mà thầy thuộc cho người ta ghi chép trên lá bối. Khi nghe câu chuyện đó tôi rất buồn cười. Vì nếu thầy đó tính tình khó chịu thì có lẽ thầy hiểu và thực tập kinh cũng không hay gì mấy, do đó kinh thầy thuộc cũng không thể đúng hoàn toàn.

Đó là câu chuyện trong đạo Bụt Nam Truyền. Trường hợp của đạo Bụt Bắc Truyền, các kinh điển bằng tiếng Prakrit, bằng chữ Sanskrit cũng được chép lại vào khoảng cùng một thời gian. Có nhiều kinh nguyên bản Sanskrit hiện giờ không còn nữa và chúng ta phải căn cứ trên những bản dịch chữ Hán hay Tây Tạng.

Đạo Bụt Nam Truyền có một truyền thống rất lâu dài và không đứt đoạn. đạo Bụt Nam Truyền đã sử dụng tiếng Pali để ghi chép kinh điển và giáo lý. Trong khi đó thì đạo Bụt Bắc Truyền, chẳng Hạn học phái Thuyết Nhất Thiết Hữu Bộ (Sarvastivada), gọi tắt là Hữu Bộ, lại sử dụng tiếng Sanskrit. Hữu Bộ đã được truyền thừa khá lâu, tới 1000 năm, ở vùng Kashmir, Đông Bắc Ấn Độ. Các kinh điển của Hữu Bộ được tuần tự dịch ra chữ Hán và truyền vào Trung Hoa.

Đạo Bụt Nam Truyền ở Tích Lan được gọi là Theravada. Thật ra đó là một tông phái tên là Xích Đồng Diệp Bộ, gọi tắt là Đồng Diệp Bộ (Tamrasatiya), có nghĩa là môn phái những vị xuất gia đắp y màu đồng, màu hỏa hoàng. Cố nhiên cái tên cũng không có nghĩa gì mấy và vì ai cũng muốn tự nhận mình là đạo Bụt truyền thống, nên đã từ lâu đạo Bụt ở Tích Lan tự gọi là Theravada, Thượng Tọa Bộ, tức là đạo Bụt chính thống, nguyên thủy. Còn đạo Bụt ở Kashmir được gọi là đạo Bụt của Thuyết Nhất Thiết Hữu Bộ.

Khi đạo Bụt chia ra làm nhiều bộ phái, 18 hoặc 20 bộ phái, một bộ phái đi xuống phía Nam, ở tại Tích Lan, một bộ phái đi lên miền Bắc ở Kasmir, còn các bộ phái kia tản mác khắp nơi ở Ấn Độ. Nếu so sánh các kinh điển của hai bộ phái Đồng Diệp Bộ và Hữu Bộ, mà thấy những điểm giống nhau, thì chúng ta biết rằng những điểm đồng đó là đạo Bụt trước khi phân phái. Và nếu chúng ta thấy những điểm dị, những điểm khác nhau, điều đó có nghĩa là từ ngày tách rời hai bộ phái bắt đầu có những cách thấy khác nhau, những cách hiểu khác nhau. Thành ra sự nghiên cứu để so sánh kinh điển của phái Theravada (Đồng Diệp Bộ) và của phái Hữu Bộ giúp chúng ta biết được những cái gì có trước khi phân phái, và những gì bất đồng sau khi phân phái.

Tuy nhiên trước khi chia ra nhiều phái đạo Bụt cũng đã biến hình rồi. Chúng ta biết ngay trong thời đại Bụt đang còn tại thế đã có sự hiểu lầm về giáo lý đạo Bụt, thì cố nhiên sau khi Bụt nhập diệt và trong mấy trăm năm truyền thừa thế nào cũng đã có những chuyện hiểu lầm và truyền thừa sai lạc. Cho nên khi học chúng ta phải cẩn thận so sánh. Nhất là chúng ta phải tìm một cái nhìn có tính cách nhất quán, một cái nhìn thấu suốt xuyên qua tất cả những điểm khác biệt. Giống như là khi có nhiều viên ngọc chúng ta dùng một sợi dây xâu lại hết tất cả để tạo thành một chuỗi ngọc vậy.

Cái nhìn nhất quán có nghĩa là cái nhìn hệ thống hóa và vượt khỏi những mâu thuẫn trên bề mặt. Trên bề mặt có thể thấy những điều trái ngược nhau. Nhưng nếu chúng ta có cái nhìn nhất quán thì những mâu thuẫn biến đi. Khi học kinh không được hướng dẫn thì ta có thể thấy lộn xộn lắm. Có khi một kinh nói thế này, khi thì một kinh khác nói ngược lại, ta không biết đường nào mà theo. Khi thì kinh nói có sinh và có tử, khi lại nói không có sinh, không có tử. Thành ra chúng ta không biết là có sinh có tử là đúng, hay không sinh không tử là đúng. Vì vậy chúng ta phải tìm ra phương pháp để có được cái nhìn nhất quán và thấu triệt và có tính cách hệ thống hóa. Phương Pháp đó dựa trên nguyên tắc Nhị Đế, Tứ Tất Đàn, Bốn Điều Y Cứ, Tương Tức và tính chất thực chứng của đạo Bụt mà chúng ta sẽ lần lượt duyệt qua.

!! Hai cách nhìn sự thật: sự thật phân biệt tục đế và chân đế

Trong đạo Bụt có quan niệm về nhị đế. Nhị đế có nghĩa là hai loại sự thật, sự thật tương đối và sự thật tuyệt đối. Sự thật tương đối gọi là tục đế (samvrti-satya), tức sự thật trong cuộc đời thế tục, có khi gọi là thế đế hay thế tục đế. Bụt luôn luôn nói sự thật, không bao giờ Ngài không nói sự thật. Nhưng có khi Ngài nói về sự thật tương đối và có khi Ngài nói về sự thật tuyệt đối. Nếu không biết điều đó, nếu không có tiêu chuẩn để phán xét, chúng ta có thể thấy nhiều điều Bụt nói trái ngược nhau. Xin nói lại : chân lý tương đối, chân lý ở ngoài đời, gọi là tục đế, thế tục đế hay thế đế. Còn chân lý tuyệt đối gọi là chân đế, thắng nghĩa đế hay đệ nhất nghĩa đế (paramartha-satya). Thắng nghĩa tức là cao hơn hết. Vậy khi nghe lời Bụt chúng ta phải có khả năng nhận diện đó là một lời tuyên bố về chân lý tương đối hay là một lời tuyên bố về chân lý tuyệt đối, thì chúng sẽ không bị lộn xộn.

Trong kinh có bài kệ này rất nổi tiếng :

<<<
Chư hạnh vô thường <br>
Thị sinh diệt pháp <br>
Sinh diệt diệt dĩ <br>
Tịch diệt vi lạc
<<<

Trong kinh Đại Niết Bàn Bàn chữ Hán, chúng ta thấy bài này, là bài kệ Bụt nói trước khi nhập diệt.

Chư hạnh vô thường là tất cả mọi hiện tượng mà chúng ta thấy và tiếp nhận đều là vô thường cả. Dịch sang tiếng Anh: All formations are impermanent. Chữ hạnh (samkara) này có nghĩa là formation. Ví dụ cái bình trà này là một hạnh. Vì bình trà này do đất, nước, lửa, gió, con người, thời gian, không gian cấu hợp lại mà thành, cho nên nó là một hạnh, một formation. Cái bông hoa kia cũng là một hạnh, tại vì trong hoa có đám mây, có mặt trời, có đất, có nước, những điều kiện phối hợp lại làm ra bông hoa. Chư hạnh vô thường là tất cả mọi hiện tượng của thế gian đều là vô thường. Bình trà và bông hoa là hai hạnh thuộc về sắc, về vật chất, nhưng cơn giận của mình hoặc nỗi buồn của mình cũng là những hạnh, chúng cũng vô thường. Giận và buồn gọi là tâm hành hay tâm hành (citta samskara). Có tâm hạnh và có sắc hạnh.

Chư hạnh vô thường, thị sinh diệt Pháp : Tất cả mọi hiện tượng đều vô thường, chúng đều là những Pháp có sinh và có diệt.

Sinh diệt diệt dĩ: Khi cái sinh và cái diệt đã bị diệt đi rồi thì lúc bấy giờ, sự tịch diệt, niềm yên lặng đó là niềm vui chân thật : Tịch diệt vi lạc.

Hai câu đầu nói về thế giới hiện tượng, nói về tục đế, về chân lý tương đối, diễn tả thế giới trong đó có sinh và có diệt. Nhưng hai câu sau đã đưa ta đi qua bình diện của chân đế tức là thực tại vượt thoát cái sinh và cái diệt. Khi mà cái sinh và cái diệt không còn nữa, khi mà cái sinh và cái diệt đã diệt rồi thì sự vắng lặng đó là niềm vui chân thật. Trong thế giới này có sinh và có diệt. Nhưng trong thế giới kia mà ta có thể gọi là Pháp giới thì không có sinh và không có diệt. Nếu ta nghĩ hai lời tuyên bố này trái chống nhau thì không đúng. Thế giới của hai câu đầu là thế giới hiện tượng (phenomenal world), thế giới của Tích Môn. Đứng về phương diện tướng, ta thấy có sinh có diệt; đứng về phương diện tính, ta thấy không có sinh cũng không có diệt. Đây là thế giới của Bản Môn.

Khi quán sát những đợt sóng, ta thấy sóng có những cái tướng, như tướng cao, tướng thấp, tướng bắt đầu, tướng chấm dứt, tướng đẹp, tướng xấu, tướng có, tướng không. Mỗi đợt sóng mang theo tướng có và tướng không. Trước khi đợt sóng vươn lên thì hình như là nó không có. Khi nó bắt đầu rồi thì hình như là nó có. Khi nó chấm dứt thì hình như là nó không có nữa. Tướng có, tướng không, tướng sinh, tướng diệt, tướng thấp, tướng cao, tướng đẹp, tướng xấu, là những tướng thuộc về thế giới hiện tượng.

Nhưng có một thế giới khác nằm ngay ở trong thế giới hiện tượng này mà không bị những cái tướng đó ràng buộc. Thế giới đó gọi là thế giới của Pháp tánh, thế giới của Bản thể (noumenal world) mà ở đây ta có thể ví dụ với nước. Sóng thì có không, có có, có cao, có thấp, có đẹp, có xấu. Nhưng nước thì không như vậy. Những cái tướng kia, những danh từ, những khái niệm mà mình dùng để mô tả sóng kia, ta không thể sử dụng để mô tả nước được. Đối với nước thì ta không thể nói là đẹp hay xấu, cao hay thấp, có hay không, theo nghĩa những tiếng đã dùng để nói về sóng. Và thế giới thứ hai này là thế giới của tánh. Như nước đối với sóng, thế giới này không tách rời ra khỏi thế giới của tướng. Nó đồng thời là thế giới của tướng. Không thể dùng các khái niệm về thế giới của tướng để nói về thế giới của tánh, cho nên ta nói nước không đẹp, không xấu, không có, không không, không thấp, không cao.

Ta hãy cùng đọc lại bài kệ : Chư hạnh vô thường, tất cả mọi hiện tượng đều vô thường. Thị sinh diệt Pháp, chúng là những hiện tượng có sinh và có diệt. Đó là sự thật mà thế gian công nhận và Bụt cũng nói như vậy. Đó là thế đế, là thế tục đế. Nhưng nếu tiếp tục quán sát cho sâu sắc thêm thì chúng ta đi sâu vào đằng sau thế giới sinh diệt, và chúng ta có thể tiếp xúc được với thế giới bất sinh bất diệt, thế giới của thể tánh. Và khi tiếp xúc được với thế giới này rồi thì ta không còn thấy sinh diệt nữa. Cái sinh cũng diệt mà cái diệt cũng diệt. Sinh diệt diệt dơi, tịch diệt vi lạc, tức là khi những ý niệm về sinh diệt không còn nữa thì sự vắng lặng của những ý niệm ấy chính là niềm an lạc thật sự.

Khi một đợt sóng lên cao, xuống thấp, dạt vào, trôi ra, nó có thể đau khổ, đó là vì nó chỉ tiếp xúc được với những tướng cao, tướng thấp, tướng đẹp, tướng xấu, tướng có, tướng không của nó mà thôi. Nhưng nếu đợt sóng tiếp xúc được với bản chất của nó, tức là nước, thì sự tình khác hẳn. Nó không còn sợ hãi nữa. Nó không còn mặc cảm nữa. Nó biết nó là nước. Và khi nó tự đồng nhất mình với nước rồi thì những tướng có, không, đẹp, xấu, thấp, cao kia không còn làm nó đau khổ nữa, không làm nó sợ hãi nữa. Do đÌó nó đạt tới được niềm vui chân thật.

Chìa khóa của giải thoát là khi ta từ thế giới hiện tượng mà đi được tới thế giới của Pháp tánh. Đi tới được, thì ta đạt được an lạc chân thật.

Vậy thì nói có sinh có diệt là đúng, hay không sinh không diệt là đúng? Hai cách nói có thể đều đúng cả. Một câu đúng về tục đế, một câu đúng về chân đế. Khi cần phát biểu về sự thật tương đối ta phải dùng tục đế, khi phát biểu về sự thật tuyệt đối ta phải dùng chân đế. Khi quý vị hướng dẫn một bài thiền tập về sinh diệt thì thường thường quý vị bắt đầu nói rằng ‘‘ta thế nào cũng phải già, ta thế nào cũng phải chết.’’ Ta thực tập trong cảnh có sinh, bệnh, già, và chết. Đến khi quý vị bắt đầu hướng dẫn người khác quán chiếu về không sinh, không diệt, họ có thể ngạc nhiên. Họ nói: Vừa rồi nói có sinh có diệt mà bây giờ thầy lại nói không sinh không diệt, tại sao? Vì họ không biết rằng thực tập trong phạm vi có sinh, có diệt sẽ đưa ta tới cái thấy về sự thật không sinh không diệt. Câu hỏi đặt ra ở đây là thực tập về sự thật tương đối (tục đế) có liên hệ tới sự thực tập về sự thật tuyệt đối (chân đế) như thế nào?

Hai sự thật có liên hệ với nhau. Nếu ta nắm vững tục đế mà đừng vướng kẹt vào tục đế, nếu tiếp xúc với tục đế cho thật sâu sắc, thì tự khắc ta tiếp xúc được với chân đế. Từ tục đế người ta có thể đi tới chân đế, không cần phải bỏ tục đế ta vẫn tới được chân đế như thường.

Hai cách nhìn sự thật, Tục đế và Chân đế không đưa tới cái thấy trái ngược với nhau. Chúng ta có thể lấy những thí dụ ở ngoài đời: đứng trước cùng một hiện tượng ta có thể dùng hai cách nhìn khác hẳn nhau. Cách nhìn này không chối bỏ cách nhìn khác, hai cách nhìn sẽ bổ túc cho nhau.

Thí dụ khi ta đi máy bay từ thành phố A đến thành phố B. Rời điểm A đi tới điểm B thì, theo một lối nhìn, ta càng ngày càng đi xa điểm A, ta sẽ nghĩ mình không bao giờ trở lại A nữa. Nhưng sự thật nếu đi mãi, đi mãi thì, vì trái đất tròn, sẽ có lúc ta trở lại điểm Ạ Cho nên nhìn theo một cách nhìn thì rời điểm A là đi xa A, theo cách nhìn khác thì rời A đi cũng là quay về với điểm Ạ

Ai cũng nghĩ là ánh sáng luôn luôn truyền theo đường thẳng. Nhưng khoa học ngày nay đã cho thấy rằng khi đi ngang gần một vật thể lớn trong không gian, ánh sáng sẽ đi cong. Đó là hai sự thật khác hẳn nhau về cùng một hiện tượng.

Khi ngồi nhìn lên chúng ta nghĩ đó là phía trên, nhìn xuống ta nghĩ đó là phía dưới. Nhưng cùng một lúc đó, đồng loại ta ở phía bên kia địa cầu nhìn sẽ thấy ngược lại. Phía mình nghĩ là trên thì họ coi là dưới. Ý niệm về trên và dưới áp dụng cho mặt đất thì đúng, áp dụng cho không gian trong vũ trụ thì sai. Trong vũ trụ cái không trên không dưới là một sự thật. Sự thật đó không hẳn chống đối với sự thật có trên có dưới ở trên mặt đất.

Ngày nay các nhà khoa học tin vào thuyết vũ trụ bung nở, nghĩa là cả vũ trụ đang trương ra, bất tận. Từ một điểm trong vũ trụ đứng quan sát ta thấy tất cả các điểm khác đều chạy xa chỗ ta đang đứng, và tốc độ rời xa tăng theo khoảng cách từ chỗ ta đứng. Một tinh hà cách ta hai tỷ năm ánh sáng di chuyển với tốc độ gấp hai lần một tinh hà ở cách một tỷ năm ánh sáng. Quan sát như thế, ta sẽ có cảm tưởng chỗ ta đứng là trung tâm của vũ trụ. Nhưng sự thật là ngược lại. Chính vì vũ trụ nở theo tốc độ gia tăng với khoảng cách như vậy mà phải kết luận vũ trụ không có trung tâm. Vì đứng từ bất cứ điểm nào ta cũng thấy cùng một hiện tượng đó. Thuyết vũ trụ nổ bùng (Big Bang) có thể khiến ta tưởng vũ trụ có một sự khởi đầu, tin sự sáng thế do một đấng hoá công. Nhưng sự thật là chính thuyết đó chứng tỏ trước vụ nổ bùng thì không có không gian và thời gian, do đó không thể nào có khái niệm trước và sau, sinh và diệt, nghĩa là không có sự khởi đầu, sự sáng thế. Ta biết thời gian cũng là một giả tướng do tri giác của ta tạo ra mà thôi. Giả tướng đó không thể tách rời giả tướng không gian và vật thể.

Sự thật tương đối và sự thật tuyệt đối liên tục, không chống báng lẫn nhau. Nếu chúng ta tiếp xúc sâu sắc với sự thật tương đối thì chúng ta sẽ tiếp xúc được với sự thật tuyệt đối. Khi nào chúng ta thấu hiểu sinh tử một cách sâu sắc thì chúng ta cũng tiếp xúc được với thực tại không sinh không tử. Điều đó trong đạo Bụt gọi là tùng tướng nhập tánh, theo lối đi từ tướng để vào cõi của tánh. Người không hiểu điều đó khi nghe nói những điều về chân đế lại lấy tiêu chuẩn tục đế ra phê phán. Giả dụ có người nghe tụng Tâm Kinh Bát Nhã thấy nói không có mắt, tai, mũi, lưỡi v.v.., bèn tới nắm mũi người tụng kinh vặn đùa một cái. Người kia la lên : ‘‘Sao lại vặn mũi tôi?’’ – ‘‘Vì anh nói không có mũi, thành thử tôi muốn thử xem có đúng là anh không có mũi thật chăng?’’ Đó là một cách nhìn sai lầm, mang cái thước đo của sự thật tương đối để luận bàn về sự thật tuyệt đối.

Hai cách trình bày sự thật đều có giá trị cả. Nếu ta quán chiếu, tiếp xúc và đi sâu vào sự thật tương đối thì sẽ khám phá ra sự thật tuyệt đối.

!! Tứ tất đàn : Bốn tiêu chuẩn về sự thật

Liên hệ với nhị đế (hai sự thật) còn có bốn tiêu chuẩn để trình bày sự thật gọi là tứ tất đàn (siddhantas).

Thứ nhất là thế giới tất đàn. Đó là các tiêu chuẩn căn cứ trên những nhận thức phù hợp với cuộc sống ở thế giới này. Ví dụ người ta chia thời gian một năm ra mười hai tháng, mỗi tháng ba mươi ngày. Sắp đặt công việc, ta phải căn cứ trên ngày tháng trong lịch cho tiện, đó là thế giới tất đàn. Nhiều khi Bụt phải nói theo những tiêu chuẩn của thế gian cho thuận tiện, chứ không hẳn vì đó là chân lý tuyệt đối. Nếu ta hỏi Bụt Ngài sinh ở đâu, lúc nào, thì Ngài cũng nói tôi sinh ở Ca Tỳ La Vệ trong thế kỷ thứ sáu trước Ki Tô. Nhưng kỳ thực cái thấy của Ngài là cái thấy bất sinh bất diệt, không phải là Ngài chỉ bắt đầu có từ ngày này và sẽ tịch vào ngày kia.

Thứ hai là vị nhân tất đàn. Vị nhân tức là vì con người mà nói như vậy. Con người là một trong những loài sinh vật ở trên trái đất. Con người có bộ óc như vậy, có lề lối suy nghĩ như vậy, có hiểu biết như vậy, cho nên phải nói làm sao cho con người hiểu được. Những người ở Paris sống trong hoàn cảnh đặc biệt của Paris, có những mối lo lắng, những thao thức, những bận rộn của đời sống Paris. Họ có những vấn đề của họ. Khi giảng pháp cho họ, hướng dẫn họ, ta phải biết những hoàn cảnh đó, để có thể thành công. Sự thật phải được nhìn thấy qua ngôn ngữ và hoàn cảnh của thính chúng. Phải hiểu điều đó mới hiểu được ngôn ngữ Bụt sử dụng. Sở dĩ Bụt nói như vậy tại vì thế giới tất đàn ở đó như vậy, con người thời đó như vậy. Thành ra lời nói không phải chỉ phản ảnh nhận thức của Bụt mà còn phản ảnh cả hoàn cảnh của người nghe nữa.

Thứ ba là đối trị tất đàn. Mỗi người có căn bệnh riêng, có những lo sợ, những mặc cảm, những buồn khổ riêng. Khi nói pháp Bụt nhắm chữa trị tâm bệnh của người nghe. Cách nói đó gọi là đối trị tất đàn. Nghe Bụt thuyết pháp ta phải nhớ điều đó. Tôi nhớ cách đây chừng 25, 26 năm trong một chuyến đi Anh tôi có đi thặm viện bảo tàng. Tôi bước vào với một cô bé 5, 6 tuổi người Anh. Tới một phòng kia chúng tôi thấy một xác người hóa tHạch chứa trong tủ kính. Con người đó chết cách đây năm ngàn năm, mà những sợi tóc, những móng tay, những nếp nhăn ở trên da vẫn còn được giữ nguyên vẹn. Đó là xác một người đàn ông nằm khum khum, ở đấy ngày xưa họ chôn như vậy. Sức nóng sa mạc đã bảo tồn thân thể đó, và thời gian đã làm nó hóa đá. Tôi đứng nhìn rất lâu, duy trì thiền quán của mình, và quên mất cô bé đang đứng bên. Cô bé lúc đó đang run sợ, đang kinh hoàng mà tôi không biết. Lúc cô bé cầm áo tôi kéo giật, tôi mới tỉnh. Với cặp mắt hoảng hốt, nó hỏi: ‘‘Will it happen to me?’’ (Con sẽ bị như vậy hay không?). Đối với một em bé, mình phải trấn an nó trước đã, nên tôi lắc đầu: ‘‘Đâu có, con đâu có thể bị như vậy, con không bao giờ bị như vậy.’’ Nói xong tôi biết rằng mình đã nói dối. Nhưng nếu nói sự thật sinh lão bệnh tử cho một em bé 5, 6 tuổi nghe thì tàn nhẫn quá. Khi ra khỏi phòng, tôi chợt nhớ ngày xưa khi thái tử Tất Đạt Đa đi với Xa Nặc thì Xa Nặc đã nói thật. Khi thấy xác người chết nằm cong queo, thái tử hỏi: ‘‘Ta sau này có như vậy không?’’ Xa Nặc nói: ‘‘Có chứ sao không. Ngài đâu có thể trốn thoát khỏi cảnh đó.’’ Xa Nặc đã nói hết sự thật. Còn tôi thì không. Cho nên, để đối trị với vấn đề trước mắt của người nghe, Bụt phải dùng thứ ngôn ngữ mà đôi khi người không hiểu sẽ nghĩ là nói sai. Bệnh như vậy thì phải dùng phương thuốc như vậy để đối trị.

Tất đàn thứ tư là đệ nhất nghĩa tất đàn. Đệ nhất nghĩa cũng như là thắng nghĩa. Tất đàn này tức là tiêu chuẩn sự thật tuyệt đối, thuộc về chân đế. Không có ngã thì nói không có ngã, dầu người ta phản đối vẫn nói là không có ngã. Trái đất nó tròn thì nói là nó tròn, dầu bị dọa treo ngược cũng cứ nói tròn. Nói thẳng sự thật không ngại gì cả.

Đó là ý niệm về tứ tất đàn, giúp ta nhớ khi đọc lời của Bụt thì hãy tìm hiểu lời đó Ngài nói theo tiêu chuẩn tất đàn nào.

Ngoài hai điều trên, khi học kinh sách chúng ta còn dùng tiêu chuẩn tứ y, tức là bốn sự y cứ. Phép tứ y này do các tổ đặt ra để soi sáng cho chúng ta khi học đạo Bụt.

!! Bốn điều y cứ

Thứ nhất là y pháp bất y nhân, tức là căn cứ vào giáo pháp mà đừng căn cứ vào người. Có ông thầy ở Tích Lan hai ngàn năm trước, ông thuộc tất cả tam tạng kinh điển nhưng tính tình khó chịu. Muốn có Phật pháp thì đừng chấp vào người, phải chiều ông, miễn thế nào học được pháp thì thôi. Có những ông thầy không thực tập điều mình dạy. Nhưng không tìm ra thầy khác nên ta phải cố chịu đựng để được học giáo pháp của Phật từ những ông thầy kia, đó là y pháp bất y nhân. Xưa, trong lớp sơ đẳng Phật học mà tôi theo học ở chùa Báo Quốc, có một thầy đã đem ví dụ thùng rác để nói về điều này. Thùng rác tuy hôi, nhưng có viên bảo châu nằm dưới đáy, muốn lấy viên bảo châu thì phải chịu dơ tay.

Về tiêu chuẩn y pháp bất y nhân này, chúng ta phải cẩn thận. Người thầy dạy không làm những điều ông ta dạy, thì học trò không có niềm tin. Khi làm thầy ta phải dạy bằng thân giáo. Thân giáo là dạy bằng cuộc sống hàng ngày của chính mình. Tuy nhiên, nếu chúng ta đòi hỏi phải có thân giáo thật thì có lẽ khó tìm ra thầy lắm. Đôi khi ta không nên vì ông thầy làm sai mà mất niềm tin nơi giáo pháp của Bụt.

Thứ hai là y liễu nghĩa kinh, bất y bất liễu nghĩa kinh. Liễu nghĩa kinh tức là những kinh nói về đệ nhất nghĩa. Bất liễu nghĩa kinh là những kinh phương tiện, chỉ nói về chân lý tương đối. Nếu hai kinh nói khác nhau thì cuối cùng mình phải nghe theo liễu nghĩa kinh. Điều y cứ thứ hai này ta cũng phải áp dụng dè dặt và khôn ngoan. Vì tiêu chuẩn này không cho ta thấy liên hệ giữa liễu nghĩa kinh và bất liễu nghĩa kinh. Nhờ thực tập bất liễu nghĩa kinh nên ta mới có thể thấu triệt liễu nghĩa kinh. Nhiều người căn cứ vào câu này sẽ chỉ muốn học những kinh như kinh Hoa Nghiêm hay kinh Pháp Hoa, để nói những chuyện cao xa. Họ không chịu học những kinh nói về Năm giới, Tam quy, vốn là những kinh căn bản nhưng rất quan trọng.

Thứ ba là y nghĩa bất y ngữ tức là căn cứ vào nghĩa lý chứ đừng chấp vào ngôn ngữ nhiều quá. Đừng quá chấp vào từng chữ, phải nương vào nghĩa lý núp đằng sau các chữ.

Cuối cùng là y trí bất y thức. Trí (prajna) và thức (vijnana) thuộc hai trình độ khác nhau. Thức là cái hiểu biết còn phân biệt, kỳ thị, nghi hoặc. Trí là thứ hiểu biết vượt trên phân biệt, kỳ thị, nghi ngờ. Trong khi học kinh điển không nên dùng óc phân biệt mà tiếp thụ và chia chẻ, phải tập dùng trí tuệ để quán chiếu.

Phương Pháp tứ y do các tổ đặt ra để giúp chúng ta, nhưng chúng ta phải dùng óc phán đoán thông minh khi áp dụng. Điều này đúng với cả bốn nguyên tắc chứ không phải chỉ có một. Hiểu sai và áp dụng tùy tiện là phụ ơn các thầy, các tổ.

!! Cây đuốc duyên khởi

Chúng ta đã bàn về nhị đế, tứ tất đàn, và về tứ y, những chiếc chìa khóa phải dùng khi học kinh điển. Tôi thiết tưởng hai khái niệm về nhị đế và về tứ tất đàn đủ giúp ta đi vào kinh tạng mà không sợ lạc đường. Khi nghe Bụt giảng dạy giáo lý mà có một cái nhìn nhất quán thì ta sẽ không cảm thấy những lời Bụt nói trái ngược nhau. Hai khái niệm nhị đế và tứ tất đàn giúp ta hiểu được cách nói của Bụt. Nếu không quen ngôn ngữ của Bụt thì ta sẽ không thể lãnh hội được thông điệp của Bụt.

Nhưng sau khi vượt qua hàng rào ngôn ngữ, để tiếp thu bài học của Bụt, chúng ta cần hiểu qua nguyên lý Duyên Khởi để tập soi sáng về nội dung. Duyên khởi tức là sự phát khởi, hình thành của các hiện tượng, căn cứ trên nguyên tắc duyên sinh, mỗi hiện tượng do nhiều điều kiện phối hợp nhau mà thành. Có một cái nhìn duyên khởi về sự vật thì chúng ta bắt đầu có chánh kiến. Bụt nói rằng duyên khởi là một giáo lý rất mầu nhiệm, người nào thấy được tính duyên khởi là có thể thấy được Bụt. Một lần sau khi nghe về duyên khởi, thầy A Nan thưa: ‘‘Bạch đức Thế tôn, lý duyên khởi hay quá mà cũng thật đơn giản, dễ hiểu.’’ Bụt nói: ‘‘Thầy đừng nghĩ như vậy. Lý duyên khởi rất sâu sắc, rất mầu nhiệm. Thầy chưa hiểu được hết đâu. Người nào thấy được tính duyên khởi tức là thấy được Như Lai.’’ Câu nói đó ta phải thuộc lòng. Tất cả giáo lý của đạo Bụt đều lấy duyên khởi làm nền tảng. Trong khi học, chúng ta có thể thấy những giáo thuyết nghe rất hay nhưng chưa chắc đã là đích thực Phật Pháp. Bất cứ giáo lý nào trái với tính duyên khởi thì không phải là giáo lý của Bụt. Cho nên trước khi đi vào kinh tạng ta phải học qua về lý duyên khởi. Dùng cái thấy về duyên khởi soi vào tam tạng kinh điển, là ta có một ngọn đèn chiếu sáng cho ta tìm đường. Một mặt dùng phương pháp nhị đế và tứ tất đàn thì hiểu được ngôn ngữ của Bụt. Một mặt dùng đạo lý duyên khởi để thấy được con người của Bụt. Thấy được con người của Bụt và nghe được ngôn ngữ của Bụt thì mình hy vọng đi vào kho tàng tam tạng kinh điển mà không sợ lạc đường.

!! Thiền hành

Nhưng chúng ta không phải chỉ học giáo lý thôi. Đây không phải là khóa học giáo lý mà là một khóa tu. Cho nên quý vị phải thực tập đàng hoàng, tinh chuyên. Những bài tập đưa ra, quý vị phải làm. Trong khi ở tại Làng Hồng, dầu quý vị ở một tháng, hay là hai, ba tháng, cũng phải thực tập cho vững chãi và tinh tấn.

Trước hết là thực tập thiền hành. Mỗi ngày chúng ta đi thiền hành chung một lần. Tất cả mọi người trong đại chúng đều nên tham dự thiền hành chung. Và trong ngày khi có thời giờ rảnh ta đi thiền hành riêng. Thiền hành riêng thường xuyên trong hai trường hợp. Một là khi có 15 hay 20 phút rỗi rảnh, ta đi thiền hành một mình để nuôi dưỡng thân tâm. Hai là mỗi khi cần đi đâu như đi ra nhà bếp, đi rửa tay, hay đi về phòng mình, ta đều thực tập thiền hành cả. Thiền hành là công phu của chúng ta. Khi cần đi, dầu chỉ năm bước hay mười bước thôi ta cũng đi thiền hành. Tại Làng Hồng chỉ có một kiểu đi là thiền hành (the walking meditation style), không ai đi cách khác. Tới Làng Hồng nếu quý vị không tập pháp môn đặc biệt này của Làng thì giống như quý vị chưa hề tới Làng Hồng.

Thiền hành là một phương pháp rất mầu nhiệm giúp ta nhận diện tâm mình. Tâm ta như con vượn chuyền cành. Vì vậy ta phải có những phương pháp để theo dõi tâm mình. Trong ta có một thứ thói quen ẩn sâu bên dưới tầng ý thức gọi là tập khí (habit energy). Tập khí thường đẩy ta vào những nẻo đường của khổ đau, hờn giận, trầm luân. Tập khí chủ động, nó kéo ta đi đâu thì ta theo đó. Cơn giận, nỗi buồn, sự sợ hãi và niềm thất vọng đều do những tập khí tạo ra. Tập khí đôi khi không phải do ta nhiễm thành mà khi ta sinh ra đã có, do tổ tiên, ông bà và cha mẹ truyền trao. Biết mình có tập khí tiêu cực cũng không phải là lý do để mang mặc cảm thua người. Miễn là ta học được cách tự nhìn thấy tập khí để chuyển hóa chúng. Phương pháp đối trị tập khí là mỗi khi một tập khí ló đầu ra thì ta phải biết nhận diện. Ta không cần phải tự trách mình sao còn nặng nghiệp! Ta cũng không chống đối hoặc trấn áp tập khí như thù địch.

!! Nhận diện

Mấy năm trước có một thiền sinh người Mỹ tới Làng Hồng. Thực tập ba, bốn tuần lễ, anh nói có thấy tiến bộ. Một bữa, anh đi ra thành phố Ste-Foy La Grande để mua thức ăn về nấu cỗ cúng lễ Tạ ơn (Thanksgiving). Trong khi đang chọn lựa mua hàng, tự nhiên trong anh cái tập khí cuống quít hớt hải từ đâu bỗng xuất hiện trở lại. Trong mấy tuần qua ở Làng Hồng, vì sống có tăng thân, nên những lúc đi, đứng, nằm, ngồi anh đều thảnh thơi, có chánh niệm. Hôm nay một mình ra thành phố, chỉ trong vòng nửa giờ, tự nhiên anh thấy mình đang hấp tấp và quýnh quáng. Nhờ mấy tuần lễ thực tập hơi thở, đi thiền hành và ăn cơm yên lặng, cho nên anh thấy được cái cuống quít của chính mình. Anh bỗng nhớ hình ảnh mẹ anh. Anh nhận ra đây là một tập khí của mẹ, và anh đã tiếp nhận tập khí đó do mẹ anh truyền trao. Mẹ anh có tánh lật đật và cuống quít, bà ít bao giờ thư thái được. Và khi nhận ra tập khí của mẹ đang sống trong mình, anh thở một hơi chậm và dài. Anh chào :Hello mummy ! Mẹ đó ư mẹ?ì Và anh cười. Trạng huống cuống quít của anh liền tan đi. Anh tiếp tục chọn mua cà rốt và khoai tây. Và lòng rất an nhiên.

Chúng ta không cần trấn áp tập khí. Tập khí luôn luôn ở trong ta. Người nào cũng có cả. Có thứ được un đúc từ thời thơ ấu, có cái được trao truyền từ ông bà và cha mẹ. Ta thường hay phản ứng theo sự thúc đẩy và điều động của tập khí. Tu có nghĩa là tập nhận diện tập khí mỗi khi chúng phát hiện.

Cách tập nhận diện hay nhất là đi thiền hành. Đi thiền hành là đi với chủ đích bước đi, chứ không ai bắt phải đi, hay bị kéo đi. Trong đời sống hàng ngày, ta thường bị lôi kéo, đi là để tới một chỗ nào đó, để làm gì đó, còn hành động bước chân đi không quan trọng. Khi đi thiền hành ta bước từng bước chân có ý thức, mỗi bước chân đều được theo dõi bởi hơi thở. Trong khi đi thiền hành ta làm chủ mình. Nếu tập khí phát hiện, ta thấy liền lập tức, ta mỉm cười, ta thở. Còn nếu không đi theo kiểu thiền hành thì ta không có cơ hội tập nhận diện do đó tập khí vẫn tiếp tục hoành hành trong ta và dẫn ta đến những lối đoạn trường. Ma đưa lối quỷ dẫn đường, lại tìm những chốn đoạn trường mà đi. Đi thiền hành giỏi, ta tập nắm vững được thân tâm. Sau đó, trong khi ngồi thiền hay những lúc làm việc ta sẽ dễ dàng tiếp tục thực tập phương pháp theo dõi hơi thở. Đang rửa chén ta ý thức những động tác của mình trong khi rửa chén.

Chúng ta cũng có thể theo dõi hơi thở với những bài thi kệ. Ví dụ bài Vào, ra, sâu, chậm hay Đã về, đã tới mà chúng ta sẽ làm quen trong những ngày tới. Nguyên tắc của sự thực tập cũng đơn giản. Đó là thiết lập cán cân thăng bằng. Một bên là khổ đau, một bên là hạnh phúc. Phần buồn đau hơi nặng thì mình phải làm sao cho phần hạnh phúc tăng lên để phần buồn đau nhẹ xuống.

Có hai phương pháp tái tạo cân bằng. Thứ nhất là trong khi thiền hành, làm việc hay ngồi thiền, ta theo dõi hơi thở để nhận diện được tập khí trong ta. Chỉ nhận diện thôi chứ không đàn áp. Thấy được tập khí, tự nhiên tập khí đó tan đi, ta tiếp tục theo dõi hơi thở chánh niệm. Nếu tập khí lại xuất hiện nữa thì ta lại nhận diện lần nữa. Đó là một thực tập rất quan trọng ở Làng Hồng. Người nào trong chúng ta cũng phải thực tập.

!! Tiếp xúc

Phương pháp thực tập thứ hai là tiếp xúc. Tiếp xúc với những niềm vui, những gì mầu nhiệm để tự nuôi dưỡng. Có những cái rất mầu nhiệm ở trong ta và xung quanh ta. Ví dụ ta có hai con mắt, đó là một điều rất mầu nhiệm. Ta có trái tim đang đập bình thường. Ta không sợ đứt mạch máu. Ta có một lá gan đang làm việc bình thường. Ta có hai chân có thể đi thiền hành. Ta có khả năng cười, khả năng vui. Ta có khả năng thưởng thức cái hay, cái đẹp trong cuộc đời. Tất cả những thứ đó ở trong con người ta, phải biết tiếp xúc. Tự ta tiếp xúc cho được, hoặc ta nhờ các bạn giúp ta tiếp xúc. Ai cũng có trong tâm thức mình những hạt giống của hạnh phúc, của thương yêu chỉ chờ nẩy mầm. Mưa xuân nhẹ hạt, đất tâm ướt, hạt đậu năm xưa hé miệng cười. Hạt đậu năm xưa tức là những hạt giống của niềm vui, của hạnh phúc, của tài năng, của thương yêu nằm sẵn trong tâm thức ta. Lâu nay trời không mưa nên hạt đậu không nẩy mầm lên được. Cơn mưa xuân ở đây là giáo pháp và tăng thân. Sống với tăng thân thì ta có cơ hội tiếp nhận cơn mưa chánh pháp. Sự thực tập của đại chúng giúp cho ta tưới tẩm những hạt giống lành trong con người ta. Khi đi thiền hành, ngắm trăng, hoặc trồng rau, rửa chén, ta phải sử dụng những cơ hội ấy để tiếp xúc với những mầu nhiệm của sự sống. Đó là tiếp xúc một cách chọn lọc (selective touching). Ta chỉ chọn tiếp xúc với những gì tích cực thôi. Chỉ tiếp xúc những thứ có khả năng trị liệu, có khả năng nuôi dưỡng. Hãy nhìn bông hoa, ngắm vầng trăng, đi dưới nắng, nghe chim hót, ngồi im lặng uống trà với một người bạn, tất cả những thứ ấy đều có giá trị nuôi dưỡng.

Tóm lại, chúng ta có hai điều cần thực tập. Với những hạt giống đau buồn và với tập khí, ta thực tập nhận diện. Với những hạt giống hạnh phúc, ta phải tiếp xúc để nuôi dưỡng. Đó là phép tu ở Làng Hồng. Nếu chúng ta thực tập được hai điều này trong một thời gian thì tự nhiên cán cân giữa hạnh phúc và khổ đau sẽ thăng bằng lại và những đau buồn dần dần sẽ được chuyển hóa.

Quý vị nên nhớ trong những buổi pháp đàm về giáo lý tứ diệu đế, bát chánh đạo, ngũ cặn, ngũ lực, thất bồ đề phần, ta nên nhớ rằng giáo lý nào cũng phải đặt trong mạch sống của sự thực tập. Những bài học Phật pháp phải có dính líu tới sự hành trì và đời sống hàng ngày của mình. Sự hành trì của ta rất quan trọng cho tăng thân của ta. Mỗi người trong chúng ta đều có trách nhiệm liên đới với nhau trong việc tu học. Khi một người biết đi thiền hành và biết sống chánh niệm thì người đó giúp cho tăng thân rất nhiều. Mỗi người trở thành một tiếng chuông chánh niệm nhắc nhở cho tất cả những người khác.

!! Phụ lục:

Hai bài kệ để thực tập thở, đi thiền hành và ngồi thiền:

!!! Bài kệ: Đã về đã tới
<<< 
Đã về Đã tới <br>
Bây giờ Ở đây<br>
Vững chãi Thảnh thơi<br>
Quay về Nương Tựa
<<<

!!! Bài kệ: Hải đảo tự thân
<<< 
Quay về nương tựa <br>
Hải đảo tự thân <br>
Chánh niệm là Bụt  <br>
Soi sáng xa gần <br>
Hơi thở là Pháp <br>
Bảo hộ thân tâm <br>
Năm uẩn là Tăng  <br>
Phối hợp tinh cần 

Thở vào Thở ra  <br>
Là hoa Tươi mát <br>
 Là núi Vững vàng  <br>
Nước tịnh Lặng chiếu <br>
 Không gian Thênh thang.
<<<
! Bài23 Tu tập từ quán

Hôm nay là ngày 13 tháng 2, năm 1994. Chúng ta đang ở tại Xóm Hạ, học tiếp về Bốn Tâm Vô Lượng.

!! Tu tập từ quán

Trong Kinh Tăng Chi Bộ (Anguttara Nikaya), phẩm nói về Nhất Pháp, Bụt có nói một câu : ‘‘Nếu một vị khất sĩ tu Từ Quán, dầu chỉ thực tập trong một chốc lát, thời gian bằng một cái búng tay thôi, thì vị khất sĩ đó đã xứng đáng là một vị khất sĩ rồi.’’ Câu nói đó chứng tỏ rằng Từ Quán rất quan trọng trong đạo Bụt. Bụt nói tiếp: ‘‘Thầy khất sĩ đó sẽ không thất bại trong thiền định, sẽ làm được theo lời bậc đạo sư chỉ dạy, sẽ đáp ứng được những lời khuyến dụ của các vị đạo sư. Và vị đó ăn cơm tín thí không uổng.’’ Nếu hằng ngày vị khất sĩ hành trì Từ Quán, thì còn công đức gì nhiều hơn, và lớn hơn nữa?

Đứng về phương diện đối trị cái giận, Từ Quán và Bi Quán là những phương pháp rất thực tế mà rất mầu nhiệm. Kinh có nói tới bảy cái bất lợi của sự giận hờn, của người không chịu buông thả, không chịu chuyển hóa cơn giận của mình.

Thứ nhất, người đó trông xấu xí. Cái giận làm tôi xấu. Ta chỉ cần nhìn vào gương là ta biết Bụt nói đúng. Ý thức được điều đó, tự nhiên ta nghe một tiếng chuông chánh niệm, và ta muốn làm một cái gì ngay để nét mặt mình bớt xấu. Có một bài thực tập để thở khi giận. Thở vào, chúng ta nói: Cái giận làm tôi xấu. Thở ra, chúng ta nói: Biết vậy, tôi mỉm cười.

<<<
Cái giận làm tôi xấu <br>
Biết vậy tôi mỉm cười <br>
Quay về thủ hộ ý <br>
Từ Quán không buông lơi.
<<<

Thở vào thì ta biết quay về, nắm giữ và thủ hộ tâm ý của mình. Thở ra, ta biết phải thực tập Từ Quán: Từ Quán không buông lơi. Chúng ta nên mô phỏng theo bài kệ trên đặt thêm những bài khác về các điểm bất lợi tiếp theo để thực tập.

Điểm bất lợi thứ hai là ta nằm kẹt đau đớn trong cơn giận của ta. He lies in pain. Người giận nằm co quắp trong niềm đau của mình. Niềm đau này là do cái giận làm ra. Thứ ba là không có sự phát triển phong phú. Thân thể cũng như tâm hồn không phát triển và bừng nở được như một đóa hoa. Thứ tư là nghèo đi về tiền tài cũng như về hạnh phúc. Thứ năm là không được tiếng tốt. Thứ sáu là không có nhiều bạn. Và thứ bảy là người đó sẽ tái sanh trong cõi A Tu La, không có hạnh phúc. Đó là bảy điều bất lợi của những người ôm cái giận của mình mà không biết buông bỏ để chuyển hóa.

Cũng trong Kinh Tăng Chi Bộ, Bụt nói tới mười một cái lợi của người thực tập Từ Quán và Bi Quán. Ngài nói rằng cái lợi thứ nhất của người thực tập Từ Quán là ngủ ngon. Thứ hai là khi thức dậy thấy khoẻ khoắn, nhẹ nhàng trong lòng. Thứ ba là ngủ không có ác mộng. Thứ tư là được gần gũi và thân cận với nhiều người. Thứ năm là được thân cận với cả những loài không phải loài người. Những loài không phải người tức chim muông, tôm cá, v.v.. cũng không sợ hãi lánh xa. Thứ sáu là được chư thiên ủng hộ, bảo vệ. Thứ bảy là không bị lửa, bị chất độc, gươm súng ám hại. Thứ tám là dễ đi vào thiền định, ta định tâm rất dễ, (get concentration easily). Thứ chín là nét mặt mình luôn luôn trầm tĩnh. Thứ mười là lúc chết không có lú lẫn. Mười một là sau khi chết, ít nhất là sinh vào cõi trời Phạm Thiên, những người ở trên đó đều ít nhiều đã tu Từ Quán và Bi Quán.

Trong Kinh Như Thị Ngữ (Itivutthaka), Bụt cũng nói: Tất cả những công đức mà ta thực hiện ở trên đời góp lại cũng không bằng công đức của sự thực tập Từ Quán. Làm chùa, đúc chuông, hay làm việc xã hội… tất cả những công đức đó chỉ bằng một phần mười sáu của công đức thực tập lòng Từ. Cũng như nhìn lên trời chúng ta thấy trăng và sao, và nếu ánh sáng của tất cả các ngôi sao họp lại không bằng ánh sáng của mặt trăng, thì tất cả các công đức khác góp lại cũng không bằng ánh sáng của Từ Quán.

!! Quán chiếu để tự chuyển hóa

Tu tập Từ Quán, Bi Quán, Hỷ Quán và Xả Quán có thể chuyển hóa hạt giống giận dữ trong ta. Giận luôn luôn có nghĩa là giận ai, giận gì. Giận những người đã làm cho mình khổ, trong đó có những người mình gọi là kẻ thù. Đối tượng của cái giận là đối tượng của tâm, nghĩa là của nhận thức, của tri giác. Trước hết ta có Tưởng, những tri giác của ta về đối tượng. Ví dụ khi ta giận cha, giận mẹ, giận cái thân phận của mình, thì ta phải có tri giác về cha, về mẹ, về cái thân phận của ta. Vì vậy Từ Quán, và Bi Quán có liên hệ tới tri giác. Từ sự sai lầm của tri giác phát sinh sự giận dữ. Quán Từ, Bi, Hỷ, và Xả, ta phải trở về quán chiếu tri giác của ta thì mới thành công được. Đó không phải là những ức tưởng, những tưởng tượng, những mong ước suông (wishful thinking). ‘‘Mong rằng các loài có hạnh phúc. Mong rằng các loài bớt đau khổ’’ là một mong ước. ‘‘May all beings be happy, may all beings suffer less’’. Đó đã là bắt đầu Từ Quán rồi, nhưng vẫn còn ở phạm vi ức tưởng. Điều chúng ta phải làm là chiếu ánh sáng quán niệm vào tri giác của chúng ta về các đối tượng của tâm. Quán chiếu những gì ta thấy, ta nghe về cảnh cùng khổ, nỗi chán chường, sự sợ hãi của người, của các sinh vật chung quanh ta, chúng ta đánh động được tâm Từ và muốn làm một việc gì để tạo ra niềm vui cho họ. Khi ta thấy được niềm đau, nỗi khổ của một người, hay một loài nào đó, thì năng lượng của Bi trong ta phát khởi. Nếu chúng ta không tiếp xúc, không quán chiếu, thì ước muốn không đủ mạnh để chuyển thành hành động.

Cho nên các bộ Luận phân biệt ra ba loại quán chiếu. Thứ nhất là quán chiếu tổng quát, chung cho tất cả mọi người, mọi loài. Biến mãn thành tựu du là bao trùm tất cả, hành giả theo dõi hơi thở và tập trung tâm ý, tự nói rằng: mong cho tất cả các loài đều có hạnh phúc. Hay thầm nói: mong cho các loài bớt khổ đau.

Phép Quán thứ hai là phân chia ra, để quán từng chủng loại. Ví dụ thay vì nói về tất cả các loài, thì chỉ nói về loài người. Mong rằng loài người có thêm hạnh phúc. Mong rằng loài người nhẹ bớt khổ đau. Rồi thu nhỏ phạm vi đối tượng của mình lại, thí dụ: mong các trẻ em ở Sarajevo đừng bị khổ đau nhiều quá, mong rằng hàng ngày các em không còn bị bom đạn nữa. Vì đối tượng thu nhỏ lại nên ta thấy rõ hơn, và ta có thể phát triển năng lượng của Từ, của Bi cụ thể hơn. Thứ ba là hướng tâm của mình về một phía, như phía Đông, phía Tây, phía Nam, phía Bắc, v.v.. Như khi nghĩ tới các em bé mồ côi, nghèo khổ ở quê hương, thì chúng ta đang ở Pháp sẽ phóng tâm mình về phương Đông. Ở đó có các trẻ em miền Bắc, miền Trung, và miền Nam thiếu ăn, không được đi học, năm bẩy tuổi đã phải đi lượm rác mà sống, v.v..

Trong Kinh, Bụt chỉ nói một cách tổng quát. Người tu Từ phát khởi tâm Từ về từng hướng một. Tâm dữ Từ câu biến mãn nhất phương thành tựu du tức là tâm ta cùng đi với năng lực của Từ, trùm cả một phương không bỏ sót. Như thị nhị, tam, tứ phương, tứ duy, thượng, hạ, phổ châu nhất thiết, tâm dữ từ câu. Vô kết, vô oán, vô nhuế, vô tranh, cực quảng, thậm đại, vô lượng thiện tu.

Như thị nhị, tam, tứ phương nghĩa là đối với phương thứ hai, thứ ba, thứ tư cũng như vậy. Tứ duy, thượng hạ là bốn phương chính và phía trên, phía dưới. Đông, Tây, Nam, Bắc, Đông Nam, Tây Nam, Đông Bắc, Tây Bắc; cộng phía trên, và phía dưới nữa là mười phương. Phổ châu nhất thiết là bao trùm tất cả, không gian cũng như thời gian. Trong lòng không có nội kết, không có oán hận, không có căm thù, giận dữ, không cãi cọ, tranh chấp. Cực quảng thậm đại là rất rộng, rất lớn. Vô lượng thiện tu là khéo léo tu tập không biết chừng nào. Khéo léo tu tập như thế nào để tâm Từ của ta có thể bao trùm tất cả, đi tới tất cả các phương, và bên trong lòng ta không còn nội kết, không còn oán hờn, không còn giận dữ, không còn sự tranh chấp; tâm ta trở thành mỗi lúc càng lớn, càng rộng.

Đoạn tiếp theo nói rằng đối với Bi, Hỷ, và Xả ta cũng làm như vậy. Đây là kinh Trung A Hàm, Kinh thứ 86, gọi là Thuyết Xướng Kinh. Bản dịch tiếng Anh dựa trên tạng Pali như sau: He dwells suffusing, first, one direction with the heart linked to friendliness, then the second, then the third, then the fourth, then above, then below, around and everywhere. And so he dwells recognizing himself in all, suffusing the entire world with the heart linked to friendliness, far reaching, gone great, unlimited, free from enmity and malice. Câu recognizing himself in all là thấy được mình trong tất cả, dịch từ chữ samba attaya. With the heart linked to friendliness: đây cũng lập lại bốn chữ ‘‘tâm dữ từ câu.’’ Hai bên, một bên Nam truyền, một bên Bắc truyền đều lập lại bốn chữ tâm dữ từ câu lần thứ hai. Mấy ngàn năm rồi so lại ta thấy vẫn còn giống. Far reaching: cực quảng. Gone great: thậm đại. Và sau đó cũng nói rằng đối với Bi, Hỷ, và Xả cũng quán tưởng giống hệt như vậy.

Những tiếng nhuế, và oán có thể có nghĩa gần giống nhau, nhưng vẫn có những chi tiết khác nhau. Vì vậy, bản chữ Hán dịch đủ hết, lời văn đi rất mạnh: Vô kết, vô oán, vô nhuế, vô tranh, cực quảng, thậm đại, vô lượng thiện tu. Thanh Tịnh Đạo Luận cắt nghĩa sabattaya là ta thấy mình ở trong tất cả, (he should identify himself with all). Atta tức là mình, sambbe là ở trong tất cả mọi loài. Đó không phải là chuyện tưởng tượng, không phải là chuyện cầu mong, mà là công phu quán chiếu. Đồng nhất mình với người, đó là cách duy nhất để có thể hiểu được người. Tìm hiểu ai, ta có thể chỉ tiếp xúc hời hợt bên ngoài thôi, nhưng có cách thứ hai là quán chiếu. Thực tập Từ Quán cũng vậy, ta phải đi sâu vào trong xương thịt của kẻ đó để thấy rõ được tình trạng của những niềm đau, nỗi khổ của họ.

Trong Kinh Niệm Xứ, Bụt thường hay nói : ‘‘Quán niệm thân thể trong thân thể, quán niệm cảm thọ trong cảm thọ, quán niệm tâm ý trong tâm ý, quán niệm đối tượng của tâm ý trong đối tượng tâm ý.’’ Chữ Hán: Quán thân ư thân. Quán thọ ư thọ. Quán tâm ư tâm. Quán pháp ư pháp. Có nghĩa là ta không đứng ngoài để nhìn đối tượng kia như là một thực thể riêng biệt, mà phải đi vào, đồng nhất mình với đối tượng đó, thì quán chiếu mới thành tựu. Đó là nguyên tắc quán chiếu trong đạo Bụt. Có một lần ở Hồng Kông, đi cứu trợ cho đồng bào ở các trại tị nạn, tôi gặp một thầy người Đức tu theo Nam Tông. Trong khi ngồi thuyền ra trại Chimawan, tôi hỏi: Thầy nghĩ sao về câu Kinh đó? Quán thân trong thân là sao? Thầy trả lời: Lặp như vậy để cho người ta nhớ đây là quán thân chứ không phải là quán tâm hay pháp. Rồi đến khi nói quán tâm trong tâm cũng như vậy, để nhắc cho người ta nhớ đây là quán tâm trong tâm chứ không phải là quán tâm trong cái khác. Tôi nói: Nếu như vậy thì nhấn mạnh không cần thiết. Rồi tôi cắt nghĩa rằng quán tâm trong tâm là mình đừng nhìn đối tượng đó là một đối tượng có ngoài mình. Mình phải đi vào đối tượng đó. Mình phải phá được ranh giới giữa chủ thể quán chiếu và đối tượng được quán chiếu thì mình mới có thể hiểu được đối tượng. Điều đó có nghĩa là trong đạo Bụt, sự thực tập quán chiếu phải căn cứ trên nguyên tắc bất nhị. Đối tượng mình đang quán chiếu, với mình là chủ thể quán chiếu, chừng nào chúng vẫn là hai khối riêng biệt thì kết quả sự quán chiếu không thành tựu. Thầy ấy đã hiểu và đã đồng ý.

Điều này rất là quan trọng. Khi nào ta làm mất ranh giới giữa chủ thể và đối tượng thì lúc đó trí tuệ thật sự mới phát hiện. Đó là đặc tính rất căn bản trong thiền quán của đạo Bụt. Quán chiếu cách mấy mà đối tượng kia vẫn còn tách biệt ở ngoài ta, thì ta chưa có tuệ giác. Điều này đúng với việc quán chiếu thân thể, với cảm thọ, với tất cả những tâm hành khác và những đối tượng của các tâm hành khác. Quán thân như thân. Quán thọ như thọ. Quán tâm như tâm. Quán pháp như pháp. Nhà thần học đạo Do Thái Martin Buber, trong tác phẩm I and Thou cũng nói những kinh nghiệm tương tự. Ông nói rằng khi mình quán chiếu và tiếp xúc với thượng đế, thì thượng đế không phải là một đối tượng cứng ngắc, gọi là It. Liên hệ giữa tín đồ với thượng đế không thể là liên hệ I – It, (không phải liên hệ Tôi – và Ngài ở ngoài tôi) mà phải là liên hệ I – Thou. Trong khi tiếp xúc, làm sao cái bản ngã của ta phải được tan ra, hòa nhập với đối tượng quán chiếu, thì ta mới tiếp xúc được với Thượng đế đích thực. Đó là phương pháp của nhà thần học Matin Buber. Cũng vậy, phép quán chiếu trong đạo Bụt là phải đi vào, trở thành một, phải xoá bỏ ranh giớii, thì tuệ giác bắt đầu mới có được.

!! Từ bi là hành động

Gởi tâm Từ bao trùm tất cả một phương, hai phương, ba phương, bốn phương… có thể chúng ta chưa hiểu được nỗi khổ, và niềm đau. Tâm Từ và tâm Bi làm phát sinh những nguồn năng lượng. Phải thực tập quán chiếu, phải thấy rất rõ những nỗi khổ, niềm đau, và nhu yếu hạnh phúc của người thì năng lượng Từ, Bi mới trào dâng. Khi mà năng lượng của Từ, của Bi, của Hỷ, và của Xả đã trào dâng sung mãn, như là đào giếng tới lúc mạch nước phun lên, thì những nội kết, oán thù, giận hờn, và tranh chấp mới tiêu tan, và con người của ta mới đổi mới. Lúc đó thì năng lượng của Từ và Bi mới biến được ra thành hành động, ngay trong đời sống hằng ngày của ta. Dù không ai khuyên nhắc, ta vẫn làm việc độ sanh để giúp đời như thường.

Cụm từ ‘‘như trở thành một với tất cả’’ rất quan trọng. Ví dụ khi ta giận một người, nghĩ rằng người đó là nguồn gốc bao nhiêu khổ đau của ta. Căn cứ trên nhận thức đó, ta nuôi dưỡng niềm oán hận, tự làm cho ta khổ, và cũng làm cho người ấy khổ. Vậy ta phải quán chiếu. Nhưng quán chiếu thế nào? Không thể chỉ nói : người ơi, tôi thương người lắm. Phải quán chiếu sâu vào nội tâm và cuộc đời của con người mà ta đang giận. Phải thấy được chính người đó cũng có những niềm đau, và nỗi khổ sâu xa. Những niềm đau nỗi khổ này có thể đã từ các thế hệ trước truyền lại, có thể từ xã hội, giáo dục, và học đường gây ra. Khi suy nghĩ thật sâu, ta thấy được tất cả những điều đó. Thấy được như vậy là tiếp xúc trực tiếp và sâu sắc. Đó là quán chiếu. Tiếp xúc được sâu sắc thì mạch nước của Từ, của Bi, của Hỷ, và của Xả mới trào lên. Khi mạch nước của Từ, Bi, Hỷ, Xả đã trào lên thì những nội kết, những khổ đau của chính ta mới tan loãng và được chuyển hóa. Không phải chỉ do ước mơ hay chúc tụng mà cơn giận chuyển hóa.

Trong truyền thống đạo Bụt, các thầy luôn luôn khuyên ta phát khởi Từ, Bi, Hỷ, và Xả đối với những người ta thân cận trước. Thí dụ ta bắt đầu từ thầy, tổ, nơi những vị mà ta đã tiếp nhận pháp môn tu học. Khi ta nghĩ tới các vị, đi vào tâm tư các vị, thì tấm lòng thương mến, biết ơn, và nỗi vui mừng phát sinh trong ta một cách dễ dàng. Lễ năm lễ hôm Tết, chúng ta đã thực tập theo truyền thống này. Năm lễ bắt đầu bằng việc quán tưởng về những người máu mủ thân thiết và gia đình tâm linh. Trong khi lạy xuống một lạy ta đồng thời quán chiếu, làm nảy sinh trong lòng những năng lượng của Từ, Bi, Hỷ và Xả. Nếu lạy xuống mà không quán chiếu, ta sẽ không thể đi sâu vào trong gia đình tâm linh của ta, không thể thấy rõ được Thầy, được các vị Tổ Sư, được Bụt. Như thế thì trong thời gian hai phút, hoặc ba phút lễ lạy những nguồn năng lượng của Từ, Bi, Hỷ, Xả không thể phát sinh.

Khi ta lạy cái lạy thứ nhất, năm vóc sát đất, ta tiếp xúc với cha mẹ ta rất cụ thể. Xương, thịt, máu huyết, những nhiễm thể của cha mẹ, và ông bà truyền lại. Ta thấy rất rõ cha mẹ, và ông bà với tất cả hạnh phúc, khổ đau, đang có mặt trong ta. Trong thời gian hai phút, nằm rạp xuống để quán chiếu, ta đi vào gia đình huyết thống và gia đình huyết thống cũng đi vào trong ta. Từ, Bi, Hỷ, và Xả phát sinh ra những nguồn năng lượng. Đó gọi là phổ châu nhất thiết.

Lạy thứ tư là để tiếp xúc với những người ta thương. Người ta thương có thể là những người đã quá cố. Lạy xuống, ta đem những năng lượng Từ, Bi, Hỷ, và Xả hướng đến cha, mẹ, anh, chị, em, ta mong ước cho họ vui tươi, có khả năng sống hạnh phúc mỗi ngày. Người hướng dẫn nói: Con xin truyền năng lượng cho những người con thương. Người thực tập phải thấy cho được cha mẹ hoặc anh chị em mình một cách cụ thể. Đó là quán tưởng và thực tập.

Lạy thứ nhất, thứ hai và thứ tư đều dễ thực tập. Lạy thứ ba là để tiếp xúc với xứ sở, với quốc gia nơi ta sống, tiếp xúc với tất cả những người đã từng khai phá, thành lập, xây dựng đất nước, giữ gìn bờ cõi, xây cầu cống, làm đường xá, thiết lập các định chế bảo vệ đời sống và hạnh phúc cho cộng đồng. Mỗi khi lái xe qua cầu, ta có chánh niệm, biết rằng cây cầu này xây lên được là do công sức bao nhiêu người. Đất nước này có an ninh, có trật tự, v.v.. là công trình của rất nhiều người. Khi lạy xuống như vậy, ta phải phổ nhập nhất thiết, (recognizing oneself in all), thì mới phát sinh lòng cảm thương, lòng biết ơn, và niềm hoan hỷ.

Trong cái lạy thứ năm, ta dùng năng lượng nuôi dưỡng từ bốn lạy đầu để tiếp xúc với những người đã làm ta khổ. Ta lạy xuống, nhìn cho rõ người ấy, với tất cả những yếu đuối, và sai lầm của người ấy. Người ấy đã không may tiếp nhận những hạt giống khổ đau nhiều quá. Vì thế người ấy đã làm khổ ta, làm khổ gia đình, làng xóm, và đồng bào ta. Nhưng người ấy cũng đang đau khổ, và những nỗi khổ đó vẫn kéo dài. Có một cựu chiến binh Hoa Kỳ trong chiến tranh đã gây cái chết của năm đứa trẻ con ở Việt Nam. Trong suốt 20 năm sau đó, ông ta vẫn khổ đau mãi về hình ảnh kia. Bạn đồng đội của ông ta bị phục kích chết. Ông đã chứng kiến, đã căm thù, đã bày ra một cuộc phục kích để trả thù lại bên địch. Trong số những dân làng chết, có năm đứa trẻ. Hình ảnh đó nằm mãi trong đầu ông. Trong hai mươi năm, hễ nhận ra là mình đang ngồi trong một phòng với trẻ em là ông ta hoảng hốt, thét lên, và chạy ra ngoài. Mãi cho đến khi gặp thầy, gặp bạn, học quán chiếu, và tu tập thì người cựu chiến binh ấy mới tự giải thoát được. Sau bảy tháng thực tập, ông ta đã được chuyển hóa. Lấy oán trả oán thì không bao giờ hết. Thù oán sẽ luân hồi mãi mãi, và khổ đau của ta cũng vậy. Lạy thứ năm là phát nguyện mong cho những người đã làm khổ mình cũng cùng chấm dứt được luân hồi, hết khổ, biết lấy Từ Bi để đáp lại căm thù. Cho nên khi lạy xuống, ta phải tâm niệm : ‘‘Con không muốn người đó khổ. Con không muốn gia đình người đó khổ. Con muốn người đó có thể nở được nụ cười. Con muốn người đó có thể có được niềm vui. Thật tình con mong muốn người ấy chấm dứt nỗi khổ. Và vì vậy con sẵn sàng truyền sang người ấy năng lượng Từ Bi Hỷ Xả của con. Xin Bụt, xin các vị Tổ Sư, xin ông bà, cha mẹ giúp con truyền cho người ấy những năng lượng và niềm vui đó.’’ Lạy xong tâm ta sẽ nhẹ đi, và ta tự giải thoát.

Các Tổ hay khuyên ta bắt đầu quán Từ Bi với những người mình thương trước. Rồi mới tới những người ta thương ít, hay những người gọi là người dưng nước lã. Ta dửng dưng với họ tại vì lâu nay ta coi họ là người xa lạ. Như những em bé bị giết ở Rwanda, những em bé đã chết và đang chết vì nội chiến ở Sarajevo, hay những em bé đang chết đói ở Somali. Đọc báo ta biết họ khổ nhưng ta không có thì giờ để quán chiếu, vì ta nghĩ họ là ‘‘người dưng’’. Sau khi đã tiếp xúc sâu sắc với người mình thương rồi, ta phải tiếp xúc với những người gọi là người dưng và quán chiếu như thế ta làm cho người dưng trở thành người thân thiết, trở thành đối tượng đích thực của Từ Bi ta. Sau cùng, ta tiếp xúc những người mà ta thù ghét, những người đã làm khổ ta. Nếu thành công trong hai bước đầu thì đến bước thứ ba này thế nào cũng thành công. Có người thực tập lạy suốt ngày. Họ lạy một ngàn không trăm tám mươi (1080) lạy buổi sáng, buổi trưa và buổi chiều. Nhưng lễ lạy thành công hay không, là do ta có quán chiếu hay không. Lễ lạy như một máy, cũng chỉ là tập thể thao, thôi chứ không có ích lợi gì mấy.

!! Quán chiếu để tự chuyển hóa

Tóm lại, Tứ Vô Lượng Tâm là một phương pháp tu tập thiền quán. Mới nghe đến Tứ Vô Lượng Tâm, ta cảm nghĩ giáo lý này hướng về tình cảm, nhưng tình cảm của Tứ Vô Lượng Tâm được tạo bằng chất liệu trí tuệ, tức là thiền quán. Tâm Từ chứa Bi, chứa Hỷ, và chứa Xả. Tình thương mà còn kỳ thị, còn phân biệt, tình thương mà không có niềm vui thì chưa phải là tình thương trong đạo Bụt. Tâm Bi cũng phải được làm bằng chất liệu của Từ, Hỷ, và Xả. Hỷ mà không có Từ, Bi, và Xả thì cũng không phải là Hỷ trong đạo Bụt. Xả trong đạo Bụt có nghĩa là không dính mắc, không phân biệt, kỳ thị, nhưng không có nghĩa là trốn tránh trách nhiệm. Phải có một thệ nguyện, một sự cam kết. Đây không phải là dửng dưng như người ta hiểu khi dịch Xả là indifference. Xả đây có nghĩa là Bất Xả, tức là buông nhưng không bỏ. Chúng ta khấn nguyện: ‘‘xin chư Phật từ bi bất xả’’. ‘‘Các vị Bụt xin đừng có bỏ con tội nghiệp’’. Xả đây không có nghĩa là không thương mà lại là bí quyết của tình thương chân thật trong đạo Bụt. Tứ Vô Lượng Tâm là giáo lý của Bụt về tình thương (the Buddhist teachings on love). Edward Conze khi viết về Từ, Bi, Hỷ và Xả đã gọi giáo lý này là ‘‘The cultivation of social emotions’’, như vậy đã là làm nghèo nội dung của bốn tâm vô lượng.

Tu tập bốn tâm này, ta sẽ đi tới giải thoát hoàn toàn, chứ không phải chỉ để có mục đích sanh lên cõi trời Phạm Thiên. Trong thời đại Bụt nhiều người tin tưởng ở Phạm Thiên (Brahma). Ao ước của họ là khi chết được sinh lên và cộng trú với Phạm Thiên, cũng tương tợ như những tín hữu Cơ Đốc giáo mong được về nước Chúa. Trong kinh, Bụt đã có một thái độ rất từ Đi đối với những người tin vào một Đấng Tối Cao và ước ao sau khi chết trở về gần gũi với Đấng Tối Cao ấy. Bụt không có thái độ đả phá. Bụt nói rằng Phạm Thiên, Brahma, là một đấng có Từ, có Bi, có Hỷ, và có Xả. Nếu quý vị muốn lên sống bên Ngài thì quý vị phải tu Từ, Bi, Hỷ, và Xả. Bụt không nói: ‘‘Không có Phạm Thiên đâu. Bạn đừng hy vọng hão huyền. Bạn hãy tu theo tôi và hãy từ bỏ tất cả những tín ngưỡng của bạn.’’

Nếu bậc Thầy của chúng ta đã làm như thế thì ta cũng nên theo con đường ấy. Giáo lý Cơ Đốc dạy rằng Thượng Đế là tình thương (Dieu est amour). Người Phật Tử chúng ta cũng phải nói: ‘‘Thượng đế là tình thương. Nếu muốn được Chúa yêu mến, nếu muốn về nước Chúa, quý vị phải thực tập tình thương chân thật’’. Và theo chúng tôi, tình thương chân thật phải có chất liệu của Từ, Bi, Hỷ và Xả. Rồi chúng ta đề nghị những phương pháp thực tập tình thương cụ thể. Tình thương mà người đời xử dụng có ý nghĩa rất mù mờ. Có khi thương nghĩa là đam mê, vướng mắc, khổ đau; đó không phải là tình thương đích thực ta nên thực tập. Vì vậy quý vị có thể sử dụng những phương pháp nuôi dưỡng, và phát triển tình thương nơi mình. Như thế chuyện trở về với Thượng đế, sống bên Thượng đế mới trở thành ra sự thật được. Con người đầy hận thù làm sao có thể sống chung với Đấng Tình Thương?

Giáo lý Tứ Vô Lượng Tâm mầu nhiệm vô cùng. Chúng ta hay nói về thương yêu nhưng chúng ta ít nhận biết được bản chất của thương yêu. Chúng ta đã học, chúng ta đã biết những yếu tố nào có thể làm nên tình thương yêu đích thực, và biết những phương pháp cụ thể để tạo ra chất liệu thương yêu, để chuyển hóa cả người thương và người được thương. Phương pháp năm cái lạy, chẳng hạn, rất cụ thể. Ngoài phương pháp đó ra chúng ta còn rất nhiều phương pháp khác nữa. Có một loại tình thương gọi là tình thương chiếm hữu (possesive love) không mang lại tự do, không đích thực là thương. Tình thương đích thực phải có Xả, tức là không kỳ thị và vướng mắc. Vậy tại sao chúng ta không thực tập và không chia sẻ? Tại sao không viết một bài về tự do trong tình thương? Đó là những đề tài rất mới, và cũng rất cũ. Niềm vui trong tình thương là một đề tài khác nên viết. Khi viết ta lấy kinh nghiệm của ta, lấy khổ đau của ta, lấy hạnh phúc của ta làm chất liệu. Ta thấy rằng thực tập đạo Bụt không khô khan chút nào. Thực tập trong đạo Bụt đem lại niềm vui và sự chuyển hóa. Đó là nhờ tình thương đích thực trong bốn tâm vô lượng.
! Oprah Winfrey talks with Thich Nhat Hanh Excerpt (Youtube)

<html>
<iframe width="560" height="315" src="https://www.youtube.com/embed/NJ9UtuWfs3U" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</html>

! How can I not let my anger explode and hurt others?

<html>
<iframe width="560" height="315" src="https://www.youtube.com/embed/AeMYRCv2Kmc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</html>
! Getting started

* [[Getting started]] guide for beginners
* [[FAQs]]

! Learning materials

* [[Secular Meditation]]
* [[Buddhist Meditation|Learning materials]]
* [[Others traditions]]

https://zen.tiddlyhost.com
zen.tiddlyhost.com
https://zen.tiddlyhost.com/thumb.png