Dreams become vivid by periods. It is not that we don’t dream, it is that the vividness of the dreams are dimmed to the point of irrelevance. We remember what we dream when we dream vividly.
<<list-links "[tag[→ Dreams]]">>
<<list-links "[tag[→ Journal]!prefix[$:/]!sort[]]">>
!!! Active work
[[Blank Page]]<br>
[[Runge]]<br>
[[Inner Observer]]<br>
[[Home]]<br>
!!! Standby work
[[The Virtuegraph]]<br>
[[espiral]]<br>
[[possible futures]]
[[Reading list]]<br>
!!! Completed projects
[[maskjerseys]]<br>
[[brow projector]]<br>
!!! Upcoming projects
[[Bézier Game]]<br>
[[Ruta de Cortés]]<br>
[[Peregrinación en el desierto]]<br>
<div class="tc-control-panel">
<<tabs "[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]" "$:/core/ui/ControlPanel/Info">>
</div>
{
"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-2020, 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\"><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\"><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\"><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 [[double square brackets]] for titles with spaces. Or you can choose to <$button set=\"$:/DefaultTiddlers\" setTo=\"[list[$:/StoryList]]\">retain story ordering</$button>"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt",
"text": "Default tiddlers"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint",
"text": "Choose which tiddlers are displayed at startup"
},
"$:/language/ControlPanel/Basics/Language/Prompt": {
"title": "$:/language/ControlPanel/Basics/Language/Prompt",
"text": "Hello! Current language:"
},
"$:/language/ControlPanel/Basics/NewJournal/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt",
"text": "Title of new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewJournal/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/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/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/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/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-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/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* ''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 variable\n* ''value'': Value of optional variable\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* 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/Upgrader/Plugins/Suppressed/Incompatible": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible",
"text": "Blocked incompatible or obsolete plugin"
},
"$:/language/Import/Upgrader/Plugins/Suppressed/Version": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Version",
"text": "Blocked plugin (due to incoming <<incoming>> being older than existing <<existing>>)"
},
"$:/language/Import/Upgrader/Plugins/Upgraded": {
"title": "$:/language/Import/Upgrader/Plugins/Upgraded",
"text": "Upgraded plugin from <<incoming>> to <<upgraded>>"
},
"$:/language/Import/Upgrader/State/Suppressed": {
"title": "$:/language/Import/Upgrader/State/Suppressed",
"text": "Blocked temporary state tiddler"
},
"$:/language/Import/Upgrader/System/Suppressed": {
"title": "$:/language/Import/Upgrader/System/Suppressed",
"text": "Blocked system tiddler"
},
"$:/language/Import/Upgrader/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/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/IsFilterOperator": {
"title": "$:/language/Error/IsFilterOperator",
"text": "Filter Error: Unknown operand for the 'is' 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/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/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/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",
"tags": "Journal"
},
"$:/language/Notifications/Save/Done": {
"title": "$:/language/Notifications/Save/Done",
"text": "Saved wiki"
},
"$:/language/Notifications/Save/Starting": {
"title": "$:/language/Notifications/Save/Starting",
"text": "Starting to save wiki"
},
"$:/language/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": "References"
},
"$:/language/TiddlerInfo/References/Empty": {
"title": "$:/language/TiddlerInfo/References/Empty",
"text": "No tiddlers link to this one"
},
"$:/language/TiddlerInfo/Tagging/Caption": {
"title": "$:/language/TiddlerInfo/Tagging/Caption",
"text": "Tagging"
},
"$:/language/TiddlerInfo/Tagging/Empty": {
"title": "$:/language/TiddlerInfo/Tagging/Empty",
"text": "No tiddlers are tagged with this one"
},
"$:/language/TiddlerInfo/Tools/Caption": {
"title": "$:/language/TiddlerInfo/Tools/Caption",
"text": "Tools"
},
"$:/language/Docs/Types/application/javascript": {
"title": "$:/language/Docs/Types/application/javascript",
"description": "JavaScript code",
"name": "application/javascript",
"group": "Developer",
"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 = $tw.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 = fs.readdirSync(folder);\n\t\t\tfor(var p=0; p<pluginFolders.length; p++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(pluginFolders[p])) {\n\t\t\t\t\tpluginFields = $tw.loadPluginFolder(path.resolve(folder,\"./\" + pluginFolders[p]));\n\t\t\t\t\tif(pluginFields && pluginFields.title) {\n\t\t\t\t\t\ttiddlers[pluginFields.title] = pluginFields;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcollectPublisherPlugins = function(folder) {\n\t\t\tvar publisherFolders = fs.readdirSync(folder);\n\t\t\tfor(var t=0; t<publisherFolders.length; t++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(publisherFolders[t])) {\n\t\t\t\t\tcollectPlugins(path.resolve(folder,\"./\" + publisherFolders[t]));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\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\tvarName = this.params[4],\n\t\tvarValue = this.params[5],\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template || title),\n\t\t\tvariables = {currentTiddler: title};\n\t\tif(varName) {\n\t\t\tvariables[varName] = varValue || \"\";\n\t\t}\n\t\tvar widgetNode = wiki.makeWidget(parser,{variables: variables}),\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> <pathname> <skinnylisting>\n\nThe tiddler identifies the bundle tiddler that contains the subtiddlers.\n\nThe pathname specifies the pathname to the folder in which the JSON files should be saved. The filename is the URL encoded title of the subtiddler.\n\nThe skinnylisting specifies the title of the tiddler to which a JSON catalogue of the subtiddlers will be saved. The JSON file contains the same data as the bundle tiddler but with the `text` field removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savelibrarytiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tcontainerTitle = this.params[0],\n\t\tfilter = this.params[1],\n\t\tbasepath = this.params[2],\n\t\tskinnyListTitle = this.params[3];\n\t// Get the container tiddler as data\n\tvar containerData = self.commander.wiki.getTiddlerDataCached(containerTitle,undefined);\n\tif(!containerData) {\n\t\treturn \"'\" + containerTitle + \"' is not a tiddler bundle\";\n\t}\n\t// Filter the list of plugins\n\tvar pluginList = [];\n\t$tw.utils.each(containerData.tiddlers,function(tiddler,title) {\n\t\tpluginList.push(title);\n\t});\n\tvar filteredPluginList;\n\tif(filter) {\n\t\tfilteredPluginList = self.commander.wiki.filterTiddlers(filter,null,self.commander.wiki.makeTiddlerIterator(pluginList));\n\t} else {\n\t\tfilteredPluginList = pluginList;\n\t}\n\t// Iterate through the plugins\n\tvar skinnyList = [];\n\t$tw.utils.each(filteredPluginList,function(title) {\n\t\tvar tiddler = containerData.tiddlers[title];\n\t\t// Save each JSON file and collect the skinny data\n\t\tvar pathname = path.resolve(self.commander.outputPath,basepath + encodeURIComponent(title) + \".json\");\n\t\t$tw.utils.createFileDirectories(pathname);\n\t\tfs.writeFileSync(pathname,JSON.stringify(tiddler),\"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 = !!$tw.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 fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\n\t\tdirectory: path.resolve(this.wikiFolderPath,directory),\n\t\twiki: this.wiki\n\t});\n\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\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.iframeNode.style[\"background-color\"] = this.widget.wiki.extractTiddlerDataItem(this.widget.wiki.getTiddlerText(\"$:/palette\"),\"tiddler-editor-background\");\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\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]);\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\tthis.domNode.style[\"background-color\"] = this.widget.wiki.extractTiddlerDataItem(this.widget.wiki.getTiddlerText(\"$:/palette\"),\"tiddler-editor-background\");\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.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\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 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\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\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.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\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\treturn true;\n};\n\n/*\nHandle a dom \"focus\" event\n*/\nSimpleEngine.prototype.handleFocusEvent = function(event) {\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\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 || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE]) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\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/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 = [],\n\t\tsubops = operator.operand.split(\"+\");\n\t// Check for common optimisations\n\tif(subops.length === 1 && subops[0] === \"\") {\n\t\treturn source;\n\t} else if(subops.length === 1 && subops[0] === \"tiddlers\") {\n\t\treturn options.wiki.each;\n\t} else if(subops.length === 1 && subops[0] === \"shadows\") {\n\t\treturn options.wiki.eachShadow;\n\t} else if(subops.length === 2 && subops[0] === \"tiddlers\" && subops[1] === \"shadows\") {\n\t\treturn options.wiki.eachTiddlerPlusShadows;\n\t} else if(subops.length === 2 && subops[0] === \"shadows\" && subops[1] === \"tiddlers\") {\n\t\treturn options.wiki.eachShadowPlusTiddlers;\n\t}\n\t// Do it the hard way\n\tfor(var t=0; t<subops.length; t++) {\n\t\tvar subop = allFilterOperators[subops[t]];\n\t\tif(subop) {\n\t\t\t$tw.utils.pushTop(results,subop(source,operator.prefix,options));\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"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 = types[type] || types.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 types = {\n\t\"number\": function(a,b) {\n\t\treturn compare($tw.utils.parseNumber(a),$tw.utils.parseNumber(b));\n\t},\n\t\"integer\": function(a,b) {\n\t\treturn compare($tw.utils.parseInt(a),$tw.utils.parseInt(b));\n\t},\n\t\"string\": function(a,b) {\n\t\treturn compare(\"\" + a,\"\" +b);\n\t},\n\t\"date\": function(a,b) {\n\t\tvar dateA = $tw.utils.parseDate(a),\n\t\t\tdateB = $tw.utils.parseDate(b);\n\t\tif(!isFinite(dateA)) {\n\t\t\tdateA = new Date(0);\n\t\t}\n\t\tif(!isFinite(dateB)) {\n\t\t\tdateB = new Date(0);\n\t\t}\n\t\treturn compare(dateA,dateB);\n\t},\n\t\"version\": function(a,b) {\n\t\treturn $tw.utils.compareVersions(a,b);\n\t}\n};\n\nfunction compare(a,b) {\n\tif(a > b) {\n\t\treturn +1;\n\t} else if(a < b) {\n\t\treturn -1;\n\t} else {\n\t\treturn 0;\n\t}\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/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\t\teditionInfo = $tw.utils.getEditionInfo();\n\tif(editionInfo) {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(editionInfo,title)) {\n\t\t\t\tresults.push(editionInfo[title].description || \"\");\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"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\t\teditionInfo = $tw.utils.getEditionInfo();\n\tif(editionInfo) {\n\t\t$tw.utils.each(editionInfo,function(info,name) {\n\t\t\tresults.push(name);\n\t\t});\n\t}\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"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));\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));\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/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($tw.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($tw.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] === \"\")) {\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] === \"\" || 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/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 = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerLinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"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) || options.wiki.getTiddlerText(operator.operand + 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.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/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/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/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 = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.trim(a)];}\n);\n\nexports.split = makeStringBinaryOperator(\n\tfunction(a,b) {return (\"\" + a).split(b);}\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 || \"\"));\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\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\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 /*jslint node: true, browser: true */\n /*global $tw: false */\n \"use strict\";\n\n /*\n Fetch titles from the current list\n */\n var prepare_results = function (source) {\n var results = [];\n source(function (tiddler, title) {\n results.push(title);\n });\n return results;\n };\n\n /*\n Moves a number of items from the tail of the current list before the item named in the operand\n */\n exports.putbefore = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1);\n return (index === -1) ?\n results.slice(0, -1) :\n results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));\n };\n\n /*\n Moves a number of items from the tail of the current list after the item named in the operand\n */\n exports.putafter = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1);\n return (index === -1) ?\n results.slice(0, -1) :\n results.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n };\n\n /*\n Replaces the item named in the operand with a number of items from the tail of the current list\n */\n exports.replace = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1);\n return (index === -1) ?\n results.slice(0, -count) :\n results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n };\n\n /*\n Moves a number of items from the tail of the current list to the head of the list\n */\n exports.putfirst = function (source, operator) {\n var results = prepare_results(source),\n count = $tw.utils.getInt(operator.suffix,1);\n return results.slice(-count).concat(results.slice(0, -count));\n };\n\n /*\n Moves a number of items from the head of the current list to the tail of the list\n */\n exports.putlast = function (source, operator) {\n var results = prepare_results(source),\n count = $tw.utils.getInt(operator.suffix,1);\n return results.slice(count).concat(results.slice(0, count));\n };\n\n /*\n Moves the item named in the operand a number of places forward or backward in the list\n */\n exports.move = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1),\n marker = results.splice(index, 1),\n offset = (index + count) > 0 ? index + count : 0;\n return results.slice(0, offset).concat(marker).concat(results.slice(offset));\n };\n\n /*\n Returns the items from the current list that are after the item named in the operand\n */\n exports.allafter = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand);\n return (index === -1) ? [] :\n (operator.suffix) ? results.slice(index) :\n results.slice(index + 1);\n };\n\n /*\n Returns the items from the current list that are before the item named in the operand\n */\n exports.allbefore = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand);\n return (index === -1) ? [] :\n (operator.suffix) ? results.slice(0, index + 1) :\n results.slice(0, index);\n };\n\n /*\n Appends the items listed in the operand array to the tail of the current list\n */\n exports.append = function (source, operator) {\n var append = $tw.utils.parseStringArray(operator.operand, \"true\"),\n results = prepare_results(source),\n count = parseInt(operator.suffix) || append.length;\n return (append.length === 0) ? results :\n (operator.prefix) ? results.concat(append.slice(-count)) :\n results.concat(append.slice(0, count));\n };\n\n /*\n Prepends the items listed in the operand array to the head of the current list\n */\n exports.prepend = function (source, operator) {\n var prepend = $tw.utils.parseStringArray(operator.operand, \"true\"),\n results = prepare_results(source),\n count = $tw.utils.getInt(operator.suffix,prepend.length);\n return (prepend.length === 0) ? results :\n (operator.prefix) ? prepend.slice(-count).concat(results) :\n prepend.slice(0, count).concat(results);\n };\n\n /*\n Returns all items from the current list except the items listed in the operand array\n */\n exports.remove = function (source, operator) {\n var array = $tw.utils.parseStringArray(operator.operand, \"true\"),\n results = prepare_results(source),\n count = parseInt(operator.suffix) || array.length,\n p,\n len,\n index;\n len = array.length - 1;\n for (p = 0; p < count; ++p) {\n if (operator.prefix) {\n index = results.indexOf(array[len - p]);\n } else {\n index = results.indexOf(array[p]);\n }\n if (index !== -1) {\n results.splice(index, 1);\n }\n }\n return results;\n };\n\n /*\n Returns all items from the current list sorted in the order of the items in the operand array\n */\n exports.sortby = function (source, operator) {\n var results = prepare_results(source);\n if (!results || results.length < 2) {\n return results;\n }\n var lookup = $tw.utils.parseStringArray(operator.operand, \"true\");\n results.sort(function (a, b) {\n return lookup.indexOf(a) - lookup.indexOf(b);\n });\n return results;\n };\n\n /*\n Removes all duplicate items from the current list\n */\n exports.unique = function (source, operator) {\n var results = prepare_results(source);\n var set = results.reduce(function (a, b) {\n if (a.indexOf(b) < 0) {\n a.push(b);\n }\n return a;\n }, []);\n return set;\n };\n})();\n",
"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\n\t\tp = nextBracketPos + 1;\n\t\tswitch (bracket) {\n\t\t\tcase \"{\": // Curly brackets\n\t\t\t\toperator.indirect = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"[\": // Square brackets\n\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"<\": // Angle brackets\n\t\t\t\toperator.variable = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"/\": // regexp brackets\n\t\t\t\tvar rex = /^((?:[^\\\\\\/]*|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\tif(rexMatch) {\n\t\t\t\t\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\n// DEPRECATION WARNING\nconsole.log(\"WARNING: Filter\",operator.operator,\"has a deprecated regexp operand\",operator.regexp);\n\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow \"Unterminated regular expression in filter expression\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing closing bracket in filter expression\";\n\t\t}\n\t\tif(!operator.regexp) {\n\t\t\toperator.operand = filterString.substring(p,nextBracketPos);\n\t\t}\n\t\tp = nextBracketPos + 1;\n\n\t\t// Push this operator\n\t\toperators.push(operator);\n\t} while(filterString.charAt(p) !== \"]\");\n\t// Skip the ending square bracket\n\tif(filterString.charAt(p++) !== \"]\") {\n\t\tthrow \"Missing ] in filter expression\";\n\t}\n\t// Return the parsing position\n\treturn p;\n}\n\n/*\nParse a filter string\n*/\nexports.parseFilter = function(filterString) {\n\tfilterString = filterString || \"\";\n\tvar results = [], // Array of arrays of operator nodes {operator:,operand:}\n\t\tp = 0, // Current position in the filter string\n\t\tmatch;\n\tvar whitespaceRegExp = /(\\s+)/mg,\n\t\toperandRegExp = /((?:\\+|\\-|~|=)?)(?:(\\[)|(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\s\\[\\]]+))/mg;\n\twhile(p < filterString.length) {\n\t\t// Skip any whitespace\n\t\twhitespaceRegExp.lastIndex = p;\n\t\tmatch = whitespaceRegExp.exec(filterString);\n\t\tif(match && match.index === p) {\n\t\t\tp = p + match[0].length;\n\t\t}\n\t\t// Match the start of the operation\n\t\tif(p < filterString.length) {\n\t\t\toperandRegExp.lastIndex = p;\n\t\t\tmatch = operandRegExp.exec(filterString);\n\t\t\tif(!match || match.index !== p) {\n\t\t\t\tthrow $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++;\n\t\t\t}\n\t\t\tif(match[2]) { // Opening square bracket\n\t\t\t\tp = parseFilterOperation(operation.operators,filterString,p);\n\t\t\t} else {\n\t\t\t\tp = match.index + match[0].length;\n\t\t\t}\n\t\t\tif(match[3] || match[4] || match[5]) { // Double quoted string, single quoted string or unquoted title\n\t\t\t\toperation.operators.push(\n\t\t\t\t\t{operator: \"title\", operand: match[3] || match[4] || match[5]}\n\t\t\t\t);\n\t\t\t}\n\t\t\tresults.push(operation);\n\t\t}\n\t}\n\treturn results;\n};\n\nexports.getFilterOperators = function() {\n\tif(!this.filterOperators) {\n\t\t$tw.Wiki.prototype.filterOperators = {};\n\t\t$tw.modules.applyMethods(\"filteroperator\",this.filterOperators);\n\t}\n\treturn this.filterOperators;\n};\n\nexports.filterTiddlers = function(filterString,widget,source) {\n\tvar fn = this.compileFilter(filterString);\n\treturn fn.call(this,source,widget);\n};\n\n/*\nCompile a filter into a function with the signature fn(source,widget) where:\nsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\nwidget: an optional widget node for retrieving the current tiddler etc.\n*/\nexports.compileFilter = function(filterString) {\n\tvar filterParseTree;\n\ttry {\n\t\tfilterParseTree = this.parseFilter(filterString);\n\t} catch(e) {\n\t\treturn function(source,widget) {\n\t\t\treturn [$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 operand = operator.operand,\n\t\t\t\t\toperatorFunction;\n\t\t\t\tif(!operator.operator) {\n\t\t\t\t\toperatorFunction = filterOperators.title;\n\t\t\t\t} else if(!filterOperators[operator.operator]) {\n\t\t\t\t\toperatorFunction = filterOperators.field;\n\t\t\t\t} else {\n\t\t\t\t\toperatorFunction = filterOperators[operator.operator];\n\t\t\t\t}\n\t\t\t\tif(operator.indirect) {\n\t\t\t\t\toperand = self.getTextReference(operator.operand,\"\",currTiddlerTitle);\n\t\t\t\t}\n\t\t\t\tif(operator.variable) {\n\t\t\t\t\toperand = widget.getVariable(operator.operand,{defaultValue: \"\"});\n\t\t\t\t}\n\t\t\t\t// Invoke the appropriate filteroperator module\n\t\t\t\tresults = operatorFunction(accumulator,{\n\t\t\t\t\t\t\toperator: operator.operator,\n\t\t\t\t\t\t\toperand: operand,\n\t\t\t\t\t\t\tprefix: operator.prefix,\n\t\t\t\t\t\t\tsuffix: operator.suffix,\n\t\t\t\t\t\t\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\t// Wrap the operator functions in a wrapper function that depends on the prefix\n\t\toperationFunctions.push((function() {\n\t\t\tswitch(operation.prefix || \"\") {\n\t\t\t\tcase \"\": // No prefix means that the operation is unioned into the result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"=\": // The results of the operation are pushed into the result without deduplication\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\tArray.prototype.push.apply(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"-\": // The results of this operation are removed from the main result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.removeArrayEntries(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"+\": // This operation is applied to the main results so far\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\n\t\t\t\t\t\tsource = self.makeTiddlerIterator(results);\n\t\t\t\t\t\tresults.splice(0,results.length);\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"~\": // This operation is unioned into the result only if the main result so far is empty\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\tif(results.length === 0) {\n\t\t\t\t\t\t\t// Main result so far is empty\n\t\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\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 = [];\n\t\t$tw.utils.each(operationFunctions,function(operationFunction) {\n\t\t\toperationFunction(results,source,widget);\n\t\t});\n\t\treturn results;\n\t});\n};\n\n})();\n",
"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() {\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\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// 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.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;\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 = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"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 = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"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 ? \"–\" : \"—\";\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: ©\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\t\tvar reEndString = \"</\" + $tw.utils.escapeRegExp(tag.tag) + \">\",\n\t\t\t\treEnd = new RegExp(\"(\" + reEndString + \")\",\"mg\");\n\t\tif(hasLineBreak) {\n\t\t\ttag.children = this.parser.parseBlocks(reEndString);\n\t\t} else {\n\t\t\ttag.children = this.parser.parseInlineRun(reEnd);\n\t\t}\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tvar endMatch = reEnd.exec(this.parser.source);\n\t\tif(endMatch && endMatch.index === this.parser.pos) {\n\t\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t\t}\n\t}\n\t// Return the tag\n\treturn [tag];\n};\n\n/*\nLook for an HTML tag. Returns null if not found, otherwise returns {type: \"element\", name:, attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseTag = function(source,pos,options) {\n\toptions = options || {};\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Define our regexps\n\tvar reTagName = /([a-zA-Z0-9\\-\\$]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a less than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\"<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the tag name\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,reTagName);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tnode.tag = token.match[1];\n\tif(node.tag.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\t// Regexp to match\n\tthis.matchRegExp = /<<([^>\\s]+)(?:\\s*)((?:[^>]|(?:>(?!>)))*?)>>(?:\\r?\\n|$)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params,\n\t\tisBlock: true\n\t}];\n};\n\n})();\n",
"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\t// Regexp to match\n\tthis.matchRegExp = /<<([^\\s>]+)\\s*([\\s\\S]*?)>>/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5]|| paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params\n\t}];\n};\n\n})();\n",
"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\nvar WikiParser = function(type,text,options) {\n\tthis.wiki = options.wiki;\n\tvar self = this;\n\t// Check for an externally linked tiddler\n\tif($tw.browser && (text || \"\") === \"\" && options._canonical_uri) {\n\t\tthis.loadRemoteTiddler(options._canonical_uri);\n\t\ttext = $tw.language.getRawString(\"LazyLoadingWarning\");\n\t}\n\t// Initialise the classes if we don't have them already\n\tif(!this.pragmaRuleClasses) {\n\t\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.pragmaRuleClasses,\"$:/config/WikiParserRules/Pragmas/\");\n\t}\n\tif(!this.blockRuleClasses) {\n\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.blockRuleClasses,\"$:/config/WikiParserRules/Block/\");\n\t}\n\tif(!this.inlineRuleClasses) {\n\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.inlineRuleClasses,\"$:/config/WikiParserRules/Inline/\");\n\t}\n\t// Save the parse text\n\tthis.type = type || \"text/vnd.tiddlywiki\";\n\tthis.source = text || \"\";\n\tthis.sourceLength = this.source.length;\n\t// Flag for ignoring whitespace\n\tthis.configTrimWhiteSpace = false;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(this.pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(this.blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(this.inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\n\tthis.tree = [];\n\tvar topBranch = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(options.parseAsInline) {\n\t\ttopBranch.push.apply(topBranch,this.parseInlineRun());\n\t} else {\n\t\ttopBranch.push.apply(topBranch,this.parseBlocks());\n\t}\n\t// Return the parse tree\n};\n\n/*\n*/\nWikiParser.prototype.loadRemoteTiddler = function(url) {\n\tvar self = this;\n\t$tw.utils.httpRequest({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tcallback: function(err,data) {\n\t\t\tif(!err) {\n\t\t\t\tvar tiddlers = self.wiki.deserializeTiddlers(\".tid\",data,self.wiki.getCreationFields());\n\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\ttiddler[\"_canonical_uri\"] = url;\n\t\t\t\t});\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tself.wiki.addTiddlers(tiddlers);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\n*/\nWikiParser.prototype.setupRules = function(proto,configPrefix) {\n\tvar self = this;\n\tif(!$tw.safemode) {\n\t\t$tw.utils.each(proto,function(object,name) {\n\t\t\tif(self.wiki.getTiddlerText(configPrefix + name,\"enable\") !== \"enable\") {\n\t\t\t\tdelete proto[name];\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nInstantiate an array of parse rules\n*/\nWikiParser.prototype.instantiateRules = function(classes,type,startPos) {\n\tvar rulesInfo = [],\n\t\tself = this;\n\t$tw.utils.each(classes,function(RuleClass) {\n\t\t// Instantiate the rule\n\t\tvar rule = new RuleClass(self);\n\t\trule.is = {};\n\t\trule.is[type] = true;\n\t\trule.init(self);\n\t\tvar matchIndex = rule.findNextMatch(startPos);\n\t\tif(matchIndex !== undefined) {\n\t\t\trulesInfo.push({\n\t\t\t\trule: rule,\n\t\t\t\tmatchIndex: matchIndex\n\t\t\t});\n\t\t}\n\t});\n\treturn rulesInfo;\n};\n\n/*\nSkip any whitespace at the current position. Options are:\n\ttreatNewlinesAsNonWhitespace: true if newlines are NOT to be treated as whitespace\n*/\nWikiParser.prototype.skipWhitespace = function(options) {\n\toptions = options || {};\n\tvar whitespaceRegExp = options.treatNewlinesAsNonWhitespace ? /([^\\S\\n]+)/mg : /(\\s+)/mg;\n\twhitespaceRegExp.lastIndex = this.pos;\n\tvar whitespaceMatch = whitespaceRegExp.exec(this.source);\n\tif(whitespaceMatch && whitespaceMatch.index === this.pos) {\n\t\tthis.pos = whitespaceRegExp.lastIndex;\n\t}\n};\n\n/*\nGet the next match out of an array of parse rule instances\n*/\nWikiParser.prototype.findNextMatch = function(rules,startPos) {\n\t// Find the best matching rule by finding the closest match position\n\tvar matchingRule,\n\t\tmatchingRulePos = this.sourceLength;\n\t// Step through each rule\n\tfor(var t=0; t<rules.length; t++) {\n\t\tvar ruleInfo = rules[t];\n\t\t// Ask the rule to get the next match if we've moved past the current one\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex < startPos) {\n\t\t\truleInfo.matchIndex = ruleInfo.rule.findNextMatch(startPos);\n\t\t}\n\t\t// Adopt this match if it's closer than the current best match\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex <= matchingRulePos) {\n\t\t\tmatchingRule = ruleInfo;\n\t\t\tmatchingRulePos = ruleInfo.matchIndex;\n\t\t}\n\t}\n\treturn matchingRule;\n};\n\n/*\nParse any pragmas at the beginning of a block of parse text\n*/\nWikiParser.prototype.parsePragmas = function() {\n\tvar currentTreeBranch = this.tree;\n\twhile(true) {\n\t\t// Skip whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check for the end of the text\n\t\tif(this.pos >= this.sourceLength) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check if we've arrived at a pragma rule match\n\t\tvar nextMatch = this.findNextMatch(this.pragmaRules,this.pos);\n\t\t// If not, just exit\n\t\tif(!nextMatch || nextMatch.matchIndex !== this.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the pragma rule\n\t\tvar subTree = nextMatch.rule.parse();\n\t\tif(subTree.length > 0) {\n\t\t\t// Quick hack; we only cope with a single parse tree node being returned, which is true at the moment\n\t\t\tcurrentTreeBranch.push.apply(currentTreeBranch,subTree);\n\t\t\tsubTree[0].children = [];\n\t\t\tcurrentTreeBranch = subTree[0].children;\n\t\t}\n\t}\n\treturn currentTreeBranch;\n};\n\n/*\nParse a block from the current position\n\tterminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis\n*/\nWikiParser.prototype.parseBlock = function(terminatorRegExpString) {\n\tvar terminatorRegExp = terminatorRegExpString ? new RegExp(\"(\" + terminatorRegExpString + \"|\\\\r?\\\\n\\\\r?\\\\n)\",\"mg\") : /(\\r?\\n\\r?\\n)/mg;\n\tthis.skipWhitespace();\n\tif(this.pos >= this.sourceLength) {\n\t\treturn [];\n\t}\n\t// Look for a block rule that applies at the current position\n\tvar nextMatch = this.findNextMatch(this.blockRules,this.pos);\n\tif(nextMatch && nextMatch.matchIndex === this.pos) {\n\t\treturn nextMatch.rule.parse();\n\t}\n\t// Treat it as a paragraph if we didn't find a block rule\n\treturn [{type: \"element\", tag: \"p\", children: this.parseInlineRun(terminatorRegExp)}];\n};\n\n/*\nParse a series of blocks of text until a terminating regexp is encountered or the end of the text\n\tterminatorRegExpString: terminating regular expression\n*/\nWikiParser.prototype.parseBlocks = function(terminatorRegExpString) {\n\tif(terminatorRegExpString) {\n\t\treturn this.parseBlocksTerminated(terminatorRegExpString);\n\t} else {\n\t\treturn this.parseBlocksUnterminated();\n\t}\n};\n\n/*\nParse a block from the current position to the end of the text\n*/\nWikiParser.prototype.parseBlocksUnterminated = function() {\n\tvar tree = [];\n\twhile(this.pos < this.sourceLength) {\n\t\ttree.push.apply(tree,this.parseBlock());\n\t}\n\treturn tree;\n};\n\n/*\nParse blocks of text until a terminating regexp is encountered\n*/\nWikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {\n\tvar terminatorRegExp = new RegExp(\"(\" + terminatorRegExpString + \")\",\"mg\"),\n\t\ttree = [];\n\t// Skip any whitespace\n\tthis.skipWhitespace();\n\t// Check if we've got the end marker\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar match = terminatorRegExp.exec(this.source);\n\t// Parse the text into blocks\n\twhile(this.pos < this.sourceLength && !(match && match.index === this.pos)) {\n\t\tvar blocks = this.parseBlock(terminatorRegExpString);\n\t\ttree.push.apply(tree,blocks);\n\t\t// Skip any whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check if we've got the end marker\n\t\tterminatorRegExp.lastIndex = this.pos;\n\t\tmatch = terminatorRegExp.exec(this.source);\n\t}\n\tif(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t}\n\treturn tree;\n};\n\n/*\nParse a run of text at the current position\n\tterminatorRegExp: a regexp at which to stop the run\n\toptions: see below\nOptions available:\n\teatTerminator: move the parse position past any encountered terminator (default false)\n*/\nWikiParser.prototype.parseInlineRun = function(terminatorRegExp,options) {\n\tif(terminatorRegExp) {\n\t\treturn this.parseInlineRunTerminated(terminatorRegExp,options);\n\t} else {\n\t\treturn this.parseInlineRunUnterminated(options);\n\t}\n};\n\nWikiParser.prototype.parseInlineRunUnterminated = function(options) {\n\tvar tree = [];\n\t// Find the next occurrence of an inline rule\n\tvar nextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around the matches until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && nextMatch) {\n\t\t// Process the text preceding the run rule\n\t\tif(nextMatch.matchIndex > this.pos) {\n\t\t\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 keepFilter;\n\tif(type === \"only\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) !== -1;\n\t\t};\n\t} else if(type === \"except\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) === -1;\n\t\t};\n\t} else {\n\t\treturn;\n\t}\n\t// Define a function to process each of our rule arrays\n\tvar processRuleArray = function(ruleArray) {\n\t\tfor(var t=ruleArray.length-1; t>=0; t--) {\n\t\t\tif(!keepFilter(ruleArray[t].rule.name)) {\n\t\t\t\truleArray.splice(t,1);\n\t\t\t}\n\t\t}\n\t};\n\t// Process each rule array\n\tprocessRuleArray(this.pragmaRules);\n\tprocessRuleArray(this.blockRules);\n\tprocessRuleArray(this.inlineRules);\n};\n\nexports[\"text/vnd.tiddlywiki\"] = WikiParser;\n\n})();\n\n",
"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\" && 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\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t}\n};\n\nexports.SaverHandler = SaverHandler;\n\n})();\n",
"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/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\": \"Basic \" + window.btoa(username + \":\" + password)\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !path || !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\") || \"master\",\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};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !path || !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 || !path || !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/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\turl = this.wiki.getTextReference(\"$:/UploadURL\");\n\t// Bail out if we don't have the bits we need\n\tif(!username || username.toString().trim() === \"\" || !password || password.toString().trim() === \"\") {\n\t\treturn false;\n\t}\n\t// Construct the url if not provided\n\tif(!url) {\n\t\turl = \"http://\" + username + \".tiddlyspot.com/store.cgi\";\n\t}\n\t// Assemble the header\n\tvar boundary = \"---------------------------\" + \"AaB03x\";\t\n\tvar uploadFormName = \"UploadPlugin\";\n\tvar head = [];\n\thead.push(\"--\" + boundary + \"\\r\\nContent-disposition: form-data; name=\\\"UploadPlugin\\\"\\r\\n\");\n\thead.push(\"backupDir=\" + backupDir + \";user=\" + username + \";password=\" + password + \";uploaddir=\" + uploadDir + \";;\"); \n\thead.push(\"\\r\\n\" + \"--\" + boundary);\n\thead.push(\"Content-disposition: form-data; name=\\\"userfile\\\"; filename=\\\"\" + uploadFilename + \"\\\"\");\n\thead.push(\"Content-Type: text/html;charset=UTF-8\");\n\thead.push(\"Content-Length: \" + text.length + \"\\r\\n\");\n\thead.push(\"\");\n\t// Assemble the tail and the data itself\n\tvar tail = \"\\r\\n--\" + boundary + \"--\\r\\n\",\n\t\tdata = head.join(\"\\r\\n\") + text + tail;\n\t// Do the HTTP post\n\tvar http = new XMLHttpRequest();\n\thttp.open(\"POST\",url,true,username,password);\n\thttp.setRequestHeader(\"Content-Type\",\"multipart/form-data; charset=UTF-8; boundary=\" + boundary);\n\thttp.onreadystatechange = function() {\n\t\tif(http.readyState == 4 && http.status == 200) {\n\t\t\tif(http.responseText.substr(0,4) === \"0 - \") {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tcallback(http.responseText);\n\t\t\t}\n\t\t}\n\t};\n\ttry {\n\t\thttp.send(data);\n\t} catch(ex) {\n\t\treturn callback($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($tw.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\");\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($tw.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\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/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($tw.wiki.getTiddlerText(\"$:/config/Server/AllowAllExternalFilters\") !== \"yes\") {\n\t\tif($tw.wiki.getTiddlerText(\"$:/config/Server/ExternalFilters/\" + filter) !== \"yes\") {\n\t\t\tconsole.log(\"Blocked attempt to GET /recipes/default/tiddlers/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\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.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.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($tw.boot.wikiPath,tlsKeyFilepath),\"utf8\"),\n\t\t\tcert: fs.readFileSync(path.resolve($tw.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\tvar pathprefix = this.get(\"path-prefix\") || \"\";\n\tfor(var t=0; t<this.routes.length; t++) {\n\t\tvar potentialRoute = this.routes[t],\n\t\t\tpathRegExp = potentialRoute.path,\n\t\t\tpathname = state.urlInfo.pathname,\n\t\t\tmatch;\n\t\tif(pathprefix) {\n\t\t\tif(pathname.substr(0,pathprefix.length) === pathprefix) {\n\t\t\t\tpathname = pathname.substr(pathprefix.length) || \"/\";\n\t\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t\t} else {\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t}\n\t\tif(match && request.method === potentialRoute.method) {\n\t\t\tstate.params = [];\n\t\t\tfor(var p=1; p<match.length; p++) {\n\t\t\t\tstate.params.push(match[p]);\n\t\t\t}\n\t\t\treturn potentialRoute;\n\t\t}\n\t}\n\treturn null;\n};\n\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) {\n\t// Compose the state object\n\tvar self = this;\n\tvar state = {};\n\tstate.wiki = self.wiki;\n\tstate.server = self;\n\tstate.urlInfo = url.parse(request.url);\n\tstate.queryParameters = querystring.parse(state.urlInfo.query);\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(!$tw.wiki.getTiddler(\"$:/plugins/tiddlywiki/tiddlyweb\") || !$tw.wiki.getTiddler(\"$:/plugins/tiddlywiki/filesystem\")) {\n\t\t$tw.utils.warning(\"Warning: Plugins required for client-server operation (\\\"tiddlywiki/filesystem\\\" and \\\"tiddlywiki/tiddlyweb\\\") are missing from tiddlywiki.info file\");\n\t}\n\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 = 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\troot.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\",\"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text);\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// Collect up the info tiddlers\n\tvar infoTiddlerFields = {};\n\t// Give each info module a chance to fill in as many info tiddlers as they want\n\t$tw.modules.forEachModuleOfType(\"info\",function(title,moduleExports) {\n\t\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\n\t\t\tvar tiddlerFieldsArray = moduleExports.getInfoTiddlerFields(infoTiddlerFields);\n\t\t\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\n\t\t\t\tif(fields) {\n\t\t\t\t\tinfoTiddlerFields[fields.title] = fields;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Bake the info tiddlers into a plugin. We use the non-standard plugin-type \"info\" because ordinary plugins are only registered asynchronously after being loaded dynamically\n\tvar fields = {\n\t\ttitle: TITLE_INFO_PLUGIN,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"info\",\n\t\ttext: JSON.stringify({tiddlers: infoTiddlerFields},null,$tw.config.preferences.jsonSpaces)\n\t};\n\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\n\t$tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]);\n\t$tw.wiki.registerPluginTiddlers(\"info\");\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\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\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\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\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}\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/PageTemplate\";\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});\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};\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// 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\tvar modules,n,m,f;\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\tvar executeStartupTiddlers = function(tag) {\n\t\t$tw.utils.each($tw.wiki.filterTiddlers(\"[all[shadows+tiddlers]tag[\" + tag + \"]!has[draft.of]]\"),function(title) {\n\t\t\t$tw.rootWidget.invokeActionString($tw.wiki.getTiddlerText(title),$tw.rootWidget);\n\t\t});\n\t};\n\texecuteStartupTiddlers(\"$:/tags/StartupAction\");\n\tif($tw.browser) {\n\t\texecuteStartupTiddlers(\"$:/tags/StartupAction/Browser\");\t\t\n\t}\n\tif($tw.node) {\n\t\texecuteStartupTiddlers(\"$:/tags/StartupAction/Node\");\t\t\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\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\t$tw.wiki.addToHistory(target);\n\t\t} else if(storyList.length > 0) {\n\t\t\t$tw.wiki.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)\nvar windows = {};\n\nexports.startup = function() {\n\t// Handle open window message\n\t$tw.rootWidget.addEventListener(\"tm-open-window\",function(event) {\n\t\t// Get the parameters\n\t\tvar refreshHandler,\n\t\t\ttitle = event.param || event.tiddlerTitle,\n\t\t\tparamObject = event.paramObject || {},\n\t\t\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\twindows[title] = srcWindow;\n\t\t// Check for reopening the same window\n\t\tif(srcWindow.haveInitialisedWindow) {\n\t\t\treturn;\n\t\t}\n\t\t// Initialise the document\n\t\tsrcDocument.write(\"<html><head></head><body class='tc-body tc-single-tiddler-window'></body></html>\");\n\t\tsrcDocument.close();\n\t\tsrcDocument.title = windowTitle;\n\t\tsrcWindow.addEventListener(\"beforeunload\",function(event) {\n\t\t\tdelete windows[title];\n\t\t\t$tw.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t},false);\n\t\t// Set up the styles\n\t\tvar styleWidgetNode = $tw.wiki.makeTranscludeWidget(\"$:/core/ui/PageStylesheet\",{\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\t\tname: \"click\",\n\t\t\thandlerObject: $tw.popup,\n\t\t\thandlerMethod: \"handleEvent\"\n\t\t}]);\n\t\tsrcWindow.haveInitialisedWindow = true;\n\t});\n\t// Close open windows when unloading main window\n\t$tw.addUnloadTask(function() {\n\t\t$tw.utils.each(windows,function(win) {\n\t\t\twin.close();\n\t\t});\n\t});\n\n};\n\n})();\n",
"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.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\t\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() {\n\t\t\tself.handleLoginEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-logout\",function() {\n\t\t\tself.handleLogoutEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-server-refresh\",function() {\n\t\t\tself.handleRefreshEvent();\n\t\t});\n\t\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 && $tw.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== \"yes\") {\n\t\tthis.wiki.addEventListener(\"lazyLoad\",function(title) {\n\t\t\tself.handleLazyLoadEvent(title);\n\t\t});\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;\t\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.tiddlerExists(title) && self.wiki.getTiddler(title);\n\t\tself.tiddlerInfo[title] = {\n\t\t\trevision: self.getTiddlerRevision(title),\n\t\t\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\n\t\t\tchangeCount: self.wiki.getChangeCount(title)\n\t\t};\n\t});\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSyncer.prototype.isDirty = function() {\n\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($tw.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) {\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}\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\tself.pollTimerId = setTimeout(function() {\n\t\t\t\tself.pollTimerId = null;\n\t\t\t\tself.syncFromServer.call(self);\n\t\t\t},self.pollTimerInterval);\n\t\t};\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\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\tif(updates.modifications.length > 0 || updates.deletions.length > 0) {\n\t\t\t\t\tself.processTaskQueue();\n\t\t\t\t}\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\tdelete self.tiddlerInfo[title];\n\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\tself.wiki.deleteTiddler(title);\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\t$tw.passwordPrompt.createPrompt({\n\t\t\t\tserviceName: $tw.language.getString(\"LoginToTiddlySpace\"),\n\t\t\t\tcallback: function(data) {\n\t\t\t\t\tself.login(data.username,data.password,function(err,isLoggedIn) {\n\t\t\t\t\t\tself.syncFromServer();\n\t\t\t\t\t});\n\t\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n};\n\n/*\nAttempt to login to TiddlyWeb.\n\tusername: username\n\tpassword: password\n\tcallback: invoked with arguments (err,isLoggedIn)\n*/\nSyncer.prototype.login = function(username,password,callback) {\n\tthis.logger.log(\"Attempting to login as\",username);\n\tvar self = this;\n\tif(this.syncadaptor.login) {\n\t\tthis.syncadaptor.login(username,password,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.getStatus(function(err,isLoggedIn,username) {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback(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);\t\t\t\t\t\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();\t\t\t\t\n\t\t\t}\n\t\t}\n\t} else {\n\t\tthis.updateDirtyStatus();\t\t\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 || $tw.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); \t\t\t\t\t\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} 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 = $tw.wiki.doesPluginInfoRequireReload(JSON.parse(incomingTiddler.text)) ? ($tw.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] = requiresReload + $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++)(e=r.charCodeAt(t))<128?o+=String.fromCharCode(e):e>127&&e<2048?(o+=String.fromCharCode(e>>6|192),o+=String.fromCharCode(63&e|128)):(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;)(t=r.charCodeAt(o))<128?(e+=String.fromCharCode(t),o++):t>191&&t<224?(e+=String.fromCharCode((31&t)<<6|63&r.charCodeAt(o+1)),o+=2):(e+=String.fromCharCode((15&t)<<12|(63&r.charCodeAt(o+1))<<6|63&r.charCodeAt(o+2)),o+=3);return e}}},this),function(r,e,o,t){if(void 0!==o.module&&o.module.exports){if(t&&o.require)for(var n=0;n<t.length;n++)o[t[n]]=o.require(t[n]);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,n,i,d,f,a,h,c=\"\",u=0;u<r.length;)d=(t=r.charCodeAt(u++))>>2,f=(3&t)<<4|(n=r.charCodeAt(u++))>>4,a=(15&n)<<2|(i=r.charCodeAt(u++))>>6,h=63&i,isNaN(n)?a=h=64:isNaN(i)&&(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,n,i,d,f,a,h=\"\",c=0;c<r.length;)t=o.indexOf(r.charAt(c++))<<2|(d=o.indexOf(r.charAt(c++)))>>4,n=(15&d)<<4|(f=o.indexOf(r.charAt(c++)))>>2,i=(3&f)<<6|(a=o.indexOf(r.charAt(c++))),h+=String.fromCharCode(t),64!=f&&(h+=String.fromCharCode(n)),64!=a&&(h+=String.fromCharCode(i));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,\"&\").replace(d,\"<\").replace(e,\">\").replace(f,\"¶<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.className && el.className.toString().split(\" \").indexOf(className) !== -1;\n};\n\nexports.addClass = function(el,className) {\n\tvar c = el.className.split(\" \");\n\tif(c.indexOf(className) === -1) {\n\t\tc.push(className);\n\t\tel.className = c.join(\" \");\n\t}\n};\n\nexports.removeClass = function(el,className) {\n\tvar c = el.className.split(\" \"),\n\t\tp = c.indexOf(className);\n\tif(p !== -1) {\n\t\tc.splice(p,1);\n\t\tel.className = c.join(\" \");\n\t}\n};\n\nexports.toggleClass = function(el,className,status) {\n\tif(status === undefined) {\n\t\tstatus = !exports.hasClass(el,className);\n\t}\n\tif(status) {\n\t\texports.addClass(el,className);\n\t} else {\n\t\texports.removeClass(el,className);\n\t}\n};\n\n/*\nGet the 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\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 && !$tw.utils.hop(headers,\"Content-type\")) {\n\t\trequest.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded; charset=UTF-8\");\n\t}\n\tif(!$tw.utils.hop(headers,\"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\");\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.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({currentTiddler: title},options.variables);\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\t// Render the title of the message\n\tvar headerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"subtitle\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\tattributes: {\n\t\t\t\ttext: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t}}}],\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: 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: $tw.rootWidget,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\tbodyWidgetNode.render(modalBody,null);\n\t// Setup the link if present\n\tif(options.downloadLink) {\n\t\tmodalLink.href = options.downloadLink;\n\t\tmodalLink.appendChild(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: $tw.rootWidget,\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\treturn this.scrollIntoView(event.target);\n\t}\n\treturn true;\n};\n\n/*\nHandle a scroll event hitting the page document\n*/\nPageScroller.prototype.scrollIntoView = function(element,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\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_TextNode = function(text) {\n\tbumpSequenceNumber(this);\n\tthis.textContent = text + \"\";\n};\n\nObject.defineProperty(TW_TextNode.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn 3;\n\t}\n});\n\nObject.defineProperty(TW_TextNode.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\treturn this.textContent.replace(/(\\r?\\n)/g,\"\");\n\t}\n});\n\nvar TW_Element = function(tag,namespace) {\n\tbumpSequenceNumber(this);\n\tthis.isTiddlyWikiFakeDom = true;\n\tthis.tag = tag;\n\tthis.attributes = {};\n\tthis.isRaw = false;\n\tthis.children = [];\n\tthis._style = {};\n\tthis.namespaceURI = namespace || \"http://www.w3.org/1999/xhtml\";\n};\n\nObject.defineProperty(TW_Element.prototype, \"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 1;\n\t}\n});\n\nTW_Element.prototype.getAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot getAttribute on a raw TW_Element\";\n\t}\n\treturn this.attributes[name];\n};\n\nTW_Element.prototype.setAttribute = function(name,value) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot setAttribute on a raw TW_Element\";\n\t}\n\tthis.attributes[name] = value + \"\";\n};\n\nTW_Element.prototype.setAttributeNS = function(namespace,name,value) {\n\tthis.setAttribute(name,value);\n};\n\nTW_Element.prototype.removeAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot removeAttribute on a raw TW_Element\";\n\t}\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\tdelete this.attributes[name];\n\t}\n};\n\nTW_Element.prototype.appendChild = function(node) {\n\tthis.children.push(node);\n\tnode.parentNode = this;\n};\n\nTW_Element.prototype.insertBefore = function(node,nextSibling) {\n\tif(nextSibling) {\n\t\tvar p = this.children.indexOf(nextSibling);\n\t\tif(p !== -1) {\n\t\t\tthis.children.splice(p,0,node);\n\t\t\tnode.parentNode = this;\n\t\t} else {\n\t\t\tthis.appendChild(node);\n\t\t}\n\t} else {\n\t\tthis.appendChild(node);\n\t}\n};\n\nTW_Element.prototype.removeChild = function(node) {\n\tvar p = this.children.indexOf(node);\n\tif(p !== -1) {\n\t\tthis.children.splice(p,1);\n\t}\n};\n\nTW_Element.prototype.hasChildNodes = function() {\n\treturn !!this.children.length;\n};\n\nObject.defineProperty(TW_Element.prototype, \"childNodes\", {\n\tget: function() {\n\t\treturn this.children;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"firstChild\", {\n\tget: function() {\n\t\treturn this.children[0];\n\t}\n});\n\nTW_Element.prototype.addEventListener = function(type,listener,useCapture) {\n\t// Do nothing\n};\n\nObject.defineProperty(TW_Element.prototype, \"tagName\", {\n\tget: function() {\n\t\treturn this.tag || \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"className\", {\n\tget: function() {\n\t\treturn this.attributes[\"class\"] || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes[\"class\"] = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"value\", {\n\tget: function() {\n\t\treturn this.attributes.value || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes.value = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"outerHTML\", {\n\tget: function() {\n\t\tvar output = [],attr,a,v;\n\t\toutput.push(\"<\",this.tag);\n\t\tif(this.attributes) {\n\t\t\tattr = [];\n\t\t\tfor(a in this.attributes) {\n\t\t\t\tattr.push(a);\n\t\t\t}\n\t\t\tattr.sort();\n\t\t\tfor(a=0; a<attr.length; a++) {\n\t\t\t\tv = this.attributes[attr[a]];\n\t\t\t\tif(v !== undefined) {\n\t\t\t\t\toutput.push(\" \",attr[a],\"=\\\"\",$tw.utils.htmlEncode(v),\"\\\"\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(this._style) {\n\t\t\tvar style = [];\n\t\t\tfor(var s in this._style) {\n\t\t\t\tstyle.push($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/*\nRecursively (and synchronously) copy a directory and all its content\n*/\nexports.copyDirectory = function(srcPath,dstPath) {\n\t// Remove any trailing path separators\n\tsrcPath = $tw.utils.removeTrailingSeparator(srcPath);\n\tdstPath = $tw.utils.removeTrailingSeparator(dstPath);\n\t// Create the destination directory\n\tvar err = $tw.utils.createDirectory(dstPath);\n\tif(err) {\n\t\treturn err;\n\t}\n\t// Function to copy a folder full of files\n\tvar copy = function(srcPath,dstPath) {\n\t\tvar srcStats = fs.lstatSync(srcPath),\n\t\t\tdstExists = fs.existsSync(dstPath);\n\t\tif(srcStats.isFile()) {\n\t\t\t$tw.utils.copyFile(srcPath,dstPath);\n\t\t} else if(srcStats.isDirectory()) {\n\t\t\tvar items = fs.readdirSync(srcPath);\n\t\t\tfor(var t=0; t<items.length; t++) {\n\t\t\t\tvar item = items[t],\n\t\t\t\t\terr = copy(srcPath + path.sep + item,dstPath + path.sep + item);\n\t\t\t\tif(err) {\n\t\t\t\t\treturn err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tcopy(srcPath,dstPath);\n\treturn null;\n};\n\n/*\nCopy a file\n*/\nvar FILE_BUFFER_LENGTH = 64 * 1024,\n\tfileBuffer;\n\nexports.copyFile = function(srcPath,dstPath) {\n\t// Create buffer if required\n\tif(!fileBuffer) {\n\t\tfileBuffer = 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 (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\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\twiki: optional wiki for evaluating the pathFilters\n*/\nexports.generateTiddlerFileInfo = function(tiddler,options) {\n\tvar fileInfo = {};\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}\n\t// Take the file extension from the tiddler content type\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: contentTypeInfo.extension,\n\t\tdirectory: options.directory,\n\t\tpathFilters: options.pathFilters,\n\t\twiki: options.wiki\n\t});\n\treturn fileInfo;\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*/\nexports.generateTiddlerFilepath = function(title,options) {\n\tvar self = this,\n\t\tdirectory = options.directory || \"\",\n\t\textension = options.extension || \"\",\n\t\tfilepath;\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\t// If not, generate a base pathname\n\tif(!filepath) {\n\t\tfilepath = title;\n\t\t// If the filepath already ends in the extension then remove it\n\t\tif(filepath.substring(filepath.length - extension.length) === extension) {\n\t\t\tfilepath = filepath.substring(0,filepath.length - extension.length);\n\t\t}\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// Don't let the filename start with a dot because such files are invisible on *nix\n\tfilepath = filepath.replace(/^\\./g,\"_\");\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// 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,\n\t\tcount = 0;\n\tdo {\n\t\tfullPath = path.resolve(directory,filepath + (count ? \"_\" + count : \"\") + extension);\n\t\tcount++;\n\t} while(fs.existsSync(fullPath));\n\t// Return the full path to the file\n\treturn fullPath;\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\",callback);\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\",callback);\n\t\t} else {\n\t\t\tfs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\",callback);\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})();\n",
"type": "application/javascript",
"module-type": "utils-node"
},
"$:/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/*\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\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.getYearForWeekNo(date);\n\t\t\t}],\n\t\t\t[/^hh12/, function() {\n\t\t\t\treturn $tw.utils.getHours12(date);\n\t\t\t}],\n\t\t\t[/^DDth/, function() {\n\t\t\t\treturn date.getDate() + $tw.utils.getDaySuffix(date);\n\t\t\t}],\n\t\t\t[/^YYYY/, function() {\n\t\t\t\treturn date.getFullYear();\n\t\t\t}],\n\t\t\t[/^0hh/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getHours());\n\t\t\t}],\n\t\t\t[/^0mm/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMinutes());\n\t\t\t}],\n\t\t\t[/^0ss/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getSeconds());\n\t\t\t}],\n\t\t\t[/^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();\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 \"&\", < to \"<\", > to \">\", \" to \""\"\nexports.htmlEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().replace(/&/mg,\"&\").replace(/</mg,\"<\").replace(/>/mg,\">\").replace(/\\\"/mg,\""\");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n// Converts all HTML entities to their character equivalents\nexports.entityDecode = function(s) {\n\tvar 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) {\n\t/*\n\t* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string\n\t* literal except for the closing quote character, backslash, carriage return,\n\t* line separator, paragraph separator, and line feed. Any character may\n\t* appear in the form of an escape sequence.\n\t*\n\t* For portability, we also escape all non-ASCII characters.\n\t*/\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\') // backslash\n\t\t.replace(/\"/g, '\\\\\"') // double quote character\n\t\t.replace(/'/g, \"\\\\'\") // single quote character\n\t\t.replace(/\\r/g, '\\\\r') // carriage return\n\t\t.replace(/\\n/g, '\\\\n') // line feed\n\t\t.replace(/[\\x00-\\x1f\\x80-\\uFFFF]/g, 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) {\n\t// See http://www.json.org/\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(/[\\x00-\\x1f\\x80-\\uFFFF]/g,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,4);\n\t} else {\n\t\tprocess.nextTick(fn);\n\t}\n};\n\n/*\nConvert a hyphenated CSS property name into a camel case one\n*/\nexports.unHyphenateCss = function(propName) {\n\treturn propName.replace(/-([a-z])/gi, function(match0,match1) {\n\t\treturn match1.toUpperCase();\n\t});\n};\n\n/*\nConvert a camelcase CSS property name into a dashed one (\"backgroundColor\" --> \"background-color\")\n*/\nexports.hyphenateCss = function(propName) {\n\treturn propName.replace(/([A-Z])/g, function(match0,match1) {\n\t\treturn \"-\" + match1.toLowerCase();\n\t});\n};\n\n/*\nParse a text reference of one of these forms:\n* title\n* !!field\n* title!!field\n* title##index\n* etc\nReturns an object with the following fields, all optional:\n* title: tiddler title\n* field: tiddler field name\n* index: JSON property index\n*/\nexports.parseTextReference = function(textRef) {\n\t// Separate out the title, field name and/or JSON indices\n\tvar reTextRef = /(?:(.*?)!!(.+))|(?:(.*?)##(.+))|(.*)/mg,\n\t\tmatch = reTextRef.exec(textRef),\n\t\tresult = {};\n\tif(match && reTextRef.lastIndex === textRef.length) {\n\t\t// Return the parts\n\t\tif(match[1]) {\n\t\t\tresult.title = match[1];\n\t\t}\n\t\tif(match[2]) {\n\t\t\tresult.field = match[2];\n\t\t}\n\t\tif(match[3]) {\n\t\t\tresult.title = match[3];\n\t\t}\n\t\tif(match[4]) {\n\t\t\tresult.index = match[4];\n\t\t}\n\t\tif(match[5]) {\n\t\t\tresult.title = match[5];\n\t\t}\n\t} else {\n\t\t// If we couldn't parse it\n\t\tresult.title = textRef\n\t}\n\treturn result;\n};\n\n/*\nChecks whether a string is a valid fieldname\n*/\nexports.isValidFieldName = function(name) {\n\tif(!name || typeof name !== \"string\") {\n\t\treturn false;\n\t}\n\tname = name.toLowerCase().trim();\n\tvar fieldValidatorRegEx = /^[a-z0-9\\-\\._]+$/mg;\n\treturn fieldValidatorRegEx.test(name);\n};\n\n/*\nExtract the version number from the meta tag or from the boot file\n*/\n\n// Browser version\nexports.extractVersionInfo = function() {\n\tif($tw.packageInfo) {\n\t\treturn $tw.packageInfo.version;\n\t} else {\n\t\tvar metatags = document.getElementsByTagName(\"meta\");\n\t\tfor(var t=0; t<metatags.length; t++) {\n\t\t\tvar m = metatags[t];\n\t\t\tif(m.name === \"tiddlywiki-version\") {\n\t\t\t\treturn m.content;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the animation duration in ms\n*/\nexports.getAnimationDuration = function() {\n\treturn parseInt($tw.wiki.getTiddlerText(\"$:/config/AnimationDuration\",\"400\"),10) || 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\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/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-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}\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\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.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// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar tag = \"button\";\n\tif(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\n\t\ttag = this.buttonTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = this[\"class\"].split(\" \") || [],\n\t\tisPoppedUp = (this.popup || this.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\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\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\tself.invokeActionString(self.actions,self,event);\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[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis.selectedClass = this.getAttribute(\"selectedClass\");\n\tthis.defaultSetValue = this.getAttribute(\"default\",\"\");\n\tthis.buttonTag = this.getAttribute(\"tag\");\n\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\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nButtonWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes[\"class\"] || 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) {\n\t\tthis.refreshSelf();\n\t\treturn true;\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\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\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\"]) {\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// 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.droppableTag && $tw.config.htmlUnsafeElements.indexOf(this.droppableTag) === -1) {\n\t\ttag = this.droppableTag;\n\t}\n\t// Create element and assign classes\n\tvar domNode = this.document.createElement(tag),\n\t\tclasses = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-droppable\");\n\tdomNode.className = classes.join(\" \");\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}\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\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\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 = event.ctrlKey && ! event.shiftKey ? \"ctrl\" : event.shiftKey && !event.ctrlKey ? \"shift\" : \n\t\t\t\tevent.ctrlKey && event.shiftKey ? \"ctrl-shift\" : \"normal\" ;\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.droppableClass = this.getAttribute(\"class\");\n\tthis.droppableEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\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*/\nDroppableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"] || changedAttributes.tag || changedAttributes.enable) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.droppable = DroppableWidget;\n\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)});\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)});\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])});\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\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) {\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\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\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBitmapWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBitmapWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create 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\t// Choose the appropriate edit widget\n\tthis.editorType = this.getEditorType();\n\t// Make the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"edit-\" + this.editorType,\n\t\tattributes: {\n\t\t\ttiddler: {type: \"string\", value: this.editTitle},\n\t\t\tfield: {type: \"string\", value: this.editField},\n\t\t\tindex: {type: \"string\", value: this.editIndex},\n\t\t\t\"class\": {type: \"string\", value: this.editClass},\n\t\t\t\"placeholder\": {type: \"string\", value: this.editPlaceholder},\n\t\t\t\"tabindex\": {type: \"string\", value: this.editTabIndex},\n\t\t\t\"focus\": {type: \"string\", value: this.editFocus}\n\t\t},\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 || (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\tthis.execute();\n\t// Neuter blacklisted elements\n\tvar tag = this.parseTreeNode.tag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"safe-\" + tag;\n\t}\n\t// Adjust headings by the current base level\n\tvar headingLevel = [\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"].indexOf(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\ttag = \"h\" + headingLevel;\n\t}\n\t// Create the DOM node\n\tvar domNode = this.document.createElementNS(this.namespace,tag);\n\tthis.assignAttributes(domNode,{excludeEventAttributes: true});\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nElementWidget.prototype.execute = function() {\n\t// Select the namespace for the tag\n\tvar tagNamespaces = {\n\t\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\t\tmath: \"http://www.w3.org/1998/Math/MathML\",\n\t\t\tbody: \"http://www.w3.org/1999/xhtml\"\n\t\t};\n\tthis.namespace = tagNamespaces[this.parseTreeNode.tag];\n\tif(this.namespace) {\n\t\tthis.setVariable(\"namespace\",this.namespace);\n\t} else {\n\t\tthis.namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"});\n\t}\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nElementWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\thasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n\tif(hasChangedAttributes) {\n\t\t// Update our attributes\n\t\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\n\t}\n\treturn this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\nexports.element = ElementWidget;\n\n})();\n",
"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.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/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\tthis.addEventListeners([\n\t\t{type: \"tm-remove-field\", handler: \"handleRemoveFieldEvent\"},\n\t\t{type: \"tm-add-field\", handler: \"handleAddFieldEvent\"},\n\t\t{type: \"tm-remove-tag\", handler: \"handleRemoveTagEvent\"},\n\t\t{type: \"tm-add-tag\", handler: \"handleAddTagEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldManglerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nFieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tdeletion = {};\n\tdeletion[event.param] = undefined;\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\taddition = this.wiki.getModificationFields(),\n\t\thadInvalidFieldName = false,\n\t\taddField = function(name,value) {\n\t\t\tvar trimmedName = name.toLowerCase().trim();\n\t\t\tif(!$tw.utils.isValidFieldName(trimmedName)) {\n\t\t\t\tif(!hadInvalidFieldName) {\n\t\t\t\t\talert($tw.language.getString(\n\t\t\t\t\t\t\"InvalidFieldName\",\n\t\t\t\t\t\t{variables:\n\t\t\t\t\t\t\t{fieldName: trimmedName}\n\t\t\t\t\t\t}\n\t\t\t\t\t));\n\t\t\t\t\thadInvalidFieldName = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(!value && tiddler) {\n\t\t\t\t\tvalue = tiddler.fields[trimmedName];\n\t\t\t\t}\n\t\t\t\taddition[trimmedName] = value || \"\";\n\t\t\t}\n\t\t\treturn;\n\t\t};\n\taddition.title = this.mangleTitle;\n\tif(typeof event.param === \"string\") {\n\t\taddField(event.param,\"\");\n\t}\n\tif(typeof event.paramObject === \"object\") {\n\t\tfor(var name in event.paramObject) {\n\t\t\taddField(name,event.paramObject[name]);\n\t\t}\n\t}\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,addition));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleRemoveTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\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// 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.makeChildWidgets([node]);\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\tself.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\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nKeyboardWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\n/*\nCompute the internal state of the widget\n*/\nKeyboardWidget.prototype.execute = function() {\n\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 domNode = this.document.createElement(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\tdomNode.setAttribute(\"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});\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\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkCatcherWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkCatcherWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.catchTo = this.getAttribute(\"to\");\n\tthis.catchMessage = this.getAttribute(\"message\");\n\tthis.catchSet = this.getAttribute(\"set\");\n\tthis.catchSetTo = this.getAttribute(\"setTo\");\n\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\tthis.invokeActionString(this.catchActions,this,event,{navigateTo: event.navigateTo});\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// Initialise the storyviews if they've not been done already\n\tif(!this.storyViews) {\n\t\tListWidget.prototype.storyViews = {};\n\t\t$tw.modules.applyMethods(\"storyview\",this.storyViews);\n\t}\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\t// Construct the storyview\n\tvar StoryView = this.storyViews[this.storyViewName];\n\tif(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 emptyMessage = this.getAttribute(\"emptyMessage\",\"\"),\n\t\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",emptyMessage,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/*\nCompose the template for a list item\n*/\nListWidget.prototype.makeItemTemplate = function(title) {\n\t// Check if the tiddler is a draft\n\tvar tiddler = this.wiki.getTiddler(title),\n\t\tisDraft = tiddler && tiddler.hasField(\"draft.of\"),\n\t\ttemplate = this.template,\n\t\ttemplateTree;\n\tif(isDraft && this.editTemplate) {\n\t\ttemplate = this.editTemplate;\n\t}\n\t// Compose the transclusion of the template\n\tif(template) {\n\t\ttemplateTree = [{type: \"transclude\", attributes: {tiddler: {type: \"string\", value: template}}}];\n\t} else {\n\t\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\t\ttemplateTree = this.parseTreeNode.children;\n\t\t} else {\n\t\t\t// Default template is a link to the title\n\t\t\ttemplateTree = [{type: \"element\", tag: this.parseTreeNode.isBlock ? \"div\" : \"span\", children: [{type: \"link\", attributes: {to: {type: \"string\", value: title}}, children: [\n\t\t\t\t\t{type: \"text\", text: title}\n\t\t\t]}]}];\n\t\t}\n\t}\n\t// Return the list item\n\treturn {type: \"listitem\", itemTitle: title, variableName: this.variableName, children: templateTree};\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tresult;\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshStart) {\n\t\tthis.storyview.refreshStart(changedTiddlers,changedAttributes);\n\t}\n\t// Completely refresh if any of our attributes have changed\n\tif(changedAttributes.filter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\tresult = true;\n\t} else {\n\t\t// Handle any changes to the list\n\t\tresult = this.handleListChanges(changedTiddlers);\n\t\t// Handle any changes to the history stack\n\t\tif(this.historyTitle && changedTiddlers[this.historyTitle]) {\n\t\t\tthis.handleHistoryChanges();\n\t\t}\n\t}\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshEnd) {\n\t\tthis.storyview.refreshEnd(changedTiddlers,changedAttributes);\n\t}\n\treturn result;\n};\n\n/*\nHandle any changes to the history list\n*/\nListWidget.prototype.handleHistoryChanges = function() {\n\t// Get the history data\n\tvar newHistory = this.wiki.getTiddlerDataCached(this.historyTitle,[]);\n\t// Ignore any entries of the history that match the previous history\n\tvar entry = 0;\n\twhile(entry < newHistory.length && entry < this.history.length && newHistory[entry].title === this.history[entry].title) {\n\t\tentry++;\n\t}\n\t// Navigate forwards to each of the new tiddlers\n\twhile(entry < newHistory.length) {\n\t\tif(this.storyview && this.storyview.navigateTo) {\n\t\t\tthis.storyview.navigateTo(newHistory[entry]);\n\t\t}\n\t\tentry++;\n\t}\n\t// Update the history\n\tthis.history = newHistory;\n};\n\n/*\nProcess any changes to the list\n*/\nListWidget.prototype.handleListChanges = function(changedTiddlers) {\n\t// Get the new list\n\tvar prevList = this.list;\n\tthis.list = this.getTiddlerList();\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\t// Check if it was empty before\n\t\tif(prevList.length === 0) {\n\t\t\t// If so, just refresh the empty message\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\t// Replace the previous content with the empty message\n\t\t\tfor(t=this.children.length-1; t>=0; t--) {\n\t\t\t\tthis.removeListItem(t);\n\t\t\t}\n\t\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\t\tthis.makeChildWidgets(this.getEmptyMessage());\n\t\t\tthis.renderChildren(this.parentDomNode,nextSibling);\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\t// If the list was empty then we need to remove the empty message\n\t\tif(prevList.length === 0) {\n\t\t\tthis.removeChildDomNodes();\n\t\t\tthis.children = [];\n\t\t}\n\t\t// Cycle through the list, inserting and removing list items as needed\n\t\tvar hasRefreshed = false;\n\t\tfor(var t=0; t<this.list.length; t++) {\n\t\t\tvar index = this.findListItem(t,this.list[t]);\n\t\t\tif(index === undefined) {\n\t\t\t\t// The list item must be inserted\n\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\thasRefreshed = true;\n\t\t\t} else {\n\t\t\t\t// There are intervening list items that must be removed\n\t\t\t\tfor(var n=index-1; n>=t; n--) {\n\t\t\t\t\tthis.removeListItem(n);\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t}\n\t\t\t\t// Refresh the item we're reusing\n\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t}\n\t\t}\n\t\t// Remove any left over items\n\t\tfor(t=this.children.length-1; t>=this.list.length; t--) {\n\t\t\tthis.removeListItem(t);\n\t\t\thasRefreshed = true;\n\t\t}\n\t\treturn hasRefreshed;\n\t}\n};\n\n/*\nFind the list item with a given title, starting from a specified position\n*/\nListWidget.prototype.findListItem = function(startIndex,title) {\n\twhile(startIndex < this.children.length) {\n\t\tif(this.children[startIndex].parseTreeNode.itemTitle === title) {\n\t\t\treturn startIndex;\n\t\t}\n\t\tstartIndex++;\n\t}\n\treturn undefined;\n};\n\n/*\nInsert a new list item at the specified index\n*/\nListWidget.prototype.insertListItem = function(index,title) {\n\t// Create, insert and render the new child widgets\n\tvar widget = this.makeChildWidget(this.makeItemTemplate(title));\n\twidget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work\n\tthis.children.splice(index,0,widget);\n\tvar nextSibling = widget.findNextSiblingDomNode();\n\twidget.render(this.parentDomNode,nextSibling);\n\t// Animate the insertion if required\n\tif(this.storyview && this.storyview.insert) {\n\t\tthis.storyview.insert(widget);\n\t}\n\treturn true;\n};\n\n/*\nRemove the specified list item\n*/\nListWidget.prototype.removeListItem = function(index) {\n\tvar widget = this.children[index];\n\t// Animate the removal if required\n\tif(this.storyview && this.storyview.remove) {\n\t\tthis.storyview.remove(widget);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n\t// Remove the child widget\n\tthis.children.splice(index,1);\n};\n\nexports.list = ListWidget;\n\nvar ListItemWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListItemWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListItemWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nListItemWidget.prototype.execute = function() {\n\t// Set the current list item title\n\tthis.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListItemWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.listitem = ListItemWidget;\n\n})();",
"type": "application/javascript",
"module-type": "widget"
},
"$:/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\tvar parser = this.wiki.parseText(this.parseType,text,\n\t\t\t\t\t\t\t{parseAsInline: !this.parseTreeNode.isBlock});\n\t\tparseTreeNodes = parser ? parser.tree : [];\n\t\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 {\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/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\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"},\n\t\t{type: \"tm-edit-tiddler\", handler: \"handleEditTiddlerEvent\"},\n\t\t{type: \"tm-delete-tiddler\", handler: \"handleDeleteTiddlerEvent\"},\n\t\t{type: \"tm-save-tiddler\", handler: \"handleSaveTiddlerEvent\"},\n\t\t{type: \"tm-cancel-tiddler\", handler: \"handleCancelTiddlerEvent\"},\n\t\t{type: \"tm-close-tiddler\", handler: \"handleCloseTiddlerEvent\"},\n\t\t{type: \"tm-close-all-tiddlers\", handler: \"handleCloseAllTiddlersEvent\"},\n\t\t{type: \"tm-close-other-tiddlers\", handler: \"handleCloseOtherTiddlersEvent\"},\n\t\t{type: \"tm-new-tiddler\", handler: \"handleNewTiddlerEvent\"},\n\t\t{type: \"tm-import-tiddlers\", handler: \"handleImportTiddlersEvent\"},\n\t\t{type: \"tm-perform-import\", handler: \"handlePerformImportEvent\"},\n\t\t{type: \"tm-fold-tiddler\", handler: \"handleFoldTiddlerEvent\"},\n\t\t{type: \"tm-fold-other-tiddlers\", handler: \"handleFoldOtherTiddlersEvent\"},\n\t\t{type: \"tm-fold-all-tiddlers\", handler: \"handleFoldAllTiddlersEvent\"},\n\t\t{type: \"tm-unfold-all-tiddlers\", handler: \"handleUnfoldAllTiddlersEvent\"},\n\t\t{type: \"tm-rename-tiddler\", handler: \"handleRenameTiddlerEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigatorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigatorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigatorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.storyTitle = this.getAttribute(\"story\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\tthis.setVariable(\"tv-story-list\",this.storyTitle);\n\tthis.setVariable(\"tv-history-list\",this.historyTitle);\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.wiki.addToStory(title,fromTitle,this.storyTitle,{\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.wiki.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\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);\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)) {\nconsole.log(\"Relinking '\" + draftOf + \"' to '\" + draftTitle + \"'\");\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 importTiddler = this.wiki.getTiddler(IMPORT_TITLE),\n\t\timportData = this.wiki.getTiddlerData(IMPORT_TITLE,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: IMPORT_TITLE,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"import\",\n\t\t\t\"status\": \"pending\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\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}\n\t});\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\tif(this.getVariable(\"tv-auto-open-on-import\") !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList && storyList.indexOf(IMPORT_TITLE) === -1) {\n\t\t\tstoryList.unshift(IMPORT_TITLE);\n\t\t}\n\t\t// And to history\n\t\thistory.push(IMPORT_TITLE);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\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\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\t\t\ttiddler = $tw.hooks.invokeHook(\"th-importing-tiddler\",tiddler);\n\t\t\tself.wiki.addTiddler(tiddler);\n\t\t\timportReport.push(\"# [[\" + tiddlerFields.title + \"]]\");\n\t\t}\n\t});\n\t// Replace the $:/Import tiddler with an import report\n\tthis.wiki.addTiddler(new $tw.Tiddler({\n\t\ttitle: event.param,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([event.param]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nNavigatorWidget.prototype.handleFoldTiddlerEvent = function(event) {\n\tvar 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 paramObject = event.paramObject || {},\n\t\tfrom = paramObject.from || event.tiddlerTitle,\n\t\tto = paramObject.to;\n\tthis.wiki.renameTiddler(from,to);\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;\n\nvar RadioWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRadioWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRadioWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\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.setAttribute(\"checked\",\"true\");\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nRadioWidget.prototype.getValue = function() {\n\tvar value,\n\t\ttiddler = this.wiki.getTiddler(this.radioTitle);\n\tif (this.radioIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex);\n\t} else {\n\t\tvalue = tiddler && tiddler.getFieldString(this.radioField);\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};\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\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRadioWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.radioTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue() === this.radioValue;\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.radio = RadioWidget;\n\n})();\n",
"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\tthis.inputDomNode.value = this.getValue();\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\t\t\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 || \"text\",\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.handleInputEvent = 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// Get the parameters from the attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.tiddlerField = this.getAttribute(\"field\");\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\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(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes['min'] || changedAttributes['max'] || changedAttributes['increment'] || changedAttributes[\"default\"] || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.tiddlerTitle]) {\n\t\t\tvar value = this.getValue();\n\t\t\tif(this.inputDomNode.value !== value) {\n\t\t\t\tthis.inputDomNode.value = value;\t\t\t\t\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\tvar classes = this[\"class\"].split(\" \") || [];\n\tclasses.push(\"tc-reveal\");\n\tdomNode.className = classes.join(\" \");\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\t}\n\tif(!this.isOpen) {\n\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t}\n\tthis.domNodes.push(domNode);\n};\n\nRevealWidget.prototype.positionPopup = function(domNode) {\n\tdomNode.style.position = \"absolute\";\n\tdomNode.style.zIndex = \"1000\";\n\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 \"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\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\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis.style = this.getAttribute(\"style\",\"\");\n\tthis[\"default\"] = this.getAttribute(\"default\",\"\");\n\tthis.animate = this.getAttribute(\"animate\",\"no\");\n\tthis.retain = this.getAttribute(\"retain\",\"no\");\n\tthis.openAnimation = this.animate === \"no\" ? undefined : \"open\";\n\tthis.closeAnimation = this.animate === \"no\" ? undefined : \"close\";\n\t// Compute the title of the state tiddler and read it\n\tthis.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\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}\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\tthis.scaleFactor = 1;\n\tthis.addEventListeners([\n\t\t{type: \"tm-scroll\", handler: \"handleScrollEvent\"}\n\t]);\n\tif($tw.browser) {\n\t\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t\t};\n\t\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\t\twindow.webkitCancelAnimationFrame ||\n\t\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\t\twindow.mozCancelAnimationFrame ||\n\t\t\twindow.mozCancelRequestAnimationFrame ||\n\t\t\tfunction(id) {\n\t\t\t\twindow.clearTimeout(id);\n\t\t\t};\n\t}\n};\n\n/*\nInherit from the base widget class\n*/\nScrollableWidget.prototype = new Widget();\n\nScrollableWidget.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle a scroll event\n*/\nScrollableWidget.prototype.handleScrollEvent = function(event) {\n\t// Pass the scroll event through if our offsetsize is larger than our scrollsize\n\tif(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === \"yes\") {\n\t\treturn true;\n\t}\n\tthis.scrollIntoView(event.target);\n\treturn false; // Handled event\n};\n\n/*\nScroll an element into view\n*/\nScrollableWidget.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = {\n\t\tx: this.outerDomNode.scrollLeft,\n\t\ty: this.outerDomNode.scrollTop\n\t};\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar scrollableBounds = this.outerDomNode.getBoundingClientRect(),\n\t\tclientTargetBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientTargetBounds.left + scrollPosition.x - scrollableBounds.left,\n\t\t\ttop: clientTargetBounds.top + scrollPosition.y - scrollableBounds.top,\n\t\t\twidth: clientTargetBounds.width,\n\t\t\theight: clientTargetBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\t// If the target is already visible then stay where we are\n\t\t\tif(targetPos >= currentPos && (targetPos + targetSize) <= (currentPos + currentSize)) {\n\t\t\t\treturn currentPos;\n\t\t\t// If the target is above/left of the current view, then scroll to its top/left\n\t\t\t} else if(targetPos <= currentPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\treturn targetPos + targetSize - currentSize;\n\t\t\t// If the target is big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\treturn currentPos;\n\t\t\t}\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,this.outerDomNode.offsetWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,this.outerDomNode.offsetHeight);\n\t// Only scroll if necessary\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tself.outerDomNode.scrollLeft = scrollPosition.x + (endX - scrollPosition.x) * t;\n\t\t\tself.outerDomNode.scrollTop = scrollPosition.y + (endY - scrollPosition.y) * t;\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(window,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nScrollableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create elements\n\tthis.outerDomNode = this.document.createElement(\"div\");\n\t$tw.utils.setStyle(this.outerDomNode,[\n\t\t{overflowY: \"auto\"},\n\t\t{overflowX: \"auto\"},\n\t\t{webkitOverflowScrolling: \"touch\"}\n\t]);\n\tthis.innerDomNode = this.document.createElement(\"div\");\n\tthis.outerDomNode.appendChild(this.innerDomNode);\n\t// Assign classes\n\tthis.outerDomNode.className = this[\"class\"] || \"\";\n\t// Insert element\n\tparent.insertBefore(this.outerDomNode,nextSibling);\n\tthis.renderChildren(this.innerDomNode,null);\n\tthis.domNodes.push(this.outerDomNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nScrollableWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.fallthrough = this.getAttribute(\"fallthrough\",\"yes\");\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nScrollableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.scrollable = ScrollableWidget;\n\n})();\n",
"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\t// Parse the text reference\n\tvar parseAsInline = !this.parseTreeNode.isBlock;\n\tif(this.transcludeMode === \"inline\") {\n\t\tparseAsInline = true;\n\t} else if(this.transcludeMode === \"block\") {\n\t\tparseAsInline = false;\n\t}\n\tvar parser = this.wiki.parseTextReference(\n\t\t\t\t\t\tthis.transcludeTitle,\n\t\t\t\t\t\tthis.transcludeField,\n\t\t\t\t\t\tthis.transcludeIndex,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparseAsInline: parseAsInline,\n\t\t\t\t\t\t\tsubTiddler: this.transcludeSubTiddler\n\t\t\t\t\t\t}),\n\t\tparseTreeNodes = parser ? parser.tree : this.parseTreeNode.children;\n\t// Set context variables for recursion detection\n\tvar recursionMarker = this.makeRecursionMarker();\n\tthis.setVariable(\"transclusion\",recursionMarker);\n\t// Check for recursion\n\tif(parser) {\n\t\tif(this.parentWidget && this.parentWidget.hasVariable(\"transclusion\",recursionMarker)) {\n\t\t\tparseTreeNodes = [{type: \"element\", tag: \"span\", attributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-error\"}\n\t\t\t}, children: [\n\t\t\t\t{type: \"text\", text: $tw.language.getString(\"Error/RecursiveTransclusion\")}\n\t\t\t]}];\n\t\t}\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nCompose a string comprising the title, field and/or index to identify this transclusion for recursion detection\n*/\nTranscludeWidget.prototype.makeRecursionMarker = function() {\n\tvar output = [];\n\toutput.push(\"{\");\n\toutput.push(this.getVariable(\"currentTiddler\",{defaultValue: \"\"}));\n\toutput.push(\"|\");\n\toutput.push(this.transcludeTitle || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeField || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeIndex || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeSubTiddler || \"\");\n\toutput.push(\"}\");\n\treturn output.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTranscludeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.transclude = TranscludeWidget;\n\n})();\n",
"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// Call the constructor\n\tWidget.call(this);\n\t// Initialise\t\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nVarsWidget.prototype = Object.create(Widget.prototype);\n\n/*\nRender this widget into the DOM\n*/\nVarsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nVarsWidget.prototype.execute = function() {\n\t// Parse variables\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(val,key) {\n\t\tif(key.charAt(0) !== \"$\") {\n\t\t\tself.setVariable(key,val);\n\t\t}\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nVarsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"vars\"] = VarsWidget;\n\n})();\n",
"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\tvalue = variable.value,\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};\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) {\n\tthis.children = [];\n\tvar self = this;\n\t$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {\n\t\tself.children.push(self.makeChildWidget(childNode));\n\t});\n};\n\n/*\nConstruct the widget object for a parse tree node\n*/\nWidget.prototype.makeChildWidget = function(parseTreeNode) {\n\tvar WidgetClass = this.widgetClasses[parseTreeNode.type];\n\tif(!WidgetClass) {\n\t\tWidgetClass = this.widgetClasses.text;\n\t\tparseTreeNode = {type: \"text\", text: \"Undefined widget '\" + parseTreeNode.type + \"'\"};\n\t}\n\treturn new WidgetClass(parseTreeNode,{\n\t\twiki: this.wiki,\n\t\tvariables: {},\n\t\tparentWidget: this,\n\t\tdocument: this.document\n\t});\n};\n\n/*\nGet the next sibling of this widget\n*/\nWidget.prototype.nextSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index < this.parentWidget.children.length-1) {\n\t\t\treturn this.parentWidget.children[index+1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the previous sibling of this widget\n*/\nWidget.prototype.previousSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index > 0) {\n\t\t\treturn this.parentWidget.children[index-1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRender the children of this widget into the DOM\n*/\nWidget.prototype.renderChildren = function(parent,nextSibling) {\n\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\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\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(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 if($tw.utils.isDate(a) && $tw.utils.isDate(b)) {\n\t\t\treturn isDescending ? b - a : a - b;\n\t\t} else {\n\t\t\ta = String(a);\n\t\t\tb = String(b);\n\t\t\tif(!isCaseSensitive) {\n\t\t\t\ta = a.toLowerCase();\n\t\t\t\tb = b.toLowerCase();\n\t\t\t}\n\t\t\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\n\t\t}\n\t});\n};\n\n/*\nFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.forEachTiddler = function(/* [options,]callback */) {\n\tvar arg = 0,\n\t\toptions = arguments.length >= 2 ? arguments[arg++] : {},\n\t\tcallback = arguments[arg++],\n\t\ttitles = this.getTiddlers(options),\n\t\tt, tiddler;\n\tfor(t=0; t<titles.length; t++) {\n\t\ttiddler = this.getTiddler(titles[t]);\n\t\tif(tiddler) {\n\t\t\tcallback.call(this,tiddler.fields.title,tiddler);\n\t\t}\n\t}\n};\n\n/*\nReturn an array of tiddler titles that are directly linked 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.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\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\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 $tw.wiki.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) !== options.invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\t// Remove any of the results we have to exclude\n\tif(options.exclude) {\n\t\tfor(t=0; t<options.exclude.length; t++) {\n\t\t\tvar p = results.indexOf(options.exclude[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tresults.splice(p,1);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nTrigger a load for a tiddler if it is skinny. Returns the text, or undefined if the tiddler is missing, null if the tiddler is being lazily loaded.\n*/\nexports.getTiddlerText = function(title,defaultText) {\n\tvar tiddler = this.getTiddler(title);\n\t// Return undefined if the tiddler isn't found\n\tif(!tiddler) {\n\t\treturn defaultText;\n\t}\n\tif(!tiddler.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\", type: type};\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\t\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);\t\t\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\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/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/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-background: #504945\nbutton-foreground: #fbf1c7\nbutton-border: transparent\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>>\nsidebar-button-foreground: <<colour foreground>>\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: #7c6f64\ntiddler-controls-foreground: #665c54\ntiddler-editor-background: #282828\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: <<colour button-background>>\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>>"
},
"$:/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-background: #4C566A\nbutton-foreground: #D8DEE9\nbutton-border: transparent\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>>\nsidebar-button-foreground: <<colour foreground>>\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: #2e3440\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\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/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: #073642\nalert-highlight: #cb4b16\nalert-muted-foreground: #586e75\nbackground: #fdf6e3\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: #cb4b16\nbutton-foreground: #fdf6e3\nbutton-border: transparent\ncode-background: #eee8d5\ncode-border: #93a1a1\ncode-foreground: #d33682\ndiff-delete-background: #BF616A\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #859900\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #D08770\ndownload-background: #859900\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #fdf6e3\ndropdown-tab-background: #93a1a1\ndropzone-background: #859900\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: #d33682\nexternal-link-foreground-visited: #b58900\nexternal-link-foreground: #cb4b16\nforeground: #839496\nmessage-background: #586e75\nmessage-border: #586e75\nmessage-foreground: #eee8d5\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #eee8d5\nmodal-footer-background: #eee8d5\nmodal-footer-border: #eee8d5\nmodal-header-border: #eee8d5\nmuted-foreground: #93a1a1\nnotification-background: #EBCB8B\nnotification-border: #D08770\npage-background: #eee8d5\npre-background: #eee8d5\npre-border: #93a1a1\nprimary: #2aa198\nselect-tag-background: #eee8d5\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: #eee8d5\nsidebar-controls-foreground-hover: #268bd2\nsidebar-controls-foreground: #586e75\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #839496\nsidebar-muted-foreground-hover: #657b83\nsidebar-muted-foreground: #93a1a1\nsidebar-tab-background-selected: #eee8d5\nsidebar-tab-background: #839496\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #657b83\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #839496\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #859900\nsidebar-tiddler-link-foreground: #268bd2\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #dc322f\ntab-background-selected: #fdf6e3\ntab-background: #839496\ntab-border-selected: #93a1a1\ntab-border: #93a1a1\ntab-divider: #fdf6e3\ntab-foreground-selected: #839496\ntab-foreground: #eee8d5\ntable-border: #657b83\ntable-footer-background: #657b83\ntable-header-background: #93a1a1\ntag-background: #6c71c4\ntag-foreground: #eee8d5\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #b58900\ntiddler-controls-foreground-selected: #b58900\ntiddler-controls-foreground: #073642\ntiddler-editor-background: #eee8d5\ntiddler-editor-border-image: #eee8d5\ntiddler-editor-border: #eee8d5\ntiddler-editor-fields-even: #eee8d5\ntiddler-editor-fields-odd: #fdf6e3\ntiddler-info-background: #eee8d5\ntiddler-info-border: #eee8d5\ntiddler-info-tab-background: #586e75\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #586e75\ntiddler-title-foreground: #073642\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: #839496\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\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 --> "
},
"$:/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": "\\define renderContent()\n<$text text=<<csvtiddlers filter:\"\"\"$(exportFilter)$\"\"\" format:\"quoted-comma-sep\">>/>\n\\end\n<<renderContent>>\n"
},
"$:/core/templates/exporters/JsonFile": {
"title": "$:/core/templates/exporters/JsonFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/JsonFile}}",
"extension": ".json",
"text": "\\define renderContent()\n<$text text=<<jsontiddlers filter:\"\"\"$(exportFilter)$\"\"\">>/>\n\\end\n<<renderContent>>\n"
},
"$:/core/templates/exporters/StaticRiver": {
"title": "$:/core/templates/exporters/StaticRiver",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/StaticRiver}}",
"extension": ".html",
"text": "\\define tv-wikilink-template() #$uri_encoded$\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n<section class=\"tc-story-river\">\n{{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}}\n</section>\n</body>\n</html>\n"
},
"$:/core/templates/exporters/StaticRiver/Content": {
"title": "$:/core/templates/exporters/StaticRiver/Content",
"text": "\\define renderContent()\n{{{ $(exportFilter)$ ||$:/core/templates/static-tiddler}}}\n\\end\n\\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",
"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/]] -[[$:/HistoryList]] -[[$:/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$tw.preloadTiddlerArray([{\n\ttitle: \"$:/config/SaveWikiButton/Template\",\n\ttext: \"$:/core/save/all-external-js\"\n}]);\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/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/empty": {
"title": "$:/core/save/empty",
"text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/lazy-all": {
"title": "$:/core/save/lazy-all",
"text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] \n\\end\n\\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[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<$set name=\"tv-config-toolbar-icons\" value={{$:/config/Toolbar/Icons}}>\n\n<$set name=\"tv-config-toolbar-text\" value={{$:/config/Toolbar/Text}}>\n\n<$set name=\"tv-config-toolbar-class\" value={{$:/config/Toolbar/ButtonClass}}>\n\n<$set name=\"tv-show-missing-links\" value={{$:/config/MissingLinks}}>\n\n<$set name=\"storyviewTitle\" value={{$:/view}}>\n\n<$set name=\"languageTitle\" value={{{ [{$:/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</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\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\">\n`<$view tiddler=\"$:/core/ui/ViewTemplate\" format=\"htmlwikified\"/>`\n</section>\n</body>\n</html>\n`"
},
"$:/core/templates/store.area.template.html": {
"title": "$:/core/templates/store.area.template.html",
"text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n`<div id=\"storeArea\" style=\"display:none;\">`\n<$list filter=<<saveTiddlerFilter>> template=\"$:/core/templates/html-div-tiddler\"/>\n<$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<$vars imageType={{$:/config/NewImageType}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" type=<<get-type>> tags={{$:/config/NewTiddler/Tags!!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": "<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{$:/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=<<journalTags>> text={{{ [<journalTitle>get[]] }}}/>\n</$reveal>\n<$reveal type=\"match\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalTags>> 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": "<$action-sendmessage $message=\"tm-new-tiddler\" tags={{$:/config/NewTiddler/Tags!!tags}}/>\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<<lingo Filter/Hint>>\n\n<div class=\"tc-search tc-advanced-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\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}} template=\"$:/core/ui/ListItemTemplate\"/>\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<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\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 to=\"$:/temp/advancedsearch\">\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}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Shadows/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$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]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo Shadows/Matches>>\n\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$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<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Standard/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$set name=\"searchTiddler\" value=\"$:/temp/advancedsearch\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n</$list>\n</$set>\n</$list>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/System": {
"title": "$:/core/ui/AdvancedSearch/System",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/System/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo System/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$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]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo System/Matches>>\n\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$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<<tabs \"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" \"$:/core/ui/AdvancedSearch/System\">>\n</div>\n"
},
"$:/core/ui/AlertTemplate": {
"title": "$:/core/ui/AlertTemplate",
"text": "<div class=\"tc-alert\">\n<div class=\"tc-alert-toolbar\">\n<$button class=\"tc-btn-invisible\"><$action-deletetiddler $tiddler=<<currentTiddler>>/>{{$:/core/images/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<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\" \"$:/core/ui/ControlPanel/TiddlerFields\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Appearance": {
"title": "$:/core/ui/ControlPanel/Appearance",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Appearance/Caption}}",
"text": "{{$:/language/ControlPanel/Appearance/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Theme\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Basics": {
"title": "$:/core/ui/ControlPanel/Basics",
"tags": "$:/tags/ControlPanel/Info",
"caption": "{{$:/language/ControlPanel/Basics/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Basics/\n\n\\define show-filter-count(filter)\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/state/tab--1498284803\" $value=\"$:/core/ui/AdvancedSearch/Filter\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n''<$count filter=\"\"\"$filter$\"\"\"/>''\n{{$:/core/images/advanced-search-button}}\n</$button>\n\\end\n\n|<<lingo Version/Prompt>> |''<<version>>'' |\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/status/UserName\"><<lingo Username/Prompt>></$link> |<$edit-text tiddler=\"$:/status/UserName\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/AnimationDuration\"><<lingo AnimDuration/Prompt>></$link> |<$edit-text tiddler=\"$:/config/AnimationDuration\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit 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> |<$list filter=\"[[$:/config/NewTiddler/Tags]]\" template=\"$:/core/ui/EditTemplate/tags\"/> |\n|<$link to=\"$:/config/NewJournal/Tags\"><<lingo NewJournal/Tags/Prompt>></$link> |<$list filter=\"[[$:/config/NewJournal/Tags]]\" template=\"$:/core/ui/EditTemplate/tags\"/> |\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<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Basics\">>\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[title]]\" 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[title]]\" 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[title]]\" 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<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-load-plugin-library\" url={{!!url}} infoTitlePrefix=\"$:/temp/RemoteAssetInfo/\"/>\n{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Plugins/OpenPluginLibrary}}\n</$button>\n\\end\n\n\\define display-server-assets(type)\n{{$:/language/Search/Search}}: <$edit-text tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" default=\"\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n<div class=\"tc-plugin-library-listing\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[title]]\" 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 \"[[<$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[title]]\" 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<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Installed/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Installed/Themes]] [[$:/core/ui/ControlPanel/Plugins/Installed/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\">>\n"
},
"$:/core/ui/ControlPanel/Saving/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=\"master\" 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 backupURL()\nhttp://$(userName)$.tiddlyspot.com/backup/\n\\end\n\\define backupLink()\n<$reveal type=\"nomatch\" state=\"$:/UploadName\" text=\"\">\n<$set name=\"userName\" value={{$:/UploadName}}>\n<$reveal type=\"match\" state=\"$:/UploadURL\" text=\"\">\n<<backupURL>>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/UploadURL\" text=\"\">\n<$macrocall $name=resolvePath source={{$:/UploadBackupDir}} root={{$:/UploadURL}}>>\n</$reveal>\n</$set>\n</$reveal>\n\\end\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/UploadName\" default=\"\" tag=\"input\"/> |\n|<<lingo Password>> |<$password name=\"upload\"/> |\n|<<lingo Backups>> |<<backupLink>> |\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>>"
},
"$:/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<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Saving]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Saving/General\">>\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<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\" \"$:/state/tabs/controlpanel/toolbars\" \"tc-vertical\">>\n</div>\n"
},
"$:/ControlPanel": {
"title": "$:/ControlPanel",
"icon": "$:/core/images/options-button",
"color": "#bbb",
"text": "<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Info\">>\n</div>\n"
},
"$:/core/ui/DefaultSearchResultList": {
"title": "$:/core/ui/DefaultSearchResultList",
"tags": "$:/tags/SearchResults",
"caption": "{{$:/language/Search/DefaultResults/Caption}}",
"text": "\\define searchResultList()\n//<small>{{$:/language/Search/Matches/Title}}</small>//\n\n<$list filter=\"[!is[system]search:title{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n//<small>{{$:/language/Search/Matches/All}}</small>//\n\n<$list filter=\"[!is[system]search{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n\\end\n<<searchResultList>>\n"
},
"$:/core/ui/EditTemplate/body/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\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}}></$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 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 $tiddler=<<newFieldNameTiddler>>/>\n<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/>\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 $tiddler=<<newFieldNameTiddler>>/>\n<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/>\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=\"tc-edit-fields\">\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<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}}/>\n</td>\n<td class=\"tc-edit-field-remove\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\n<$action-deletefield $field=<<currentField>>/>\n{{$:/core/images/delete-button}}\n</$button>\n</td>\n</tr>\n</$list>\n</$list>\n</tbody>\n</table>\n</div>\n\n<$fieldmangler>\n<div class=\"tc-edit-field-add\">\n<em class=\"tc-edit\">\n<<lingo Fields/Add/Prompt>> \n</em>\n<span class=\"tc-edit-field-add-name\">\n<$edit-text tiddler=<<newFieldNameTiddler>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}}/>\n</span> \n<$button popup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> \n<$reveal state=<<qualify \"$:/state/popup/field-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$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={{{ [<newFieldNameTiddler>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<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\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<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$set>\n</$linkcatcher>\n</$set>\n</div>\n</$reveal>\n<span class=\"tc-edit-field-add-value\">\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}}/>\n</$keyboard>\n</$set>\n</span> \n<span class=\"tc-edit-field-add-button\">\n<$macrocall $name=\"new-field\"/>\n</span>\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)\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 message=\"tm-remove-tag\" param={{!!title}} class=\"tc-btn-invisible tc-remove-tag-button\">{{$:/core/images/close-button}}</$button>\n</span>\n</$vars>\n\\end\n\n\\define tag-body(colour,palette,icon)\n<$macrocall $name=\"tag-body-inner\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon=\"\"\"$icon$\"\"\"/>\n\\end\n\n<div class=\"tc-edit-tags\">\n<$fieldmangler>\n<$list filter=\"[all[current]tags[]sort[title]]\" storyview=\"pop\">\n<$macrocall $name=\"tag-body\" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}}/>\n</$list>\n<$set name=\"tabIndex\" value={{$:/config/EditTabIndex}}>\n<$macrocall $name=\"tag-picker\"/>\n</$set>\n</$fieldmangler>\n</div>\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}}/>\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",
"text": "\\define lingo-base() $:/language/EditTemplate/\n\\whitespace trim\n<div class=\"tc-type-selector\"><$fieldmangler>\n<em class=\"tc-edit\"><<lingo Type/Prompt>></em> <$edit-text field=\"type\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-edit-typeeditor tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}}/> <$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message=\"tm-remove-field\" param=\"type\" class=\"tc-btn-invisible tc-btn-icon\" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button>\n</$fieldmangler></div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$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<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]]\"><$link to={{!!name}}><$view field=\"description\"/> (<$view field=\"name\"/>)</$link>\n</$list>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</$set>\n</div>\n"
},
"$:/core/ui/EditTemplate": {
"title": "$:/core/ui/EditTemplate",
"text": "\\define save-tiddler-actions()\n<$action-sendmessage $message=\"tm-add-tag\" $param={{{ [<newTagNameTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/>\n<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/>\n<$action-sendmessage $message=\"tm-save-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\">>>\n<$keyboard key=\"((cancel-edit-tiddler))\" message=\"tm-cancel-tiddler\">\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": "<$button message=\"tm-cancel-tiddler\" tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>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>"
},
"$:/core/ui/Buttons/delete": {
"title": "$:/core/ui/Buttons/delete",
"tags": "$:/tags/EditToolbar $:/tags/ViewToolbar",
"caption": "{{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}}",
"description": "{{$:/language/Buttons/Delete/Hint}}",
"text": "<$button message=\"tm-delete-tiddler\" tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>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>"
},
"$:/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<$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]]",
"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/]] +[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=\" \"/>\n\n<$entity entity=\"✓\"/>\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]]",
"dropdown": "$:/core/ui/EditorToolbar/line-width-dropdown",
"text": "<$text text={{$:/config/BitmapEditor/LineWidth}}/>"
},
"$:/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 $tiddler=<<dropdown-state>> />\n<$action-deletetiddler $tiddler=<<searchTiddler>> />\n<$action-deletetiddler $tiddler=<<linkTiddler>> />\n\\end\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 body(config-title)\n''<<lingo Hint>>''\n\n<$vars searchTiddler=\"\"\"$config-title$/search\"\"\" linkTiddler=\"\"\"$config-title$/link\"\"\" linktext=\"\" >\n\n<$vars linkTiddler=<<searchTiddler>>>\n<$keyboard key=\"ENTER\" actions=<<add-link-actions>>>\n<$edit-text tiddler=<<searchTiddler>> type=\"search\" tag=\"input\" focus=\"true\" placeholder={{$:/language/Search/Search}} default=\"\"/>\n<$reveal tag=\"span\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n<<external-link>>\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\">\n<$action-setfield $tiddler=<<searchTiddler>> text=\"\" />\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</$keyboard>\n</$vars>\n\n<$reveal tag=\"div\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n\n<$linkcatcher actions=<<add-link-actions>> to=<<linkTiddler>>>\n\n{{$:/core/ui/SearchResults}}\n\n</$linkcatcher>\n\n</$reveal>\n\n</$vars>\n\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Link/\">>/>"
},
"$:/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=\" \"/>\n\n<$entity entity=\"✓\"/>\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]]",
"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]]",
"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=\" \"/>\n\n<$entity entity=\"✓\"/>\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]]",
"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>>/> × <$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]]",
"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/]] +[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()\nmessage-$(payloadTiddler)$\n\\end\n\n\\define selectionField()\nselection-$(payloadTiddler)$\n\\end\n\n\\define previewPopupState()\n$(currentTiddler)$!!popup-$(payloadTiddler)$\n\\end\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>\n<tbody>\n<tr>\n<th>\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>\n<td>\n<$checkbox field=<<selectionField>> checked=\"checked\" unchecked=\"unchecked\" default=\"checked\"/>\n</td>\n<td>\n<$reveal type=\"nomatch\" stateTitle=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" setTitle=<<previewPopupState>> setTo=\"yes\">\n{{$:/core/images/right-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" setTitle=<<previewPopupState>> setTo=\"no\">\n{{$:/core/images/down-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n</td>\n<td>\n<$view field=<<messageField>>/>\n</td>\n</tr>\n<tr>\n<td colspan=\"3\">\n<$reveal type=\"match\" text=\"yes\" stateTitle=<<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\"\"\"/>\n</$navigator>\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/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/KeyboardShortcut/toggle-sidebar": {
"title": "$:/core/ui/KeyboardShortcut/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"
},
"$:/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": "\\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<$action-listops\n\t$tiddler=<<currentTiddler>>\n\t$field=\"tags\"\n\t$subfilter=\"[<tag>] [all[current]tags[]]\"\n/>\n\\end\n\n<p>\n<$list filter=\"[all[current]tags[]] [list[$:/config/Manager/RecentTags]] +[sort[title]] \" variable=\"tag\">\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<$macrocall $name=\"tag-picker\" actions=<<tag-picker-actions>>/>\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<<tabs \"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar/Plugins]!has[draft.of]]\" \"$:/core/ui/MoreSideBar/Plugins/Plugins\">>\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 control-panel-button(class)\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>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=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/close-all": {
"title": "$:/core/ui/Buttons/close-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Caption}}",
"description": "{{$:/language/Buttons/CloseAll/Hint}}",
"text": "<$button message=\"tm-close-all-tiddlers\" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>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",
"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<$set name=\"tv-config-toolbar-icons\" value={{$:/config/Toolbar/Icons}}>\n\n<$set name=\"tv-config-toolbar-text\" value={{$:/config/Toolbar/Text}}>\n\n<$set name=\"tv-config-toolbar-class\" value={{$:/config/Toolbar/ButtonClass}}>\n\n<$set name=\"tv-enable-drag-and-drop\" value={{$:/config/DragAndDrop/Enable}}>\n\n<$set name=\"tv-show-missing-links\" value={{$:/config/MissingLinks}}>\n\n<$set name=\"storyviewTitle\" value={{$:/view}}>\n\n<$set name=\"languageTitle\" value={{{ [{$:/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</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\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>>/></$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>>/></$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=<<lingo Delete/Hint>> aria-label=<<lingo 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\"> <<lingo Names/External/Show>></$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/SearchResults": {
"title": "$:/core/ui/SearchResults",
"text": "<div class=\"tc-search-results\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\"\"\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n\n</$list>\n\n</div>\n"
},
"$:/core/ui/SideBar/More": {
"title": "$:/core/ui/SideBar/More",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/More/Caption}}",
"text": "<div class=\"tc-more-sidebar\">\n<$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\" />\n</div>"
},
"$:/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\">{{$:/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<div class=\"tc-sidebar-lists tc-sidebar-search\">\n\n<$set name=\"searchTiddler\" value=\"$:/temp/search\">\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/search\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-popup-handle\"/>\n<$reveal state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search}}/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\" />\n{{$:/core/images/close-button}}\n</$button>\n<$button popup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<$list filter=\"[{$:/temp/search}minlength{$:/config/Search/MinLength}limit[1]]\" variable=\"listItem\">\n<$set name=\"searchTerm\" value={{{ [<searchTiddler>get[text]] }}}>\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[!is[system]search<searchTerm>]\"/>\"\"\">\n{{$:/language/Search/Matches}}\n</$set>\n</$set>\n</$list>\n</$button>\n</$reveal>\n<$reveal state=\"$:/temp/search\" type=\"match\" text=\"\">\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown tc-search-drop-down tc-popup-handle\" state=<<qualify \"$:/state/popup/search-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n\n<$list filter=\"[{$:/temp/search}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n{{$:/core/ui/SearchResults}}\n\n</$list>\n\n</$reveal>\n\n</$reveal>\n\n</$set>\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\"/>\n\n</div>\n"
},
"$:/TagManager": {
"title": "$:/TagManager",
"icon": "$:/core/images/tag-button",
"color": "#bbb",
"text": "\\define lingo-base() $:/language/TagManager/\n\\define iconEditorTab(type)\n\\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/TagTemplate": {
"title": "$:/core/ui/TagTemplate",
"text": "\\whitespace trim\n<span class=\"tc-tag-list-item\">\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<$transclude tiddler=<<listItem>>/>\n\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Fields": {
"title": "$:/core/ui/TiddlerInfo/Fields",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Fields/Caption}}",
"text": "<$transclude tiddler=\"$:/core/ui/TiddlerFields\"/>\n"
},
"$:/core/ui/TiddlerInfo/List": {
"title": "$:/core/ui/TiddlerInfo/List",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/List/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[list{!!title}]\" emptyMessage=<<lingo List/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/Listed": {
"title": "$:/core/ui/TiddlerInfo/Listed",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Listed/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]listed[]!is[system]]\" emptyMessage=<<lingo Listed/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/References": {
"title": "$:/core/ui/TiddlerInfo/References",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/References/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]backlinks[]sort[title]]\" emptyMessage=<<lingo References/Empty>> template=\"$:/core/ui/ListItemTemplate\">\n</$list>"
},
"$:/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}}/>"
},
"$:/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\">{{$:/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\">{{$:/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": "<$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"
},
"$:/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<span class=\"tc-tiddler-title-icon\" style=<<title-styles>>>\n<$transclude tiddler={{!!icon}}>\n<$transclude tiddler={{$:/config/DefaultTiddlerIcon}}/>\n</$transclude>\n</span>\n</$set>\n<$list filter=\"[all[current]removeprefix[$:/]]\">\n<h2 class=\"tc-title\" title={{$:/language/SystemTiddler/Tooltip}}>\n<span class=\"tc-system-title-prefix\">$:/</span><$text text=<<currentTiddler>>/>\n</h2>\n</$list>\n<$list filter=\"[all[current]!prefix[$:/]]\">\n<h2 class=\"tc-title\">\n<$view field=\"title\"/>\n</h2>\n</$list>\n</$link>\n</$set>\n</div>\n\n<$reveal type=\"nomatch\" text=\"\" default=\"\" state=<<tiddlerInfoState>> class=\"tc-tiddler-info tc-popup-handle\" animate=\"yes\" retain=\"yes\">\n\n<$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\\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!!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!!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/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.22/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": "no"
},
"$:/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[]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state/]] -[prefix[$:/temp/]]"
},
"$:/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/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/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/italic": {
"title": "$:/config/ShortcutInfo/italic",
"text": "{{$:/language/Buttons/Italic/Hint}}"
},
"$:/config/ShortcutInfo/link": {
"title": "$:/config/ShortcutInfo/link",
"text": "{{$:/language/Buttons/Link/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/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/underline": {
"title": "$:/config/ShortcutInfo/underline",
"text": "{{$:/language/Buttons/Underline/Hint}}"
},
"$:/config/SyncFilter": {
"title": "$:/config/SyncFilter",
"text": "[is[tiddler]] -[[$:/HistoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]]"
},
"$:/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/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-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/cancel-edit-tiddler": {
"title": "$:/config/shortcuts/cancel-edit-tiddler",
"text": "escape"
},
"$:/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/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/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 swatchStyle()\nbackground-color: $(swatchColour)$;\n\\end\n\\define swatch()\n<$set name=\"swatchColour\" value={{##$(colour)$}}\n><div class=\"tc-swatch\" style=<<swatchStyle>> title=<<colour>>/></$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>"
},
"$:/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<span class=\"tc-popup-keep\"><$button popup=<<qualify \"$:/state/popup/export\">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>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={{$lingoBase$Caption}}/></span>\n</$list>\n</$button></span><$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n<$set name=\"extension\" value={{!!extension}}>\n<$button class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-download-file\" $param=<<currentTiddler>> exportFilter=\"\"\"$exportFilter$\"\"\" filename=<<exportButtonFilename \"\"\"$baseFilename$\"\"\">>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n<$transclude field=\"description\"/>\n</$button>\n</$set>\n</$list>\n</div>\n</$reveal>\n\\end\n"
},
"$:/core/macros/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/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</$type$>\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 \n</div>\n<div style=\"height:0.5em;\"/>\n</$droppable>\n</$tiddler>\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)\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=<<qualify \"$state$\">> setTo=<<currentTab>> default=\"$default$\" selectedClass=\"tc-tab-selected\" tooltip={{!!tooltip}}>\n<$tiddler tiddler=<<save-currentTiddler>>>\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude tiddler=\"$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></$button></$tiddler></$set></$list>\n</div>\n<div class=\"tc-tab-divider $class$\"/>\n<div class=\"tc-tab-content $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\n<$reveal type=\"match\" state=<<qualify \"$state$\">> text=<<currentTab>> default=\"$default$\" 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\\end\n"
},
"$:/core/macros/tag-picker": {
"title": "$:/core/macros/tag-picker",
"tags": "$:/tags/Macro",
"text": "\\define add-tag-actions()\n<$action-sendmessage $message=\"tm-add-tag\" $param={{{ [<newTagNameTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>\n\\end\n\n\\define tag-button()\n<$button class=\"tc-btn-invisible\" tag=\"a\" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}>\n<$action-sendmessage $message=\"tm-add-tag\" $param=<<tag>>/>\n<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>\n<$macrocall $name=\"tag-pill\" tag=<<tag>>/>\n</$button>\n\\end\n\n\\define tag-picker-inner()\n\\whitespace trim\n<div class=\"tc-edit-add-tag\">\n<span class=\"tc-add-tag-name\">\n<$keyboard key=\"ENTER\" actions=<<add-tag-actions>>>\n<$edit-text tiddler=<<newTagNameTiddler>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}}/>\n</$keyboard>\n</span> <$button popup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class=\"tc-add-tag-button\">\n<$set name=\"tag\" value={{{ [<newTagNameTiddler>get[text]] }}}>\n<$button set=\"$:/temp/NewTagName\" setTo=\"\" class=\"\">\n<<add-tag-actions>>\n<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>\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\">\n<$set name=\"newTagName\" value={{{ [<newTagNameTiddler>get[text]] }}}>\n<$list filter=\"[<newTagName>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=\"[tags[]!is[system]search:title<newTagName>sort[]]\" variable=\"tag\">\n<<tag-button>>\n</$list></$list>\n<hr>\n<$list filter=\"[<newTagName>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=\"[tags[]is[system]search:title<newTagName>sort[]]\" variable=\"tag\">\n<<tag-button>>\n</$list></$list>\n</$set>\n</div>\n</$reveal>\n</div>\n\\end\n\\define tag-picker()\n\\whitespace trim\n<$list filter=\"[<newTagNameTiddler>match[]]\" emptyMessage=<<tag-picker-inner>>>\n<$set name=\"newTagNameTiddler\" value=<<qualify \"$:/temp/NewTagName\">>>\n<<tag-picker-inner>>\n</$set>\n</$list>\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\">\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><$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>\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>\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}} --- {{$:/SiteSubtitle}}"
},
"$:/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>"
}
}
}
\define colour(name)
<$transclude tiddler={{$:/palette}} index="$name$"><$transclude tiddler="$:/palettes/Vanilla" index="$name$"><$transclude tiddler="$:/config/DefaultColourMappings/$name$"/></$transclude></$transclude>
\end
\define color(name)
<<colour $name$>>
\end
\define box-shadow(shadow)
``
-webkit-box-shadow: $shadow$;
-moz-box-shadow: $shadow$;
box-shadow: $shadow$;
``
\end
\define filter(filter)
``
-webkit-filter: $filter$;
-moz-filter: $filter$;
filter: $filter$;
``
\end
\define transition(transition)
``
-webkit-transition: $transition$;
-moz-transition: $transition$;
transition: $transition$;
``
\end
\define transform-origin(origin)
``
-webkit-transform-origin: $origin$;
-moz-transform-origin: $origin$;
transform-origin: $origin$;
``
\end
\define background-linear-gradient(gradient)
``
background-image: linear-gradient($gradient$);
background-image: -o-linear-gradient($gradient$);
background-image: -moz-linear-gradient($gradient$);
background-image: -webkit-linear-gradient($gradient$);
background-image: -ms-linear-gradient($gradient$);
``
\end
\define column-count(columns)
``
-moz-column-count: $columns$;
-webkit-column-count: $columns$;
column-count: $columns$;
``
\end
\define datauri(title)
<$macrocall $name="makedatauri" type={{$title$!!type}} text={{$title$}} _canonical_uri={{$title$!!_canonical_uri}}/>
\end
\define if-sidebar(text)
<$reveal state="$:/state/sidebar" type="match" text="yes" default="yes">$text$</$reveal>
\end
\define if-no-sidebar(text)
<$reveal state="$:/state/sidebar" type="nomatch" text="yes" default="yes">$text$</$reveal>
\end
\define if-background-attachment(text)
<$reveal state="$:/themes/tiddlywiki/vanilla/settings/backgroundimage" type="nomatch" text="">$text$</$reveal>
\end
{
"tiddlers": {
"Untitled 1": {
"title": "Untitled 1",
"text": "<meta charset='utf-8'><span style=\"color: rgba(255, 255, 255, 0.7); font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(19, 21, 23); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;\">cricrimental</span>",
"type": "text/html"
},
"Untitled": {
"title": "Untitled",
"text": "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\"><span style=\"color: rgb(255, 255, 255); font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 37.6px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 700; letter-spacing: -0.5px; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(19, 21, 23); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;\">020 10 16 Family lunch</span>"
}
}
}
alert-background: <<colour background>>
alert-border: <<colour very-muted-foreground>>
alert-highlight: <<colour very-muted-foreground>>
alert-muted-foreground: <<colour muted-foreground>>
background: #303030
blockquote-bar: <<colour page-background>>
button-background: transparent
button-foreground: inherit
button-border: <<colour tag-background>>
code-background: <<colour pre-background>>
code-border: <<colour pre-border>>
code-foreground: rgba(255, 255, 255, 0.54)
dirty-indicator: #c80000
download-background: <<colour primary>>
download-foreground: <<colour foreground>>
dragger-background: <<colour foreground>>
dragger-foreground: <<colour background>>
dropdown-background: #424242
dropdown-border: <<colour dropdown-background>>
dropdown-tab-background-selected: <<colour dropdown-background>>
dropdown-tab-background: #050505
dropzone-background: <<colour tag-background>>
external-link-background-hover: transparent
external-link-background-visited: transparent
external-link-background: transparent
external-link-foreground-hover:
external-link-foreground-visited: #7c318c
external-link-foreground: #9e3eb3
foreground: rgba(255, 255, 255, 0.7)
message-background: <<colour background>>
message-border: <<colour very-muted-foreground>>
message-foreground: rgba(255, 255, 255, 0.54)
modal-backdrop: <<colour page-background>>
modal-background: <<colour background>>
modal-border: <<colour very-muted-foreground>>
modal-footer-background: <<colour background>>
modal-footer-border: <<colour background>>
modal-header-border: <<colour very-muted-foreground>>
muted-foreground: rgba(255, 255, 255, 0.54)
notification-background: <<colour dropdown-background>>
notification-border: <<colour dropdown-background>>
page-background: #212121
pre-background: #2a2a2a
pre-border: transparent
primary: #5656f3
select-tag-background: <<colour background>>
select-tag-foreground: <<colour foreground>>
sidebar-button-foreground: <<colour foreground>>
sidebar-controls-foreground-hover: #494949
sidebar-controls-foreground: #5d5d5d
sidebar-foreground-shadow: transparent
sidebar-foreground: rgba(255, 255, 255, 0.54)
sidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)
sidebar-muted-foreground: rgba(255, 255, 255, 0.38)
sidebar-tab-background-selected: <<colour page-background>>
sidebar-tab-background: transparent
sidebar-tab-border-selected: <<colour table-border>>
sidebar-tab-border: transparent
sidebar-tab-divider: <<colour table-border>>
sidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)
sidebar-tab-foreground: rgba(255, 255, 255, 0.54)
sidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)
sidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)
site-title-foreground: rgba(255, 255, 255, 0.7)
static-alert-foreground: #aaaaaa
tab-background-selected: <<colour background>>
tab-background: transparent
tab-border-selected: <<colour table-border>>
tab-border: transparent
tab-divider: <<colour table-border>>
tab-foreground-selected: rgba(255, 255, 255, 0.87)
tab-foreground: rgba(255, 255, 255, 0.54)
table-border: #3a3a3a
table-footer-background: <<colour tiddler-editor-fields-odd>>
table-header-background: <<colour tiddler-editor-fields-even>>
tag-background: #ec6
tag-foreground: <<colour button-foreground>>
tiddler-background: <<colour background>>
tiddler-border: red
tiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>
tiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>
tiddler-controls-foreground: <<colour sidebar-controls-foreground>>
tiddler-editor-background: transparent
tiddler-editor-border-image:
tiddler-editor-border: rgba(255, 255, 255, 0.08)
tiddler-editor-fields-even: rgba(255, 255, 255, 0.1)
tiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)
tiddler-info-background: #454545
tiddler-info-border: #454545
tiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>
tiddler-link-background: <<colour background>>
tiddler-link-foreground: <<colour primary>>
tiddler-subtitle-foreground: <<colour muted-foreground>>
tiddler-title-foreground: red
toolbar-new-button:
toolbar-options-button:
toolbar-save-button:
toolbar-info-button:
toolbar-edit-button:
toolbar-close-button:
toolbar-delete-button:
toolbar-cancel-button:
toolbar-done-button:
untagged-background: <<colour very-muted-foreground>>
very-muted-foreground: rgba(255, 255, 255, 0.12)
{
"tiddlers": {
"$:/plugins/danielo515/encryptTiddler/Encrypt-Tiddler": {
"title": "$:/plugins/danielo515/encryptTiddler/Encrypt-Tiddler",
"created": "20140406153742691",
"creator": "Danielo515",
"description": "add the hability to encrypt individual tiddlers",
"modified": "20141029152631265",
"modifier": "Danielo Rodriguez",
"tags": "index plugins",
"type": "text/vnd.tiddlywiki",
"caption": "readme",
"text": "This plugin adds the ability to encrypt your tiddlers individually. This have several advantages:\n\n* You can specify a different password for each tiddler if you want.\n* You don't have to encrypt your whole wiky.\n* If you forget your password, you only lose a tiddler.\n* It's possible to edit the tiddler content , tags and fields ''except the encrypt field'' after encryption. Decrypting your tiddler will restore it to its original state when you encrypted it. This way you can hide the encrypted tiddlers as a \"different\" thing.\n* You can even encrypt images.\n* You can have sensible data in a day to day wiky.\n* I didn't try this, but theoretically you can apply double encryption by encrypting your wiki too."
},
"$:/plugins/danielo515/encryptTiddler/Changelog": {
"title": "$:/plugins/danielo515/encryptTiddler/Changelog",
"text": "!! V2.3\n* No need to double type password for decrypt tiddlers\n* Fix bug with batch encryption\n* Code simplified\n!! V2.2\n* Added the need to type the password twice\n* Tested on tw 5.1.22\n!! V2.1\n* Added control panel.\n* Added ability to batch encrypt and decrypt tiddlers.\n* Added some documentation an language strings.\n\n"
},
"$:/plugins/danielo515/encryptTiddler/control-panel/batch-encrypt": {
"title": "$:/plugins/danielo515/encryptTiddler/control-panel/batch-encrypt",
"caption": "Batch Encryption",
"text": "\\define lingo-base() $:/language/Search/\n<<lingo Filter/Hint>>\n{{$:/plugins/danielo515/encryptTiddler/language/batch}}\n\n<$linkcatcher to=\"$:/temp/encrypt/filter\">\n\n<div class=\"tc-search tc-advanced-search\">\n<$edit-text tiddler=\"$:/temp/encrypt/filter\" type=\"search\" tag=\"input\" default=\"\" placeholder=\"filter tiddlers\"/>\n<$button popup=<<qualify \"$:/state/filterDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n<$reveal state=\"$:/temp/encrypt/filter\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/encrypt/filter\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n\n\n<$edit-text tag=\"input\" tiddler=\"$:/temp/password1\" placeholder=\"password\" type=\"password\" default=\"\" col=\"4\"/>\n<$edit-text tag=\"input\" tiddler=\"$:/temp/password2\" placeholder=\"confirm password\" type=\"password\" default=\"\" col=\"4\"/>\n<$encryptTiddler passwordTiddler1=\"$:/temp/password1\" passwordTiddler2=\"$:/temp/password2\" filter={{$:/temp/encrypt/filter}}>\n<$button message=\"tw-encrypt-tiddler\">\nEncrypt\n</$button>\n<$button message=\"tw-decrypt-tiddler\">\nDecrypt\n</$button>\n</$encryptTiddler>\n</$reveal>\n</div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/filterDropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Filter]!sort[]] -[[$:/core/Filters/SystemTags]] -[[$:/core/Filters/AllTags]]\"><$link to={{!!filter}}><$transclude field=\"description\"/></$link>\n</$list>\n</div>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/encrypt/filter\" type=\"nomatch\" text=\"\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/encrypt/filter}}/>\"\"\">\n<div class=\"tc-search-results\">\n<<lingo Filter/Matches>>\n<$list filter={{$:/temp/encrypt/filter}} template=\"$:/plugins/danielo515/encryptTiddler/ui/listItemTemplate\"/>\n</div>\n</$set>\n</$reveal>"
},
"$:/plugins/danielo515/encryptTiddler/control-panel": {
"title": "$:/plugins/danielo515/encryptTiddler/control-panel",
"tags": "$:/tags/ControlPanel",
"caption": "Encrypt Tiddlers",
"text": "\\define prefix(name) $:/plugins/danielo515/encryptTiddler/control-panel/$name$\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]prefix[$:/plugins/danielo515/encryptTiddler/control-panel/]]\" default=<<prefix \"batch-encrypt\">> state=\"$:/state/encryptTiddler/control-panel/tabs\">>"
},
"$:/plugins/danielo515/encryptTiddler/crypt-batch-button": {
"title": "$:/plugins/danielo515/encryptTiddler/crypt-batch-button",
"creator": "Danielo",
"text": "<span title=\"Encrypt/Decrypt tiddler\" class=\"pc-batch-controls\">\n <$reveal state=<<qualify \"$:/state/encrypt\">> type=\"nomatch\" text={{!!title}} animate=\"no\"><$button set=<<qualify \"$:/state/encrypt\">> setTo={{!!title}} class=\"tc-btn-invisible\">{{$:/plugins/danielo515/encryptTiddler/unlocked}}</$button></$reveal><$reveal state=<<qualify \"$:/state/encrypt\">> type=\"match\" text={{!!title}} animate=\"no\"><$button set=<<qualify \"$:/state/encrypt\">> setTo=\"\" class=\"tc-btn-invisible\">{{$:/plugins/danielo515/encryptTiddler/unlocked}}</$button></$reveal>\n <$encryptTiddler passwordTiddler1=\"$:/temp/password1\" passwordTiddler2=\"$:/temp/password2\" filter={{$:/temp/encrypt/filter}}><$reveal state=<<qualify \"$:/state/encrypt\">> type=\"match\" text={{!!title}} animate=\"yes\">\n <div class=\"tc-block-dropdown tw-crypt-dropdown\">\n <span class=\"tw-password-field\"><$edit-text tiddler=\"$:/temp/password1\" tag=\"input\" type=\"password\" default=\"\" placeholder=\"password\" class=\"tc-edit-texteditor\"/></span>\n <span class=\"tw-password-field\"><$edit-text tiddler=\"$:/temp/password2\" tag=\"input\" type=\"password\" default=\"\" placeholder=\"repeat\" class=\"tc-edit-texteditor\"/></span>\n <span class=\"tw-crypt-button\"> <$button message=\"tw-encrypt-tiddler\" set=<<qualify \"$:/state/encrypt\">> setTo=\"\" >Encrypt</$button> <$button message=\"tw-decrypt-tiddler\" set=<<qualify \"$:/state/encrypt\">> setTo=\"\" >Decrypt</$button></span>\n </div>\n </$reveal></$encryptTiddler>\n</span>\n"
},
"$:/plugins/danielo515/encryptTiddler/crypt-button": {
"title": "$:/plugins/danielo515/encryptTiddler/crypt-button",
"created": "20140405233000477",
"creator": "Danielo",
"modified": "20200422065835622",
"tags": "$:/tags/ViewToolbar button encrypt export",
"type": "text/vnd.tiddlywiki",
"text": "<span title=\"Encrypt/Decrypt tiddler\"><$transclude tiddler=\"$:/plugins/danielo515/encryptTiddler/openPopup\"/>\n</span><$encryptTiddler passwordTiddler1=\"$:/temp/password1\" passwordTiddler2=\"$:/temp/password2\"><$reveal state=\"$:/state/encrypt\" type=\"match\" text={{!!title}} animate=\"yes\">\n<div class=\"tc-block-dropdown tw-crypt-dropdown\">\n<div>\n <div class=\"tw-password-field\"><$edit-text tiddler=\"$:/temp/password1\" tag=\"input\" type=\"password\" default=\"\" placeholder=\"password\" class=\"tc-edit-texteditor\"/></div>\n <$list filter=\"[all[current]!has[encrypted]]\"><div class=\"tw-password-field\"><$edit-text tiddler=\"$:/temp/password2\" tag=\"input\" type=\"password\" default=\"\" placeholder=\"repeat\" class=\"tc-edit-texteditor\"/></div></$list>\n</div>\n <span class=\"tw-crypt-button\"> <$list filter=\"[all[current]!has[encrypted]]\"> <$button message=\"tw-encrypt-tiddler\" set=\"$:/state/encrypt\" setTo=\"\" >Encrypt</$button></$list><$list filter=\"[is[current]has[encrypted]]\"> <$button message=\"tw-decrypt-tiddler\" set=\"$:/state/encrypt\" setTo=\"\" >Decrypt</$button></$list></span>\n</div>\n</$reveal></$encryptTiddler>\n"
},
"$:/plugins/danielo515/encryptTiddler/encrypttiddler.js": {
"title": "$:/plugins/danielo515/encryptTiddler/encrypttiddler.js",
"text": "/*\\\ntitle: $:/plugins/danielo515/encryptTiddler/encrypttiddler.js\ntype: application/javascript\nmodule-type: widget\n\nencrypttiddler widget\n\n\n\\*/\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 encryptTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t\t{type: \"tw-encrypt-tiddler\", handler: \"handleEncryptevent\"},\n\t\t\t{type: \"tw-decrypt-tiddler\", handler: \"handleDecryptevent\"},\n\t\t\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nencryptTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nencryptTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tconsole.log(\"Render\");\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*/\nencryptTiddlerWidget.prototype.execute = function() {\n\t// Get attributes\n\t this.tiddlerTitle=this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t this.filter=this.getAttribute(\"filter\",undefined);\n \t this.passwordTiddler1=this.getAttribute(\"passwordTiddler1\");\n \t this.passwordTiddler2=this.getAttribute(\"passwordTiddler2\");\n\t// Construct the child widgets\n\tconsole.log(this.targetTiddler);\n\t\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*/\nencryptTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.filter) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nencryptTiddlerWidget.prototype.getTiddlersToProcess = function () {\n if (this.filter) {\n //we have a filter to work with\n return this.wiki.filterTiddlers(this.filter);\n }\n //single tiddler case\n var tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n return tiddler ? [tiddler.fields.title] : [];\n};\n\nencryptTiddlerWidget.prototype.handleEncryptevent = function (event) {\n var password = this.getPassword(true);\n var tiddlers = this.getTiddlersToProcess();\n\n if (tiddlers.length > 0 && password) {\n var self = this;\n $tw.utils.each(tiddlers, function (title) {\n var tiddler = self.wiki.getTiddler(title);\n var fields = {\n text: \"!This is an encrypted Tiddler\",\n encrypted: self.encryptFields(title, password),\n };\n self.saveTiddler(tiddler, fields);\n });\n } else {\n console.log(\n \"We did not find any tiddler to encrypt or password not set!\"\n );\n }\n};\n\nencryptTiddlerWidget.prototype.handleDecryptevent = function(event){\n\tvar password =this.getPassword(false);\n\tvar tiddlers = this.getTiddlersToProcess();\n\n\tif(tiddlers.length > 0 && password){\n\t\tvar self = this;\n\t\t$tw.utils.each(tiddlers, function(title){\n\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\tvar fields = self.decryptFields(tiddler,password);\n\t\t\tif(fields)self.saveTiddler(tiddler,fields);\n\t\t});\n\t}\n};\n\nencryptTiddlerWidget.prototype.saveTiddler=function(tiddler,fields){\n\tthis.wiki.addTiddler( new $tw.Tiddler(this.wiki.getModificationFields(),tiddler,this.clearNonStandardFields(tiddler), fields ) )\n}\n\nencryptTiddlerWidget.prototype.encryptFields = function (title,password){\n\tvar jsonData=this.wiki.getTiddlerAsJson(title);\n\treturn $tw.crypto.encrypt(jsonData,password);\n\n};\n\nencryptTiddlerWidget.prototype.decryptFields = function (tiddler, password) {\n var JSONfields = $tw.crypto.decrypt(tiddler.fields.encrypted, password);\n if (JSONfields !== null) {\n return JSON.parse(JSONfields);\n }\n console.log(\n \"Error decrypting \" + tiddler.fields.title + \". Probably bad password\"\n );\n return false;\n};\n\nencryptTiddlerWidget.prototype.getPasswordFromTiddler = function(title){\n\tvar tiddler=this.wiki.getTiddler(title);\n\tif(tiddler){\n\t\tvar password=tiddler.fields.text;\n\t\tthis.saveTiddler(tiddler); //reset password tiddler\n\t\treturn password;\n\t}\n\n\treturn false\n}\n\nencryptTiddlerWidget.prototype.getPassword = function(confirm){\n\tvar password1 = this.getPasswordFromTiddler(this.passwordTiddler1);\n\tif(!confirm) return password1\n var password2 = this.getPasswordFromTiddler(this.passwordTiddler2);\n\n if (password1 === password2) {\n return password1;\n }\n\n return null;\n}\n\n// This function erases every field of a tiddler that is not standard and also\n// the text field\nencryptTiddlerWidget.prototype.clearNonStandardFields =function(tiddler) {\n\tvar standardFieldNames = \"title tags modified modifier created creator\".split(\" \");\n\t\tvar clearFields = {};\n\t\tfor(var fieldName in tiddler.fields) {\n\t\t\tif(standardFieldNames.indexOf(fieldName) === -1) {\n\t\t\t\tclearFields[fieldName] = undefined;\n\t\t\t}\n\t\t}\n\t\tconsole.log(\"Cleared fields \"+JSON.stringify(clearFields));\n\t\treturn clearFields;\n};\n\nexports.encryptTiddler = encryptTiddlerWidget;",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/danielo515/encryptTiddler/Filters/encrypted-tiddlers": {
"title": "$:/plugins/danielo515/encryptTiddler/Filters/encrypted-tiddlers",
"description": "All encrypted tiddlers",
"filter": "[has[encrypted]]",
"tags": "$:/tags/Filter"
},
"$:/plugins/danielo515/encryptTiddler/Filters/normal-unencrypted-tiddlers": {
"title": "$:/plugins/danielo515/encryptTiddler/Filters/normal-unencrypted-tiddlers",
"filter": "[!is[system]!has[encrypted]]",
"description": "Non-encrypted normal tiddlers",
"tags": "$:/tags/Filter"
},
"$:/plugins/danielo515/encryptTiddler/language/batch": {
"title": "$:/plugins/danielo515/encryptTiddler/language/batch",
"text": "Use below controls to encrypt or decrypt a bunch of tiddlers. Encryption ''controls are hidden'' until you type something in the search box. All listed tiddlers will be affected. The presence of a small padlock (<span class=\"pc-listItem-lock\">{{$:/core/images/locked-padlock}}</span>) next to the tiddler title indicates that particular tiddler is already encrypted."
},
"$:/plugins/danielo515/encryptTiddler/ui/listItemTemplate": {
"title": "$:/plugins/danielo515/encryptTiddler/ui/listItemTemplate",
"text": "<div class=\"tc-menu-list-item\">\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n<$list filter=\"[all[current]has[encrypted]]\">\n<span class=\"pc-listItem-lock\">{{$:/core/images/locked-padlock}}</span>\n</$list>\n</$link>\n</div>"
},
"$:/plugins/danielo515/encryptTiddler/openPopup": {
"title": "$:/plugins/danielo515/encryptTiddler/openPopup",
"created": "20140406151910358",
"creator": "Danielo",
"modified": "20140608121417975",
"modifier": "Danielo515",
"tags": "button encrypt export",
"type": "text/vnd.tiddlywiki",
"text": "<$reveal state=\"$:/state/encrypt\" type=\"nomatch\" text={{!!title}} animate=\"no\"><$button set=\"$:/state/encrypt\" setTo={{!!title}} class=\"tc-btn-invisible\">{{$:/plugins/danielo515/encryptTiddler/unlocked}}</$button></$reveal><$reveal state=\"$:/state/encrypt\" type=\"match\" text={{!!title}} animate=\"no\"><$button set=\"$:/state/encrypt\" setTo=\"\" class=\"tc-btn-invisible\">{{$:/plugins/danielo515/encryptTiddler/unlocked}}</$button></$reveal>"
},
"$:/plugins/danielo515/encryptTiddler/styles": {
"title": "$:/plugins/danielo515/encryptTiddler/styles",
"created": "20140406110705085",
"creator": "danielo",
"tags": "$:/tags/Stylesheet encrypt export",
"type": "text/plain",
"text": ".tw-password-field {\n\tdisplay: block;\n\tfont-size:1em;\n\tline-height:0;\n\tmargin: 0;\n}\n\n/*It is for use in combination with tc-block-dropdown */\n.tw-crypt-dropdown{\n\tline-height:0;\n\tpadding: 8px;\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.pc-batch-controls .tw-crypt-dropdown{\n\tright: 0px;\n}\n\n.pc-batch-controls{\n\tposition:relative;\n}\n\n.pc-listItem-lock svg{\n\theight: 1em;\n\twidth: 1em;\n\tfill: #aaaaaa;\n}\n\n.tw-password-field input{\n\tfont-size:0.5em;\n}\n\n.tw-crypt-button {\n\tdisplay: inline-block;\n\tpadding: 8px;\n}\n\n.tw-crypt-button button{\n\tfont-size:0.5em;\n\ttext-transform: uppercase;\n\tborder-radius: 4px;\n}\n"
},
"$:/plugins/danielo515/encryptTiddler/unlocked": {
"title": "$:/plugins/danielo515/encryptTiddler/unlocked",
"created": "20140406101339943",
"creator": "danielo515",
"modified": "20140608121532690",
"modifier": "danielo515",
"tags": "encrypt export",
"type": "text/vnd.tiddlywiki",
"text": "<svg version=\"1.1\" id=\"Capa_1\" xmlns=\"http://www.w3.org/2000/svg\" class=\"tc-image-button\"\n\t viewBox=\"0 0 100 100\" style=\"enable-background:new 0 0 100 100;\" xml:space=\"preserve\">\n<g>\n\t<path d=\"M77.555,50H35.304V31.63c0-4.057,1.435-7.521,4.305-10.391c2.87-2.87,6.333-4.305,10.391-4.305\n\t\tc4.056,0,7.52,1.435,10.39,4.305s4.305,6.335,4.305,10.391c0,0.996,0.363,1.857,1.091,2.583c0.727,0.729,1.588,1.09,2.583,1.09\n\t\th3.674c0.995,0,1.856-0.361,2.583-1.09c0.727-0.727,1.091-1.588,1.091-2.583c0-7.079-2.517-13.136-7.549-18.17\n\t\tC63.136,8.428,57.08,5.912,50,5.912c-7.081,0-13.137,2.516-18.169,7.548c-5.033,5.034-7.549,11.091-7.549,18.17V50h-1.837\n\t\tc-1.531,0-2.833,0.536-3.904,1.608c-1.072,1.072-1.607,2.372-1.607,3.902v33.067c0,1.532,0.535,2.832,1.607,3.904\n\t\tc1.071,1.072,2.372,1.608,3.904,1.608h55.11c1.53,0,2.832-0.536,3.904-1.608c1.071-1.072,1.607-2.372,1.607-3.904V55.51\n\t\tc0-1.529-0.536-2.83-1.607-3.902C80.387,50.536,79.085,50,77.555,50z M54.315,72.937V83.72c0,2.173-1.762,3.935-3.935,3.935H49.62\n\t\tc-2.173,0-3.935-1.762-3.935-3.935V72.937c-2.31-1.443-3.852-4.001-3.852-6.925c0-4.511,3.657-8.167,8.167-8.167\n\t\ts8.167,3.657,8.167,8.167C58.167,68.937,56.625,71.495,54.315,72.937z\"/>\n</g>\n</svg>\n"
}
}
}
{
"tiddlers": {
"$:/plugins/tiddlywiki/markdown/EditorToolbar/bold": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/bold",
"list-after": "$:/core/ui/EditorToolbar/bold",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/bold",
"caption": "{{$:/language/Buttons/Bold/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Bold/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((bold))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"**\"\n\tsuffix=\"**\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-1": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-1",
"list-after": "$:/core/ui/EditorToolbar/heading-1",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-1",
"caption": "{{$:/language/Buttons/Heading1/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading1/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"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"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-2": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-2",
"list-after": "$:/core/ui/EditorToolbar/heading-2",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-2",
"caption": "{{$:/language/Buttons/Heading2/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading2/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"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"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-3": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-3",
"list-after": "$:/core/ui/EditorToolbar/heading-3",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-3",
"caption": "{{$:/language/Buttons/Heading3/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading3/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"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"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-4": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-4",
"list-after": "$:/core/ui/EditorToolbar/heading-4",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-4",
"caption": "{{$:/language/Buttons/Heading4/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading4/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"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"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-5": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-5",
"list-after": "$:/core/ui/EditorToolbar/heading-5",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-5",
"caption": "{{$:/language/Buttons/Heading5/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading5/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"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"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-6": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-6",
"list-after": "$:/core/ui/EditorToolbar/heading-6",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-6",
"caption": "{{$:/language/Buttons/Heading6/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading6/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"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"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/italic": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/italic",
"list-after": "$:/core/ui/EditorToolbar/italic",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/italic",
"caption": "{{$:/language/Buttons/Italic/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Italic/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((italic))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"*\"\n\tsuffix=\"*\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/list-bullet": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/list-bullet",
"list-after": "$:/core/ui/EditorToolbar/list-bullet",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/list-bullet",
"caption": "{{$:/language/Buttons/ListBullet/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/ListBullet/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"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"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/list-number": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/list-number",
"list-after": "$:/core/ui/EditorToolbar/list-number",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/list-number",
"caption": "{{$:/language/Buttons/ListNumber/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/ListNumber/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((list-number))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"1.\"\n\tcount=\"1\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/mono-line": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/mono-line",
"list-after": "$:/core/ui/EditorToolbar/mono-line",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/mono-line",
"caption": "{{$:/language/Buttons/MonoLine/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/MonoLine/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((mono-line))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"`\"\n\tsuffix=\"`\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/quote": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/quote",
"list-after": "$:/core/ui/EditorToolbar/quote",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/quote",
"caption": "{{$:/language/Buttons/Quote/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Quote/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((quote))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\">\"\n\tcount=\"1\"\n/>\n"
},
"$:/config/markdown/breaks": {
"title": "$:/config/markdown/breaks",
"text": "false"
},
"$:/config/markdown/linkNewWindow": {
"title": "$:/config/markdown/linkNewWindow",
"text": "true"
},
"$:/config/markdown/linkify": {
"title": "$:/config/markdown/linkify",
"text": "false"
},
"$:/config/markdown/quotes": {
"title": "$:/config/markdown/quotes",
"text": "“”‘’"
},
"$:/config/markdown/renderWikiText": {
"title": "$:/config/markdown/renderWikiText",
"text": "true"
},
"$:/config/markdown/renderWikiTextPragma": {
"title": "$:/config/markdown/renderWikiTextPragma",
"text": "\\rules only html image macrocallinline syslink transcludeinline wikilink filteredtranscludeblock macrocallblock transcludeblock"
},
"$:/config/markdown/typographer": {
"title": "$:/config/markdown/typographer",
"text": "false"
},
"$:/language/Docs/Types/text/x-markdown": {
"title": "$:/language/Docs/Types/text/x-markdown",
"description": "Markdown",
"name": "text/x-markdown",
"group": "Text"
},
"$:/plugins/tiddlywiki/markdown/remarkable.js": {
"text": "!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=e||self).remarkable={})}(this,function(e){\"use strict\";var t={Aacute:\"Á\",aacute:\"á\",Abreve:\"Ă\",abreve:\"ă\",ac:\"∾\",acd:\"∿\",acE:\"∾̳\",Acirc:\"Â\",acirc:\"â\",acute:\"´\",Acy:\"А\",acy:\"а\",AElig:\"Æ\",aelig:\"æ\",af:\"\",Afr:\"𝔄\",afr:\"𝔞\",Agrave:\"À\",agrave:\"à\",alefsym:\"ℵ\",aleph:\"ℵ\",Alpha:\"Α\",alpha:\"α\",Amacr:\"Ā\",amacr:\"ā\",amalg:\"⨿\",AMP:\"&\",amp:\"&\",And:\"⩓\",and:\"∧\",andand:\"⩕\",andd:\"⩜\",andslope:\"⩘\",andv:\"⩚\",ang:\"∠\",ange:\"⦤\",angle:\"∠\",angmsd:\"∡\",angmsdaa:\"⦨\",angmsdab:\"⦩\",angmsdac:\"⦪\",angmsdad:\"⦫\",angmsdae:\"⦬\",angmsdaf:\"⦭\",angmsdag:\"⦮\",angmsdah:\"⦯\",angrt:\"∟\",angrtvb:\"⊾\",angrtvbd:\"⦝\",angsph:\"∢\",angst:\"Å\",angzarr:\"⍼\",Aogon:\"Ą\",aogon:\"ą\",Aopf:\"𝔸\",aopf:\"𝕒\",ap:\"≈\",apacir:\"⩯\",apE:\"⩰\",ape:\"≊\",apid:\"≋\",apos:\"'\",ApplyFunction:\"\",approx:\"≈\",approxeq:\"≊\",Aring:\"Å\",aring:\"å\",Ascr:\"𝒜\",ascr:\"𝒶\",Assign:\"≔\",ast:\"*\",asymp:\"≈\",asympeq:\"≍\",Atilde:\"Ã\",atilde:\"ã\",Auml:\"Ä\",auml:\"ä\",awconint:\"∳\",awint:\"⨑\",backcong:\"≌\",backepsilon:\"϶\",backprime:\"‵\",backsim:\"∽\",backsimeq:\"⋍\",Backslash:\"∖\",Barv:\"⫧\",barvee:\"⊽\",Barwed:\"⌆\",barwed:\"⌅\",barwedge:\"⌅\",bbrk:\"⎵\",bbrktbrk:\"⎶\",bcong:\"≌\",Bcy:\"Б\",bcy:\"б\",bdquo:\"„\",becaus:\"∵\",Because:\"∵\",because:\"∵\",bemptyv:\"⦰\",bepsi:\"϶\",bernou:\"ℬ\",Bernoullis:\"ℬ\",Beta:\"Β\",beta:\"β\",beth:\"ℶ\",between:\"≬\",Bfr:\"𝔅\",bfr:\"𝔟\",bigcap:\"⋂\",bigcirc:\"◯\",bigcup:\"⋃\",bigodot:\"⨀\",bigoplus:\"⨁\",bigotimes:\"⨂\",bigsqcup:\"⨆\",bigstar:\"★\",bigtriangledown:\"▽\",bigtriangleup:\"△\",biguplus:\"⨄\",bigvee:\"⋁\",bigwedge:\"⋀\",bkarow:\"⤍\",blacklozenge:\"⧫\",blacksquare:\"▪\",blacktriangle:\"▴\",blacktriangledown:\"▾\",blacktriangleleft:\"◂\",blacktriangleright:\"▸\",blank:\"␣\",blk12:\"▒\",blk14:\"░\",blk34:\"▓\",block:\"█\",bne:\"=⃥\",bnequiv:\"≡⃥\",bNot:\"⫭\",bnot:\"⌐\",Bopf:\"𝔹\",bopf:\"𝕓\",bot:\"⊥\",bottom:\"⊥\",bowtie:\"⋈\",boxbox:\"⧉\",boxDL:\"╗\",boxDl:\"╖\",boxdL:\"╕\",boxdl:\"┐\",boxDR:\"╔\",boxDr:\"╓\",boxdR:\"╒\",boxdr:\"┌\",boxH:\"═\",boxh:\"─\",boxHD:\"╦\",boxHd:\"╤\",boxhD:\"╥\",boxhd:\"┬\",boxHU:\"╩\",boxHu:\"╧\",boxhU:\"╨\",boxhu:\"┴\",boxminus:\"⊟\",boxplus:\"⊞\",boxtimes:\"⊠\",boxUL:\"╝\",boxUl:\"╜\",boxuL:\"╛\",boxul:\"┘\",boxUR:\"╚\",boxUr:\"╙\",boxuR:\"╘\",boxur:\"└\",boxV:\"║\",boxv:\"│\",boxVH:\"╬\",boxVh:\"╫\",boxvH:\"╪\",boxvh:\"┼\",boxVL:\"╣\",boxVl:\"╢\",boxvL:\"╡\",boxvl:\"┤\",boxVR:\"╠\",boxVr:\"╟\",boxvR:\"╞\",boxvr:\"├\",bprime:\"‵\",Breve:\"˘\",breve:\"˘\",brvbar:\"¦\",Bscr:\"ℬ\",bscr:\"𝒷\",bsemi:\"⁏\",bsim:\"∽\",bsime:\"⋍\",bsol:\"\\\\\",bsolb:\"⧅\",bsolhsub:\"⟈\",bull:\"•\",bullet:\"•\",bump:\"≎\",bumpE:\"⪮\",bumpe:\"≏\",Bumpeq:\"≎\",bumpeq:\"≏\",Cacute:\"Ć\",cacute:\"ć\",Cap:\"⋒\",cap:\"∩\",capand:\"⩄\",capbrcup:\"⩉\",capcap:\"⩋\",capcup:\"⩇\",capdot:\"⩀\",CapitalDifferentialD:\"ⅅ\",caps:\"∩︀\",caret:\"⁁\",caron:\"ˇ\",Cayleys:\"ℭ\",ccaps:\"⩍\",Ccaron:\"Č\",ccaron:\"č\",Ccedil:\"Ç\",ccedil:\"ç\",Ccirc:\"Ĉ\",ccirc:\"ĉ\",Cconint:\"∰\",ccups:\"⩌\",ccupssm:\"⩐\",Cdot:\"Ċ\",cdot:\"ċ\",cedil:\"¸\",Cedilla:\"¸\",cemptyv:\"⦲\",cent:\"¢\",CenterDot:\"·\",centerdot:\"·\",Cfr:\"ℭ\",cfr:\"𝔠\",CHcy:\"Ч\",chcy:\"ч\",check:\"✓\",checkmark:\"✓\",Chi:\"Χ\",chi:\"χ\",cir:\"○\",circ:\"ˆ\",circeq:\"≗\",circlearrowleft:\"↺\",circlearrowright:\"↻\",circledast:\"⊛\",circledcirc:\"⊚\",circleddash:\"⊝\",CircleDot:\"⊙\",circledR:\"®\",circledS:\"Ⓢ\",CircleMinus:\"⊖\",CirclePlus:\"⊕\",CircleTimes:\"⊗\",cirE:\"⧃\",cire:\"≗\",cirfnint:\"⨐\",cirmid:\"⫯\",cirscir:\"⧂\",ClockwiseContourIntegral:\"∲\",CloseCurlyDoubleQuote:\"”\",CloseCurlyQuote:\"’\",clubs:\"♣\",clubsuit:\"♣\",Colon:\"∷\",colon:\":\",Colone:\"⩴\",colone:\"≔\",coloneq:\"≔\",comma:\",\",commat:\"@\",comp:\"∁\",compfn:\"∘\",complement:\"∁\",complexes:\"ℂ\",cong:\"≅\",congdot:\"⩭\",Congruent:\"≡\",Conint:\"∯\",conint:\"∮\",ContourIntegral:\"∮\",Copf:\"ℂ\",copf:\"𝕔\",coprod:\"∐\",Coproduct:\"∐\",COPY:\"©\",copy:\"©\",copysr:\"℗\",CounterClockwiseContourIntegral:\"∳\",crarr:\"↵\",Cross:\"⨯\",cross:\"✗\",Cscr:\"𝒞\",cscr:\"𝒸\",csub:\"⫏\",csube:\"⫑\",csup:\"⫐\",csupe:\"⫒\",ctdot:\"⋯\",cudarrl:\"⤸\",cudarrr:\"⤵\",cuepr:\"⋞\",cuesc:\"⋟\",cularr:\"↶\",cularrp:\"⤽\",Cup:\"⋓\",cup:\"∪\",cupbrcap:\"⩈\",CupCap:\"≍\",cupcap:\"⩆\",cupcup:\"⩊\",cupdot:\"⊍\",cupor:\"⩅\",cups:\"∪︀\",curarr:\"↷\",curarrm:\"⤼\",curlyeqprec:\"⋞\",curlyeqsucc:\"⋟\",curlyvee:\"⋎\",curlywedge:\"⋏\",curren:\"¤\",curvearrowleft:\"↶\",curvearrowright:\"↷\",cuvee:\"⋎\",cuwed:\"⋏\",cwconint:\"∲\",cwint:\"∱\",cylcty:\"⌭\",Dagger:\"‡\",dagger:\"†\",daleth:\"ℸ\",Darr:\"↡\",dArr:\"⇓\",darr:\"↓\",dash:\"‐\",Dashv:\"⫤\",dashv:\"⊣\",dbkarow:\"⤏\",dblac:\"˝\",Dcaron:\"Ď\",dcaron:\"ď\",Dcy:\"Д\",dcy:\"д\",DD:\"ⅅ\",dd:\"ⅆ\",ddagger:\"‡\",ddarr:\"⇊\",DDotrahd:\"⤑\",ddotseq:\"⩷\",deg:\"°\",Del:\"∇\",Delta:\"Δ\",delta:\"δ\",demptyv:\"⦱\",dfisht:\"⥿\",Dfr:\"𝔇\",dfr:\"𝔡\",dHar:\"⥥\",dharl:\"⇃\",dharr:\"⇂\",DiacriticalAcute:\"´\",DiacriticalDot:\"˙\",DiacriticalDoubleAcute:\"˝\",DiacriticalGrave:\"`\",DiacriticalTilde:\"˜\",diam:\"⋄\",Diamond:\"⋄\",diamond:\"⋄\",diamondsuit:\"♦\",diams:\"♦\",die:\"¨\",DifferentialD:\"ⅆ\",digamma:\"ϝ\",disin:\"⋲\",div:\"÷\",divide:\"÷\",divideontimes:\"⋇\",divonx:\"⋇\",DJcy:\"Ђ\",djcy:\"ђ\",dlcorn:\"⌞\",dlcrop:\"⌍\",dollar:\"$\",Dopf:\"𝔻\",dopf:\"𝕕\",Dot:\"¨\",dot:\"˙\",DotDot:\"⃜\",doteq:\"≐\",doteqdot:\"≑\",DotEqual:\"≐\",dotminus:\"∸\",dotplus:\"∔\",dotsquare:\"⊡\",doublebarwedge:\"⌆\",DoubleContourIntegral:\"∯\",DoubleDot:\"¨\",DoubleDownArrow:\"⇓\",DoubleLeftArrow:\"⇐\",DoubleLeftRightArrow:\"⇔\",DoubleLeftTee:\"⫤\",DoubleLongLeftArrow:\"⟸\",DoubleLongLeftRightArrow:\"⟺\",DoubleLongRightArrow:\"⟹\",DoubleRightArrow:\"⇒\",DoubleRightTee:\"⊨\",DoubleUpArrow:\"⇑\",DoubleUpDownArrow:\"⇕\",DoubleVerticalBar:\"∥\",DownArrow:\"↓\",Downarrow:\"⇓\",downarrow:\"↓\",DownArrowBar:\"⤓\",DownArrowUpArrow:\"⇵\",DownBreve:\"̑\",downdownarrows:\"⇊\",downharpoonleft:\"⇃\",downharpoonright:\"⇂\",DownLeftRightVector:\"⥐\",DownLeftTeeVector:\"⥞\",DownLeftVector:\"↽\",DownLeftVectorBar:\"⥖\",DownRightTeeVector:\"⥟\",DownRightVector:\"⇁\",DownRightVectorBar:\"⥗\",DownTee:\"⊤\",DownTeeArrow:\"↧\",drbkarow:\"⤐\",drcorn:\"⌟\",drcrop:\"⌌\",Dscr:\"𝒟\",dscr:\"𝒹\",DScy:\"Ѕ\",dscy:\"ѕ\",dsol:\"⧶\",Dstrok:\"Đ\",dstrok:\"đ\",dtdot:\"⋱\",dtri:\"▿\",dtrif:\"▾\",duarr:\"⇵\",duhar:\"⥯\",dwangle:\"⦦\",DZcy:\"Џ\",dzcy:\"џ\",dzigrarr:\"⟿\",Eacute:\"É\",eacute:\"é\",easter:\"⩮\",Ecaron:\"Ě\",ecaron:\"ě\",ecir:\"≖\",Ecirc:\"Ê\",ecirc:\"ê\",ecolon:\"≕\",Ecy:\"Э\",ecy:\"э\",eDDot:\"⩷\",Edot:\"Ė\",eDot:\"≑\",edot:\"ė\",ee:\"ⅇ\",efDot:\"≒\",Efr:\"𝔈\",efr:\"𝔢\",eg:\"⪚\",Egrave:\"È\",egrave:\"è\",egs:\"⪖\",egsdot:\"⪘\",el:\"⪙\",Element:\"∈\",elinters:\"⏧\",ell:\"ℓ\",els:\"⪕\",elsdot:\"⪗\",Emacr:\"Ē\",emacr:\"ē\",empty:\"∅\",emptyset:\"∅\",EmptySmallSquare:\"◻\",emptyv:\"∅\",EmptyVerySmallSquare:\"▫\",emsp:\" \",emsp13:\" \",emsp14:\" \",ENG:\"Ŋ\",eng:\"ŋ\",ensp:\" \",Eogon:\"Ę\",eogon:\"ę\",Eopf:\"𝔼\",eopf:\"𝕖\",epar:\"⋕\",eparsl:\"⧣\",eplus:\"⩱\",epsi:\"ε\",Epsilon:\"Ε\",epsilon:\"ε\",epsiv:\"ϵ\",eqcirc:\"≖\",eqcolon:\"≕\",eqsim:\"≂\",eqslantgtr:\"⪖\",eqslantless:\"⪕\",Equal:\"⩵\",equals:\"=\",EqualTilde:\"≂\",equest:\"≟\",Equilibrium:\"⇌\",equiv:\"≡\",equivDD:\"⩸\",eqvparsl:\"⧥\",erarr:\"⥱\",erDot:\"≓\",Escr:\"ℰ\",escr:\"ℯ\",esdot:\"≐\",Esim:\"⩳\",esim:\"≂\",Eta:\"Η\",eta:\"η\",ETH:\"Ð\",eth:\"ð\",Euml:\"Ë\",euml:\"ë\",euro:\"€\",excl:\"!\",exist:\"∃\",Exists:\"∃\",expectation:\"ℰ\",ExponentialE:\"ⅇ\",exponentiale:\"ⅇ\",fallingdotseq:\"≒\",Fcy:\"Ф\",fcy:\"ф\",female:\"♀\",ffilig:\"ffi\",fflig:\"ff\",ffllig:\"ffl\",Ffr:\"𝔉\",ffr:\"𝔣\",filig:\"fi\",FilledSmallSquare:\"◼\",FilledVerySmallSquare:\"▪\",fjlig:\"fj\",flat:\"♭\",fllig:\"fl\",fltns:\"▱\",fnof:\"ƒ\",Fopf:\"𝔽\",fopf:\"𝕗\",ForAll:\"∀\",forall:\"∀\",fork:\"⋔\",forkv:\"⫙\",Fouriertrf:\"ℱ\",fpartint:\"⨍\",frac12:\"½\",frac13:\"⅓\",frac14:\"¼\",frac15:\"⅕\",frac16:\"⅙\",frac18:\"⅛\",frac23:\"⅔\",frac25:\"⅖\",frac34:\"¾\",frac35:\"⅗\",frac38:\"⅜\",frac45:\"⅘\",frac56:\"⅚\",frac58:\"⅝\",frac78:\"⅞\",frasl:\"⁄\",frown:\"⌢\",Fscr:\"ℱ\",fscr:\"𝒻\",gacute:\"ǵ\",Gamma:\"Γ\",gamma:\"γ\",Gammad:\"Ϝ\",gammad:\"ϝ\",gap:\"⪆\",Gbreve:\"Ğ\",gbreve:\"ğ\",Gcedil:\"Ģ\",Gcirc:\"Ĝ\",gcirc:\"ĝ\",Gcy:\"Г\",gcy:\"г\",Gdot:\"Ġ\",gdot:\"ġ\",gE:\"≧\",ge:\"≥\",gEl:\"⪌\",gel:\"⋛\",geq:\"≥\",geqq:\"≧\",geqslant:\"⩾\",ges:\"⩾\",gescc:\"⪩\",gesdot:\"⪀\",gesdoto:\"⪂\",gesdotol:\"⪄\",gesl:\"⋛︀\",gesles:\"⪔\",Gfr:\"𝔊\",gfr:\"𝔤\",Gg:\"⋙\",gg:\"≫\",ggg:\"⋙\",gimel:\"ℷ\",GJcy:\"Ѓ\",gjcy:\"ѓ\",gl:\"≷\",gla:\"⪥\",glE:\"⪒\",glj:\"⪤\",gnap:\"⪊\",gnapprox:\"⪊\",gnE:\"≩\",gne:\"⪈\",gneq:\"⪈\",gneqq:\"≩\",gnsim:\"⋧\",Gopf:\"𝔾\",gopf:\"𝕘\",grave:\"`\",GreaterEqual:\"≥\",GreaterEqualLess:\"⋛\",GreaterFullEqual:\"≧\",GreaterGreater:\"⪢\",GreaterLess:\"≷\",GreaterSlantEqual:\"⩾\",GreaterTilde:\"≳\",Gscr:\"𝒢\",gscr:\"ℊ\",gsim:\"≳\",gsime:\"⪎\",gsiml:\"⪐\",GT:\">\",Gt:\"≫\",gt:\">\",gtcc:\"⪧\",gtcir:\"⩺\",gtdot:\"⋗\",gtlPar:\"⦕\",gtquest:\"⩼\",gtrapprox:\"⪆\",gtrarr:\"⥸\",gtrdot:\"⋗\",gtreqless:\"⋛\",gtreqqless:\"⪌\",gtrless:\"≷\",gtrsim:\"≳\",gvertneqq:\"≩︀\",gvnE:\"≩︀\",Hacek:\"ˇ\",hairsp:\" \",half:\"½\",hamilt:\"ℋ\",HARDcy:\"Ъ\",hardcy:\"ъ\",hArr:\"⇔\",harr:\"↔\",harrcir:\"⥈\",harrw:\"↭\",Hat:\"^\",hbar:\"ℏ\",Hcirc:\"Ĥ\",hcirc:\"ĥ\",hearts:\"♥\",heartsuit:\"♥\",hellip:\"…\",hercon:\"⊹\",Hfr:\"ℌ\",hfr:\"𝔥\",HilbertSpace:\"ℋ\",hksearow:\"⤥\",hkswarow:\"⤦\",hoarr:\"⇿\",homtht:\"∻\",hookleftarrow:\"↩\",hookrightarrow:\"↪\",Hopf:\"ℍ\",hopf:\"𝕙\",horbar:\"―\",HorizontalLine:\"─\",Hscr:\"ℋ\",hscr:\"𝒽\",hslash:\"ℏ\",Hstrok:\"Ħ\",hstrok:\"ħ\",HumpDownHump:\"≎\",HumpEqual:\"≏\",hybull:\"⁃\",hyphen:\"‐\",Iacute:\"Í\",iacute:\"í\",ic:\"\",Icirc:\"Î\",icirc:\"î\",Icy:\"И\",icy:\"и\",Idot:\"İ\",IEcy:\"Е\",iecy:\"е\",iexcl:\"¡\",iff:\"⇔\",Ifr:\"ℑ\",ifr:\"𝔦\",Igrave:\"Ì\",igrave:\"ì\",ii:\"ⅈ\",iiiint:\"⨌\",iiint:\"∭\",iinfin:\"⧜\",iiota:\"℩\",IJlig:\"IJ\",ijlig:\"ij\",Im:\"ℑ\",Imacr:\"Ī\",imacr:\"ī\",image:\"ℑ\",ImaginaryI:\"ⅈ\",imagline:\"ℐ\",imagpart:\"ℑ\",imath:\"ı\",imof:\"⊷\",imped:\"Ƶ\",Implies:\"⇒\",in:\"∈\",incare:\"℅\",infin:\"∞\",infintie:\"⧝\",inodot:\"ı\",Int:\"∬\",int:\"∫\",intcal:\"⊺\",integers:\"ℤ\",Integral:\"∫\",intercal:\"⊺\",Intersection:\"⋂\",intlarhk:\"⨗\",intprod:\"⨼\",InvisibleComma:\"\",InvisibleTimes:\"\",IOcy:\"Ё\",iocy:\"ё\",Iogon:\"Į\",iogon:\"į\",Iopf:\"𝕀\",iopf:\"𝕚\",Iota:\"Ι\",iota:\"ι\",iprod:\"⨼\",iquest:\"¿\",Iscr:\"ℐ\",iscr:\"𝒾\",isin:\"∈\",isindot:\"⋵\",isinE:\"⋹\",isins:\"⋴\",isinsv:\"⋳\",isinv:\"∈\",it:\"\",Itilde:\"Ĩ\",itilde:\"ĩ\",Iukcy:\"І\",iukcy:\"і\",Iuml:\"Ï\",iuml:\"ï\",Jcirc:\"Ĵ\",jcirc:\"ĵ\",Jcy:\"Й\",jcy:\"й\",Jfr:\"𝔍\",jfr:\"𝔧\",jmath:\"ȷ\",Jopf:\"𝕁\",jopf:\"𝕛\",Jscr:\"𝒥\",jscr:\"𝒿\",Jsercy:\"Ј\",jsercy:\"ј\",Jukcy:\"Є\",jukcy:\"є\",Kappa:\"Κ\",kappa:\"κ\",kappav:\"ϰ\",Kcedil:\"Ķ\",kcedil:\"ķ\",Kcy:\"К\",kcy:\"к\",Kfr:\"𝔎\",kfr:\"𝔨\",kgreen:\"ĸ\",KHcy:\"Х\",khcy:\"х\",KJcy:\"Ќ\",kjcy:\"ќ\",Kopf:\"𝕂\",kopf:\"𝕜\",Kscr:\"𝒦\",kscr:\"𝓀\",lAarr:\"⇚\",Lacute:\"Ĺ\",lacute:\"ĺ\",laemptyv:\"⦴\",lagran:\"ℒ\",Lambda:\"Λ\",lambda:\"λ\",Lang:\"⟪\",lang:\"⟨\",langd:\"⦑\",langle:\"⟨\",lap:\"⪅\",Laplacetrf:\"ℒ\",laquo:\"«\",Larr:\"↞\",lArr:\"⇐\",larr:\"←\",larrb:\"⇤\",larrbfs:\"⤟\",larrfs:\"⤝\",larrhk:\"↩\",larrlp:\"↫\",larrpl:\"⤹\",larrsim:\"⥳\",larrtl:\"↢\",lat:\"⪫\",lAtail:\"⤛\",latail:\"⤙\",late:\"⪭\",lates:\"⪭︀\",lBarr:\"⤎\",lbarr:\"⤌\",lbbrk:\"❲\",lbrace:\"{\",lbrack:\"[\",lbrke:\"⦋\",lbrksld:\"⦏\",lbrkslu:\"⦍\",Lcaron:\"Ľ\",lcaron:\"ľ\",Lcedil:\"Ļ\",lcedil:\"ļ\",lceil:\"⌈\",lcub:\"{\",Lcy:\"Л\",lcy:\"л\",ldca:\"⤶\",ldquo:\"“\",ldquor:\"„\",ldrdhar:\"⥧\",ldrushar:\"⥋\",ldsh:\"↲\",lE:\"≦\",le:\"≤\",LeftAngleBracket:\"⟨\",LeftArrow:\"←\",Leftarrow:\"⇐\",leftarrow:\"←\",LeftArrowBar:\"⇤\",LeftArrowRightArrow:\"⇆\",leftarrowtail:\"↢\",LeftCeiling:\"⌈\",LeftDoubleBracket:\"⟦\",LeftDownTeeVector:\"⥡\",LeftDownVector:\"⇃\",LeftDownVectorBar:\"⥙\",LeftFloor:\"⌊\",leftharpoondown:\"↽\",leftharpoonup:\"↼\",leftleftarrows:\"⇇\",LeftRightArrow:\"↔\",Leftrightarrow:\"⇔\",leftrightarrow:\"↔\",leftrightarrows:\"⇆\",leftrightharpoons:\"⇋\",leftrightsquigarrow:\"↭\",LeftRightVector:\"⥎\",LeftTee:\"⊣\",LeftTeeArrow:\"↤\",LeftTeeVector:\"⥚\",leftthreetimes:\"⋋\",LeftTriangle:\"⊲\",LeftTriangleBar:\"⧏\",LeftTriangleEqual:\"⊴\",LeftUpDownVector:\"⥑\",LeftUpTeeVector:\"⥠\",LeftUpVector:\"↿\",LeftUpVectorBar:\"⥘\",LeftVector:\"↼\",LeftVectorBar:\"⥒\",lEg:\"⪋\",leg:\"⋚\",leq:\"≤\",leqq:\"≦\",leqslant:\"⩽\",les:\"⩽\",lescc:\"⪨\",lesdot:\"⩿\",lesdoto:\"⪁\",lesdotor:\"⪃\",lesg:\"⋚︀\",lesges:\"⪓\",lessapprox:\"⪅\",lessdot:\"⋖\",lesseqgtr:\"⋚\",lesseqqgtr:\"⪋\",LessEqualGreater:\"⋚\",LessFullEqual:\"≦\",LessGreater:\"≶\",lessgtr:\"≶\",LessLess:\"⪡\",lesssim:\"≲\",LessSlantEqual:\"⩽\",LessTilde:\"≲\",lfisht:\"⥼\",lfloor:\"⌊\",Lfr:\"𝔏\",lfr:\"𝔩\",lg:\"≶\",lgE:\"⪑\",lHar:\"⥢\",lhard:\"↽\",lharu:\"↼\",lharul:\"⥪\",lhblk:\"▄\",LJcy:\"Љ\",ljcy:\"љ\",Ll:\"⋘\",ll:\"≪\",llarr:\"⇇\",llcorner:\"⌞\",Lleftarrow:\"⇚\",llhard:\"⥫\",lltri:\"◺\",Lmidot:\"Ŀ\",lmidot:\"ŀ\",lmoust:\"⎰\",lmoustache:\"⎰\",lnap:\"⪉\",lnapprox:\"⪉\",lnE:\"≨\",lne:\"⪇\",lneq:\"⪇\",lneqq:\"≨\",lnsim:\"⋦\",loang:\"⟬\",loarr:\"⇽\",lobrk:\"⟦\",LongLeftArrow:\"⟵\",Longleftarrow:\"⟸\",longleftarrow:\"⟵\",LongLeftRightArrow:\"⟷\",Longleftrightarrow:\"⟺\",longleftrightarrow:\"⟷\",longmapsto:\"⟼\",LongRightArrow:\"⟶\",Longrightarrow:\"⟹\",longrightarrow:\"⟶\",looparrowleft:\"↫\",looparrowright:\"↬\",lopar:\"⦅\",Lopf:\"𝕃\",lopf:\"𝕝\",loplus:\"⨭\",lotimes:\"⨴\",lowast:\"∗\",lowbar:\"_\",LowerLeftArrow:\"↙\",LowerRightArrow:\"↘\",loz:\"◊\",lozenge:\"◊\",lozf:\"⧫\",lpar:\"(\",lparlt:\"⦓\",lrarr:\"⇆\",lrcorner:\"⌟\",lrhar:\"⇋\",lrhard:\"⥭\",lrm:\"\",lrtri:\"⊿\",lsaquo:\"‹\",Lscr:\"ℒ\",lscr:\"𝓁\",Lsh:\"↰\",lsh:\"↰\",lsim:\"≲\",lsime:\"⪍\",lsimg:\"⪏\",lsqb:\"[\",lsquo:\"‘\",lsquor:\"‚\",Lstrok:\"Ł\",lstrok:\"ł\",LT:\"<\",Lt:\"≪\",lt:\"<\",ltcc:\"⪦\",ltcir:\"⩹\",ltdot:\"⋖\",lthree:\"⋋\",ltimes:\"⋉\",ltlarr:\"⥶\",ltquest:\"⩻\",ltri:\"◃\",ltrie:\"⊴\",ltrif:\"◂\",ltrPar:\"⦖\",lurdshar:\"⥊\",luruhar:\"⥦\",lvertneqq:\"≨︀\",lvnE:\"≨︀\",macr:\"¯\",male:\"♂\",malt:\"✠\",maltese:\"✠\",Map:\"⤅\",map:\"↦\",mapsto:\"↦\",mapstodown:\"↧\",mapstoleft:\"↤\",mapstoup:\"↥\",marker:\"▮\",mcomma:\"⨩\",Mcy:\"М\",mcy:\"м\",mdash:\"—\",mDDot:\"∺\",measuredangle:\"∡\",MediumSpace:\" \",Mellintrf:\"ℳ\",Mfr:\"𝔐\",mfr:\"𝔪\",mho:\"℧\",micro:\"µ\",mid:\"∣\",midast:\"*\",midcir:\"⫰\",middot:\"·\",minus:\"−\",minusb:\"⊟\",minusd:\"∸\",minusdu:\"⨪\",MinusPlus:\"∓\",mlcp:\"⫛\",mldr:\"…\",mnplus:\"∓\",models:\"⊧\",Mopf:\"𝕄\",mopf:\"𝕞\",mp:\"∓\",Mscr:\"ℳ\",mscr:\"𝓂\",mstpos:\"∾\",Mu:\"Μ\",mu:\"μ\",multimap:\"⊸\",mumap:\"⊸\",nabla:\"∇\",Nacute:\"Ń\",nacute:\"ń\",nang:\"∠⃒\",nap:\"≉\",napE:\"⩰̸\",napid:\"≋̸\",napos:\"ʼn\",napprox:\"≉\",natur:\"♮\",natural:\"♮\",naturals:\"ℕ\",nbsp:\" \",nbump:\"≎̸\",nbumpe:\"≏̸\",ncap:\"⩃\",Ncaron:\"Ň\",ncaron:\"ň\",Ncedil:\"Ņ\",ncedil:\"ņ\",ncong:\"≇\",ncongdot:\"⩭̸\",ncup:\"⩂\",Ncy:\"Н\",ncy:\"н\",ndash:\"–\",ne:\"≠\",nearhk:\"⤤\",neArr:\"⇗\",nearr:\"↗\",nearrow:\"↗\",nedot:\"≐̸\",NegativeMediumSpace:\"\",NegativeThickSpace:\"\",NegativeThinSpace:\"\",NegativeVeryThinSpace:\"\",nequiv:\"≢\",nesear:\"⤨\",nesim:\"≂̸\",NestedGreaterGreater:\"≫\",NestedLessLess:\"≪\",NewLine:\"\\n\",nexist:\"∄\",nexists:\"∄\",Nfr:\"𝔑\",nfr:\"𝔫\",ngE:\"≧̸\",nge:\"≱\",ngeq:\"≱\",ngeqq:\"≧̸\",ngeqslant:\"⩾̸\",nges:\"⩾̸\",nGg:\"⋙̸\",ngsim:\"≵\",nGt:\"≫⃒\",ngt:\"≯\",ngtr:\"≯\",nGtv:\"≫̸\",nhArr:\"⇎\",nharr:\"↮\",nhpar:\"⫲\",ni:\"∋\",nis:\"⋼\",nisd:\"⋺\",niv:\"∋\",NJcy:\"Њ\",njcy:\"њ\",nlArr:\"⇍\",nlarr:\"↚\",nldr:\"‥\",nlE:\"≦̸\",nle:\"≰\",nLeftarrow:\"⇍\",nleftarrow:\"↚\",nLeftrightarrow:\"⇎\",nleftrightarrow:\"↮\",nleq:\"≰\",nleqq:\"≦̸\",nleqslant:\"⩽̸\",nles:\"⩽̸\",nless:\"≮\",nLl:\"⋘̸\",nlsim:\"≴\",nLt:\"≪⃒\",nlt:\"≮\",nltri:\"⋪\",nltrie:\"⋬\",nLtv:\"≪̸\",nmid:\"∤\",NoBreak:\"\",NonBreakingSpace:\" \",Nopf:\"ℕ\",nopf:\"𝕟\",Not:\"⫬\",not:\"¬\",NotCongruent:\"≢\",NotCupCap:\"≭\",NotDoubleVerticalBar:\"∦\",NotElement:\"∉\",NotEqual:\"≠\",NotEqualTilde:\"≂̸\",NotExists:\"∄\",NotGreater:\"≯\",NotGreaterEqual:\"≱\",NotGreaterFullEqual:\"≧̸\",NotGreaterGreater:\"≫̸\",NotGreaterLess:\"≹\",NotGreaterSlantEqual:\"⩾̸\",NotGreaterTilde:\"≵\",NotHumpDownHump:\"≎̸\",NotHumpEqual:\"≏̸\",notin:\"∉\",notindot:\"⋵̸\",notinE:\"⋹̸\",notinva:\"∉\",notinvb:\"⋷\",notinvc:\"⋶\",NotLeftTriangle:\"⋪\",NotLeftTriangleBar:\"⧏̸\",NotLeftTriangleEqual:\"⋬\",NotLess:\"≮\",NotLessEqual:\"≰\",NotLessGreater:\"≸\",NotLessLess:\"≪̸\",NotLessSlantEqual:\"⩽̸\",NotLessTilde:\"≴\",NotNestedGreaterGreater:\"⪢̸\",NotNestedLessLess:\"⪡̸\",notni:\"∌\",notniva:\"∌\",notnivb:\"⋾\",notnivc:\"⋽\",NotPrecedes:\"⊀\",NotPrecedesEqual:\"⪯̸\",NotPrecedesSlantEqual:\"⋠\",NotReverseElement:\"∌\",NotRightTriangle:\"⋫\",NotRightTriangleBar:\"⧐̸\",NotRightTriangleEqual:\"⋭\",NotSquareSubset:\"⊏̸\",NotSquareSubsetEqual:\"⋢\",NotSquareSuperset:\"⊐̸\",NotSquareSupersetEqual:\"⋣\",NotSubset:\"⊂⃒\",NotSubsetEqual:\"⊈\",NotSucceeds:\"⊁\",NotSucceedsEqual:\"⪰̸\",NotSucceedsSlantEqual:\"⋡\",NotSucceedsTilde:\"≿̸\",NotSuperset:\"⊃⃒\",NotSupersetEqual:\"⊉\",NotTilde:\"≁\",NotTildeEqual:\"≄\",NotTildeFullEqual:\"≇\",NotTildeTilde:\"≉\",NotVerticalBar:\"∤\",npar:\"∦\",nparallel:\"∦\",nparsl:\"⫽⃥\",npart:\"∂̸\",npolint:\"⨔\",npr:\"⊀\",nprcue:\"⋠\",npre:\"⪯̸\",nprec:\"⊀\",npreceq:\"⪯̸\",nrArr:\"⇏\",nrarr:\"↛\",nrarrc:\"⤳̸\",nrarrw:\"↝̸\",nRightarrow:\"⇏\",nrightarrow:\"↛\",nrtri:\"⋫\",nrtrie:\"⋭\",nsc:\"⊁\",nsccue:\"⋡\",nsce:\"⪰̸\",Nscr:\"𝒩\",nscr:\"𝓃\",nshortmid:\"∤\",nshortparallel:\"∦\",nsim:\"≁\",nsime:\"≄\",nsimeq:\"≄\",nsmid:\"∤\",nspar:\"∦\",nsqsube:\"⋢\",nsqsupe:\"⋣\",nsub:\"⊄\",nsubE:\"⫅̸\",nsube:\"⊈\",nsubset:\"⊂⃒\",nsubseteq:\"⊈\",nsubseteqq:\"⫅̸\",nsucc:\"⊁\",nsucceq:\"⪰̸\",nsup:\"⊅\",nsupE:\"⫆̸\",nsupe:\"⊉\",nsupset:\"⊃⃒\",nsupseteq:\"⊉\",nsupseteqq:\"⫆̸\",ntgl:\"≹\",Ntilde:\"Ñ\",ntilde:\"ñ\",ntlg:\"≸\",ntriangleleft:\"⋪\",ntrianglelefteq:\"⋬\",ntriangleright:\"⋫\",ntrianglerighteq:\"⋭\",Nu:\"Ν\",nu:\"ν\",num:\"#\",numero:\"№\",numsp:\" \",nvap:\"≍⃒\",nVDash:\"⊯\",nVdash:\"⊮\",nvDash:\"⊭\",nvdash:\"⊬\",nvge:\"≥⃒\",nvgt:\">⃒\",nvHarr:\"⤄\",nvinfin:\"⧞\",nvlArr:\"⤂\",nvle:\"≤⃒\",nvlt:\"<⃒\",nvltrie:\"⊴⃒\",nvrArr:\"⤃\",nvrtrie:\"⊵⃒\",nvsim:\"∼⃒\",nwarhk:\"⤣\",nwArr:\"⇖\",nwarr:\"↖\",nwarrow:\"↖\",nwnear:\"⤧\",Oacute:\"Ó\",oacute:\"ó\",oast:\"⊛\",ocir:\"⊚\",Ocirc:\"Ô\",ocirc:\"ô\",Ocy:\"О\",ocy:\"о\",odash:\"⊝\",Odblac:\"Ő\",odblac:\"ő\",odiv:\"⨸\",odot:\"⊙\",odsold:\"⦼\",OElig:\"Œ\",oelig:\"œ\",ofcir:\"⦿\",Ofr:\"𝔒\",ofr:\"𝔬\",ogon:\"˛\",Ograve:\"Ò\",ograve:\"ò\",ogt:\"⧁\",ohbar:\"⦵\",ohm:\"Ω\",oint:\"∮\",olarr:\"↺\",olcir:\"⦾\",olcross:\"⦻\",oline:\"‾\",olt:\"⧀\",Omacr:\"Ō\",omacr:\"ō\",Omega:\"Ω\",omega:\"ω\",Omicron:\"Ο\",omicron:\"ο\",omid:\"⦶\",ominus:\"⊖\",Oopf:\"𝕆\",oopf:\"𝕠\",opar:\"⦷\",OpenCurlyDoubleQuote:\"“\",OpenCurlyQuote:\"‘\",operp:\"⦹\",oplus:\"⊕\",Or:\"⩔\",or:\"∨\",orarr:\"↻\",ord:\"⩝\",order:\"ℴ\",orderof:\"ℴ\",ordf:\"ª\",ordm:\"º\",origof:\"⊶\",oror:\"⩖\",orslope:\"⩗\",orv:\"⩛\",oS:\"Ⓢ\",Oscr:\"𝒪\",oscr:\"ℴ\",Oslash:\"Ø\",oslash:\"ø\",osol:\"⊘\",Otilde:\"Õ\",otilde:\"õ\",Otimes:\"⨷\",otimes:\"⊗\",otimesas:\"⨶\",Ouml:\"Ö\",ouml:\"ö\",ovbar:\"⌽\",OverBar:\"‾\",OverBrace:\"⏞\",OverBracket:\"⎴\",OverParenthesis:\"⏜\",par:\"∥\",para:\"¶\",parallel:\"∥\",parsim:\"⫳\",parsl:\"⫽\",part:\"∂\",PartialD:\"∂\",Pcy:\"П\",pcy:\"п\",percnt:\"%\",period:\".\",permil:\"‰\",perp:\"⊥\",pertenk:\"‱\",Pfr:\"𝔓\",pfr:\"𝔭\",Phi:\"Φ\",phi:\"φ\",phiv:\"ϕ\",phmmat:\"ℳ\",phone:\"☎\",Pi:\"Π\",pi:\"π\",pitchfork:\"⋔\",piv:\"ϖ\",planck:\"ℏ\",planckh:\"ℎ\",plankv:\"ℏ\",plus:\"+\",plusacir:\"⨣\",plusb:\"⊞\",pluscir:\"⨢\",plusdo:\"∔\",plusdu:\"⨥\",pluse:\"⩲\",PlusMinus:\"±\",plusmn:\"±\",plussim:\"⨦\",plustwo:\"⨧\",pm:\"±\",Poincareplane:\"ℌ\",pointint:\"⨕\",Popf:\"ℙ\",popf:\"𝕡\",pound:\"£\",Pr:\"⪻\",pr:\"≺\",prap:\"⪷\",prcue:\"≼\",prE:\"⪳\",pre:\"⪯\",prec:\"≺\",precapprox:\"⪷\",preccurlyeq:\"≼\",Precedes:\"≺\",PrecedesEqual:\"⪯\",PrecedesSlantEqual:\"≼\",PrecedesTilde:\"≾\",preceq:\"⪯\",precnapprox:\"⪹\",precneqq:\"⪵\",precnsim:\"⋨\",precsim:\"≾\",Prime:\"″\",prime:\"′\",primes:\"ℙ\",prnap:\"⪹\",prnE:\"⪵\",prnsim:\"⋨\",prod:\"∏\",Product:\"∏\",profalar:\"⌮\",profline:\"⌒\",profsurf:\"⌓\",prop:\"∝\",Proportion:\"∷\",Proportional:\"∝\",propto:\"∝\",prsim:\"≾\",prurel:\"⊰\",Pscr:\"𝒫\",pscr:\"𝓅\",Psi:\"Ψ\",psi:\"ψ\",puncsp:\" \",Qfr:\"𝔔\",qfr:\"𝔮\",qint:\"⨌\",Qopf:\"ℚ\",qopf:\"𝕢\",qprime:\"⁗\",Qscr:\"𝒬\",qscr:\"𝓆\",quaternions:\"ℍ\",quatint:\"⨖\",quest:\"?\",questeq:\"≟\",QUOT:'\"',quot:'\"',rAarr:\"⇛\",race:\"∽̱\",Racute:\"Ŕ\",racute:\"ŕ\",radic:\"√\",raemptyv:\"⦳\",Rang:\"⟫\",rang:\"⟩\",rangd:\"⦒\",range:\"⦥\",rangle:\"⟩\",raquo:\"»\",Rarr:\"↠\",rArr:\"⇒\",rarr:\"→\",rarrap:\"⥵\",rarrb:\"⇥\",rarrbfs:\"⤠\",rarrc:\"⤳\",rarrfs:\"⤞\",rarrhk:\"↪\",rarrlp:\"↬\",rarrpl:\"⥅\",rarrsim:\"⥴\",Rarrtl:\"⤖\",rarrtl:\"↣\",rarrw:\"↝\",rAtail:\"⤜\",ratail:\"⤚\",ratio:\"∶\",rationals:\"ℚ\",RBarr:\"⤐\",rBarr:\"⤏\",rbarr:\"⤍\",rbbrk:\"❳\",rbrace:\"}\",rbrack:\"]\",rbrke:\"⦌\",rbrksld:\"⦎\",rbrkslu:\"⦐\",Rcaron:\"Ř\",rcaron:\"ř\",Rcedil:\"Ŗ\",rcedil:\"ŗ\",rceil:\"⌉\",rcub:\"}\",Rcy:\"Р\",rcy:\"р\",rdca:\"⤷\",rdldhar:\"⥩\",rdquo:\"”\",rdquor:\"”\",rdsh:\"↳\",Re:\"ℜ\",real:\"ℜ\",realine:\"ℛ\",realpart:\"ℜ\",reals:\"ℝ\",rect:\"▭\",REG:\"®\",reg:\"®\",ReverseElement:\"∋\",ReverseEquilibrium:\"⇋\",ReverseUpEquilibrium:\"⥯\",rfisht:\"⥽\",rfloor:\"⌋\",Rfr:\"ℜ\",rfr:\"𝔯\",rHar:\"⥤\",rhard:\"⇁\",rharu:\"⇀\",rharul:\"⥬\",Rho:\"Ρ\",rho:\"ρ\",rhov:\"ϱ\",RightAngleBracket:\"⟩\",RightArrow:\"→\",Rightarrow:\"⇒\",rightarrow:\"→\",RightArrowBar:\"⇥\",RightArrowLeftArrow:\"⇄\",rightarrowtail:\"↣\",RightCeiling:\"⌉\",RightDoubleBracket:\"⟧\",RightDownTeeVector:\"⥝\",RightDownVector:\"⇂\",RightDownVectorBar:\"⥕\",RightFloor:\"⌋\",rightharpoondown:\"⇁\",rightharpoonup:\"⇀\",rightleftarrows:\"⇄\",rightleftharpoons:\"⇌\",rightrightarrows:\"⇉\",rightsquigarrow:\"↝\",RightTee:\"⊢\",RightTeeArrow:\"↦\",RightTeeVector:\"⥛\",rightthreetimes:\"⋌\",RightTriangle:\"⊳\",RightTriangleBar:\"⧐\",RightTriangleEqual:\"⊵\",RightUpDownVector:\"⥏\",RightUpTeeVector:\"⥜\",RightUpVector:\"↾\",RightUpVectorBar:\"⥔\",RightVector:\"⇀\",RightVectorBar:\"⥓\",ring:\"˚\",risingdotseq:\"≓\",rlarr:\"⇄\",rlhar:\"⇌\",rlm:\"\",rmoust:\"⎱\",rmoustache:\"⎱\",rnmid:\"⫮\",roang:\"⟭\",roarr:\"⇾\",robrk:\"⟧\",ropar:\"⦆\",Ropf:\"ℝ\",ropf:\"𝕣\",roplus:\"⨮\",rotimes:\"⨵\",RoundImplies:\"⥰\",rpar:\")\",rpargt:\"⦔\",rppolint:\"⨒\",rrarr:\"⇉\",Rrightarrow:\"⇛\",rsaquo:\"›\",Rscr:\"ℛ\",rscr:\"𝓇\",Rsh:\"↱\",rsh:\"↱\",rsqb:\"]\",rsquo:\"’\",rsquor:\"’\",rthree:\"⋌\",rtimes:\"⋊\",rtri:\"▹\",rtrie:\"⊵\",rtrif:\"▸\",rtriltri:\"⧎\",RuleDelayed:\"⧴\",ruluhar:\"⥨\",rx:\"℞\",Sacute:\"Ś\",sacute:\"ś\",sbquo:\"‚\",Sc:\"⪼\",sc:\"≻\",scap:\"⪸\",Scaron:\"Š\",scaron:\"š\",sccue:\"≽\",scE:\"⪴\",sce:\"⪰\",Scedil:\"Ş\",scedil:\"ş\",Scirc:\"Ŝ\",scirc:\"ŝ\",scnap:\"⪺\",scnE:\"⪶\",scnsim:\"⋩\",scpolint:\"⨓\",scsim:\"≿\",Scy:\"С\",scy:\"с\",sdot:\"⋅\",sdotb:\"⊡\",sdote:\"⩦\",searhk:\"⤥\",seArr:\"⇘\",searr:\"↘\",searrow:\"↘\",sect:\"§\",semi:\";\",seswar:\"⤩\",setminus:\"∖\",setmn:\"∖\",sext:\"✶\",Sfr:\"𝔖\",sfr:\"𝔰\",sfrown:\"⌢\",sharp:\"♯\",SHCHcy:\"Щ\",shchcy:\"щ\",SHcy:\"Ш\",shcy:\"ш\",ShortDownArrow:\"↓\",ShortLeftArrow:\"←\",shortmid:\"∣\",shortparallel:\"∥\",ShortRightArrow:\"→\",ShortUpArrow:\"↑\",shy:\"\",Sigma:\"Σ\",sigma:\"σ\",sigmaf:\"ς\",sigmav:\"ς\",sim:\"∼\",simdot:\"⩪\",sime:\"≃\",simeq:\"≃\",simg:\"⪞\",simgE:\"⪠\",siml:\"⪝\",simlE:\"⪟\",simne:\"≆\",simplus:\"⨤\",simrarr:\"⥲\",slarr:\"←\",SmallCircle:\"∘\",smallsetminus:\"∖\",smashp:\"⨳\",smeparsl:\"⧤\",smid:\"∣\",smile:\"⌣\",smt:\"⪪\",smte:\"⪬\",smtes:\"⪬︀\",SOFTcy:\"Ь\",softcy:\"ь\",sol:\"/\",solb:\"⧄\",solbar:\"⌿\",Sopf:\"𝕊\",sopf:\"𝕤\",spades:\"♠\",spadesuit:\"♠\",spar:\"∥\",sqcap:\"⊓\",sqcaps:\"⊓︀\",sqcup:\"⊔\",sqcups:\"⊔︀\",Sqrt:\"√\",sqsub:\"⊏\",sqsube:\"⊑\",sqsubset:\"⊏\",sqsubseteq:\"⊑\",sqsup:\"⊐\",sqsupe:\"⊒\",sqsupset:\"⊐\",sqsupseteq:\"⊒\",squ:\"□\",Square:\"□\",square:\"□\",SquareIntersection:\"⊓\",SquareSubset:\"⊏\",SquareSubsetEqual:\"⊑\",SquareSuperset:\"⊐\",SquareSupersetEqual:\"⊒\",SquareUnion:\"⊔\",squarf:\"▪\",squf:\"▪\",srarr:\"→\",Sscr:\"𝒮\",sscr:\"𝓈\",ssetmn:\"∖\",ssmile:\"⌣\",sstarf:\"⋆\",Star:\"⋆\",star:\"☆\",starf:\"★\",straightepsilon:\"ϵ\",straightphi:\"ϕ\",strns:\"¯\",Sub:\"⋐\",sub:\"⊂\",subdot:\"⪽\",subE:\"⫅\",sube:\"⊆\",subedot:\"⫃\",submult:\"⫁\",subnE:\"⫋\",subne:\"⊊\",subplus:\"⪿\",subrarr:\"⥹\",Subset:\"⋐\",subset:\"⊂\",subseteq:\"⊆\",subseteqq:\"⫅\",SubsetEqual:\"⊆\",subsetneq:\"⊊\",subsetneqq:\"⫋\",subsim:\"⫇\",subsub:\"⫕\",subsup:\"⫓\",succ:\"≻\",succapprox:\"⪸\",succcurlyeq:\"≽\",Succeeds:\"≻\",SucceedsEqual:\"⪰\",SucceedsSlantEqual:\"≽\",SucceedsTilde:\"≿\",succeq:\"⪰\",succnapprox:\"⪺\",succneqq:\"⪶\",succnsim:\"⋩\",succsim:\"≿\",SuchThat:\"∋\",Sum:\"∑\",sum:\"∑\",sung:\"♪\",Sup:\"⋑\",sup:\"⊃\",sup1:\"¹\",sup2:\"²\",sup3:\"³\",supdot:\"⪾\",supdsub:\"⫘\",supE:\"⫆\",supe:\"⊇\",supedot:\"⫄\",Superset:\"⊃\",SupersetEqual:\"⊇\",suphsol:\"⟉\",suphsub:\"⫗\",suplarr:\"⥻\",supmult:\"⫂\",supnE:\"⫌\",supne:\"⊋\",supplus:\"⫀\",Supset:\"⋑\",supset:\"⊃\",supseteq:\"⊇\",supseteqq:\"⫆\",supsetneq:\"⊋\",supsetneqq:\"⫌\",supsim:\"⫈\",supsub:\"⫔\",supsup:\"⫖\",swarhk:\"⤦\",swArr:\"⇙\",swarr:\"↙\",swarrow:\"↙\",swnwar:\"⤪\",szlig:\"ß\",Tab:\"\\t\",target:\"⌖\",Tau:\"Τ\",tau:\"τ\",tbrk:\"⎴\",Tcaron:\"Ť\",tcaron:\"ť\",Tcedil:\"Ţ\",tcedil:\"ţ\",Tcy:\"Т\",tcy:\"т\",tdot:\"⃛\",telrec:\"⌕\",Tfr:\"𝔗\",tfr:\"𝔱\",there4:\"∴\",Therefore:\"∴\",therefore:\"∴\",Theta:\"Θ\",theta:\"θ\",thetasym:\"ϑ\",thetav:\"ϑ\",thickapprox:\"≈\",thicksim:\"∼\",ThickSpace:\" \",thinsp:\" \",ThinSpace:\" \",thkap:\"≈\",thksim:\"∼\",THORN:\"Þ\",thorn:\"þ\",Tilde:\"∼\",tilde:\"˜\",TildeEqual:\"≃\",TildeFullEqual:\"≅\",TildeTilde:\"≈\",times:\"×\",timesb:\"⊠\",timesbar:\"⨱\",timesd:\"⨰\",tint:\"∭\",toea:\"⤨\",top:\"⊤\",topbot:\"⌶\",topcir:\"⫱\",Topf:\"𝕋\",topf:\"𝕥\",topfork:\"⫚\",tosa:\"⤩\",tprime:\"‴\",TRADE:\"™\",trade:\"™\",triangle:\"▵\",triangledown:\"▿\",triangleleft:\"◃\",trianglelefteq:\"⊴\",triangleq:\"≜\",triangleright:\"▹\",trianglerighteq:\"⊵\",tridot:\"◬\",trie:\"≜\",triminus:\"⨺\",TripleDot:\"⃛\",triplus:\"⨹\",trisb:\"⧍\",tritime:\"⨻\",trpezium:\"⏢\",Tscr:\"𝒯\",tscr:\"𝓉\",TScy:\"Ц\",tscy:\"ц\",TSHcy:\"Ћ\",tshcy:\"ћ\",Tstrok:\"Ŧ\",tstrok:\"ŧ\",twixt:\"≬\",twoheadleftarrow:\"↞\",twoheadrightarrow:\"↠\",Uacute:\"Ú\",uacute:\"ú\",Uarr:\"↟\",uArr:\"⇑\",uarr:\"↑\",Uarrocir:\"⥉\",Ubrcy:\"Ў\",ubrcy:\"ў\",Ubreve:\"Ŭ\",ubreve:\"ŭ\",Ucirc:\"Û\",ucirc:\"û\",Ucy:\"У\",ucy:\"у\",udarr:\"⇅\",Udblac:\"Ű\",udblac:\"ű\",udhar:\"⥮\",ufisht:\"⥾\",Ufr:\"𝔘\",ufr:\"𝔲\",Ugrave:\"Ù\",ugrave:\"ù\",uHar:\"⥣\",uharl:\"↿\",uharr:\"↾\",uhblk:\"▀\",ulcorn:\"⌜\",ulcorner:\"⌜\",ulcrop:\"⌏\",ultri:\"◸\",Umacr:\"Ū\",umacr:\"ū\",uml:\"¨\",UnderBar:\"_\",UnderBrace:\"⏟\",UnderBracket:\"⎵\",UnderParenthesis:\"⏝\",Union:\"⋃\",UnionPlus:\"⊎\",Uogon:\"Ų\",uogon:\"ų\",Uopf:\"𝕌\",uopf:\"𝕦\",UpArrow:\"↑\",Uparrow:\"⇑\",uparrow:\"↑\",UpArrowBar:\"⤒\",UpArrowDownArrow:\"⇅\",UpDownArrow:\"↕\",Updownarrow:\"⇕\",updownarrow:\"↕\",UpEquilibrium:\"⥮\",upharpoonleft:\"↿\",upharpoonright:\"↾\",uplus:\"⊎\",UpperLeftArrow:\"↖\",UpperRightArrow:\"↗\",Upsi:\"ϒ\",upsi:\"υ\",upsih:\"ϒ\",Upsilon:\"Υ\",upsilon:\"υ\",UpTee:\"⊥\",UpTeeArrow:\"↥\",upuparrows:\"⇈\",urcorn:\"⌝\",urcorner:\"⌝\",urcrop:\"⌎\",Uring:\"Ů\",uring:\"ů\",urtri:\"◹\",Uscr:\"𝒰\",uscr:\"𝓊\",utdot:\"⋰\",Utilde:\"Ũ\",utilde:\"ũ\",utri:\"▵\",utrif:\"▴\",uuarr:\"⇈\",Uuml:\"Ü\",uuml:\"ü\",uwangle:\"⦧\",vangrt:\"⦜\",varepsilon:\"ϵ\",varkappa:\"ϰ\",varnothing:\"∅\",varphi:\"ϕ\",varpi:\"ϖ\",varpropto:\"∝\",vArr:\"⇕\",varr:\"↕\",varrho:\"ϱ\",varsigma:\"ς\",varsubsetneq:\"⊊︀\",varsubsetneqq:\"⫋︀\",varsupsetneq:\"⊋︀\",varsupsetneqq:\"⫌︀\",vartheta:\"ϑ\",vartriangleleft:\"⊲\",vartriangleright:\"⊳\",Vbar:\"⫫\",vBar:\"⫨\",vBarv:\"⫩\",Vcy:\"В\",vcy:\"в\",VDash:\"⊫\",Vdash:\"⊩\",vDash:\"⊨\",vdash:\"⊢\",Vdashl:\"⫦\",Vee:\"⋁\",vee:\"∨\",veebar:\"⊻\",veeeq:\"≚\",vellip:\"⋮\",Verbar:\"‖\",verbar:\"|\",Vert:\"‖\",vert:\"|\",VerticalBar:\"∣\",VerticalLine:\"|\",VerticalSeparator:\"❘\",VerticalTilde:\"≀\",VeryThinSpace:\" \",Vfr:\"𝔙\",vfr:\"𝔳\",vltri:\"⊲\",vnsub:\"⊂⃒\",vnsup:\"⊃⃒\",Vopf:\"𝕍\",vopf:\"𝕧\",vprop:\"∝\",vrtri:\"⊳\",Vscr:\"𝒱\",vscr:\"𝓋\",vsubnE:\"⫋︀\",vsubne:\"⊊︀\",vsupnE:\"⫌︀\",vsupne:\"⊋︀\",Vvdash:\"⊪\",vzigzag:\"⦚\",Wcirc:\"Ŵ\",wcirc:\"ŵ\",wedbar:\"⩟\",Wedge:\"⋀\",wedge:\"∧\",wedgeq:\"≙\",weierp:\"℘\",Wfr:\"𝔚\",wfr:\"𝔴\",Wopf:\"𝕎\",wopf:\"𝕨\",wp:\"℘\",wr:\"≀\",wreath:\"≀\",Wscr:\"𝒲\",wscr:\"𝓌\",xcap:\"⋂\",xcirc:\"◯\",xcup:\"⋃\",xdtri:\"▽\",Xfr:\"𝔛\",xfr:\"𝔵\",xhArr:\"⟺\",xharr:\"⟷\",Xi:\"Ξ\",xi:\"ξ\",xlArr:\"⟸\",xlarr:\"⟵\",xmap:\"⟼\",xnis:\"⋻\",xodot:\"⨀\",Xopf:\"𝕏\",xopf:\"𝕩\",xoplus:\"⨁\",xotime:\"⨂\",xrArr:\"⟹\",xrarr:\"⟶\",Xscr:\"𝒳\",xscr:\"𝓍\",xsqcup:\"⨆\",xuplus:\"⨄\",xutri:\"△\",xvee:\"⋁\",xwedge:\"⋀\",Yacute:\"Ý\",yacute:\"ý\",YAcy:\"Я\",yacy:\"я\",Ycirc:\"Ŷ\",ycirc:\"ŷ\",Ycy:\"Ы\",ycy:\"ы\",yen:\"¥\",Yfr:\"𝔜\",yfr:\"𝔶\",YIcy:\"Ї\",yicy:\"ї\",Yopf:\"𝕐\",yopf:\"𝕪\",Yscr:\"𝒴\",yscr:\"𝓎\",YUcy:\"Ю\",yucy:\"ю\",Yuml:\"Ÿ\",yuml:\"ÿ\",Zacute:\"Ź\",zacute:\"ź\",Zcaron:\"Ž\",zcaron:\"ž\",Zcy:\"З\",zcy:\"з\",Zdot:\"Ż\",zdot:\"ż\",zeetrf:\"ℨ\",ZeroWidthSpace:\"\",Zeta:\"Ζ\",zeta:\"ζ\",Zfr:\"ℨ\",zfr:\"𝔷\",ZHcy:\"Ж\",zhcy:\"ж\",zigrarr:\"⇝\",Zopf:\"ℤ\",zopf:\"𝕫\",Zscr:\"𝒵\",zscr:\"𝓏\",zwj:\"\",zwnj:\"\"},r=Object.prototype.hasOwnProperty;function n(e){return o=e,(n=t)&&r.call(n,o)?t[e]:e;var n,o}var o=Object.prototype.hasOwnProperty;function s(e,t){return!!e&&o.call(e,t)}function i(e){return[].slice.call(arguments,1).forEach(function(t){if(t){if(\"object\"!=typeof t)throw new TypeError(t+\"must be object\");Object.keys(t).forEach(function(r){e[r]=t[r]})}}),e}var a=/\\\\([\\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;function u(e){return e.indexOf(\"\\\\\")<0?e:e.replace(a,\"$1\")}function l(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!=(65535&e)&&65534!=(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function c(e){if(e>65535){var t=55296+((e-=65536)>>10),r=56320+(1023&e);return String.fromCharCode(t,r)}return String.fromCharCode(e)}var p=/&([a-z#][a-z0-9]{1,31});/gi,h=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;function f(e,t){var r=0,o=n(t);return t!==o?o:35===t.charCodeAt(0)&&h.test(t)&&l(r=\"x\"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10))?c(r):e}function g(e){return e.indexOf(\"&\")<0?e:e.replace(p,f)}var d=/[&<>\"]/,m=/[&<>\"]/g,b={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\"};function v(e){return b[e]}function k(e){return d.test(e)?e.replace(m,v):e}var A=Object.freeze({isString:function(e){return\"[object String]\"===function(e){return Object.prototype.toString.call(e)}(e)},has:s,assign:i,unescapeMd:u,isValidEntityCode:l,fromCodePoint:c,replaceEntities:g,escapeHtml:k}),y={};y.blockquote_open=function(){return\"<blockquote>\\n\"},y.blockquote_close=function(e,t){return\"</blockquote>\"+x(e,t)},y.code=function(e,t){return e[t].block?\"<pre><code>\"+k(e[t].content)+\"</code></pre>\"+x(e,t):\"<code>\"+k(e[t].content)+\"</code>\"},y.fence=function(e,t,r,n,o){var i,a,l=e[t],c=\"\",p=r.langPrefix;if(l.params){if(a=(i=l.params.split(/\\s+/g)).join(\" \"),s(o.rules.fence_custom,i[0]))return o.rules.fence_custom[i[0]](e,t,r,n,o);c=' class=\"'+p+k(g(u(a)))+'\"'}return\"<pre><code\"+c+\">\"+(r.highlight&&r.highlight.apply(r.highlight,[l.content].concat(i))||k(l.content))+\"</code></pre>\"+x(e,t)},y.fence_custom={},y.heading_open=function(e,t){return\"<h\"+e[t].hLevel+\">\"},y.heading_close=function(e,t){return\"</h\"+e[t].hLevel+\">\\n\"},y.hr=function(e,t,r){return(r.xhtmlOut?\"<hr />\":\"<hr>\")+x(e,t)},y.bullet_list_open=function(){return\"<ul>\\n\"},y.bullet_list_close=function(e,t){return\"</ul>\"+x(e,t)},y.list_item_open=function(){return\"<li>\"},y.list_item_close=function(){return\"</li>\\n\"},y.ordered_list_open=function(e,t){var r=e[t];return\"<ol\"+(r.order>1?' start=\"'+r.order+'\"':\"\")+\">\\n\"},y.ordered_list_close=function(e,t){return\"</ol>\"+x(e,t)},y.paragraph_open=function(e,t){return e[t].tight?\"\":\"<p>\"},y.paragraph_close=function(e,t){var r=!(e[t].tight&&t&&\"inline\"===e[t-1].type&&!e[t-1].content);return(e[t].tight?\"\":\"</p>\")+(r?x(e,t):\"\")},y.link_open=function(e,t,r){var n=e[t].title?' title=\"'+k(g(e[t].title))+'\"':\"\",o=r.linkTarget?' target=\"'+r.linkTarget+'\"':\"\";return'<a href=\"'+k(e[t].href)+'\"'+n+o+\">\"},y.link_close=function(){return\"</a>\"},y.image=function(e,t,r){var n=' src=\"'+k(e[t].src)+'\"',o=e[t].title?' title=\"'+k(g(e[t].title))+'\"':\"\";return\"<img\"+n+(' alt=\"'+(e[t].alt?k(g(u(e[t].alt))):\"\")+'\"')+o+(r.xhtmlOut?\" /\":\"\")+\">\"},y.table_open=function(){return\"<table>\\n\"},y.table_close=function(){return\"</table>\\n\"},y.thead_open=function(){return\"<thead>\\n\"},y.thead_close=function(){return\"</thead>\\n\"},y.tbody_open=function(){return\"<tbody>\\n\"},y.tbody_close=function(){return\"</tbody>\\n\"},y.tr_open=function(){return\"<tr>\"},y.tr_close=function(){return\"</tr>\\n\"},y.th_open=function(e,t){var r=e[t];return\"<th\"+(r.align?' style=\"text-align:'+r.align+'\"':\"\")+\">\"},y.th_close=function(){return\"</th>\"},y.td_open=function(e,t){var r=e[t];return\"<td\"+(r.align?' style=\"text-align:'+r.align+'\"':\"\")+\">\"},y.td_close=function(){return\"</td>\"},y.strong_open=function(){return\"<strong>\"},y.strong_close=function(){return\"</strong>\"},y.em_open=function(){return\"<em>\"},y.em_close=function(){return\"</em>\"},y.del_open=function(){return\"<del>\"},y.del_close=function(){return\"</del>\"},y.ins_open=function(){return\"<ins>\"},y.ins_close=function(){return\"</ins>\"},y.mark_open=function(){return\"<mark>\"},y.mark_close=function(){return\"</mark>\"},y.sub=function(e,t){return\"<sub>\"+k(e[t].content)+\"</sub>\"},y.sup=function(e,t){return\"<sup>\"+k(e[t].content)+\"</sup>\"},y.hardbreak=function(e,t,r){return r.xhtmlOut?\"<br />\\n\":\"<br>\\n\"},y.softbreak=function(e,t,r){return r.breaks?r.xhtmlOut?\"<br />\\n\":\"<br>\\n\":\"\\n\"},y.text=function(e,t){return k(e[t].content)},y.htmlblock=function(e,t){return e[t].content},y.htmltag=function(e,t){return e[t].content},y.abbr_open=function(e,t){return'<abbr title=\"'+k(g(e[t].title))+'\">'},y.abbr_close=function(){return\"</abbr>\"},y.footnote_ref=function(e,t){var r=Number(e[t].id+1).toString(),n=\"fnref\"+r;return e[t].subId>0&&(n+=\":\"+e[t].subId),'<sup class=\"footnote-ref\"><a href=\"#fn'+r+'\" id=\"'+n+'\">['+r+\"]</a></sup>\"},y.footnote_block_open=function(e,t,r){return(r.xhtmlOut?'<hr class=\"footnotes-sep\" />\\n':'<hr class=\"footnotes-sep\">\\n')+'<section class=\"footnotes\">\\n<ol class=\"footnotes-list\">\\n'},y.footnote_block_close=function(){return\"</ol>\\n</section>\\n\"},y.footnote_open=function(e,t){return'<li id=\"fn'+Number(e[t].id+1).toString()+'\" class=\"footnote-item\">'},y.footnote_close=function(){return\"</li>\\n\"},y.footnote_anchor=function(e,t){var r=\"fnref\"+Number(e[t].id+1).toString();return e[t].subId>0&&(r+=\":\"+e[t].subId),' <a href=\"#'+r+'\" class=\"footnote-backref\">↩</a>'},y.dl_open=function(){return\"<dl>\\n\"},y.dt_open=function(){return\"<dt>\"},y.dd_open=function(){return\"<dd>\"},y.dl_close=function(){return\"</dl>\\n\"},y.dt_close=function(){return\"</dt>\\n\"},y.dd_close=function(){return\"</dd>\\n\"};var x=y.getBreak=function(e,t){return(t=function e(t,r){return++r>=t.length-2?r:\"paragraph_open\"===t[r].type&&t[r].tight&&\"inline\"===t[r+1].type&&0===t[r+1].content.length&&\"paragraph_close\"===t[r+2].type&&t[r+2].tight?e(t,r+2):r}(e,t))<e.length&&\"list_item_close\"===e[t].type?\"\":\"\\n\"};function w(){this.rules=i({},y),this.getBreak=y.getBreak}function C(){this.__rules__=[],this.__cache__=null}function E(e,t,r,n,o){this.src=e,this.env=n,this.options=r,this.parser=t,this.tokens=o,this.pos=0,this.posMax=this.src.length,this.level=0,this.pending=\"\",this.pendingLevel=0,this.cache=[],this.isInLabel=!1,this.linkLevel=0,this.linkContent=\"\",this.labelUnmatchedScopes=0}function D(e,t){var r,n,o,s=-1,i=e.posMax,a=e.pos,u=e.isInLabel;if(e.isInLabel)return-1;if(e.labelUnmatchedScopes)return e.labelUnmatchedScopes--,-1;for(e.pos=t+1,e.isInLabel=!0,r=1;e.pos<i;){if(91===(o=e.src.charCodeAt(e.pos)))r++;else if(93===o&&0===--r){n=!0;break}e.parser.skipToken(e)}return n?(s=e.pos,e.labelUnmatchedScopes=0):e.labelUnmatchedScopes=r-1,e.pos=a,e.isInLabel=u,s}function _(e,t,r,n){var o,s,i,a,u,l;if(42!==e.charCodeAt(0))return-1;if(91!==e.charCodeAt(1))return-1;if(-1===e.indexOf(\"]:\"))return-1;if((s=D(o=new E(e,t,r,n,[]),1))<0||58!==e.charCodeAt(s+1))return-1;for(a=o.posMax,i=s+2;i<a&&10!==o.src.charCodeAt(i);i++);return u=e.slice(2,s),0===(l=e.slice(s+2,i).trim()).length?-1:(n.abbreviations||(n.abbreviations={}),void 0===n.abbreviations[\":\"+u]&&(n.abbreviations[\":\"+u]=l),i)}function B(e){var t=g(e);try{t=decodeURI(t)}catch(e){}return encodeURI(t)}function q(e,t){var r,n,o,s=t,i=e.posMax;if(60===e.src.charCodeAt(t)){for(t++;t<i;){if(10===(r=e.src.charCodeAt(t)))return!1;if(62===r)return o=B(u(e.src.slice(s+1,t))),!!e.parser.validateLink(o)&&(e.pos=t+1,e.linkContent=o,!0);92===r&&t+1<i?t+=2:t++}return!1}for(n=0;t<i&&32!==(r=e.src.charCodeAt(t))&&!(r<32||127===r);)if(92===r&&t+1<i)t+=2;else{if(40===r&&++n>1)break;if(41===r&&--n<0)break;t++}return s!==t&&(o=u(e.src.slice(s,t)),!!e.parser.validateLink(o)&&(e.linkContent=o,e.pos=t,!0))}function F(e,t){var r,n=t,o=e.posMax,s=e.src.charCodeAt(t);if(34!==s&&39!==s&&40!==s)return!1;for(t++,40===s&&(s=41);t<o;){if((r=e.src.charCodeAt(t))===s)return e.pos=t+1,e.linkContent=u(e.src.slice(n+1,t)),!0;92===r&&t+1<o?t+=2:t++}return!1}function M(e){return e.trim().replace(/\\s+/g,\" \").toUpperCase()}function S(e,t,r,n){var o,s,i,a,u,l,c,p,h;if(91!==e.charCodeAt(0))return-1;if(-1===e.indexOf(\"]:\"))return-1;if((s=D(o=new E(e,t,r,n,[]),0))<0||58!==e.charCodeAt(s+1))return-1;for(a=o.posMax,i=s+2;i<a&&(32===(u=o.src.charCodeAt(i))||10===u);i++);if(!q(o,i))return-1;for(c=o.linkContent,l=i=o.pos,i+=1;i<a&&(32===(u=o.src.charCodeAt(i))||10===u);i++);for(i<a&&l!==i&&F(o,i)?(p=o.linkContent,i=o.pos):(p=\"\",i=l);i<a&&32===o.src.charCodeAt(i);)i++;return i<a&&10!==o.src.charCodeAt(i)?-1:(h=M(e.slice(1,s)),void 0===n.references[h]&&(n.references[h]={title:p,href:c}),i)}w.prototype.renderInline=function(e,t,r){for(var n=this.rules,o=e.length,s=0,i=\"\";o--;)i+=n[e[s].type](e,s++,t,r,this);return i},w.prototype.render=function(e,t,r){for(var n=this.rules,o=e.length,s=-1,i=\"\";++s<o;)\"inline\"===e[s].type?i+=this.renderInline(e[s].children,t,r):i+=n[e[s].type](e,s,t,r,this);return i},C.prototype.__find__=function(e){for(var t=this.__rules__.length,r=-1;t--;)if(this.__rules__[++r].name===e)return r;return-1},C.prototype.__compile__=function(){var e=this,t=[\"\"];e.__rules__.forEach(function(e){e.enabled&&e.alt.forEach(function(e){t.indexOf(e)<0&&t.push(e)})}),e.__cache__={},t.forEach(function(t){e.__cache__[t]=[],e.__rules__.forEach(function(r){r.enabled&&(t&&r.alt.indexOf(t)<0||e.__cache__[t].push(r.fn))})})},C.prototype.at=function(e,t,r){var n=this.__find__(e),o=r||{};if(-1===n)throw new Error(\"Parser rule not found: \"+e);this.__rules__[n].fn=t,this.__rules__[n].alt=o.alt||[],this.__cache__=null},C.prototype.before=function(e,t,r,n){var o=this.__find__(e),s=n||{};if(-1===o)throw new Error(\"Parser rule not found: \"+e);this.__rules__.splice(o,0,{name:t,enabled:!0,fn:r,alt:s.alt||[]}),this.__cache__=null},C.prototype.after=function(e,t,r,n){var o=this.__find__(e),s=n||{};if(-1===o)throw new Error(\"Parser rule not found: \"+e);this.__rules__.splice(o+1,0,{name:t,enabled:!0,fn:r,alt:s.alt||[]}),this.__cache__=null},C.prototype.push=function(e,t,r){var n=r||{};this.__rules__.push({name:e,enabled:!0,fn:t,alt:n.alt||[]}),this.__cache__=null},C.prototype.enable=function(e,t){e=Array.isArray(e)?e:[e],t&&this.__rules__.forEach(function(e){e.enabled=!1}),e.forEach(function(e){var t=this.__find__(e);if(t<0)throw new Error(\"Rules manager: invalid rule name \"+e);this.__rules__[t].enabled=!0},this),this.__cache__=null},C.prototype.disable=function(e){(e=Array.isArray(e)?e:[e]).forEach(function(e){var t=this.__find__(e);if(t<0)throw new Error(\"Rules manager: invalid rule name \"+e);this.__rules__[t].enabled=!1},this),this.__cache__=null},C.prototype.getRules=function(e){return null===this.__cache__&&this.__compile__(),this.__cache__[e]||[]},E.prototype.pushPending=function(){this.tokens.push({type:\"text\",content:this.pending,level:this.pendingLevel}),this.pending=\"\"},E.prototype.push=function(e){this.pending&&this.pushPending(),this.tokens.push(e),this.pendingLevel=this.level},E.prototype.cacheSet=function(e,t){for(var r=this.cache.length;r<=e;r++)this.cache.push(0);this.cache[e]=t},E.prototype.cacheGet=function(e){return e<this.cache.length?this.cache[e]:0};var T=\" \\n()[]'\\\".,!?-\";function L(e){return e.replace(/([-()\\[\\]{}+?*.$\\^|,:#<!\\\\])/g,\"\\\\$1\")}var R=/\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/,N=/\\((c|tm|r|p)\\)/gi,z={c:\"©\",r:\"®\",p:\"§\",tm:\"™\"};var P=/['\"]/,j=/['\"]/g,I=/[-\\s()\\[\\]]/,O=\"’\";function U(e,t){return!(t<0||t>=e.length)&&!I.test(e[t])}function H(e,t,r){return e.substr(0,t)+r+e.substr(t+1)}var V=[[\"block\",function(e){e.inlineMode?e.tokens.push({type:\"inline\",content:e.src.replace(/\\n/g,\" \").trim(),level:0,lines:[0,1],children:[]}):e.block.parse(e.src,e.options,e.env,e.tokens)}],[\"abbr\",function(e){var t,r,n,o,s=e.tokens;if(!e.inlineMode)for(t=1,r=s.length-1;t<r;t++)if(\"paragraph_open\"===s[t-1].type&&\"inline\"===s[t].type&&\"paragraph_close\"===s[t+1].type){for(n=s[t].content;n.length&&!((o=_(n,e.inline,e.options,e.env))<0);)n=n.slice(o).trim();s[t].content=n,n.length||(s[t-1].tight=!0,s[t+1].tight=!0)}}],[\"references\",function(e){var t,r,n,o,s=e.tokens;if(e.env.references=e.env.references||{},!e.inlineMode)for(t=1,r=s.length-1;t<r;t++)if(\"inline\"===s[t].type&&\"paragraph_open\"===s[t-1].type&&\"paragraph_close\"===s[t+1].type){for(n=s[t].content;n.length&&!((o=S(n,e.inline,e.options,e.env))<0);)n=n.slice(o).trim();s[t].content=n,n.length||(s[t-1].tight=!0,s[t+1].tight=!0)}}],[\"inline\",function(e){var t,r,n,o=e.tokens;for(r=0,n=o.length;r<n;r++)\"inline\"===(t=o[r]).type&&e.inline.parse(t.content,e.options,e.env,t.children)}],[\"footnote_tail\",function(e){var t,r,n,o,s,i,a,u,l,c=0,p=!1,h={};if(e.env.footnotes&&(e.tokens=e.tokens.filter(function(e){return\"footnote_reference_open\"===e.type?(p=!0,u=[],l=e.label,!1):\"footnote_reference_close\"===e.type?(p=!1,h[\":\"+l]=u,!1):(p&&u.push(e),!p)}),e.env.footnotes.list)){for(i=e.env.footnotes.list,e.tokens.push({type:\"footnote_block_open\",level:c++}),t=0,r=i.length;t<r;t++){for(e.tokens.push({type:\"footnote_open\",id:t,level:c++}),i[t].tokens?((a=[]).push({type:\"paragraph_open\",tight:!1,level:c++}),a.push({type:\"inline\",content:\"\",level:c,children:i[t].tokens}),a.push({type:\"paragraph_close\",tight:!1,level:--c})):i[t].label&&(a=h[\":\"+i[t].label]),e.tokens=e.tokens.concat(a),s=\"paragraph_close\"===e.tokens[e.tokens.length-1].type?e.tokens.pop():null,o=i[t].count>0?i[t].count:1,n=0;n<o;n++)e.tokens.push({type:\"footnote_anchor\",id:t,subId:n,level:c});s&&e.tokens.push(s),e.tokens.push({type:\"footnote_close\",level:--c})}e.tokens.push({type:\"footnote_block_close\",level:--c})}}],[\"abbr2\",function(e){var t,r,n,o,s,i,a,u,l,c,p,h,f=e.tokens;if(e.env.abbreviations)for(e.env.abbrRegExp||(h=\"(^|[\"+T.split(\"\").map(L).join(\"\")+\"])(\"+Object.keys(e.env.abbreviations).map(function(e){return e.substr(1)}).sort(function(e,t){return t.length-e.length}).map(L).join(\"|\")+\")($|[\"+T.split(\"\").map(L).join(\"\")+\"])\",e.env.abbrRegExp=new RegExp(h,\"g\")),c=e.env.abbrRegExp,r=0,n=f.length;r<n;r++)if(\"inline\"===f[r].type)for(t=(o=f[r].children).length-1;t>=0;t--)if(\"text\"===(s=o[t]).type){for(u=0,i=s.content,c.lastIndex=0,l=s.level,a=[];p=c.exec(i);)c.lastIndex>u&&a.push({type:\"text\",content:i.slice(u,p.index+p[1].length),level:l}),a.push({type:\"abbr_open\",title:e.env.abbreviations[\":\"+p[2]],level:l++}),a.push({type:\"text\",content:p[2],level:l}),a.push({type:\"abbr_close\",level:--l}),u=c.lastIndex-p[3].length;a.length&&(u<i.length&&a.push({type:\"text\",content:i.slice(u),level:l}),f[r].children=o=[].concat(o.slice(0,t),a,o.slice(t+1)))}}],[\"replacements\",function(e){var t,r,n,o,s,i;if(e.options.typographer)for(s=e.tokens.length-1;s>=0;s--)if(\"inline\"===e.tokens[s].type)for(t=(o=e.tokens[s].children).length-1;t>=0;t--)\"text\"===(r=o[t]).type&&(n=r.content,n=(i=n).indexOf(\"(\")<0?i:i.replace(N,function(e,t){return z[t.toLowerCase()]}),R.test(n)&&(n=n.replace(/\\+-/g,\"±\").replace(/\\.{2,}/g,\"…\").replace(/([?!])…/g,\"$1..\").replace(/([?!]){4,}/g,\"$1$1$1\").replace(/,{2,}/g,\",\").replace(/(^|[^-])---([^-]|$)/gm,\"$1—$2\").replace(/(^|\\s)--(\\s|$)/gm,\"$1–$2\").replace(/(^|[^-\\s])--([^-\\s]|$)/gm,\"$1–$2\")),r.content=n)}],[\"smartquotes\",function(e){var t,r,n,o,s,i,a,u,l,c,p,h,f,g,d,m,b;if(e.options.typographer)for(b=[],d=e.tokens.length-1;d>=0;d--)if(\"inline\"===e.tokens[d].type)for(m=e.tokens[d].children,b.length=0,t=0;t<m.length;t++)if(\"text\"===(r=m[t]).type&&!P.test(r.text)){for(a=m[t].level,f=b.length-1;f>=0&&!(b[f].level<=a);f--);b.length=f+1,s=0,i=(n=r.content).length;e:for(;s<i&&(j.lastIndex=s,o=j.exec(n));)if(u=!U(n,o.index-1),s=o.index+1,g=\"'\"===o[0],(l=!U(n,s))||u){if(p=!l,h=!u)for(f=b.length-1;f>=0&&(c=b[f],!(b[f].level<a));f--)if(c.single===g&&b[f].level===a){c=b[f],g?(m[c.token].content=H(m[c.token].content,c.pos,e.options.quotes[2]),r.content=H(r.content,o.index,e.options.quotes[3])):(m[c.token].content=H(m[c.token].content,c.pos,e.options.quotes[0]),r.content=H(r.content,o.index,e.options.quotes[1])),b.length=f;continue e}p?b.push({token:t,pos:o.index,single:g,level:a}):h&&g&&(r.content=H(r.content,o.index,O))}else g&&(r.content=H(r.content,o.index,O))}}]];function G(){this.options={},this.ruler=new C;for(var e=0;e<V.length;e++)this.ruler.push(V[e][0],V[e][1])}function $(e,t,r,n,o){var s,i,a,u,l,c,p;for(this.src=e,this.parser=t,this.options=r,this.env=n,this.tokens=o,this.bMarks=[],this.eMarks=[],this.tShift=[],this.blkIndent=0,this.line=0,this.lineMax=0,this.tight=!1,this.parentType=\"root\",this.ddIndent=-1,this.level=0,this.result=\"\",c=0,p=!1,a=u=c=0,l=(i=this.src).length;u<l;u++){if(s=i.charCodeAt(u),!p){if(32===s){c++;continue}p=!0}10!==s&&u!==l-1||(10!==s&&u++,this.bMarks.push(a),this.eMarks.push(u),this.tShift.push(c),p=!1,c=0,a=u+1)}this.bMarks.push(i.length),this.eMarks.push(i.length),this.tShift.push(0),this.lineMax=this.bMarks.length-1}function Z(e,t){var r,n,o;return(n=e.bMarks[t]+e.tShift[t])>=(o=e.eMarks[t])?-1:42!==(r=e.src.charCodeAt(n++))&&45!==r&&43!==r?-1:n<o&&32!==e.src.charCodeAt(n)?-1:n}function W(e,t){var r,n=e.bMarks[t]+e.tShift[t],o=e.eMarks[t];if(n+1>=o)return-1;if((r=e.src.charCodeAt(n++))<48||r>57)return-1;for(;;){if(n>=o)return-1;if(!((r=e.src.charCodeAt(n++))>=48&&r<=57)){if(41===r||46===r)break;return-1}}return n<o&&32!==e.src.charCodeAt(n)?-1:n}G.prototype.process=function(e){var t,r,n;for(t=0,r=(n=this.ruler.getRules(\"\")).length;t<r;t++)n[t](e)},$.prototype.isEmpty=function(e){return this.bMarks[e]+this.tShift[e]>=this.eMarks[e]},$.prototype.skipEmptyLines=function(e){for(var t=this.lineMax;e<t&&!(this.bMarks[e]+this.tShift[e]<this.eMarks[e]);e++);return e},$.prototype.skipSpaces=function(e){for(var t=this.src.length;e<t&&32===this.src.charCodeAt(e);e++);return e},$.prototype.skipChars=function(e,t){for(var r=this.src.length;e<r&&this.src.charCodeAt(e)===t;e++);return e},$.prototype.skipCharsBack=function(e,t,r){if(e<=r)return e;for(;e>r;)if(t!==this.src.charCodeAt(--e))return e+1;return e},$.prototype.getLines=function(e,t,r,n){var o,s,i,a,u,l=e;if(e>=t)return\"\";if(l+1===t)return s=this.bMarks[l]+Math.min(this.tShift[l],r),i=n?this.eMarks[l]+1:this.eMarks[l],this.src.slice(s,i);for(a=new Array(t-e),o=0;l<t;l++,o++)(u=this.tShift[l])>r&&(u=r),u<0&&(u=0),s=this.bMarks[l]+u,i=l+1<t||n?this.eMarks[l]+1:this.eMarks[l],a[o]=this.src.slice(s,i);return a.join(\"\")};var J={};[\"article\",\"aside\",\"button\",\"blockquote\",\"body\",\"canvas\",\"caption\",\"col\",\"colgroup\",\"dd\",\"div\",\"dl\",\"dt\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"hgroup\",\"hr\",\"iframe\",\"li\",\"map\",\"object\",\"ol\",\"output\",\"p\",\"pre\",\"progress\",\"script\",\"section\",\"style\",\"table\",\"tbody\",\"td\",\"textarea\",\"tfoot\",\"th\",\"tr\",\"thead\",\"ul\",\"video\"].forEach(function(e){J[e]=!0});var Y=/^<([a-zA-Z]{1,15})[\\s\\/>]/,K=/^<\\/([a-zA-Z]{1,15})[\\s>]/;function Q(e,t){var r=e.bMarks[t]+e.blkIndent,n=e.eMarks[t];return e.src.substr(r,n-r)}function X(e,t){var r,n,o=e.bMarks[t]+e.tShift[t],s=e.eMarks[t];return o>=s?-1:126!==(n=e.src.charCodeAt(o++))&&58!==n?-1:o===(r=e.skipSpaces(o))?-1:r>=s?-1:r}var ee=[[\"code\",function(e,t,r){var n,o;if(e.tShift[t]-e.blkIndent<4)return!1;for(o=n=t+1;n<r;)if(e.isEmpty(n))n++;else{if(!(e.tShift[n]-e.blkIndent>=4))break;o=++n}return e.line=n,e.tokens.push({type:\"code\",content:e.getLines(t,o,4+e.blkIndent,!0),block:!0,lines:[t,e.line],level:e.level}),!0}],[\"fences\",function(e,t,r,n){var o,s,i,a,u,l=!1,c=e.bMarks[t]+e.tShift[t],p=e.eMarks[t];if(c+3>p)return!1;if(126!==(o=e.src.charCodeAt(c))&&96!==o)return!1;if(u=c,(s=(c=e.skipChars(c,o))-u)<3)return!1;if((i=e.src.slice(c,p).trim()).indexOf(\"`\")>=0)return!1;if(n)return!0;for(a=t;!(++a>=r||(c=u=e.bMarks[a]+e.tShift[a])<(p=e.eMarks[a])&&e.tShift[a]<e.blkIndent);)if(e.src.charCodeAt(c)===o&&!(e.tShift[a]-e.blkIndent>=4||(c=e.skipChars(c,o))-u<s||(c=e.skipSpaces(c))<p)){l=!0;break}return s=e.tShift[t],e.line=a+(l?1:0),e.tokens.push({type:\"fence\",params:i,content:e.getLines(t+1,a,s,!0),lines:[t,e.line],level:e.level}),!0},[\"paragraph\",\"blockquote\",\"list\"]],[\"blockquote\",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g,d=e.bMarks[t]+e.tShift[t],m=e.eMarks[t];if(d>m)return!1;if(62!==e.src.charCodeAt(d++))return!1;if(e.level>=e.options.maxNesting)return!1;if(n)return!0;for(32===e.src.charCodeAt(d)&&d++,u=e.blkIndent,e.blkIndent=0,a=[e.bMarks[t]],e.bMarks[t]=d,s=(d=d<m?e.skipSpaces(d):d)>=m,i=[e.tShift[t]],e.tShift[t]=d-e.bMarks[t],p=e.parser.ruler.getRules(\"blockquote\"),o=t+1;o<r&&!((d=e.bMarks[o]+e.tShift[o])>=(m=e.eMarks[o]));o++)if(62!==e.src.charCodeAt(d++)){if(s)break;for(g=!1,h=0,f=p.length;h<f;h++)if(p[h](e,o,r,!0)){g=!0;break}if(g)break;a.push(e.bMarks[o]),i.push(e.tShift[o]),e.tShift[o]=-1337}else 32===e.src.charCodeAt(d)&&d++,a.push(e.bMarks[o]),e.bMarks[o]=d,s=(d=d<m?e.skipSpaces(d):d)>=m,i.push(e.tShift[o]),e.tShift[o]=d-e.bMarks[o];for(l=e.parentType,e.parentType=\"blockquote\",e.tokens.push({type:\"blockquote_open\",lines:c=[t,0],level:e.level++}),e.parser.tokenize(e,t,o),e.tokens.push({type:\"blockquote_close\",level:--e.level}),e.parentType=l,c[1]=e.line,h=0;h<i.length;h++)e.bMarks[h+t]=a[h],e.tShift[h+t]=i[h];return e.blkIndent=u,!0},[\"paragraph\",\"blockquote\",\"list\"]],[\"hr\",function(e,t,r,n){var o,s,i,a=e.bMarks[t],u=e.eMarks[t];if((a+=e.tShift[t])>u)return!1;if(42!==(o=e.src.charCodeAt(a++))&&45!==o&&95!==o)return!1;for(s=1;a<u;){if((i=e.src.charCodeAt(a++))!==o&&32!==i)return!1;i===o&&s++}return!(s<3||!n&&(e.line=t+1,e.tokens.push({type:\"hr\",lines:[t,e.line],level:e.level}),0))},[\"paragraph\",\"blockquote\",\"list\"]],[\"list\",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g,d,m,b,v,k,A,y,x,w,C,E=!0;if((p=W(e,t))>=0)d=!0;else{if(!((p=Z(e,t))>=0))return!1;d=!1}if(e.level>=e.options.maxNesting)return!1;if(g=e.src.charCodeAt(p-1),n)return!0;for(b=e.tokens.length,d?(c=e.bMarks[t]+e.tShift[t],f=Number(e.src.substr(c,p-c-1)),e.tokens.push({type:\"ordered_list_open\",order:f,lines:k=[t,0],level:e.level++})):e.tokens.push({type:\"bullet_list_open\",lines:k=[t,0],level:e.level++}),o=t,v=!1,y=e.parser.ruler.getRules(\"list\");!(!(o<r)||((h=(m=e.skipSpaces(p))>=e.eMarks[o]?1:m-p)>4&&(h=1),h<1&&(h=1),s=p-e.bMarks[o]+h,e.tokens.push({type:\"list_item_open\",lines:A=[t,0],level:e.level++}),a=e.blkIndent,u=e.tight,i=e.tShift[t],l=e.parentType,e.tShift[t]=m-e.bMarks[t],e.blkIndent=s,e.tight=!0,e.parentType=\"list\",e.parser.tokenize(e,t,r,!0),e.tight&&!v||(E=!1),v=e.line-t>1&&e.isEmpty(e.line-1),e.blkIndent=a,e.tShift[t]=i,e.tight=u,e.parentType=l,e.tokens.push({type:\"list_item_close\",level:--e.level}),o=t=e.line,A[1]=o,m=e.bMarks[t],o>=r)||e.isEmpty(o)||e.tShift[o]<e.blkIndent);){for(C=!1,x=0,w=y.length;x<w;x++)if(y[x](e,o,r,!0)){C=!0;break}if(C)break;if(d){if((p=W(e,o))<0)break}else if((p=Z(e,o))<0)break;if(g!==e.src.charCodeAt(p-1))break}return e.tokens.push({type:d?\"ordered_list_close\":\"bullet_list_close\",level:--e.level}),k[1]=o,e.line=o,E&&function(e,t){var r,n,o=e.level+2;for(r=t+2,n=e.tokens.length-2;r<n;r++)e.tokens[r].level===o&&\"paragraph_open\"===e.tokens[r].type&&(e.tokens[r+2].tight=!0,e.tokens[r].tight=!0,r+=2)}(e,b),!0},[\"paragraph\",\"blockquote\"]],[\"footnote\",function(e,t,r,n){var o,s,i,a,u,l=e.bMarks[t]+e.tShift[t],c=e.eMarks[t];if(l+4>c)return!1;if(91!==e.src.charCodeAt(l))return!1;if(94!==e.src.charCodeAt(l+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(a=l+2;a<c;a++){if(32===e.src.charCodeAt(a))return!1;if(93===e.src.charCodeAt(a))break}return!(a===l+2||a+1>=c||58!==e.src.charCodeAt(++a)||!n&&(a++,e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.refs||(e.env.footnotes.refs={}),u=e.src.slice(l+2,a-2),e.env.footnotes.refs[\":\"+u]=-1,e.tokens.push({type:\"footnote_reference_open\",label:u,level:e.level++}),o=e.bMarks[t],s=e.tShift[t],i=e.parentType,e.tShift[t]=e.skipSpaces(a)-a,e.bMarks[t]=a,e.blkIndent+=4,e.parentType=\"footnote\",e.tShift[t]<e.blkIndent&&(e.tShift[t]+=e.blkIndent,e.bMarks[t]-=e.blkIndent),e.parser.tokenize(e,t,r,!0),e.parentType=i,e.blkIndent-=4,e.tShift[t]=s,e.bMarks[t]=o,e.tokens.push({type:\"footnote_reference_close\",level:--e.level}),0))},[\"paragraph\"]],[\"heading\",function(e,t,r,n){var o,s,i,a=e.bMarks[t]+e.tShift[t],u=e.eMarks[t];if(a>=u)return!1;if(35!==(o=e.src.charCodeAt(a))||a>=u)return!1;for(s=1,o=e.src.charCodeAt(++a);35===o&&a<u&&s<=6;)s++,o=e.src.charCodeAt(++a);return!(s>6||a<u&&32!==o||!n&&(u=e.skipCharsBack(u,32,a),(i=e.skipCharsBack(u,35,a))>a&&32===e.src.charCodeAt(i-1)&&(u=i),e.line=t+1,e.tokens.push({type:\"heading_open\",hLevel:s,lines:[t,e.line],level:e.level}),a<u&&e.tokens.push({type:\"inline\",content:e.src.slice(a,u).trim(),level:e.level+1,lines:[t,e.line],children:[]}),e.tokens.push({type:\"heading_close\",hLevel:s,level:e.level}),0))},[\"paragraph\",\"blockquote\"]],[\"lheading\",function(e,t,r){var n,o,s,i=t+1;return!(i>=r||e.tShift[i]<e.blkIndent||e.tShift[i]-e.blkIndent>3||(o=e.bMarks[i]+e.tShift[i])>=(s=e.eMarks[i])||45!==(n=e.src.charCodeAt(o))&&61!==n||(o=e.skipChars(o,n),(o=e.skipSpaces(o))<s||(o=e.bMarks[t]+e.tShift[t],e.line=i+1,e.tokens.push({type:\"heading_open\",hLevel:61===n?1:2,lines:[t,e.line],level:e.level}),e.tokens.push({type:\"inline\",content:e.src.slice(o,e.eMarks[t]).trim(),level:e.level+1,lines:[t,e.line-1],children:[]}),e.tokens.push({type:\"heading_close\",hLevel:61===n?1:2,level:e.level}),0)))}],[\"htmlblock\",function(e,t,r,n){var o,s,i,a=e.bMarks[t],u=e.eMarks[t],l=e.tShift[t];if(a+=l,!e.options.html)return!1;if(l>3||a+2>=u)return!1;if(60!==e.src.charCodeAt(a))return!1;if(33===(o=e.src.charCodeAt(a+1))||63===o){if(n)return!0}else{if(47!==o&&!function(e){var t=32|e;return t>=97&&t<=122}(o))return!1;if(47===o){if(!(s=e.src.slice(a,u).match(K)))return!1}else if(!(s=e.src.slice(a,u).match(Y)))return!1;if(!0!==J[s[1].toLowerCase()])return!1;if(n)return!0}for(i=t+1;i<e.lineMax&&!e.isEmpty(i);)i++;return e.line=i,e.tokens.push({type:\"htmlblock\",level:e.level,lines:[t,e.line],content:e.getLines(t,i,0,!0)}),!0},[\"paragraph\",\"blockquote\"]],[\"table\",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g;if(t+2>r)return!1;if(u=t+1,e.tShift[u]<e.blkIndent)return!1;if((i=e.bMarks[u]+e.tShift[u])>=e.eMarks[u])return!1;if(124!==(o=e.src.charCodeAt(i))&&45!==o&&58!==o)return!1;if(s=Q(e,t+1),!/^[-:| ]+$/.test(s))return!1;if((l=s.split(\"|\"))<=2)return!1;for(p=[],a=0;a<l.length;a++){if(!(h=l[a].trim())){if(0===a||a===l.length-1)continue;return!1}if(!/^:?-+:?$/.test(h))return!1;58===h.charCodeAt(h.length-1)?p.push(58===h.charCodeAt(0)?\"center\":\"right\"):58===h.charCodeAt(0)?p.push(\"left\"):p.push(\"\")}if(-1===(s=Q(e,t).trim()).indexOf(\"|\"))return!1;if(l=s.replace(/^\\||\\|$/g,\"\").split(\"|\"),p.length!==l.length)return!1;if(n)return!0;for(e.tokens.push({type:\"table_open\",lines:f=[t,0],level:e.level++}),e.tokens.push({type:\"thead_open\",lines:[t,t+1],level:e.level++}),e.tokens.push({type:\"tr_open\",lines:[t,t+1],level:e.level++}),a=0;a<l.length;a++)e.tokens.push({type:\"th_open\",align:p[a],lines:[t,t+1],level:e.level++}),e.tokens.push({type:\"inline\",content:l[a].trim(),lines:[t,t+1],level:e.level,children:[]}),e.tokens.push({type:\"th_close\",level:--e.level});for(e.tokens.push({type:\"tr_close\",level:--e.level}),e.tokens.push({type:\"thead_close\",level:--e.level}),e.tokens.push({type:\"tbody_open\",lines:g=[t+2,0],level:e.level++}),u=t+2;u<r&&!(e.tShift[u]<e.blkIndent)&&-1!==(s=Q(e,u).trim()).indexOf(\"|\");u++){for(l=s.replace(/^\\||\\|$/g,\"\").split(\"|\"),e.tokens.push({type:\"tr_open\",level:e.level++}),a=0;a<l.length;a++)e.tokens.push({type:\"td_open\",align:p[a],level:e.level++}),c=l[a].substring(124===l[a].charCodeAt(0)?1:0,124===l[a].charCodeAt(l[a].length-1)?l[a].length-1:l[a].length).trim(),e.tokens.push({type:\"inline\",content:c,level:e.level,children:[]}),e.tokens.push({type:\"td_close\",level:--e.level});e.tokens.push({type:\"tr_close\",level:--e.level})}return e.tokens.push({type:\"tbody_close\",level:--e.level}),e.tokens.push({type:\"table_close\",level:--e.level}),f[1]=g[1]=u,e.line=u,!0},[\"paragraph\"]],[\"deflist\",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g,d,m,b;if(n)return!(e.ddIndent<0)&&X(e,t)>=0;if(c=t+1,e.isEmpty(c)&&++c>r)return!1;if(e.tShift[c]<e.blkIndent)return!1;if((o=X(e,c))<0)return!1;if(e.level>=e.options.maxNesting)return!1;l=e.tokens.length,e.tokens.push({type:\"dl_open\",lines:u=[t,0],level:e.level++}),i=t,s=c;e:for(;;){for(b=!0,m=!1,e.tokens.push({type:\"dt_open\",lines:[i,i],level:e.level++}),e.tokens.push({type:\"inline\",content:e.getLines(i,i+1,e.blkIndent,!1).trim(),level:e.level+1,lines:[i,i],children:[]}),e.tokens.push({type:\"dt_close\",level:--e.level});;){if(e.tokens.push({type:\"dd_open\",lines:a=[c,0],level:e.level++}),d=e.tight,h=e.ddIndent,p=e.blkIndent,g=e.tShift[s],f=e.parentType,e.blkIndent=e.ddIndent=e.tShift[s]+2,e.tShift[s]=o-e.bMarks[s],e.tight=!0,e.parentType=\"deflist\",e.parser.tokenize(e,s,r,!0),e.tight&&!m||(b=!1),m=e.line-s>1&&e.isEmpty(e.line-1),e.tShift[s]=g,e.tight=d,e.parentType=f,e.blkIndent=p,e.ddIndent=h,e.tokens.push({type:\"dd_close\",level:--e.level}),a[1]=c=e.line,c>=r)break e;if(e.tShift[c]<e.blkIndent)break e;if((o=X(e,c))<0)break;s=c}if(c>=r)break;if(i=c,e.isEmpty(i))break;if(e.tShift[i]<e.blkIndent)break;if((s=i+1)>=r)break;if(e.isEmpty(s)&&s++,s>=r)break;if(e.tShift[s]<e.blkIndent)break;if((o=X(e,s))<0)break}return e.tokens.push({type:\"dl_close\",level:--e.level}),u[1]=c,e.line=c,b&&function(e,t){var r,n,o=e.level+2;for(r=t+2,n=e.tokens.length-2;r<n;r++)e.tokens[r].level===o&&\"paragraph_open\"===e.tokens[r].type&&(e.tokens[r+2].tight=!0,e.tokens[r].tight=!0,r+=2)}(e,l),!0},[\"paragraph\"]],[\"paragraph\",function(e,t){var r,n,o,s,i,a,u=t+1;if(u<(r=e.lineMax)&&!e.isEmpty(u))for(a=e.parser.ruler.getRules(\"paragraph\");u<r&&!e.isEmpty(u);u++)if(!(e.tShift[u]-e.blkIndent>3)){for(o=!1,s=0,i=a.length;s<i;s++)if(a[s](e,u,r,!0)){o=!0;break}if(o)break}return n=e.getLines(t,u,e.blkIndent,!1).trim(),e.line=u,n.length&&(e.tokens.push({type:\"paragraph_open\",tight:!1,lines:[t,e.line],level:e.level}),e.tokens.push({type:\"inline\",content:n,level:e.level+1,lines:[t,e.line],children:[]}),e.tokens.push({type:\"paragraph_close\",tight:!1,level:e.level})),!0}]];function te(){this.ruler=new C;for(var e=0;e<ee.length;e++)this.ruler.push(ee[e][0],ee[e][1],{alt:(ee[e][2]||[]).slice()})}te.prototype.tokenize=function(e,t,r){for(var n,o=this.ruler.getRules(\"\"),s=o.length,i=t,a=!1;i<r&&(e.line=i=e.skipEmptyLines(i),!(i>=r))&&!(e.tShift[i]<e.blkIndent);){for(n=0;n<s&&!o[n](e,i,r,!1);n++);if(e.tight=!a,e.isEmpty(e.line-1)&&(a=!0),(i=e.line)<r&&e.isEmpty(i)){if(a=!0,++i<r&&\"list\"===e.parentType&&e.isEmpty(i))break;e.line=i}}};var re=/[\\n\\t]/g,ne=/\\r[\\n\\u0085]|[\\u2424\\u2028\\u0085]/g,oe=/\\u00a0/g;function se(e){switch(e){case 10:case 92:case 96:case 42:case 95:case 94:case 91:case 93:case 33:case 38:case 60:case 62:case 123:case 125:case 36:case 37:case 64:case 126:case 43:case 61:case 58:return!0;default:return!1}}te.prototype.parse=function(e,t,r,n){var o,s=0,i=0;if(!e)return[];(e=(e=e.replace(oe,\" \")).replace(ne,\"\\n\")).indexOf(\"\\t\")>=0&&(e=e.replace(re,function(t,r){var n;return 10===e.charCodeAt(r)?(s=r+1,i=0,t):(n=\" \".slice((r-s-i)%4),i=r-s+1,n)})),o=new $(e,this,t,r,n),this.tokenize(o,o.line,o.lineMax)};for(var ie=[],ae=0;ae<256;ae++)ie.push(0);function ue(e){return e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122}function le(e,t){var r,n,o,s=t,i=!0,a=!0,u=e.posMax,l=e.src.charCodeAt(t);for(r=t>0?e.src.charCodeAt(t-1):-1;s<u&&e.src.charCodeAt(s)===l;)s++;return s>=u&&(i=!1),(o=s-t)>=4?i=a=!1:(32!==(n=s<u?e.src.charCodeAt(s):-1)&&10!==n||(i=!1),32!==r&&10!==r||(a=!1),95===l&&(ue(r)&&(i=!1),ue(n)&&(a=!1))),{can_open:i,can_close:a,delims:o}}\"\\\\!\\\"#$%&'()*+,./:;<=>?@[]^_`{|}~-\".split(\"\").forEach(function(e){ie[e.charCodeAt(0)]=1});var ce=/\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;var pe=/\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;var he=[\"coap\",\"doi\",\"javascript\",\"aaa\",\"aaas\",\"about\",\"acap\",\"cap\",\"cid\",\"crid\",\"data\",\"dav\",\"dict\",\"dns\",\"file\",\"ftp\",\"geo\",\"go\",\"gopher\",\"h323\",\"http\",\"https\",\"iax\",\"icap\",\"im\",\"imap\",\"info\",\"ipp\",\"iris\",\"iris.beep\",\"iris.xpc\",\"iris.xpcs\",\"iris.lwz\",\"ldap\",\"mailto\",\"mid\",\"msrp\",\"msrps\",\"mtqp\",\"mupdate\",\"news\",\"nfs\",\"ni\",\"nih\",\"nntp\",\"opaquelocktoken\",\"pop\",\"pres\",\"rtsp\",\"service\",\"session\",\"shttp\",\"sieve\",\"sip\",\"sips\",\"sms\",\"snmp\",\"soap.beep\",\"soap.beeps\",\"tag\",\"tel\",\"telnet\",\"tftp\",\"thismessage\",\"tn3270\",\"tip\",\"tv\",\"urn\",\"vemmi\",\"ws\",\"wss\",\"xcon\",\"xcon-userid\",\"xmlrpc.beep\",\"xmlrpc.beeps\",\"xmpp\",\"z39.50r\",\"z39.50s\",\"adiumxtra\",\"afp\",\"afs\",\"aim\",\"apt\",\"attachment\",\"aw\",\"beshare\",\"bitcoin\",\"bolo\",\"callto\",\"chrome\",\"chrome-extension\",\"com-eventbrite-attendee\",\"content\",\"cvs\",\"dlna-playsingle\",\"dlna-playcontainer\",\"dtn\",\"dvb\",\"ed2k\",\"facetime\",\"feed\",\"finger\",\"fish\",\"gg\",\"git\",\"gizmoproject\",\"gtalk\",\"hcp\",\"icon\",\"ipn\",\"irc\",\"irc6\",\"ircs\",\"itms\",\"jar\",\"jms\",\"keyparc\",\"lastfm\",\"ldaps\",\"magnet\",\"maps\",\"market\",\"message\",\"mms\",\"ms-help\",\"msnim\",\"mumble\",\"mvn\",\"notes\",\"oid\",\"palm\",\"paparazzi\",\"platform\",\"proxy\",\"psyc\",\"query\",\"res\",\"resource\",\"rmi\",\"rsync\",\"rtmp\",\"secondlife\",\"sftp\",\"sgn\",\"skype\",\"smb\",\"soldat\",\"spotify\",\"ssh\",\"steam\",\"svn\",\"teamspeak\",\"things\",\"udp\",\"unreal\",\"ut2004\",\"ventrilo\",\"view-source\",\"webcal\",\"wtai\",\"wyciwyg\",\"xfire\",\"xri\",\"ymsgr\"],fe=/^<([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,ge=/^<([a-zA-Z.\\-]{1,25}):([^<>\\x00-\\x20]*)>/;function de(e,t){return e=e.source,t=t||\"\",function r(n,o){return n?(o=o.source||o,e=e.replace(n,o),r):new RegExp(e,t)}}var me=de(/(?:unquoted|single_quoted|double_quoted)/)(\"unquoted\",/[^\"'=<>`\\x00-\\x20]+/)(\"single_quoted\",/'[^']*'/)(\"double_quoted\",/\"[^\"]*\"/)(),be=de(/(?:\\s+attr_name(?:\\s*=\\s*attr_value)?)/)(\"attr_name\",/[a-zA-Z_:][a-zA-Z0-9:._-]*/)(\"attr_value\",me)(),ve=de(/<[A-Za-z][A-Za-z0-9]*attribute*\\s*\\/?>/)(\"attribute\",be)(),ke=de(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/)(\"open_tag\",ve)(\"close_tag\",/<\\/[A-Za-z][A-Za-z0-9]*\\s*>/)(\"comment\",/<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->/)(\"processing\",/<[?].*?[?]>/)(\"declaration\",/<![A-Z]+\\s+[^>]*>/)(\"cdata\",/<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/)();var Ae=/^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i,ye=/^&([a-z][a-z0-9]{1,31});/i;var xe=[[\"text\",function(e,t){for(var r=e.pos;r<e.posMax&&!se(e.src.charCodeAt(r));)r++;return r!==e.pos&&(t||(e.pending+=e.src.slice(e.pos,r)),e.pos=r,!0)}],[\"newline\",function(e,t){var r,n,o=e.pos;if(10!==e.src.charCodeAt(o))return!1;if(r=e.pending.length-1,n=e.posMax,!t)if(r>=0&&32===e.pending.charCodeAt(r))if(r>=1&&32===e.pending.charCodeAt(r-1)){for(var s=r-2;s>=0;s--)if(32!==e.pending.charCodeAt(s)){e.pending=e.pending.substring(0,s+1);break}e.push({type:\"hardbreak\",level:e.level})}else e.pending=e.pending.slice(0,-1),e.push({type:\"softbreak\",level:e.level});else e.push({type:\"softbreak\",level:e.level});for(o++;o<n&&32===e.src.charCodeAt(o);)o++;return e.pos=o,!0}],[\"escape\",function(e,t){var r,n=e.pos,o=e.posMax;if(92!==e.src.charCodeAt(n))return!1;if(++n<o){if((r=e.src.charCodeAt(n))<256&&0!==ie[r])return t||(e.pending+=e.src[n]),e.pos+=2,!0;if(10===r){for(t||e.push({type:\"hardbreak\",level:e.level}),n++;n<o&&32===e.src.charCodeAt(n);)n++;return e.pos=n,!0}}return t||(e.pending+=\"\\\\\"),e.pos++,!0}],[\"backticks\",function(e,t){var r,n,o,s,i,a=e.pos;if(96!==e.src.charCodeAt(a))return!1;for(r=a,a++,n=e.posMax;a<n&&96===e.src.charCodeAt(a);)a++;for(o=e.src.slice(r,a),s=i=a;-1!==(s=e.src.indexOf(\"`\",i));){for(i=s+1;i<n&&96===e.src.charCodeAt(i);)i++;if(i-s===o.length)return t||e.push({type:\"code\",content:e.src.slice(a,s).replace(/[ \\n]+/g,\" \").trim(),block:!1,level:e.level}),e.pos=i,!0}return t||(e.pending+=o),e.pos+=o.length,!0}],[\"del\",function(e,t){var r,n,o,s,i,a=e.posMax,u=e.pos;if(126!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=a)return!1;if(126!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(s=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),126===s)return!1;if(126===i)return!1;if(32===i||10===i)return!1;for(n=u+2;n<a&&126===e.src.charCodeAt(n);)n++;if(n>u+3)return e.pos+=n-u,t||(e.pending+=e.src.slice(u,n)),!0;for(e.pos=u+2,o=1;e.pos+1<a;){if(126===e.src.charCodeAt(e.pos)&&126===e.src.charCodeAt(e.pos+1)&&(s=e.src.charCodeAt(e.pos-1),126!==(i=e.pos+2<a?e.src.charCodeAt(e.pos+2):-1)&&126!==s&&(32!==s&&10!==s?o--:32!==i&&10!==i&&o++,o<=0))){r=!0;break}e.parser.skipToken(e)}return r?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"del_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"del_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=a,!0):(e.pos=u,!1)}],[\"ins\",function(e,t){var r,n,o,s,i,a=e.posMax,u=e.pos;if(43!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=a)return!1;if(43!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(s=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),43===s)return!1;if(43===i)return!1;if(32===i||10===i)return!1;for(n=u+2;n<a&&43===e.src.charCodeAt(n);)n++;if(n!==u+2)return e.pos+=n-u,t||(e.pending+=e.src.slice(u,n)),!0;for(e.pos=u+2,o=1;e.pos+1<a;){if(43===e.src.charCodeAt(e.pos)&&43===e.src.charCodeAt(e.pos+1)&&(s=e.src.charCodeAt(e.pos-1),43!==(i=e.pos+2<a?e.src.charCodeAt(e.pos+2):-1)&&43!==s&&(32!==s&&10!==s?o--:32!==i&&10!==i&&o++,o<=0))){r=!0;break}e.parser.skipToken(e)}return r?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"ins_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"ins_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=a,!0):(e.pos=u,!1)}],[\"mark\",function(e,t){var r,n,o,s,i,a=e.posMax,u=e.pos;if(61!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=a)return!1;if(61!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(s=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),61===s)return!1;if(61===i)return!1;if(32===i||10===i)return!1;for(n=u+2;n<a&&61===e.src.charCodeAt(n);)n++;if(n!==u+2)return e.pos+=n-u,t||(e.pending+=e.src.slice(u,n)),!0;for(e.pos=u+2,o=1;e.pos+1<a;){if(61===e.src.charCodeAt(e.pos)&&61===e.src.charCodeAt(e.pos+1)&&(s=e.src.charCodeAt(e.pos-1),61!==(i=e.pos+2<a?e.src.charCodeAt(e.pos+2):-1)&&61!==s&&(32!==s&&10!==s?o--:32!==i&&10!==i&&o++,o<=0))){r=!0;break}e.parser.skipToken(e)}return r?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"mark_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"mark_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=a,!0):(e.pos=u,!1)}],[\"emphasis\",function(e,t){var r,n,o,s,i,a,u,l=e.posMax,c=e.pos,p=e.src.charCodeAt(c);if(95!==p&&42!==p)return!1;if(t)return!1;if(r=(u=le(e,c)).delims,!u.can_open)return e.pos+=r,t||(e.pending+=e.src.slice(c,e.pos)),!0;if(e.level>=e.options.maxNesting)return!1;for(e.pos=c+r,a=[r];e.pos<l;)if(e.src.charCodeAt(e.pos)!==p)e.parser.skipToken(e);else{if(n=(u=le(e,e.pos)).delims,u.can_close){for(s=a.pop(),i=n;s!==i;){if(i<s){a.push(s-i);break}if(i-=s,0===a.length)break;e.pos+=s,s=a.pop()}if(0===a.length){r=s,o=!0;break}e.pos+=n;continue}u.can_open&&a.push(n),e.pos+=n}return o?(e.posMax=e.pos,e.pos=c+r,t||(2!==r&&3!==r||e.push({type:\"strong_open\",level:e.level++}),1!==r&&3!==r||e.push({type:\"em_open\",level:e.level++}),e.parser.tokenize(e),1!==r&&3!==r||e.push({type:\"em_close\",level:--e.level}),2!==r&&3!==r||e.push({type:\"strong_close\",level:--e.level})),e.pos=e.posMax+r,e.posMax=l,!0):(e.pos=c,!1)}],[\"sub\",function(e,t){var r,n,o=e.posMax,s=e.pos;if(126!==e.src.charCodeAt(s))return!1;if(t)return!1;if(s+2>=o)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=s+1;e.pos<o;){if(126===e.src.charCodeAt(e.pos)){r=!0;break}e.parser.skipToken(e)}return r&&s+1!==e.pos?(n=e.src.slice(s+1,e.pos)).match(/(^|[^\\\\])(\\\\\\\\)*\\s/)?(e.pos=s,!1):(e.posMax=e.pos,e.pos=s+1,t||e.push({type:\"sub\",level:e.level,content:n.replace(ce,\"$1\")}),e.pos=e.posMax+1,e.posMax=o,!0):(e.pos=s,!1)}],[\"sup\",function(e,t){var r,n,o=e.posMax,s=e.pos;if(94!==e.src.charCodeAt(s))return!1;if(t)return!1;if(s+2>=o)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=s+1;e.pos<o;){if(94===e.src.charCodeAt(e.pos)){r=!0;break}e.parser.skipToken(e)}return r&&s+1!==e.pos?(n=e.src.slice(s+1,e.pos)).match(/(^|[^\\\\])(\\\\\\\\)*\\s/)?(e.pos=s,!1):(e.posMax=e.pos,e.pos=s+1,t||e.push({type:\"sup\",level:e.level,content:n.replace(pe,\"$1\")}),e.pos=e.posMax+1,e.posMax=o,!0):(e.pos=s,!1)}],[\"links\",function(e,t){var r,n,o,s,i,a,u,l,c=!1,p=e.pos,h=e.posMax,f=e.pos,g=e.src.charCodeAt(f);if(33===g&&(c=!0,g=e.src.charCodeAt(++f)),91!==g)return!1;if(e.level>=e.options.maxNesting)return!1;if(r=f+1,(n=D(e,f))<0)return!1;if((a=n+1)<h&&40===e.src.charCodeAt(a)){for(a++;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);if(a>=h)return!1;for(f=a,q(e,a)?(s=e.linkContent,a=e.pos):s=\"\",f=a;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);if(a<h&&f!==a&&F(e,a))for(i=e.linkContent,a=e.pos;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);else i=\"\";if(a>=h||41!==e.src.charCodeAt(a))return e.pos=p,!1;a++}else{if(e.linkLevel>0)return!1;for(;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);if(a<h&&91===e.src.charCodeAt(a)&&(f=a+1,(a=D(e,a))>=0?o=e.src.slice(f,a++):a=f-1),o||(void 0===o&&(a=n+1),o=e.src.slice(r,n)),!(u=e.env.references[M(o)]))return e.pos=p,!1;s=u.href,i=u.title}return t||(e.pos=r,e.posMax=n,c?e.push({type:\"image\",src:s,title:i,alt:e.src.substr(r,n-r),level:e.level}):(e.push({type:\"link_open\",href:s,title:i,level:e.level++}),e.linkLevel++,e.parser.tokenize(e),e.linkLevel--,e.push({type:\"link_close\",level:--e.level}))),e.pos=a,e.posMax=h,!0}],[\"footnote_inline\",function(e,t){var r,n,o,s,i=e.posMax,a=e.pos;return!(a+2>=i||94!==e.src.charCodeAt(a)||91!==e.src.charCodeAt(a+1)||e.level>=e.options.maxNesting||(r=a+2,(n=D(e,a+1))<0||(t||(e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.list||(e.env.footnotes.list=[]),o=e.env.footnotes.list.length,e.pos=r,e.posMax=n,e.push({type:\"footnote_ref\",id:o,level:e.level}),e.linkLevel++,s=e.tokens.length,e.parser.tokenize(e),e.env.footnotes.list[o]={tokens:e.tokens.splice(s)},e.linkLevel--),e.pos=n+1,e.posMax=i,0)))}],[\"footnote_ref\",function(e,t){var r,n,o,s,i=e.posMax,a=e.pos;if(a+3>i)return!1;if(!e.env.footnotes||!e.env.footnotes.refs)return!1;if(91!==e.src.charCodeAt(a))return!1;if(94!==e.src.charCodeAt(a+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(n=a+2;n<i;n++){if(32===e.src.charCodeAt(n))return!1;if(10===e.src.charCodeAt(n))return!1;if(93===e.src.charCodeAt(n))break}return!(n===a+2||n>=i||(n++,r=e.src.slice(a+2,n-1),void 0===e.env.footnotes.refs[\":\"+r]||(t||(e.env.footnotes.list||(e.env.footnotes.list=[]),e.env.footnotes.refs[\":\"+r]<0?(o=e.env.footnotes.list.length,e.env.footnotes.list[o]={label:r,count:0},e.env.footnotes.refs[\":\"+r]=o):o=e.env.footnotes.refs[\":\"+r],s=e.env.footnotes.list[o].count,e.env.footnotes.list[o].count++,e.push({type:\"footnote_ref\",id:o,subId:s,level:e.level})),e.pos=n,e.posMax=i,0)))}],[\"autolink\",function(e,t){var r,n,o,s,i,a=e.pos;return!(60!==e.src.charCodeAt(a)||(r=e.src.slice(a)).indexOf(\">\")<0||((n=r.match(ge))?he.indexOf(n[1].toLowerCase())<0||(i=B(s=n[0].slice(1,-1)),!e.parser.validateLink(s)||(t||(e.push({type:\"link_open\",href:i,level:e.level}),e.push({type:\"text\",content:s,level:e.level+1}),e.push({type:\"link_close\",level:e.level})),e.pos+=n[0].length,0)):!(o=r.match(fe))||(i=B(\"mailto:\"+(s=o[0].slice(1,-1))),!e.parser.validateLink(i)||(t||(e.push({type:\"link_open\",href:i,level:e.level}),e.push({type:\"text\",content:s,level:e.level+1}),e.push({type:\"link_close\",level:e.level})),e.pos+=o[0].length,0))))}],[\"htmltag\",function(e,t){var r,n,o,s=e.pos;return!(!e.options.html||(o=e.posMax,60!==e.src.charCodeAt(s)||s+2>=o||33!==(r=e.src.charCodeAt(s+1))&&63!==r&&47!==r&&!function(e){var t=32|e;return t>=97&&t<=122}(r)||!(n=e.src.slice(s).match(ke))||(t||e.push({type:\"htmltag\",content:e.src.slice(s,s+n[0].length),level:e.level}),e.pos+=n[0].length,0)))}],[\"entity\",function(e,t){var r,o,s=e.pos,i=e.posMax;if(38!==e.src.charCodeAt(s))return!1;if(s+1<i)if(35===e.src.charCodeAt(s+1)){if(o=e.src.slice(s).match(Ae))return t||(r=\"x\"===o[1][0].toLowerCase()?parseInt(o[1].slice(1),16):parseInt(o[1],10),e.pending+=l(r)?c(r):c(65533)),e.pos+=o[0].length,!0}else if(o=e.src.slice(s).match(ye)){var a=n(o[1]);if(o[1]!==a)return t||(e.pending+=a),e.pos+=o[0].length,!0}return t||(e.pending+=\"&\"),e.pos++,!0}]];function we(){this.ruler=new C;for(var e=0;e<xe.length;e++)this.ruler.push(xe[e][0],xe[e][1]);this.validateLink=Ce}function Ce(e){var t=e.trim().toLowerCase();return-1===(t=g(t)).indexOf(\":\")||-1===[\"vbscript\",\"javascript\",\"file\",\"data\"].indexOf(t.split(\":\")[0])}we.prototype.skipToken=function(e){var t,r,n=this.ruler.getRules(\"\"),o=n.length,s=e.pos;if((r=e.cacheGet(s))>0)e.pos=r;else{for(t=0;t<o;t++)if(n[t](e,!0))return void e.cacheSet(s,e.pos);e.pos++,e.cacheSet(s,e.pos)}},we.prototype.tokenize=function(e){for(var t,r,n=this.ruler.getRules(\"\"),o=n.length,s=e.posMax;e.pos<s;){for(r=0;r<o&&!(t=n[r](e,!1));r++);if(t){if(e.pos>=s)break}else e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()},we.prototype.parse=function(e,t,r,n){var o=new E(e,this,t,r,n);this.tokenize(o)};var Ee={default:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{rules:[\"block\",\"inline\",\"references\",\"replacements\",\"smartquotes\",\"references\",\"abbr2\",\"footnote_tail\"]},block:{rules:[\"blockquote\",\"code\",\"fences\",\"footnote\",\"heading\",\"hr\",\"htmlblock\",\"lheading\",\"list\",\"paragraph\",\"table\"]},inline:{rules:[\"autolink\",\"backticks\",\"del\",\"emphasis\",\"entity\",\"escape\",\"footnote_ref\",\"htmltag\",\"links\",\"newline\",\"text\"]}}},full:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{},block:{},inline:{}}},commonmark:{options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{rules:[\"block\",\"inline\",\"references\",\"abbr2\"]},block:{rules:[\"blockquote\",\"code\",\"fences\",\"heading\",\"hr\",\"htmlblock\",\"lheading\",\"list\",\"paragraph\"]},inline:{rules:[\"autolink\",\"backticks\",\"emphasis\",\"entity\",\"escape\",\"htmltag\",\"links\",\"newline\",\"text\"]}}}};function De(e,t,r){this.src=t,this.env=r,this.options=e.options,this.tokens=[],this.inlineMode=!1,this.inline=e.inline,this.block=e.block,this.renderer=e.renderer,this.typographer=e.typographer}function _e(e,t){\"string\"!=typeof e&&(t=e,e=\"default\"),t&&null!=t.linkify&&console.warn(\"linkify option is removed. Use linkify plugin instead:\\n\\nimport Remarkable from 'remarkable';\\nimport linkify from 'remarkable/linkify';\\nnew Remarkable().use(linkify)\\n\"),this.inline=new we,this.block=new te,this.core=new G,this.renderer=new w,this.ruler=new C,this.options={},this.configure(Ee[e]),this.set(t||{})}function Be(e,t){if(Array.prototype.indexOf)return e.indexOf(t);for(var r=0,n=e.length;r<n;r++)if(e[r]===t)return r;return-1}function qe(e,t){for(var r=e.length-1;r>=0;r--)!0===t(e[r])&&e.splice(r,1)}function Fe(e){throw new Error(\"Unhandled case for value: '\"+e+\"'\")}_e.prototype.set=function(e){i(this.options,e)},_e.prototype.configure=function(e){var t=this;if(!e)throw new Error(\"Wrong `remarkable` preset, check name/content\");e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach(function(r){e.components[r].rules&&t[r].ruler.enable(e.components[r].rules,!0)})},_e.prototype.use=function(e,t){return e(this,t),this},_e.prototype.parse=function(e,t){var r=new De(this,e,t);return this.core.process(r),r.tokens},_e.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)},_e.prototype.parseInline=function(e,t){var r=new De(this,e,t);return r.inlineMode=!0,this.core.process(r),r.tokens},_e.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)};var Me=function(){function e(e){void 0===e&&(e={}),this.tagName=\"\",this.attrs={},this.innerHTML=\"\",this.whitespaceRegex=/\\s+/,this.tagName=e.tagName||\"\",this.attrs=e.attrs||{},this.innerHTML=e.innerHtml||e.innerHTML||\"\"}return e.prototype.setTagName=function(e){return this.tagName=e,this},e.prototype.getTagName=function(){return this.tagName||\"\"},e.prototype.setAttr=function(e,t){return this.getAttrs()[e]=t,this},e.prototype.getAttr=function(e){return this.getAttrs()[e]},e.prototype.setAttrs=function(e){return Object.assign(this.getAttrs(),e),this},e.prototype.getAttrs=function(){return this.attrs||(this.attrs={})},e.prototype.setClass=function(e){return this.setAttr(\"class\",e)},e.prototype.addClass=function(e){for(var t,r=this.getClass(),n=this.whitespaceRegex,o=r?r.split(n):[],s=e.split(n);t=s.shift();)-1===Be(o,t)&&o.push(t);return this.getAttrs().class=o.join(\" \"),this},e.prototype.removeClass=function(e){for(var t,r=this.getClass(),n=this.whitespaceRegex,o=r?r.split(n):[],s=e.split(n);o.length&&(t=s.shift());){var i=Be(o,t);-1!==i&&o.splice(i,1)}return this.getAttrs().class=o.join(\" \"),this},e.prototype.getClass=function(){return this.getAttrs().class||\"\"},e.prototype.hasClass=function(e){return-1!==(\" \"+this.getClass()+\" \").indexOf(\" \"+e+\" \")},e.prototype.setInnerHTML=function(e){return this.innerHTML=e,this},e.prototype.setInnerHtml=function(e){return this.setInnerHTML(e)},e.prototype.getInnerHTML=function(){return this.innerHTML||\"\"},e.prototype.getInnerHtml=function(){return this.getInnerHTML()},e.prototype.toAnchorString=function(){var e=this.getTagName(),t=this.buildAttrsStr();return[\"<\",e,t=t?\" \"+t:\"\",\">\",this.getInnerHtml(),\"</\",e,\">\"].join(\"\")},e.prototype.buildAttrsStr=function(){if(!this.attrs)return\"\";var e=this.getAttrs(),t=[];for(var r in e)e.hasOwnProperty(r)&&t.push(r+'=\"'+e[r]+'\"');return t.join(\" \")},e}();var Se=function(){function e(e){void 0===e&&(e={}),this.newWindow=!1,this.truncate={},this.className=\"\",this.newWindow=e.newWindow||!1,this.truncate=e.truncate||{},this.className=e.className||\"\"}return e.prototype.build=function(e){return new Me({tagName:\"a\",attrs:this.createAttrs(e),innerHtml:this.processAnchorText(e.getAnchorText())})},e.prototype.createAttrs=function(e){var t={href:e.getAnchorHref()},r=this.createCssClass(e);return r&&(t.class=r),this.newWindow&&(t.target=\"_blank\",t.rel=\"noopener noreferrer\"),this.truncate&&this.truncate.length&&this.truncate.length<e.getAnchorText().length&&(t.title=e.getAnchorHref()),t},e.prototype.createCssClass=function(e){var t=this.className;if(t){for(var r=[t],n=e.getCssClassSuffixes(),o=0,s=n.length;o<s;o++)r.push(t+\"-\"+n[o]);return r.join(\" \")}return\"\"},e.prototype.processAnchorText=function(e){return e=this.doTruncate(e)},e.prototype.doTruncate=function(e){var t=this.truncate;if(!t||!t.length)return e;var r=t.length,n=t.location;return\"smart\"===n?function(e,t,r){var n,o;null==r?(r=\"…\",o=3,n=8):(o=r.length,n=r.length);var s=function(e){var t=\"\";return e.scheme&&e.host&&(t+=e.scheme+\"://\"),e.host&&(t+=e.host),e.path&&(t+=\"/\"+e.path),e.query&&(t+=\"?\"+e.query),e.fragment&&(t+=\"#\"+e.fragment),t},i=function(e,t){var n=t/2,o=Math.ceil(n),s=-1*Math.floor(n),i=\"\";return s<0&&(i=e.substr(s)),e.substr(0,o)+r+i};if(e.length<=t)return e;var a=t-o,u=function(e){var t={},r=e,n=r.match(/^([a-z]+):\\/\\//i);return n&&(t.scheme=n[1],r=r.substr(n[0].length)),(n=r.match(/^(.*?)(?=(\\?|#|\\/|$))/i))&&(t.host=n[1],r=r.substr(n[0].length)),(n=r.match(/^\\/(.*?)(?=(\\?|#|$))/i))&&(t.path=n[1],r=r.substr(n[0].length)),(n=r.match(/^\\?(.*?)(?=(#|$))/i))&&(t.query=n[1],r=r.substr(n[0].length)),(n=r.match(/^#(.*?)$/i))&&(t.fragment=n[1]),t}(e);if(u.query){var l=u.query.match(/^(.*?)(?=(\\?|\\#))(.*?)$/i);l&&(u.query=u.query.substr(0,l[1].length),e=s(u))}if(e.length<=t)return e;if(u.host&&(u.host=u.host.replace(/^www\\./,\"\"),e=s(u)),e.length<=t)return e;var c=\"\";if(u.host&&(c+=u.host),c.length>=a)return u.host.length==t?(u.host.substr(0,t-o)+r).substr(0,a+n):i(c,a).substr(0,a+n);var p=\"\";if(u.path&&(p+=\"/\"+u.path),u.query&&(p+=\"?\"+u.query),p){if((c+p).length>=a)return(c+p).length==t?(c+p).substr(0,t):(c+i(p,a-c.length)).substr(0,a+n);c+=p}if(u.fragment){var h=\"#\"+u.fragment;if((c+h).length>=a)return(c+h).length==t?(c+h).substr(0,t):(c+i(h,a-c.length)).substr(0,a+n);c+=h}if(u.scheme&&u.host){var f=u.scheme+\"://\";if((c+f).length<a)return(f+c).substr(0,t)}if(c.length<=t)return c;var g=\"\";return a>0&&(g=c.substr(-1*Math.floor(a/2))),(c.substr(0,Math.ceil(a/2))+r+g).substr(0,a+n)}(e,r):\"middle\"===n?function(e,t,r){if(e.length<=t)return e;var n,o;null==r?(r=\"…\",n=8,o=3):(n=r.length,o=r.length);var s=t-o,i=\"\";return s>0&&(i=e.substr(-1*Math.floor(s/2))),(e.substr(0,Math.ceil(s/2))+r+i).substr(0,s+n)}(e,r):function(e,t,r){return function(e,t,r){var n;return e.length>t&&(null==r?(r=\"…\",n=3):n=r.length,e=e.substring(0,t-n)+r),e}(e,t,r)}(e,r)},e}(),Te=function(){function e(e){this.__jsduckDummyDocProp=null,this.matchedText=\"\",this.offset=0,this.tagBuilder=e.tagBuilder,this.matchedText=e.matchedText,this.offset=e.offset}return e.prototype.getMatchedText=function(){return this.matchedText},e.prototype.setOffset=function(e){this.offset=e},e.prototype.getOffset=function(){return this.offset},e.prototype.getCssClassSuffixes=function(){return[this.getType()]},e.prototype.buildTag=function(){return this.tagBuilder.build(this)},e}(),Le=function(e,t){return(Le=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)};function Re(e,t){function r(){this.constructor=e}Le(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var Ne=function(){return(Ne=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)},ze=function(e){function t(t){var r=e.call(this,t)||this;return r.email=\"\",r.email=t.email,r}return Re(t,e),t.prototype.getType=function(){return\"email\"},t.prototype.getEmail=function(){return this.email},t.prototype.getAnchorHref=function(){return\"mailto:\"+this.email},t.prototype.getAnchorText=function(){return this.email},t}(Te),Pe=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName=\"\",r.hashtag=\"\",r.serviceName=t.serviceName,r.hashtag=t.hashtag,r}return Re(t,e),t.prototype.getType=function(){return\"hashtag\"},t.prototype.getServiceName=function(){return this.serviceName},t.prototype.getHashtag=function(){return this.hashtag},t.prototype.getAnchorHref=function(){var e=this.serviceName,t=this.hashtag;switch(e){case\"twitter\":return\"https://twitter.com/hashtag/\"+t;case\"facebook\":return\"https://www.facebook.com/hashtag/\"+t;case\"instagram\":return\"https://instagram.com/explore/tags/\"+t;default:throw new Error(\"Unknown service name to point hashtag to: \"+e)}},t.prototype.getAnchorText=function(){return\"#\"+this.hashtag},t}(Te),je=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName=\"twitter\",r.mention=\"\",r.mention=t.mention,r.serviceName=t.serviceName,r}return Re(t,e),t.prototype.getType=function(){return\"mention\"},t.prototype.getMention=function(){return this.mention},t.prototype.getServiceName=function(){return this.serviceName},t.prototype.getAnchorHref=function(){switch(this.serviceName){case\"twitter\":return\"https://twitter.com/\"+this.mention;case\"instagram\":return\"https://instagram.com/\"+this.mention;case\"soundcloud\":return\"https://soundcloud.com/\"+this.mention;default:throw new Error(\"Unknown service name to point mention to: \"+this.serviceName)}},t.prototype.getAnchorText=function(){return\"@\"+this.mention},t.prototype.getCssClassSuffixes=function(){var t=e.prototype.getCssClassSuffixes.call(this),r=this.getServiceName();return r&&t.push(r),t},t}(Te),Ie=function(e){function t(t){var r=e.call(this,t)||this;return r.number=\"\",r.plusSign=!1,r.number=t.number,r.plusSign=t.plusSign,r}return Re(t,e),t.prototype.getType=function(){return\"phone\"},t.prototype.getPhoneNumber=function(){return this.number},t.prototype.getNumber=function(){return this.getPhoneNumber()},t.prototype.getAnchorHref=function(){return\"tel:\"+(this.plusSign?\"+\":\"\")+this.number},t.prototype.getAnchorText=function(){return this.matchedText},t}(Te),Oe=function(e){function t(t){var r=e.call(this,t)||this;return r.url=\"\",r.urlMatchType=\"scheme\",r.protocolUrlMatch=!1,r.protocolRelativeMatch=!1,r.stripPrefix={scheme:!0,www:!0},r.stripTrailingSlash=!0,r.decodePercentEncoding=!0,r.schemePrefixRegex=/^(https?:\\/\\/)?/i,r.wwwPrefixRegex=/^(https?:\\/\\/)?(www\\.)?/i,r.protocolRelativeRegex=/^\\/\\//,r.protocolPrepended=!1,r.urlMatchType=t.urlMatchType,r.url=t.url,r.protocolUrlMatch=t.protocolUrlMatch,r.protocolRelativeMatch=t.protocolRelativeMatch,r.stripPrefix=t.stripPrefix,r.stripTrailingSlash=t.stripTrailingSlash,r.decodePercentEncoding=t.decodePercentEncoding,r}return Re(t,e),t.prototype.getType=function(){return\"url\"},t.prototype.getUrlMatchType=function(){return this.urlMatchType},t.prototype.getUrl=function(){var e=this.url;return this.protocolRelativeMatch||this.protocolUrlMatch||this.protocolPrepended||(e=this.url=\"http://\"+e,this.protocolPrepended=!0),e},t.prototype.getAnchorHref=function(){return this.getUrl().replace(/&/g,\"&\")},t.prototype.getAnchorText=function(){var e=this.getMatchedText();return this.protocolRelativeMatch&&(e=this.stripProtocolRelativePrefix(e)),this.stripPrefix.scheme&&(e=this.stripSchemePrefix(e)),this.stripPrefix.www&&(e=this.stripWwwPrefix(e)),this.stripTrailingSlash&&(e=this.removeTrailingSlash(e)),this.decodePercentEncoding&&(e=this.removePercentEncoding(e)),e},t.prototype.stripSchemePrefix=function(e){return e.replace(this.schemePrefixRegex,\"\")},t.prototype.stripWwwPrefix=function(e){return e.replace(this.wwwPrefixRegex,\"$1\")},t.prototype.stripProtocolRelativePrefix=function(e){return e.replace(this.protocolRelativeRegex,\"\")},t.prototype.removeTrailingSlash=function(e){return\"/\"===e.charAt(e.length-1)&&(e=e.slice(0,-1)),e},t.prototype.removePercentEncoding=function(e){var t=e.replace(/%22/gi,\""\").replace(/%26/gi,\"&\").replace(/%27/gi,\"'\").replace(/%3C/gi,\"<\").replace(/%3E/gi,\">\");try{return decodeURIComponent(t)}catch(e){return t}},t}(Te),Ue=function(e){this.__jsduckDummyDocProp=null,this.tagBuilder=e.tagBuilder},He=/[A-Za-z]/,Ve=/[0-9]/,Ge=/\\s/,$e=/['\"]/,Ze=/[\\x00-\\x1F\\x7F]/,We=/A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC/.source,Je=We+/\\u00a9\\u00ae\\u2000-\\u3300\\ud83c\\ud000-\\udfff\\ud83d\\ud000-\\udfff\\ud83e\\ud000-\\udfff/.source+/\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F/.source,Ye=/0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19/.source,Ke=Je+Ye,Qe=Je+Ye,Xe=\"(?:[\"+Ye+\"]{1,3}\\\\.){3}[\"+Ye+\"]{1,3}\",et=\"[\"+Qe+\"](?:[\"+Qe+\"\\\\-]{0,61}[\"+Qe+\"])?\",tt=function(e){return\"(?=(\"+et+\"))\\\\\"+e},rt=function(e){return\"(?:\"+tt(e)+\"(?:\\\\.\"+tt(e+1)+\"){0,126}|\"+Xe+\")\"},nt=new RegExp(\"[\"+Qe+\"]\"),ot=/(?:xn--vermgensberatung-pwb|xn--vermgensberater-ctb|xn--clchc0ea0b2g2a9gcd|xn--w4r85el8fhu5dnra|northwesternmutual|travelersinsurance|vermögensberatung|xn--3oq18vl8pn36a|xn--5su34j936bgsg|xn--bck1b9a5dre4c|xn--mgbai9azgqp6j|xn--mgberp4a5d4ar|xn--xkc2dl3a5ee0h|vermögensberater|xn--fzys8d69uvgm|xn--mgba7c0bbn0a|xn--xkc2al3hye2a|americanexpress|kerryproperties|sandvikcoromant|xn--i1b6b1a6a2e|xn--kcrx77d1x4a|xn--lgbbat1ad8j|xn--mgba3a4f16a|xn--mgbaakc7dvf|xn--mgbc0a9azcg|xn--nqv7fs00ema|afamilycompany|americanfamily|bananarepublic|cancerresearch|cookingchannel|kerrylogistics|weatherchannel|xn--54b7fta0cc|xn--6qq986b3xl|xn--80aqecdr1a|xn--b4w605ferd|xn--fiq228c5hs|xn--h2breg3eve|xn--jlq61u9w7b|xn--mgba3a3ejt|xn--mgbaam7a8h|xn--mgbayh7gpa|xn--mgbb9fbpob|xn--mgbbh1a71e|xn--mgbca7dzdo|xn--mgbi4ecexp|xn--mgbx4cd0ab|xn--rvc1e0am3e|international|lifeinsurance|spreadbetting|travelchannel|wolterskluwer|xn--eckvdtc9d|xn--fpcrj9c3d|xn--fzc2c9e2c|xn--h2brj9c8c|xn--tiq49xqyj|xn--yfro4i67o|xn--ygbi2ammx|construction|lplfinancial|scholarships|versicherung|xn--3e0b707e|xn--45br5cyl|xn--80adxhks|xn--80asehdb|xn--8y0a063a|xn--gckr3f0f|xn--mgb9awbf|xn--mgbab2bd|xn--mgbgu82a|xn--mgbpl2fh|xn--mgbt3dhd|xn--mk1bu44c|xn--ngbc5azd|xn--ngbe9e0a|xn--ogbpf8fl|xn--qcka1pmc|accountants|barclaycard|blackfriday|blockbuster|bridgestone|calvinklein|contractors|creditunion|engineering|enterprises|foodnetwork|investments|kerryhotels|lamborghini|motorcycles|olayangroup|photography|playstation|productions|progressive|redumbrella|rightathome|williamhill|xn--11b4c3d|xn--1ck2e1b|xn--1qqw23a|xn--2scrj9c|xn--3bst00m|xn--3ds443g|xn--3hcrj9c|xn--42c2d9a|xn--45brj9c|xn--55qw42g|xn--6frz82g|xn--80ao21a|xn--9krt00a|xn--cck2b3b|xn--czr694b|xn--d1acj3b|xn--efvy88h|xn--estv75g|xn--fct429k|xn--fjq720a|xn--flw351e|xn--g2xx48c|xn--gecrj9c|xn--gk3at1e|xn--h2brj9c|xn--hxt814e|xn--imr513n|xn--j6w193g|xn--jvr189m|xn--kprw13d|xn--kpry57d|xn--kpu716f|xn--mgbbh1a|xn--mgbtx2b|xn--mix891f|xn--nyqy26a|xn--otu796d|xn--pbt977c|xn--pgbs0dh|xn--q9jyb4c|xn--rhqv96g|xn--rovu88b|xn--s9brj9c|xn--ses554g|xn--t60b56a|xn--vuq861b|xn--w4rs40l|xn--xhq521b|xn--zfr164b|சிங்கப்பூர்|accountant|apartments|associates|basketball|bnpparibas|boehringer|capitalone|consulting|creditcard|cuisinella|eurovision|extraspace|foundation|healthcare|immobilien|industries|management|mitsubishi|nationwide|newholland|nextdirect|onyourside|properties|protection|prudential|realestate|republican|restaurant|schaeffler|swiftcover|tatamotors|technology|telefonica|university|vistaprint|vlaanderen|volkswagen|xn--30rr7y|xn--3pxu8k|xn--45q11c|xn--4gbrim|xn--55qx5d|xn--5tzm5g|xn--80aswg|xn--90a3ac|xn--9dbq2a|xn--9et52u|xn--c2br7g|xn--cg4bki|xn--czrs0t|xn--czru2d|xn--fiq64b|xn--fiqs8s|xn--fiqz9s|xn--io0a7i|xn--kput3i|xn--mxtq1m|xn--o3cw4h|xn--pssy2u|xn--unup4y|xn--wgbh1c|xn--wgbl6a|xn--y9a3aq|accenture|alfaromeo|allfinanz|amsterdam|analytics|aquarelle|barcelona|bloomberg|christmas|community|directory|education|equipment|fairwinds|financial|firestone|fresenius|frontdoor|fujixerox|furniture|goldpoint|hisamitsu|homedepot|homegoods|homesense|honeywell|institute|insurance|kuokgroup|ladbrokes|lancaster|landrover|lifestyle|marketing|marshalls|melbourne|microsoft|panasonic|passagens|pramerica|richardli|scjohnson|shangrila|solutions|statebank|statefarm|stockholm|travelers|vacations|xn--90ais|xn--c1avg|xn--d1alf|xn--e1a4c|xn--fhbei|xn--j1aef|xn--j1amh|xn--l1acc|xn--ngbrx|xn--nqv7f|xn--p1acf|xn--tckwe|xn--vhquv|yodobashi|abudhabi|airforce|allstate|attorney|barclays|barefoot|bargains|baseball|boutique|bradesco|broadway|brussels|budapest|builders|business|capetown|catering|catholic|chrysler|cipriani|cityeats|cleaning|clinique|clothing|commbank|computer|delivery|deloitte|democrat|diamonds|discount|discover|download|engineer|ericsson|esurance|etisalat|everbank|exchange|feedback|fidelity|firmdale|football|frontier|goodyear|grainger|graphics|guardian|hdfcbank|helsinki|holdings|hospital|infiniti|ipiranga|istanbul|jpmorgan|lighting|lundbeck|marriott|maserati|mckinsey|memorial|merckmsd|mortgage|movistar|observer|partners|pharmacy|pictures|plumbing|property|redstone|reliance|saarland|samsclub|security|services|shopping|showtime|softbank|software|stcgroup|supplies|symantec|training|uconnect|vanguard|ventures|verisign|woodside|xn--90ae|xn--node|xn--p1ai|xn--qxam|yokohama|السعودية|abogado|academy|agakhan|alibaba|android|athleta|auction|audible|auspost|avianca|banamex|bauhaus|bentley|bestbuy|booking|brother|bugatti|capital|caravan|careers|cartier|channel|charity|chintai|citadel|clubmed|college|cologne|comcast|company|compare|contact|cooking|corsica|country|coupons|courses|cricket|cruises|dentist|digital|domains|exposed|express|farmers|fashion|ferrari|ferrero|finance|fishing|fitness|flights|florist|flowers|forsale|frogans|fujitsu|gallery|genting|godaddy|grocery|guitars|hamburg|hangout|hitachi|holiday|hosting|hoteles|hotmail|hyundai|iselect|ismaili|jewelry|juniper|kitchen|komatsu|lacaixa|lancome|lanxess|lasalle|latrobe|leclerc|liaison|limited|lincoln|markets|metlife|monster|netbank|netflix|network|neustar|okinawa|oldnavy|organic|origins|philips|pioneer|politie|realtor|recipes|rentals|reviews|rexroth|samsung|sandvik|schmidt|schwarz|science|shiksha|shriram|singles|staples|starhub|storage|support|surgery|systems|temasek|theater|theatre|tickets|tiffany|toshiba|trading|walmart|wanggou|watches|weather|website|wedding|whoswho|windows|winners|xfinity|yamaxun|youtube|zuerich|католик|اتصالات|الجزائر|العليان|پاکستان|كاثوليك|موبايلي|இந்தியா|abarth|abbott|abbvie|active|africa|agency|airbus|airtel|alipay|alsace|alstom|anquan|aramco|author|bayern|beauty|berlin|bharti|blanco|bostik|boston|broker|camera|career|caseih|casino|center|chanel|chrome|church|circle|claims|clinic|coffee|comsec|condos|coupon|credit|cruise|dating|datsun|dealer|degree|dental|design|direct|doctor|dunlop|dupont|durban|emerck|energy|estate|events|expert|family|flickr|futbol|gallup|garden|george|giving|global|google|gratis|health|hermes|hiphop|hockey|hotels|hughes|imamat|insure|intuit|jaguar|joburg|juegos|kaufen|kinder|kindle|kosher|lancia|latino|lawyer|lefrak|living|locker|london|luxury|madrid|maison|makeup|market|mattel|mobile|mobily|monash|mormon|moscow|museum|mutual|nagoya|natura|nissan|nissay|norton|nowruz|office|olayan|online|oracle|orange|otsuka|pfizer|photos|physio|piaget|pictet|quebec|racing|realty|reisen|repair|report|review|rocher|rogers|ryukyu|safety|sakura|sanofi|school|schule|search|secure|select|shouji|soccer|social|stream|studio|supply|suzuki|swatch|sydney|taipei|taobao|target|tattoo|tennis|tienda|tjmaxx|tkmaxx|toyota|travel|unicom|viajes|viking|villas|virgin|vision|voting|voyage|vuelos|walter|warman|webcam|xihuan|yachts|yandex|zappos|москва|онлайн|ابوظبي|ارامكو|الاردن|المغرب|امارات|فلسطين|مليسيا|भारतम्|இலங்கை|ファッション|actor|adult|aetna|amfam|amica|apple|archi|audio|autos|azure|baidu|beats|bible|bingo|black|boats|bosch|build|canon|cards|chase|cheap|cisco|citic|click|cloud|coach|codes|crown|cymru|dabur|dance|deals|delta|dodge|drive|dubai|earth|edeka|email|epost|epson|faith|fedex|final|forex|forum|gallo|games|gifts|gives|glade|glass|globo|gmail|green|gripe|group|gucci|guide|homes|honda|horse|house|hyatt|ikano|intel|irish|iveco|jetzt|koeln|kyoto|lamer|lease|legal|lexus|lilly|linde|lipsy|lixil|loans|locus|lotte|lotto|lupin|macys|mango|media|miami|money|mopar|movie|nadex|nexus|nikon|ninja|nokia|nowtv|omega|osaka|paris|parts|party|phone|photo|pizza|place|poker|praxi|press|prime|promo|quest|radio|rehab|reise|ricoh|rocks|rodeo|rugby|salon|sener|seven|sharp|shell|shoes|skype|sling|smart|smile|solar|space|sport|stada|store|study|style|sucks|swiss|tatar|tires|tirol|tmall|today|tokyo|tools|toray|total|tours|trade|trust|tunes|tushu|ubank|vegas|video|vodka|volvo|wales|watch|weber|weibo|works|world|xerox|yahoo|zippo|ایران|بازار|بھارت|سودان|سورية|همراه|भारोत|संगठन|বাংলা|భారత్|ഭാരതം|嘉里大酒店|aarp|able|adac|aero|aigo|akdn|ally|amex|arab|army|arpa|arte|asda|asia|audi|auto|baby|band|bank|bbva|beer|best|bike|bing|blog|blue|bofa|bond|book|buzz|cafe|call|camp|care|cars|casa|case|cash|cbre|cern|chat|citi|city|club|cool|coop|cyou|data|date|dclk|deal|dell|desi|diet|dish|docs|doha|duck|duns|dvag|erni|fage|fail|fans|farm|fast|fiat|fido|film|fire|fish|flir|food|ford|free|fund|game|gbiz|gent|ggee|gift|gmbh|gold|golf|goog|guge|guru|hair|haus|hdfc|help|here|hgtv|host|hsbc|icbc|ieee|imdb|immo|info|itau|java|jeep|jobs|jprs|kddi|kiwi|kpmg|kred|land|lego|lgbt|lidl|life|like|limo|link|live|loan|loft|love|ltda|luxe|maif|meet|meme|menu|mini|mint|mobi|moda|moto|name|navy|news|next|nico|nike|ollo|open|page|pars|pccw|pics|ping|pink|play|plus|pohl|porn|post|prod|prof|qpon|raid|read|reit|rent|rest|rich|rmit|room|rsvp|ruhr|safe|sale|sarl|save|saxo|scor|scot|seat|seek|sexy|shaw|shia|shop|show|silk|sina|site|skin|sncf|sohu|song|sony|spot|star|surf|talk|taxi|team|tech|teva|tiaa|tips|town|toys|tube|vana|visa|viva|vivo|vote|voto|wang|weir|wien|wiki|wine|work|xbox|yoga|zara|zero|zone|дети|сайт|بارت|بيتك|ڀارت|تونس|شبكة|عراق|عمان|موقع|भारत|ভারত|ভাৰত|ਭਾਰਤ|ભારત|ଭାରତ|ಭಾರತ|ලංකා|グーグル|クラウド|ポイント|大众汽车|组织机构|電訊盈科|香格里拉|aaa|abb|abc|aco|ads|aeg|afl|aig|anz|aol|app|art|aws|axa|bar|bbc|bbt|bcg|bcn|bet|bid|bio|biz|bms|bmw|bnl|bom|boo|bot|box|buy|bzh|cab|cal|cam|car|cat|cba|cbn|cbs|ceb|ceo|cfa|cfd|com|crs|csc|dad|day|dds|dev|dhl|diy|dnp|dog|dot|dtv|dvr|eat|eco|edu|esq|eus|fan|fit|fly|foo|fox|frl|ftr|fun|fyi|gal|gap|gdn|gea|gle|gmo|gmx|goo|gop|got|gov|hbo|hiv|hkt|hot|how|ibm|ice|icu|ifm|inc|ing|ink|int|ist|itv|jcb|jcp|jio|jll|jmp|jnj|jot|joy|kfh|kia|kim|kpn|krd|lat|law|lds|llc|lol|lpl|ltd|man|map|mba|med|men|mil|mit|mlb|mls|mma|moe|moi|mom|mov|msd|mtn|mtr|nab|nba|nec|net|new|nfl|ngo|nhk|now|nra|nrw|ntt|nyc|obi|off|one|ong|onl|ooo|org|ott|ovh|pay|pet|phd|pid|pin|pnc|pro|pru|pub|pwc|qvc|red|ren|ril|rio|rip|run|rwe|sap|sas|sbi|sbs|sca|scb|ses|sew|sex|sfr|ski|sky|soy|srl|srt|stc|tab|tax|tci|tdk|tel|thd|tjx|top|trv|tui|tvs|ubs|uno|uol|ups|vet|vig|vin|vip|wed|win|wme|wow|wtc|wtf|xin|xxx|xyz|you|yun|zip|бел|ком|қаз|мкд|мон|орг|рус|срб|укр|հայ|קום|عرب|قطر|كوم|مصر|कॉम|नेट|คอม|ไทย|ストア|セール|みんな|中文网|天主教|我爱你|新加坡|淡马锡|诺基亚|飞利浦|ac|ad|ae|af|ag|ai|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw|ελ|бг|ею|рф|გე|닷넷|닷컴|삼성|한국|コム|世界|中信|中国|中國|企业|佛山|信息|健康|八卦|公司|公益|台湾|台灣|商城|商店|商标|嘉里|在线|大拿|娱乐|家電|工行|广东|微博|慈善|手机|手表|招聘|政务|政府|新闻|时尚|書籍|机构|游戏|澳門|点看|珠宝|移动|网址|网店|网站|网络|联通|谷歌|购物|通販|集团|食品|餐厅|香港)/,st=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.localPartCharRegex=new RegExp(\"[\"+Qe+\"!#$%&'*+/=?^_`{|}~-]\"),t.strictTldRegex=new RegExp(\"^\"+ot.source+\"$\"),t}return Re(t,e),t.prototype.parseMatches=function(e){for(var t=this.tagBuilder,r=this.localPartCharRegex,n=this.strictTldRegex,o=[],s=e.length,i=new it,a={m:\"a\",a:\"i\",i:\"l\",l:\"t\",t:\"o\",o:\":\"},u=0,l=0,c=i;u<s;){var p=e.charAt(u);switch(l){case 0:h(p);break;case 1:f(e.charAt(u-1),p);break;case 2:g(p);break;case 3:d(p);break;case 4:m(p);break;case 5:b(p);break;case 6:v(p);break;case 7:k(p);break;default:Fe(l)}u++}return x(),o;function h(e){\"m\"===e?A(1):r.test(e)&&A()}function f(e,t){\":\"===e?r.test(t)?(l=2,c=new it(Ne({},c,{hasMailtoPrefix:!0}))):y():a[e]===t||(r.test(t)?l=2:\".\"===t?l=3:\"@\"===t?l=4:y())}function g(e){\".\"===e?l=3:\"@\"===e?l=4:r.test(e)||y()}function d(e){\".\"===e?y():\"@\"===e?y():r.test(e)?l=2:y()}function m(e){nt.test(e)?l=5:y()}function b(e){\".\"===e?l=7:\"-\"===e?l=6:nt.test(e)||x()}function v(e){\"-\"===e||\".\"===e?x():nt.test(e)?l=5:x()}function k(e){\".\"===e||\"-\"===e?x():nt.test(e)?(l=5,c=new it(Ne({},c,{hasDomainDot:!0}))):x()}function A(e){void 0===e&&(e=2),l=e,c=new it({idx:u})}function y(){l=0,c=i}function x(){if(c.hasDomainDot){var r=e.slice(c.idx,u);/[-.]$/.test(r)&&(r=r.slice(0,-1));var s=c.hasMailtoPrefix?r.slice(\"mailto:\".length):r;(function(e){var t=(e.split(\".\").pop()||\"\").toLowerCase();return n.test(t)})(s)&&o.push(new ze({tagBuilder:t,matchedText:r,offset:c.idx,email:s}))}y()}},t}(Ue),it=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.hasMailtoPrefix=!!e.hasMailtoPrefix,this.hasDomainDot=!!e.hasDomainDot},at=function(){function e(){}return e.isValid=function(e,t){return!(t&&!this.isValidUriScheme(t)||this.urlMatchDoesNotHaveProtocolOrDot(e,t)||this.urlMatchDoesNotHaveAtLeastOneWordChar(e,t)&&!this.isValidIpAddress(e)||this.containsMultipleDots(e))},e.isValidIpAddress=function(e){var t=new RegExp(this.hasFullProtocolRegex.source+this.ipRegex.source);return null!==e.match(t)},e.containsMultipleDots=function(e){var t=e;return this.hasFullProtocolRegex.test(e)&&(t=e.split(\"://\")[1]),t.split(\"/\")[0].indexOf(\"..\")>-1},e.isValidUriScheme=function(e){var t=e.match(this.uriSchemeRegex),r=t&&t[0].toLowerCase();return\"javascript:\"!==r&&\"vbscript:\"!==r},e.urlMatchDoesNotHaveProtocolOrDot=function(e,t){return!(!e||t&&this.hasFullProtocolRegex.test(t)||-1!==e.indexOf(\".\"))},e.urlMatchDoesNotHaveAtLeastOneWordChar=function(e,t){return!(!e||!t)&&!this.hasWordCharAfterProtocolRegex.test(e)},e.hasFullProtocolRegex=/^[A-Za-z][-.+A-Za-z0-9]*:\\/\\//,e.uriSchemeRegex=/^[A-Za-z][-.+A-Za-z0-9]*:/,e.hasWordCharAfterProtocolRegex=new RegExp(\":[^\\\\s]*?[\"+We+\"]\"),e.ipRegex=/[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?(:[0-9]*)?\\/?$/,e}(),ut=function(e){function t(t){var r,n=e.call(this,t)||this;return n.stripPrefix={scheme:!0,www:!0},n.stripTrailingSlash=!0,n.decodePercentEncoding=!0,n.matcherRegex=(r=new RegExp(\"[/?#](?:[\"+Qe+\"\\\\-+&@#/%=~_()|'$*\\\\[\\\\]?!:,.;✓]*[\"+Qe+\"\\\\-+&@#/%=~_()|'$*\\\\[\\\\]✓])?\"),new RegExp([\"(?:\",\"(\",/(?:[A-Za-z][-.+A-Za-z0-9]{0,63}:(?![A-Za-z][-.+A-Za-z0-9]{0,63}:\\/\\/)(?!\\d+\\/?)(?:\\/\\/)?)/.source,rt(2),\")\",\"|\",\"(\",\"(//)?\",/(?:www\\.)/.source,rt(6),\")\",\"|\",\"(\",\"(//)?\",rt(10)+\"\\\\.\",ot.source,\"(?![-\"+Ke+\"])\",\")\",\")\",\"(?::[0-9]+)?\",\"(?:\"+r.source+\")?\"].join(\"\"),\"gi\")),n.wordCharRegExp=new RegExp(\"[\"+Qe+\"]\"),n.stripPrefix=t.stripPrefix,n.stripTrailingSlash=t.stripTrailingSlash,n.decodePercentEncoding=t.decodePercentEncoding,n}return Re(t,e),t.prototype.parseMatches=function(e){for(var t,r=this.matcherRegex,n=this.stripPrefix,o=this.stripTrailingSlash,s=this.decodePercentEncoding,i=this.tagBuilder,a=[],u=function(){var r=t[0],u=t[1],c=t[4],p=t[5],h=t[9],f=t.index,g=p||h,d=e.charAt(f-1);if(!at.isValid(r,u))return\"continue\";if(f>0&&\"@\"===d)return\"continue\";if(f>0&&g&&l.wordCharRegExp.test(d))return\"continue\";if(/\\?$/.test(r)&&(r=r.substr(0,r.length-1)),l.matchHasUnbalancedClosingParen(r))r=r.substr(0,r.length-1);else{var m=l.matchHasInvalidCharAfterTld(r,u);m>-1&&(r=r.substr(0,m))}var b=[\"http://\",\"https://\"].find(function(e){return!!u&&-1!==u.indexOf(e)});if(b){var v=r.indexOf(b);r=r.substr(v),u=u.substr(v),f+=v}var k=u?\"scheme\":c?\"www\":\"tld\",A=!!u;a.push(new Oe({tagBuilder:i,matchedText:r,offset:f,urlMatchType:k,url:r,protocolUrlMatch:A,protocolRelativeMatch:!!g,stripPrefix:n,stripTrailingSlash:o,decodePercentEncoding:s}))},l=this;null!==(t=r.exec(e));)u();return a},t.prototype.matchHasUnbalancedClosingParen=function(e){var t,r=e.charAt(e.length-1);if(\")\"===r)t=\"(\";else{if(\"]\"!==r)return!1;t=\"[\"}for(var n=0,o=0,s=e.length-1;o<s;o++){var i=e.charAt(o);i===t?n++:i===r&&(n=Math.max(n-1,0))}return 0===n},t.prototype.matchHasInvalidCharAfterTld=function(e,t){if(!e)return-1;var r=0;t&&(r=e.indexOf(\":\"),e=e.slice(r));var n=new RegExp(\"^((.?//)?[-.\"+Qe+\"]*[-\"+Qe+\"]\\\\.[-\"+Qe+\"]+)\").exec(e);return null===n?-1:(r+=n[1].length,e=e.slice(n[1].length),/^[^-.A-Za-z0-9:\\/?#]/.test(e)?r:-1)},t}(Ue),lt=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName=\"twitter\",r.matcherRegex=new RegExp(\"#[_\"+Qe+\"]{1,139}(?![_\"+Qe+\"])\",\"g\"),r.nonWordCharRegex=new RegExp(\"[^\"+Qe+\"]\"),r.serviceName=t.serviceName,r}return Re(t,e),t.prototype.parseMatches=function(e){for(var t,r=this.matcherRegex,n=this.nonWordCharRegex,o=this.serviceName,s=this.tagBuilder,i=[];null!==(t=r.exec(e));){var a=t.index,u=e.charAt(a-1);if(0===a||n.test(u)){var l=t[0],c=t[0].slice(1);i.push(new Pe({tagBuilder:s,matchedText:l,offset:a,serviceName:o,hashtag:c}))}}return i},t}(Ue),ct=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.matcherRegex=/(?:(?:(?:(\\+)?\\d{1,3}[-\\040.]?)?\\(?\\d{3}\\)?[-\\040.]?\\d{3}[-\\040.]?\\d{4})|(?:(\\+)(?:9[976]\\d|8[987530]\\d|6[987]\\d|5[90]\\d|42\\d|3[875]\\d|2[98654321]\\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)[-\\040.]?(?:\\d[-\\040.]?){6,12}\\d+))([,;]+[0-9]+#?)*/g,t}return Re(t,e),t.prototype.parseMatches=function(e){for(var t,r=this.matcherRegex,n=this.tagBuilder,o=[];null!==(t=r.exec(e));){var s=t[0],i=s.replace(/[^0-9,;#]/g,\"\"),a=!(!t[1]&&!t[2]),u=0==t.index?\"\":e.substr(t.index-1,1),l=e.substr(t.index+s.length,1),c=!u.match(/\\d/)&&!l.match(/\\d/);this.testMatch(t[3])&&this.testMatch(s)&&c&&o.push(new Ie({tagBuilder:n,matchedText:s,offset:t.index,number:i,plusSign:a}))}return o},t.prototype.testMatch=function(e){return/\\D/.test(e)},t}(Ue),pt=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName=\"twitter\",r.matcherRegexes={twitter:new RegExp(\"@[_\"+Qe+\"]{1,50}(?![_\"+Qe+\"])\",\"g\"),instagram:new RegExp(\"@[_.\"+Qe+\"]{1,30}(?![_\"+Qe+\"])\",\"g\"),soundcloud:new RegExp(\"@[-_.\"+Qe+\"]{1,50}(?![-_\"+Qe+\"])\",\"g\")},r.nonWordCharRegex=new RegExp(\"[^\"+Qe+\"]\"),r.serviceName=t.serviceName,r}return Re(t,e),t.prototype.parseMatches=function(e){var t,r=this.serviceName,n=this.matcherRegexes[this.serviceName],o=this.nonWordCharRegex,s=this.tagBuilder,i=[];if(!n)return i;for(;null!==(t=n.exec(e));){var a=t.index,u=e.charAt(a-1);if(0===a||o.test(u)){var l=t[0].replace(/\\.+$/g,\"\"),c=l.slice(1);i.push(new je({tagBuilder:s,matchedText:l,offset:a,serviceName:r,mention:c}))}}return i},t}(Ue);function ht(e,t){for(var r=t.onOpenTag,n=t.onCloseTag,o=t.onText,s=t.onComment,i=t.onDoctype,a=new ft,u=0,l=e.length,c=0,p=0,h=a;u<l;){var f=e.charAt(u);switch(c){case 0:g(f);break;case 1:d(f);break;case 2:b(f);break;case 3:m(f);break;case 4:v(f);break;case 5:k(f);break;case 6:A(f);break;case 7:y(f);break;case 8:x(f);break;case 9:w(f);break;case 10:C(f);break;case 11:E(f);break;case 12:D(f);break;case 13:_();break;case 14:B(f);break;case 15:q(f);break;case 16:F(f);break;case 17:M(f);break;case 18:S(f);break;case 19:T(f);break;case 20:L(f);break;default:Fe(c)}u++}function g(e){\"<\"===e&&N()}function d(e){\"!\"===e?c=13:\"/\"===e?(c=2,h=new ft(Ne({},h,{isClosing:!0}))):\"<\"===e?N():He.test(e)?(c=3,h=new ft(Ne({},h,{isOpening:!0}))):(c=0,h=a)}function m(e){Ge.test(e)?(h=new ft(Ne({},h,{name:P()})),c=4):\"<\"===e?N():\"/\"===e?(h=new ft(Ne({},h,{name:P()})),c=12):\">\"===e?(h=new ft(Ne({},h,{name:P()})),z()):He.test(e)||Ve.test(e)||\":\"===e||R()}function b(e){\">\"===e?R():He.test(e)?c=3:R()}function v(e){Ge.test(e)||(\"/\"===e?c=12:\">\"===e?z():\"<\"===e?N():\"=\"===e||$e.test(e)||Ze.test(e)?R():c=5)}function k(e){Ge.test(e)?c=6:\"/\"===e?c=12:\"=\"===e?c=7:\">\"===e?z():\"<\"===e?N():$e.test(e)&&R()}function A(e){Ge.test(e)||(\"/\"===e?c=12:\"=\"===e?c=7:\">\"===e?z():\"<\"===e?N():$e.test(e)?R():c=5)}function y(e){Ge.test(e)||('\"'===e?c=8:\"'\"===e?c=9:/[>=`]/.test(e)?R():\"<\"===e?N():c=10)}function x(e){'\"'===e&&(c=11)}function w(e){\"'\"===e&&(c=11)}function C(e){Ge.test(e)?c=4:\">\"===e?z():\"<\"===e&&N()}function E(e){Ge.test(e)?c=4:\"/\"===e?c=12:\">\"===e?z():\"<\"===e?N():(c=4,u--)}function D(e){\">\"===e?(h=new ft(Ne({},h,{isClosing:!0})),z()):c=4}function _(t){\"--\"===e.substr(u,2)?(u+=2,h=new ft(Ne({},h,{type:\"comment\"})),c=14):\"DOCTYPE\"===e.substr(u,7).toUpperCase()?(u+=7,h=new ft(Ne({},h,{type:\"doctype\"})),c=20):R()}function B(e){\"-\"===e?c=15:\">\"===e?R():c=16}function q(e){\"-\"===e?c=18:\">\"===e?R():c=16}function F(e){\"-\"===e&&(c=17)}function M(e){c=\"-\"===e?18:16}function S(e){\">\"===e?z():\"!\"===e?c=19:\"-\"===e||(c=16)}function T(e){\"-\"===e?c=17:\">\"===e?z():c=16}function L(e){\">\"===e?z():\"<\"===e&&N()}function R(){c=0,h=a}function N(){c=1,h=new ft({idx:u})}function z(){var t=e.slice(p,h.idx);t&&o(t,p),\"comment\"===h.type?s(h.idx):\"doctype\"===h.type?i(h.idx):(h.isOpening&&r(h.name,h.idx),h.isClosing&&n(h.name,h.idx)),R(),p=u+1}function P(){var t=h.idx+(h.isClosing?2:1);return e.slice(t,u).toLowerCase()}p<u&&function(){var t=e.slice(p,u);o(t,p),p=u+1}()}var ft=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.type=e.type||\"tag\",this.name=e.name||\"\",this.isOpening=!!e.isOpening,this.isClosing=!!e.isClosing},gt=function(){function e(t){void 0===t&&(t={}),this.version=e.version,this.urls={},this.email=!0,this.phone=!0,this.hashtag=!1,this.mention=!1,this.newWindow=!0,this.stripPrefix={scheme:!0,www:!0},this.stripTrailingSlash=!0,this.decodePercentEncoding=!0,this.truncate={length:0,location:\"end\"},this.className=\"\",this.replaceFn=null,this.context=void 0,this.matchers=null,this.tagBuilder=null,this.urls=this.normalizeUrlsCfg(t.urls),this.email=\"boolean\"==typeof t.email?t.email:this.email,this.phone=\"boolean\"==typeof t.phone?t.phone:this.phone,this.hashtag=t.hashtag||this.hashtag,this.mention=t.mention||this.mention,this.newWindow=\"boolean\"==typeof t.newWindow?t.newWindow:this.newWindow,this.stripPrefix=this.normalizeStripPrefixCfg(t.stripPrefix),this.stripTrailingSlash=\"boolean\"==typeof t.stripTrailingSlash?t.stripTrailingSlash:this.stripTrailingSlash,this.decodePercentEncoding=\"boolean\"==typeof t.decodePercentEncoding?t.decodePercentEncoding:this.decodePercentEncoding;var r=this.mention;if(!1!==r&&\"twitter\"!==r&&\"instagram\"!==r&&\"soundcloud\"!==r)throw new Error(\"invalid `mention` cfg - see docs\");var n=this.hashtag;if(!1!==n&&\"twitter\"!==n&&\"facebook\"!==n&&\"instagram\"!==n)throw new Error(\"invalid `hashtag` cfg - see docs\");this.truncate=this.normalizeTruncateCfg(t.truncate),this.className=t.className||this.className,this.replaceFn=t.replaceFn||this.replaceFn,this.context=t.context||this}return e.link=function(t,r){return new e(r).link(t)},e.parse=function(t,r){return new e(r).parse(t)},e.prototype.normalizeUrlsCfg=function(e){return null==e&&(e=!0),\"boolean\"==typeof e?{schemeMatches:e,wwwMatches:e,tldMatches:e}:{schemeMatches:\"boolean\"!=typeof e.schemeMatches||e.schemeMatches,wwwMatches:\"boolean\"!=typeof e.wwwMatches||e.wwwMatches,tldMatches:\"boolean\"!=typeof e.tldMatches||e.tldMatches}},e.prototype.normalizeStripPrefixCfg=function(e){return null==e&&(e=!0),\"boolean\"==typeof e?{scheme:e,www:e}:{scheme:\"boolean\"!=typeof e.scheme||e.scheme,www:\"boolean\"!=typeof e.www||e.www}},e.prototype.normalizeTruncateCfg=function(e){return\"number\"==typeof e?{length:e,location:\"end\"}:function(e,t){for(var r in t)t.hasOwnProperty(r)&&void 0===e[r]&&(e[r]=t[r]);return e}(e||{},{length:Number.POSITIVE_INFINITY,location:\"end\"})},e.prototype.parse=function(e){var t=this,r=[\"a\",\"style\",\"script\"],n=0,o=[];return ht(e,{onOpenTag:function(e){r.indexOf(e)>=0&&n++},onText:function(e,r){if(0===n){var s=function(e,t){if(!t.global)throw new Error(\"`splitRegex` must have the 'g' flag set\");for(var r,n=[],o=0;r=t.exec(e);)n.push(e.substring(o,r.index)),n.push(r[0]),o=r.index+r[0].length;return n.push(e.substring(o)),n}(e,/( | |<|<|>|>|"|"|')/gi),i=r;s.forEach(function(e,r){if(r%2==0){var n=t.parseText(e,i);o.push.apply(o,n)}i+=e.length})}},onCloseTag:function(e){r.indexOf(e)>=0&&(n=Math.max(n-1,0))},onComment:function(e){},onDoctype:function(e){}}),o=this.compactMatches(o),o=this.removeUnwantedMatches(o)},e.prototype.compactMatches=function(e){e.sort(function(e,t){return e.getOffset()-t.getOffset()});for(var t=0;t<e.length-1;t++){var r=e[t],n=r.getOffset(),o=r.getMatchedText().length,s=n+o;if(t+1<e.length){if(e[t+1].getOffset()===n){var i=e[t+1].getMatchedText().length>o?t:t+1;e.splice(i,1);continue}e[t+1].getOffset()<s&&e.splice(t+1,1)}}return e},e.prototype.removeUnwantedMatches=function(e){return this.hashtag||qe(e,function(e){return\"hashtag\"===e.getType()}),this.email||qe(e,function(e){return\"email\"===e.getType()}),this.phone||qe(e,function(e){return\"phone\"===e.getType()}),this.mention||qe(e,function(e){return\"mention\"===e.getType()}),this.urls.schemeMatches||qe(e,function(e){return\"url\"===e.getType()&&\"scheme\"===e.getUrlMatchType()}),this.urls.wwwMatches||qe(e,function(e){return\"url\"===e.getType()&&\"www\"===e.getUrlMatchType()}),this.urls.tldMatches||qe(e,function(e){return\"url\"===e.getType()&&\"tld\"===e.getUrlMatchType()}),e},e.prototype.parseText=function(e,t){void 0===t&&(t=0),t=t||0;for(var r=this.getMatchers(),n=[],o=0,s=r.length;o<s;o++){for(var i=r[o].parseMatches(e),a=0,u=i.length;a<u;a++)i[a].setOffset(t+i[a].getOffset());n.push.apply(n,i)}return n},e.prototype.link=function(e){if(!e)return\"\";for(var t=this.parse(e),r=[],n=0,o=0,s=t.length;o<s;o++){var i=t[o];r.push(e.substring(n,i.getOffset())),r.push(this.createMatchReturnVal(i)),n=i.getOffset()+i.getMatchedText().length}return r.push(e.substring(n)),r.join(\"\")},e.prototype.createMatchReturnVal=function(e){var t;return this.replaceFn&&(t=this.replaceFn.call(this.context,e)),\"string\"==typeof t?t:!1===t?e.getMatchedText():t instanceof Me?t.toAnchorString():e.buildTag().toAnchorString()},e.prototype.getMatchers=function(){if(this.matchers)return this.matchers;var e=this.getTagBuilder(),t=[new lt({tagBuilder:e,serviceName:this.hashtag}),new st({tagBuilder:e}),new ct({tagBuilder:e}),new pt({tagBuilder:e,serviceName:this.mention}),new ut({tagBuilder:e,stripPrefix:this.stripPrefix,stripTrailingSlash:this.stripTrailingSlash,decodePercentEncoding:this.decodePercentEncoding})];return this.matchers=t},e.prototype.getTagBuilder=function(){var e=this.tagBuilder;return e||(e=this.tagBuilder=new Se({newWindow:this.newWindow,truncate:this.truncate,className:this.className})),e},e.version=\"3.11.0\",e.AnchorTagBuilder=Se,e.HtmlTag=Me,e.matcher={Email:st,Hashtag:lt,Matcher:Ue,Mention:pt,Phone:ct,Url:ut},e.match={Email:ze,Hashtag:Pe,Match:Te,Mention:je,Phone:Ie,Url:Oe},e}(),dt=/www|@|\\:\\/\\//;function mt(e){return/^<\\/a\\s*>/i.test(e)}function bt(){var e=[],t=new gt({stripPrefix:!1,url:!0,email:!0,replaceFn:function(t){switch(t.getType()){case\"url\":e.push({text:t.matchedText,url:t.getUrl()});break;case\"email\":e.push({text:t.matchedText,url:\"mailto:\"+t.getEmail().replace(/^mailto:/i,\"\")})}return!1}});return{links:e,autolinker:t}}function vt(e){var t,r,n,o,s,i,a,u,l,c,p,h,f,g,d=e.tokens,m=null;for(r=0,n=d.length;r<n;r++)if(\"inline\"===d[r].type)for(p=0,t=(o=d[r].children).length-1;t>=0;t--)if(\"link_close\"!==(s=o[t]).type){if(\"htmltag\"===s.type&&(g=s.content,/^<a[>\\s]/i.test(g)&&p>0&&p--,mt(s.content)&&p++),!(p>0)&&\"text\"===s.type&&dt.test(s.content)){if(m||(h=(m=bt()).links,f=m.autolinker),i=s.content,h.length=0,f.link(i),!h.length)continue;for(a=[],c=s.level,u=0;u<h.length;u++)e.inline.validateLink(h[u].url)&&((l=i.indexOf(h[u].text))&&a.push({type:\"text\",content:i.slice(0,l),level:c}),a.push({type:\"link_open\",href:h[u].url,title:\"\",level:c++}),a.push({type:\"text\",content:h[u].text,level:c}),a.push({type:\"link_close\",level:--c}),i=i.slice(l+h[u].text.length));i.length&&a.push({type:\"text\",content:i,level:c}),d[r].children=o=[].concat(o.slice(0,t),a,o.slice(t+1))}}else for(t--;o[t].level!==s.level&&\"link_open\"!==o[t].type;)t--}e.Remarkable=_e,e.linkify=function(e){e.core.ruler.push(\"linkify\",vt)},e.utils=A,Object.defineProperty(e,\"__esModule\",{value:!0})});\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/markdown/remarkable.js",
"module-type": "library"
},
"$:/plugins/tiddlywiki/markdown/images/new-markdown-button": {
"title": "$:/plugins/tiddlywiki/markdown/images/new-markdown-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-new-markdown-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <rect x=\"80\" y=\"96\" width=\"48\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"96\" y=\"80\" width=\"16\" height=\"48\" rx=\"8\"></rect>\n <path d=\"M3.23876972,39.5396716 C3.23876972,35.9653274 6.13586353,33.0691646 9.7141757,33.0691646 L98.1283744,33.0691646 C101.706101,33.0691646 104.60378,35.9646626 104.60378,39.5396716 L104.60378,84.8296213 C104.60378,88.4039654 101.706687,91.3001282 98.1283744,91.3001282 L9.7141757,91.3001282 C6.13644944,91.3001282 3.23876972,88.4046302 3.23876972,84.8296213 L3.23876972,39.5396716 L3.23876972,39.5396716 Z M-2.15298617,39.5396716 L-2.15298617,84.8296213 C-2.15298617,91.3833243 3.15957363,96.6918841 9.7141757,96.6918841 L98.1283744,96.6918841 C104.684083,96.6918841 109.995536,91.382138 109.995536,84.8296213 L109.995536,39.5396716 C109.995536,32.9859686 104.682977,27.6774087 98.1283744,27.6774087 L9.7141757,27.6774087 C3.15846686,27.6774087 -2.15298617,32.9871549 -2.15298617,39.5396716 Z M14.0222815,80.5166164 L14.0222815,43.8526764 L24.8057933,43.8526764 L35.589305,57.3320661 L46.3728168,43.8526764 L57.1563286,43.8526764 L57.1563286,80.5166164 L46.3728168,80.5166164 L46.3728168,59.4887685 L35.589305,72.9681582 L24.8057933,59.4887685 L24.8057933,80.5166164 L14.0222815,80.5166164 Z M81.4192301,80.5166164 L65.2439624,62.723822 L76.0274742,62.723822 L76.0274742,43.8526764 L86.810986,43.8526764 L86.810986,62.723822 L97.5944978,62.723822 L81.4192301,80.5166164 Z\"transform=\"translate(53.921275, 62.184646) rotate(-60.000000) translate(-53.921275, -62.184646) \"></path>\n </g>\n</svg>"
},
"$:/plugins/tiddlywiki/markdown/new-markdown-button": {
"title": "$:/plugins/tiddlywiki/markdown/new-markdown-button",
"tags": "$:/tags/PageControls",
"caption": "{{$:/plugins/tiddlywiki/markdown/images/new-markdown-button}} {{$:/language/Buttons/NewMarkdown/Caption}}",
"description": "{{$:/language/Buttons/NewMarkdown/Hint}}",
"list-after": "$:/core/ui/Buttons/new-tiddler",
"text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/NewMarkdown/Hint}} aria-label={{$:/language/Buttons/NewMarkdown/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-new-tiddler\" type=\"text/x-markdown\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/plugins/tiddlywiki/markdown/images/new-markdown-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewMarkdown/Caption}}/></span>\n</$list>\n</$button>\n"
},
"$:/plugins/tiddlywiki/markdown/readme": {
"title": "$:/plugins/tiddlywiki/markdown/readme",
"text": "This is a TiddlyWiki plugin for parsing Markdown text, using the [[Remarkable|https://github.com/jonschlinkert/remarkable]] library.\n\nIt is completely self-contained, and doesn't need an Internet connection in order to work. It works both in the browser and under Node.js.\n\n[[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/markdown]]\n"
},
"$:/plugins/tiddlywiki/markdown/usage": {
"title": "$:/plugins/tiddlywiki/markdown/usage",
"text": "! Plugin Configuration\n\n|!Config |!Default |!Description |\n| <code>[[breaks|$:/config/markdown/breaks]]</code>| ``false``|Remarkable library config: Convert '\\n' in paragraphs into ``<br>`` |\n| <code>[[linkify|$:/config/markdown/linkify]]</code>| ``false``|Remarkable library config: Autoconvert URL-like text to links |\n| <code>[[linkNewWindow|$:/config/markdown/linkNewWindow]]</code>| ``true``|For external links, should clicking on them open a new window/tab automatically? |\n| <code>[[quotes|$:/config/markdown/quotes]]</code>| ``“”‘’``|Remarkable library config: Double + single quotes replacement pairs, when ``typographer`` enabled |\n| <code>[[renderWikiText|$:/config/markdown/renderWikiText]]</code>| ``true``|After Markdown is parsed, should any text elements be handed off to the ~WikiText parser for further processing? |\n| <code>[[renderWikiTextPragma|$:/config/markdown/renderWikiTextPragma]]</code>| ``\\rules only html image macrocallinline syslink transcludeinline wikilink filteredtranscludeblock macrocallblock transcludeblock``|When handing off to the ~WikiText parser, what pragma rules should it follow? |\n| <code>[[typographer|$:/config/markdown/typographer]]</code>| ``false``|Remarkable library config: Enable some language-neutral replacement + quotes beautification |\n\n! Creating ~WikiLinks\n\nCreate wiki links with the usual Markdown link syntax targeting `#` and the target tiddler title:\n\n```\n[link text](#TiddlerTitle)\n```\n\nIf the target tiddler has a space in its name, that name must be URL-escaped to be detected as a URL:\n\n```\n[link text](#Test%20Tiddler)\n```\n\n! Images\n\nMarkdown image syntax can be used to reference images by tiddler title or an external URI. For example:\n\n```\n\n\n\n```\n"
},
"$:/plugins/tiddlywiki/markdown/wrapper.js": {
"title": "$:/plugins/tiddlywiki/markdown/wrapper.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/markdown/wrapper.js\ntype: application/javascript\nmodule-type: parser\n\nWraps up the remarkable parser for use as a Parser in TiddlyWiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar r = require(\"$:/plugins/tiddlywiki/markdown/remarkable.js\");\n\nvar Remarkable = r.Remarkable,\n\tlinkify = r.linkify,\n\tutils = r.utils;\n\n///// Set up configuration options /////\nfunction parseAsBoolean(tiddlerName) {\n\treturn $tw.wiki.getTiddlerText(tiddlerName).toLowerCase() === \"true\";\n}\nvar pluginOpts = {\n\tlinkNewWindow: parseAsBoolean(\"$:/config/markdown/linkNewWindow\"),\n\trenderWikiText: parseAsBoolean(\"$:/config/markdown/renderWikiText\"),\n\trenderWikiTextPragma: $tw.wiki.getTiddlerText(\"$:/config/markdown/renderWikiTextPragma\").trim()\n};\nvar remarkableOpts = {\n\tbreaks: parseAsBoolean(\"$:/config/markdown/breaks\"),\n\tquotes: $tw.wiki.getTiddlerText(\"$:/config/markdown/quotes\"),\n\ttypographer: parseAsBoolean(\"$:/config/markdown/typographer\")\n};\n\nvar md = new Remarkable(remarkableOpts);\n\nif (parseAsBoolean(\"$:/config/markdown/linkify\")) {\n\tmd = md.use(linkify);\n}\n\nfunction findTagWithType(nodes, startPoint, type, level) {\n\tfor (var i = startPoint; i < nodes.length; i++) {\n\t\tif (nodes[i].type === type && nodes[i].level === level) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * Remarkable creates nodes that look like:\n * [\n * { type: 'paragraph_open'},\n * { type: 'inline', content: 'Hello World', children:[{type: 'text', content: 'Hello World'}]},\n * { type: 'paragraph_close'}\n * ]\n *\n * But TiddlyWiki wants the Parser (https://tiddlywiki.com/dev/static/Parser.html) to emit nodes like:\n *\n * [\n * { type: 'element', tag: 'p', children: [{type: 'text', text: 'Hello World'}]}\n * ]\n */\nfunction convertNodes(remarkableTree, isStartOfInline) {\n\tlet out = [];\n\n\tfunction wrappedElement(elementTag, currentIndex, currentLevel, closingType, nodes) {\n\t\tvar j = findTagWithType(nodes, currentIndex + 1, closingType, currentLevel);\n\t\tif (j === false) {\n\t\t\tconsole.error(\"Failed to find a \" + closingType + \" node after position \" + currentIndex);\n\t\t\tconsole.log(nodes);\n\t\t\treturn currentIndex + 1;\n\t\t}\n\t\tlet children = convertNodes(nodes.slice(currentIndex + 1, j));\n\n\t\tout.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: elementTag,\n\t\t\tchildren: children\n\t\t});\n\t\treturn j;\n\t}\n\n\tfor (var i = 0; i < remarkableTree.length; i++) {\n\t\tvar currentNode = remarkableTree[i];\n\t\tif (currentNode.type === \"paragraph_open\") {\n\t\t\ti = wrappedElement(\"p\", i, currentNode.level, \"paragraph_close\", remarkableTree);\n\t\t} else if (currentNode.type === \"heading_open\") {\n\t\t\ti = wrappedElement(\"h\" + currentNode.hLevel, i, currentNode.level, \"heading_close\", remarkableTree);\n\t\t} else if (currentNode.type === \"bullet_list_open\") {\n\t\t\ti = wrappedElement(\"ul\", i, currentNode.level, \"bullet_list_close\", remarkableTree);\n\t\t} else if (currentNode.type == 'ordered_list_open') {\n\t\t\ti = wrappedElement('ol', i, currentNode.level,'ordered_list_close', remarkableTree);\n\t\t} else if (currentNode.type === \"list_item_open\") {\n\t\t\ti = wrappedElement(\"li\", i, currentNode.level, \"list_item_close\", remarkableTree);\n\t\t} else if (currentNode.type === \"link_open\") {\n\t\t\tvar j = findTagWithType(remarkableTree, i + 1, \"link_close\", currentNode.level);\n\n\t\t\tif (currentNode.href[0] !== \"#\") {\n\t\t\t\t// External link\n\t\t\t\tvar attributes = {\n\t\t\t\t\thref: { type: \"string\", value: currentNode.href }\n\t\t\t\t};\n\t\t\t\tif (pluginOpts.linkNewWindow) {\n\t\t\t\t\tattributes.target = { type: \"string\", value: \"_blank\" };\n\t\t\t\t}\n\t\t\t\tout.push({\n\t\t\t\t\ttype: \"element\",\n\t\t\t\t\ttag: \"a\",\n\t\t\t\t\tattributes: attributes,\n\t\t\t\t\tchildren: convertNodes(remarkableTree.slice(i + 1, j))\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Internal link\n\t\t\t\tout.push({\n\t\t\t\t\ttype: \"link\",\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tto: { type: \"string\", value: decodeURI(currentNode.href.substr(1)) }\n\t\t\t\t\t},\n\t\t\t\t\tchildren: convertNodes(remarkableTree.slice(i + 1, j))\n\t\t\t\t});\n\t\t\t}\n\t\t\ti = j;\n\t\t} else if (currentNode.type.substr(currentNode.type.length - 5) === \"_open\") {\n\t\t\tvar tagName = currentNode.type.substr(0, currentNode.type.length - 5);\n\t\t\ti = wrappedElement(tagName, i, currentNode.level, tagName + \"_close\", remarkableTree);\n\t\t} else if (currentNode.type === \"code\") {\n\t\t\tout.push({\n\t\t\t\ttype: \"element\",\n\t\t\t\ttag: currentNode.block ? \"pre\" : \"code\",\n\t\t\t\tchildren: [{ type: \"text\", text: currentNode.content }]\n\t\t\t});\n\t\t} else if (currentNode.type === \"fence\") {\n\t\t\tout.push({\n\t\t\t\ttype: \"codeblock\",\n\t\t\t\tattributes: {\n\t\t\t\t\tlanguage: { type: \"string\", value: currentNode.params },\n\t\t\t\t\tcode: { type: \"string\", value: currentNode.content }\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (currentNode.type === \"image\") {\n\t\t\tout.push({\n\t\t\t\ttype: \"image\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttooltip: { type: \"string\", value: currentNode.alt },\n\t\t\t\t\tsource: { type: \"string\", value: currentNode.src }\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (currentNode.type === \"softbreak\") {\n\t\t\tout.push({\n\t\t\t\ttype: \"element\",\n\t\t\t\ttag: \"br\",\n\t\t\t});\n\t\t} else if (currentNode.type == 'hr') {\n\t\t\tout.push({\n\t\t\t\ttype: 'element',\n\t\t\t\ttag: 'hr',\n\t\t\t});\n\t\t} else if (currentNode.type === \"inline\") {\n\t\t\tout = out.concat(convertNodes(currentNode.children, true));\n\t\t} else if (currentNode.type === \"text\") {\n\t\t\tif (!pluginOpts.renderWikiText) {\n\t\t\t\tout.push({\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: currentNode.content\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// The Markdown compiler thinks this is just text.\n\t\t\t\t// Hand off to the WikiText parser to see if there's more to render\n\n\t\t\t\t// If we're inside a block element (div, p, td, h1), and this is the first child in the tree,\n\t\t\t\t// handle as a block-level parse. Otherwise not.\n\t\t\t\tvar parseAsInline = !(isStartOfInline && i === 0);\n\t\t\t\tvar textToParse = currentNode.content;\n\t\t\t\tif (pluginOpts.renderWikiTextPragma !== \"\") {\n\t\t\t\t\ttextToParse = pluginOpts.renderWikiTextPragma + \"\\n\" + textToParse;\n\t\t\t\t}\n\t\t\t\tvar wikiParser = $tw.wiki.parseText(\"text/vnd.tiddlywiki\", textToParse, {\n\t\t\t\t\tparseAsInline: parseAsInline\n\t\t\t\t});\n\t\t\t\tvar rs = wikiParser.tree;\n\n\t\t\t\t// If we parsed as a block, but the root element the WikiText parser gave is a paragraph,\n\t\t\t\t// we should discard the paragraph, since the way Remarkable nests its nodes, this \"inline\"\n\t\t\t\t// node is always inside something else that's a block-level element\n\t\t\t\tif (!parseAsInline\n\t\t\t\t\t&& rs.length === 1\n\t\t\t\t\t&& rs[0].type === \"element\"\n\t\t\t\t\t&& rs[0].tag === \"p\"\n\t\t\t\t) {\n\t\t\t\t\trs = rs[0].children;\n\t\t\t\t}\n\n\t\t\t\t// If the original text element started with a space, add it back in\n\t\t\t\tif (rs.length > 0\n\t\t\t\t\t&& rs[0].type === \"text\"\n\t\t\t\t\t&& currentNode.content[0] === \" \"\n\t\t\t\t) {\n\t\t\t\t\trs[0].text = \" \" + rs[0].text;\n\t\t\t\t}\n\t\t\t\tout = out.concat(rs);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.error(\"Unknown node type: \" + currentNode.type, currentNode);\n\t\t\tout.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: currentNode.content\n\t\t\t});\n\t\t}\n\t}\n\treturn out;\n}\n\nvar MarkdownParser = function(type, text, options) {\n\tvar tree = md.parse(text, {});\n\t//console.debug(tree);\n\ttree = convertNodes(tree);\n\t//console.debug(tree);\n\n\tthis.tree = tree;\n};\n\nexports[\"text/x-markdown\"] = MarkdownParser;\n\n})();\n",
"type": "application/javascript",
"module-type": "parser"
}
}
}
Mark MacKay's Introspection Notebook
$:/core/ui/EditTemplate/body/preview/diffs-current
Conversaciones que saltan
$:/core/ui/TiddlerInfo/References
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/Advanced
$:/core/ui/AdvancedSearch/Filter
$:/core/ui/TiddlerInfo/Advanced
$:/themes/tiddlywiki/vanilla/themetweaks
$:/core/ui/ControlPanel/Basics
$:/core/ui/ControlPanel/Plugins/Add/Plugins
$:/core/ui/TiddlerInfo/Advanced
$:/core/ui/TiddlerInfo/References
$:/core/ui/ControlPanel/Plugins/Installed/Plugins
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/ControlPanel/Info
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/MoreSideBar/Tags
$:/core/ui/ControlPanel/Toolbars/EditToolbar
[tag[→ Journal]!prefix[$:/]]
{
"tiddlers": {
"$:/info/browser": {
"title": "$:/info/browser",
"text": "yes"
},
"$:/info/node": {
"title": "$:/info/node",
"text": "no"
},
"$:/info/url/full": {
"title": "$:/info/url/full",
"text": "file:///Users/duopixel/Coding/inner.observer/index.html"
},
"$:/info/url/host": {
"title": "$:/info/url/host",
"text": ""
},
"$:/info/url/hostname": {
"title": "$:/info/url/hostname",
"text": ""
},
"$:/info/url/protocol": {
"title": "$:/info/url/protocol",
"text": "file:"
},
"$:/info/url/port": {
"title": "$:/info/url/port",
"text": ""
},
"$:/info/url/pathname": {
"title": "$:/info/url/pathname",
"text": "/Users/duopixel/Coding/inner.observer/index.html"
},
"$:/info/url/search": {
"title": "$:/info/url/search",
"text": ""
},
"$:/info/url/origin": {
"title": "$:/info/url/origin",
"text": "file://"
},
"$:/info/browser/screen/width": {
"title": "$:/info/browser/screen/width",
"text": "1680"
},
"$:/info/browser/screen/height": {
"title": "$:/info/browser/screen/height",
"text": "1050"
},
"$:/info/browser/language": {
"title": "$:/info/browser/language",
"text": "en-US"
}
}
}
"""
90429 [[Writing prompts]], 5 fields
48176 [[Memorias de Cone, libro II]], 5 fields
35082 [[Arena y Espuma, Khalil Gibrán]], 5 fields
30937 [[Entrevista con John Laing]], 5 fields
20378 [[Transcription: The Ideal of Lao Tze's Ethics]], 5 fields
20356 [[The Ideal of Lao-Tze's Ethics]], 5 fields
17157 [[Inspiring people]], 5 fields
17031 [[2019 11 15 log Carta de reflexión]], 5 fields
17027 [[Getting traction with web games]], 7 fields
16415 [[dremilyanhalt]], 5 fields
16126 [[09 Espiral - Vida, muerte y renacimiento]], 5 fields
14181 [[Singing bowl]], 5 fields
13680 [[You're already a pretty good designer]], 5 fields
12009 [[Interview with John Laing]], 5 fields
11844 [[Essay: Los naranjos de Valencia]], 5 fields
11763 [[Method of Action wakes up after a long hibernation]], 5 fields
11604 [[The inferiority complex]], 6 fields
11578 [[2020 06 14 Stream of thought self-therapy]], 5 fields
11575 [[Stream of thought virtuegraph]], 5 fields
11054 [[2018 06 24 Stream of todos]], 5 fields
10905 [[2018 06 24 First log]], 6 fields, text/vnd.tiddlywiki
10706 [[Concepts of psychology]], 5 fields
10649 [[08 Espiral - Espiritualidad, religiosidad y misticismo]], 5 fields
10495 [[2019 10 07 Personal Library]], 6 fields, text/x-markdown
10424 [[Notes on The Courage to be Disliked]], 6 fields
9697 [[05 Espiral - El solista ejecuta su propia melodía]], 5 fields
9694 [[2018 08 14 Notes on personality]], 5 fields
9549 [[2019 12 15 An actual work log]], 6 fields, text/x-markdown
9343 [[2020 08 19 Personajes famosos]], 5 fields
8991 [[A day without women]], 5 fields
8952 [[Essay - A day without women]], 5 fields
8896 [[2020 07 02 Work logs resumed, working out donations]], 5 fields
8301 [[2018 08 23 Current projects]], 6 fields, text/x-markdown
8183 [[State of life, May 2018]], 5 fields
7618 [[07 Espiral - Luces y sombras]], 5 fields
7525 [[Conversations with Goethe notes]], 5 fields
7492 [[04 Espiral - ¿Quién es el yo que se encuentra dentro de mi piel? DEPRECATED]], 5 fields
7319 [[2018 07 29 Planning at the gym]], 6 fields, text/x-markdown
7166 [[2019 10 20 ACT]], 6 fields, text/x-markdown
7149 [[Intellect Optional]], 5 fields
7138 [[2019 12 17 The day ahead]], 5 fields
7060 [[2018 06 29 Bézier Game]], 5 fields
7054 [[Reir ejercicio 4]], 5 fields
6942 [[2020 01 01 Tales of fire and devotion]], 6 fields, text/x-markdown
6871 [[2020 02 25 Cerrando frentes y narración de tareas]], 6 fields, text/x-markdown
6713 [[01 Espiral - La alborada del ser]], 5 fields
6665 [[2019 11 19 Journal II]], 6 fields, text/x-markdown
6537 [[2018 06 26 airbnb and starting blog]], 5 fields
6442 [[Marihuana]], 6 fields, text/x-markdown
6325 [[Email exchange june 2020]], 5 fields
6302 [[2019 07 02 Pueyo de Fañanas → Huesca]], 6 fields, text/x-markdown
6276 [[Chinese box]], 6 fields, text/x-markdown
6270 [[2018 07 30 Carrying the hiking backpack on the bike]], 6 fields, text/x-markdown
6263 [[2018 06 28 Airbnb and publishing set-up]], 5 fields
6235 [[What is the virtuegraph]], 5 fields
6221 [[2018 06 25 Receiving AirBnB guests and new online presence]], 5 fields
6051 [[2019 06 17 Cervera → Torá]], 6 fields, text/x-markdown
6042 [[03 Espiral - Existen dos universos, uno a cada lado de la piel]], 5 fields
5903 [[2019 06 28 Monzón, day 1]], 6 fields, text/x-markdown
5885 [[2019 10 10 How to make a good mission great]], 6 fields, text/x-markdown
5826 [[02 Espiral - La urdimbre de la consciencia]], 5 fields
5785 [[2019 04 09 Signs, meaning and rationality]], 5 fields
5701 [[Custom stylesheet]], 6 fields, text/css
5682 [[The Racial Performance Gap]], 5 fields
5679 [[2019 10 14 Without electricity]], 6 fields, text/x-markdown
5458 [[2019 03 15 Time flowing backwards]], 5 fields
5368 [[06 Espiral - Encuentros]], 5 fields
5293 [[On Bathroom Gender]], 5 fields
5256 [[2018 07 05 Exploring places to work in Madrid]], 5 fields
5244 [[The Virtuegraph for depression]], 5 fields
5208 [[2018 06 27 Project Arete and airbnb work]], 5 fields
5184 [[Here are the hands speaking]], 5 fields
5182 [[2019 05 22 Presence II]], 6 fields, text/x-markdown
5146 [[The inward exploration]], 5 fields
5075 [[2020 07 27 Mares turbulentos]], 5 fields
4971 [[2019 11 01 Writing as therapy]], 6 fields, text/x-markdown
4913 [[2020 07 10 Todo es trabajo]], 5 fields
4903 [[2020 07 17 flujo de la consciencia]], 5 fields
4878 [[2019 06 29 Monzón → Berbegal]], 5 fields
4860 [[What makes a good workplace?]], 5 fields
4817 [[2018 08 02 Entrevías and Vallecas]], 6 fields, text/x-markdown
4817 [[Todo es trabajo]], 5 fields
4816 [[10 Espiral - el despertar de la conciencia]], 5 fields
4775 [[2018-07-22 Rabid dogs]], 6 fields, text/x-markdown
4762 [[2018 12 11 Work logs resumed]], 5 fields
4749 [[2019 01 04 The voice inside my head]], 6 fields, text/x-markdown
4722 [[About me 2018]], 5 fields
4707 [[2019 03 14 The subjective experience]], 5 fields
4665 [[2020 07 28 El ego carga la llave para abrir el corazón]], 5 fields
4602 [[2020 03 30 Quarantine log: experiment ended, reality begins]], 5 fields
4567 [[Zangarrón Mask]], 5 fields
4498 [[2019 04 12 I digress]], 5 fields
4496 [[2019-08-01 Castro Urdiales → Güemes]], 6 fields, text/x-markdown
4462 [[2019 04 16 Changing tires]], 5 fields
4445 [[2019 01 08 The ego on the driver's seat]], 6 fields, text/x-markdown
4421 [[2019 04 20 After the camino]], 5 fields
4375 [[2019 11 19 Journal I prompts]], 5 fields
4315 [[The Creative Reincarnation]], 5 fields
4313 [[Where I am in life, last day of 2019]], 5 fields
4300 [[2019 12 13 Scorpion]], 5 fields
4250 [[2020 04 11 Quarantine Diaries]], 5 fields
4203 [[2018 07 09 Reina Sofía Library]], 5 fields
4202 [[2019 02 11 Kindness]], 5 fields
4186 [[2019 08 16 Excalibur biface]], 6 fields, text/x-markdown
4146 [[2019 08 18 Observing emotion]], 5 fields
4140 [[2019 05 08 Is austerity uncomfortable after you try better things?]], 5 fields
4108 [[2019 05 18 Allegory of the chefs]], 6 fields, text/x-markdown
4061 [[2019 03 22 Morsels of experience]], 5 fields
4060 [[2020 08 06 Doctor Google]], 5 fields
4017 [[2019 03 16 Sickness and work]], 5 fields
4017 [[2019 10 22 Third night in a row without electricity]], 5 fields
3965 [[2018 07 11 Bézier Game]], 5 fields
3953 [[2020 07 31 Inteligencia visual e inteligencia artificial]], 5 fields
3929 [[2019 12 23 On expressing emotions]], 5 fields
3878 [[2019 12 12 Tying a rope to a tree]], 5 fields
3867 [[2019 05 07 On group discussions]], 6 fields, text/x-markdown
3857 [[2018 07 31 Losing by being honest]], 6 fields, text/x-markdown
3837 [[2019 02 12 Statistics and advertisers]], 5 fields
3837 [[2020 07 16 Sufrimiento y redención]], 5 fields
3821 [[Life advice]], 5 fields
3815 [[2019 04 24 Random thoughts]], 6 fields, text/x-markdown
3736 [[2019 02 26 Marcus Aurelius]], 5 fields
3732 [[2019 06 03 Moving again]], 5 fields
3723 [[2019 03 01 All questions resolved]], 6 fields, text/x-markdown
3702 [[2018 07 16 Orcasitas]], 6 fields, text/x-markdown
3678 [[2019 05 15 Goethian Science]], 5 fields
3658 [[2020 01 31 Material and digital productivity]], 6 fields, text/x-markdown
3649 [[2019 08 30 Stomach hands]], 5 fields
3622 [[2019 02 23 Working route day]], 6 fields, text/x-markdown
3600 [[2020 07 30 Method Draw y mi práctica de meditación actual]], 5 fields
3597 [[Habit breakers]], 5 fields
3596 [[2020 07 19 Una taxonomía de los sueños]], 5 fields
3581 [[2019 09 25 Discarding sacred objects]], 5 fields
3566 [[2019 06 13 Montserrat]], 6 fields, text/x-markdown
3556 [[2019 10 24 log: The flood took everything]], 5 fields
3554 [[2019 02 02 Of dependencies and mice]], 5 fields
3551 [[2020 07 20 Habrá mudanza antes del final de año]], 5 fields
3539 [[2018 08 20 Bezier Game, Goethe, Notebits]], 5 fields
3524 [[2019 05 27 Existential wanderings]], 6 fields, text/x-markdown
3504 [[2019 07 01 Berbegal → Pueyo de Fañanas]], 6 fields, text/x-markdown
3502 [[2019 01 05 The mind projects itself]], 5 fields
3499 [[2018 26 08 The virtuegraph]], 5 fields
3487 [[2019 12 31 Future sensing, an alternative to new year's resolutions]], 6 fields, text/x-markdown
3482 [[2019 01 19 Today was better than yesterday]], 5 fields
3481 [[2019 08 26 Lost passport]], 5 fields
3476 [[2019 08 28 Lightness and darkness]], 5 fields
3450 [[2019 12 17 Stream of thought]], 5 fields
3422 [[2020 02 05 2019 vs 2020]], 6 fields, text/x-markdown
3420 [[2018 07 06 Bézier Game]], 5 fields
3401 [[2019 07 23 Zumaia → Deba]], 6 fields, text/x-markdown
3379 [[2019 06 30 Berbegal, day 1]], 6 fields, text/x-markdown
3358 [[2019 12 02 Let's explore this path for a while, it looks promising]], 5 fields
3357 [[2019 05 09 Intuition and bikes]], 6 fields, text/vnd.tiddlywiki
3356 [[2019 04 29 New library, boring meals]], 6 fields, text/x-markdown
3352 [[2020 02 24 Workshops and factories]], 6 fields, text/x-markdown
3343 [[Advice to myself starting a sabbatical period]], 5 fields
3332 [[2019 05 18 Sunday of intense work]], 5 fields
3327 [[2020 07 08 Dos meses de bitácoras de trabajo en español]], 5 fields
3301 [[Why TiddlyWiki]], 5 fields
3299 [[2019 06 14 Montserrat → Igualada]], 6 fields, text/x-markdown
3229 [[2019-10-28 log: Sorting stones]], 5 fields
3214 [[On Gender]], 5 fields
3208 [[2019 03 19 Do things, tell people]], 6 fields, text/x-markdown
3197 [[Father's Day Messages 2020]], 5 fields
3180 [[2019 10 30 Registering thought]], 5 fields
3169 [[2019 11 05 Recount of the day]], 6 fields, text/x-markdown
3157 [[2019 08 24 Old dreams]], 6 fields, text/x-markdown
3153 [[2019 07 26 Camino log: Ziortza → Guernica]], 6 fields, text/x-markdown
3146 [[2018 07 26 Lost and recovered phone]], 5 fields
3133 [[2018-08-18 a lot of wisdom is required to work for oneself]], 5 fields
3110 [[2019 12 27 Live thinking]], 5 fields
3095 [[2020 08 23 Psicomagia]], 5 fields
3094 [[2019 03 25 Self promotion]], 6 fields, text/x-markdown
3081 [[2019 09 30 Spiritual cognition]], 5 fields
3053 [[2019 03 04 Feminism]], 5 fields
3025 [[2020 07 26 El yo-crítico]], 5 fields
3023 [[2019 05 30 Sci-fi scenarios]], 5 fields
3018 [[At the noon of life]], 5 fields
3016 [[Essay - At the noon of life]], 5 fields
2997 [[2020 08 03 Method Draw, deseos de caminar]], 5 fields
2983 [[2019 06 24 Tárrega → Balaguer]], 6 fields, text/x-markdown
2974 [[Lunch with Óscar]], 5 fields
2971 [[2019 08 05 Santillana del Mar → Comillas]], 6 fields, text/x-markdown
2970 [[2019 09 30 Separating professional and spiritual work]], 6 fields, text/x-markdown
2969 [[2020 07 07 Sacrifice]], 5 fields
2968 [[2019 01 23 Tumble and fall]], 5 fields
2959 [[2019 02 28 Gratitude and performance]], 5 fields
2958 [[2019 12 31 Predictions instead of resolutions]], 5 fields
2956 [[2019 06 19 Cervera, day 1]], 6 fields, text/x-markdown
2948 [[2020 08 07 El dilema del tranvía]], 5 fields
2934 [[2019 05 17 Putting habits into practice]], 5 fields
2928 [[2019 07 08 Santa Cilia → Arrés]], 6 fields, text/x-markdown
2922 [[2019 12 28 learning from the shadow]], 5 fields
2919 [[2019 02 15 Karma Yoga]], 5 fields
2904 [[2020 02 19 Live debugging stream of thought]], 5 fields
2893 [[2020 08 16 Todo lo que soy, son imaginaciones]], 5 fields
2889 [[2019 06 27 Tamarite de Litera - Monzón]], 6 fields, text/x-markdown
2886 [[2019 12 27 Pleasure and pain]], 5 fields
2869 [[2018 07 18 Forcing oneself to work only depletes the energies that remain]], 6 fields, text/x-markdown
2858 [[2019 12 05 A mind that worries]], 6 fields, text/x-markdown
2856 [[2019 06 21 Cervera, day 2]], 6 fields, text/x-markdown
2855 [[2019 05 13 Choosing sides]], 5 fields
2844 [[2019 10 17 Heal or Sacrifice]], 5 fields
2835 [[2018 07 24 Packing things which I don't need]], 6 fields, text/x-markdown
2831 [[2018 08 21 Work done]], 5 fields
2831 [[2019-12-04 Poison or medicine]], 5 fields
2826 [[2018 07 02 Airbnb, streaky, bezier]], 5 fields
2821 [[A fall from the rope]], 5 fields
2805 [[2019 06 05 Introspecting into presence]], 6 fields, text/x-markdown
2800 [[2020 07 23 enraizando el trabajo técnico]], 5 fields
2798 [[2020 07 21 El cuerpo natural]], 5 fields
2791 [[2020 08 18 inner.observer y exploration.work]], 5 fields
2787 [[2019 12 12 Impromptu poetry]], 5 fields
2780 [[2019 06 24 Cervera → Tárrega]], 6 fields, text/x-markdown
2755 [[2019 10 15 Gym progress explorations]], 5 fields
2737 [[2019 07 20 Irún → Pasai Donibane]], 6 fields, text/x-markdown
2737 [[HN Comments design and development]], 5 fields
2722 [[Incendio del otro lado del río]], 5 fields
2716 [[2020 08 20 Lo que resta de agosto será para proyectos personales]], 5 fields
2705 [[2018 09 03 Moving, again]], 5 fields
2704 [[2020 0423 For the log reader: a silent pre-release]], 5 fields
2702 [[2019-03-20 A change of name]], 6 fields, text/x-markdown
2698 [[The keystone]], 5 fields
2695 [[2018 07 07 Work place explorations]], 5 fields
2691 [[2019 02 27 A few screws loose]], 6 fields, text/x-markdown
2690 [[The Dog]], 5 fields
2687 [[2018 12 26 Integrity transcending all manifestations]], 5 fields
2671 [[2020 03 13 Unconcerned action]], 5 fields
2663 [[2019 01 15 New workplace]], 5 fields
2661 [[Symptom: life is meaningless]], 5 fields
2659 [[Phone calls (stream of thought)]], 5 fields
2656 [[Keyboard meditation]], 5 fields
2651 [[2019 11 27 Journal III]], 5 fields
2649 [[2019 03 08 Tying loose ends]], 5 fields
2643 [[2019 08 15 A Monk's Guide to a Clean House and Mind]], 5 fields
2636 [[Pinecone]], 5 fields
2632 [[Phone calls or messages]], 5 fields
2629 [[2019 01 30 Paper.js]], 6 fields, text/x-markdown
2619 [[2019 02 18 Release dates]], 6 fields, text/x-markdown
2613 [[2019 02 23 Questions followed up]], 6 fields, text/x-markdown
2607 [[2019 01 09 Setback]], 6 fields, text/x-markdown
2603 [[2019 07 03 Huesca, day 1]], 5 fields
2597 [[The highest dwelling]], 5 fields
2595 [[2020 02 03 The Symposium]], 5 fields
2593 [[2020 07 12 El día sabático]], 5 fields
2576 [[The Higher Shelter]], 5 fields
2562 [[2019 09 21 Anti-ideologue]], 5 fields
2531 [[2019 02 01 Chiaroscuro]], 5 fields
2531 [[2020 03 21 Quarantine Prelude]], 5 fields
2529 [[2019 04 13 Unattached experience]], 5 fields
2529 [[Reading list]], 5 fields
2523 [[2019 06 15 Igualada → La Panadella]], 6 fields, text/x-markdown
2521 [[2019 03 24 On dreams]], 5 fields
2487 [[Polarities]], 6 fields, text/x-markdown
2480 [[2019 05 10 the present moment]], 5 fields
2475 [[2019 03 13 Waiting for the mud to settle]], 5 fields
2471 [[2019 08 14 Consistent people]], 5 fields
2462 [[2019 02 17 Money in creative endavors]], 5 fields
2455 [[2019 06 25 Balaguer → Algerri]], 6 fields, text/x-markdown
2455 [[Doctor Simi]], 5 fields
2447 [[2018 12 12 The activity itself is the reward]], 5 fields
2446 [[2019 01 26 Calm after the storm]], 5 fields
2446 [[2020 08 15 Despreciar es meterse en la tarea de los demás]], 5 fields
2438 [[2019 05 12 Beauty and work]], 5 fields
2430 [[2019 08 19 From my phone]], 5 fields
2430 [[2020 02 10 A dead rooster]], 6 fields, text/x-markdown
2424 [[Skin tone]], 5 fields
2422 [[2019 08 02 Güemes → Santander]], 6 fields, text/x-markdown
2418 [[2020 06 24 Thoughts on pot]], 5 fields
2395 [[2020 04 24 KG mobile]], 5 fields
2394 [[2020 03 23 Experiments]], 5 fields
2376 [[2020 03 05 Blank Page reader]], 5 fields
2363 [[2020 03 14 Washing hands]], 5 fields
2359 [[2018 07 27 Will vs action]], 6 fields, text/x-markdown
2356 [[2019 07 09 Arrés → Artiega]], 5 fields
2350 [[2018 07 03 Bézier Game]], 5 fields
2342 [[HN comment: on science measuring design]], 5 fields
2332 [[2019 06 18 Torá → Cervera]], 6 fields, text/x-markdown
2321 [[2019 09 09 Intolerance to intolerance to tolerance]], 5 fields
2316 [[2020 02 04 Development time estimates]], 5 fields
2315 [[2019 07 28 Larrabetzu → Bilbao]], 6 fields, text/x-markdown
2313 [[2018 12 14 Recovery]], 5 fields
2313 [[2019 11 04 Collaboration and cleaning]], 5 fields
2299 [[2020 07 15 La procrastinación, o la evasión de la acción]], 5 fields
2291 [[2020 01 18 One year ago...]], 5 fields
2289 [[2020 03 18 Time to stay home]], 5 fields
2279 [[2018 12 31 New year's or football match]], 6 fields, text/x-markdown
2260 [[2019 10 04 Indignation without action is poison]], 5 fields
2258 [[The purpose of life]], 5 fields
2252 [[Virtuegraph design statement]], 5 fields
2245 [[2020 05 08 KernType released (publicly)]], 5 fields
2236 [[2020 01 02 Accessibility]], 5 fields
2223 [[Essay: El defensor de damiselas en apuros]], 5 fields
2219 [[2020 03 22 Water]], 5 fields
2197 [[2019 02 10 Sunday of leisurely work]], 5 fields
2194 [[2019 01 10 A new boss is hired]], 5 fields
2191 [[2020 07 03 The spiritual backbone of work]], 5 fields
2190 [[2020 08 22 El cuerpo]], 5 fields
2158 [[2018 07 20 Use the faculties of exploration]], 6 fields, text/x-markdown
2157 [[2019 02 23 Questions]], 6 fields, text/x-markdown
2152 [[2019 03 17 Fever driven design]], 5 fields
2152 [[2019 07 31 Castro Urdiales → Laredo]], 6 fields, text/x-markdown
2141 [[2019 01 07 A new state emerges]], 5 fields
2128 [[2019 01 21 Tool making]], 5 fields
2126 [[2019 01 28 Momentum]], 5 fields
2123 [[2019 10 31 Rush]], 5 fields
2115 [[2019 12 09 Palm tree]], 5 fields
2111 [[Devotional writing]], 6 fields, text/x-markdown
2109 [[2019 02 14 Stream of consciousness]], 5 fields
2105 [[On transforming libido]], 5 fields
2099 [[2018 06 14 What makes a good work route]], 5 fields
2095 [[2018 08 01 I suffer from the opposite of hypochondria]], 5 fields
2093 [[2019 12 31 Placing pieces of the puzzle]], 5 fields
2092 [[2018 07 19 We equate satisfaction in work by the effort and time expended]], 6 fields, text/x-markdown
2092 [[2019 04 11 Spiritual algebra]], 5 fields
2085 [[2020 08 17 About]], 5 fields
2080 [[2019 08 25 Stupid users]], 5 fields
2079 [[2019 12 21 Christmas meal]], 5 fields
2076 [[2018 12 22 Work manifesting itself in dreams]], 5 fields
2075 [[Exploring the senses]], 6 fields, text/x-markdown
2073 [[Course Description]], 5 fields
2072 [[Random Thoughts on Psychology]], 5 fields
2071 [[2019 11 04 Moving forward]], 5 fields
2060 [[2020 07 14 Trabajando al exterior]], 5 fields
2056 [[2018 07 17 Sebas visit]], 5 fields
2050 [[2019 08 13 A stone in the shoe]], 5 fields
2048 [[2019 01 14 Sleeplessness]], 5 fields
2042 [[2019 01 24 The Kingdom of God is Within]], 5 fields
2033 [[2020 01 24 It's Friday]], 5 fields
2026 [[2019 05 03 Barcelona]], 5 fields
2022 [[On body language]], 5 fields
2016 [[2019 09 27 Old friends, old places]], 5 fields
2012 [[2019 01 17 Turbulent waters]], 5 fields
2008 [[Insight - A house with an expiry date]], 5 fields
2000 [[2019 01 01 Intuition driven development]], 5 fields
1995 [[2019 03 22 Morsels of experience II]], 6 fields, text/x-markdown
1995 [[2020 01 11 Designing from the Spirit]], 5 fields
1985 [[2018 08 11 Bike stolen]], 5 fields
1973 [[HN Comment: on personal responsibility and isolation]], 5 fields
1968 [[2019 05 18 Writing first thing in the morning]], 5 fields
1947 [[2018 12 15 Feature driven development]], 5 fields
1942 [[2020 01 08 Computer repair technician]], 5 fields
1941 [[2018 12 29 The sense of pleasure]], 5 fields
1936 [[2019 09 26 Cancún → Puebla]], 5 fields
1929 [[HN Comment: Continental social science]], 5 fields
1924 [[2019 07 21 Pasai Donibane → Oriol]], 6 fields, text/x-markdown
1921 [[2019 02 10 Synergies]], 5 fields
1919 [[2018 08 19 Registering gym progress]], 5 fields
1909 [[2018 12 28 Figuring out honest beggars]], 5 fields
1909 [[2019 11 10 Exploring the senses, interrupted]], 5 fields
1904 [[El asesinato de mi sombra]], 5 fields
1903 [[2019 02 21 Hypomania]], 5 fields
1895 [[Links Canal de Interacción]], 6 fields
1890 [[2020 08 21 Civilización]], 5 fields
1886 [[Principles for the noon of life]], 5 fields
1876 [[2019 02 28 On public speaking]], 5 fields
1864 [[2019 03 11 Not jumping yet]], 5 fields
1861 [[2019 10 02 Pedestrians]], 5 fields
1855 [[2020 01 22 Impromptu Sabbath]], 5 fields
1853 [[2019 01 20 Experimenting with format]], 5 fields
1852 [[2019 12 18 Wisdom and spirit]], 5 fields
1846 [[2019 02 24 jammed doors]], 6 fields, text/x-markdown
1843 [[2020 01 20 On chivalry]], 5 fields
1843 [[2020 08 06 Enfermedad física y espiritual]], 5 fields
1836 [[2019 02 19 The veiled sun]], 5 fields
1827 [[2019 07 27 Guernica → Larrabetzu]], 6 fields, text/x-markdown
1826 [[2018 12 23 Help others shine]], 5 fields
1826 [[2020 07 22 Saber recibir]], 5 fields
1825 [[2018 12 20 Zooming in the fractal]], 5 fields
1819 [[2019 11 25 A ladder]], 5 fields
1809 [[2020 03 10 A murky stream of thought]], 5 fields
1794 [[2019 10 18 Back in college]], 5 fields
1793 [[2019 10 21 Impending sense of flow]], 5 fields
1789 [[2019 06 26 Algerri → Tamarite de Litera]], 6 fields, text/x-markdown
1786 [[2020 01 30 Sickness]], 5 fields
1782 [[2020 07 29 Días nublados]], 5 fields
1764 [[2019 02 05 Give as much care to the end as to the beginning]], 5 fields
1757 [[2019 02 03 Stress is optional]], 5 fields
1744 [[2020 03 25 Mom's visit]], 5 fields
1736 [[2020 07 24 viernes sabático]], 5 fields
1732 [[Who am I]], 5 fields
1729 [[HN Comment: The Way]], 5 fields
1725 [[2020 04 20 Writing without attachment]], 5 fields
1724 [[HN Comment: Impostor's syndrome]], 5 fields
1721 [[2020 04 24 The Boolean Game is a PWA now]], 5 fields
1715 [[2019 10 03 Reuniting professional and spiritual work]], 5 fields
1706 [[2020 06 18 Sense of mastery in writing]], 5 fields
1700 [[2020 07 23 Carta para mi prima Helen]], 5 fields
1696 [[The divine spark]], 5 fields
1695 [[HN Commment: revenge on spammer]], 5 fields
1683 [[Streams of thought]], 5 fields
1678 [[2019 12 20 Projects as small talk]], 5 fields
1677 [[2018 08 03 Asking for the time]], 5 fields
1674 [[HN Comment: on AB testing]], 5 fields
1664 [[2020 03 11 Cards]], 5 fields
1662 [[Mark MacKay]], 5 fields
1661 [[2018 07 25 Description of work done]], 5 fields
1649 [[2019 07 04 Huesca → Bolea]], 6 fields, text/x-markdown
1638 [[2020 03 26 Unsolicited help]], 5 fields
1632 [[2018 12 27 Finding fulfillment in work again]], 5 fields
1630 [[Todos y todas]], 5 fields
1618 [[2019 01 29 Sunset]], 5 fields
1593 [[2019 02 13 Onboarding instructions]], 5 fields
1588 [[2018 12 21 Stale projects finding new life]], 5 fields
1576 [[2019 07 10 Artieda → Sangüesa]], 6 fields, text/x-markdown
1572 [[2018 08 30 Server administration woes]], 5 fields
1564 [[HN Comment: Frustrations with wikipedia]], 5 fields
1559 [[2018 08 07 The nature of work]], 5 fields
1537 [[2020 04 21 Boredom is the mother of all invention]], 5 fields
1533 [[2019 07 19 Hendaye → Irún]], 6 fields, text/x-markdown
1533 [[Libido and masculinity]], 5 fields
1525 [[2019 01 06 Good news]], 5 fields
1524 [[2020 02 20 Blank.page en castellano]], 5 fields
1523 [[2020 05 25 Work logs paused]], 6 fields
1522 [[2020 07 29 Sufrimiento existencial]], 6 fields, text/x-markdown
1519 [[2019 07 29 Bilbao → Pobeña]], 6 fields, text/x-markdown
1518 [[2019 07 22 Oriol → Zumaia]], 6 fields, text/x-markdown
1513 [[2019 03 09 Mystery problems are interesting]], 5 fields
1501 [[2019 02 20 Zealous teachers]], 5 fields
1499 [[2018 07 14 Exploring paper.js]], 5 fields
1495 [[2019 08 03 Santander → Requejada]], 6 fields, text/x-markdown
1493 [[2019 03 07 Landing screen]], 5 fields
1493 [[2020 03 03 Present moment, Nina]], 5 fields
1491 [[2019 05 16 Tiredness]], 5 fields
1491 [[2019 06 22 Cervera day 3]], 5 fields
1489 [[HN Commment MOA data loss]], 5 fields
1488 [[2019 01 27 Small victory]], 5 fields
1485 [[2020 04 28 What was done today in matters of work]], 5 fields
1478 [[HN Comment on switching countries]], 5 fields
1474 [[2018 12 30 Kicking children]], 5 fields
1460 [[Artist Box]], 5 fields
1456 [[2020 08 13 ¿Qué es sentirse saludable?]], 5 fields
1445 [[2019 12 30 log: a glimpse of the true shadow]], 5 fields
1442 [[2019 02 08 Transcending principles II]], 5 fields
1432 [[HN Comment: on wickedness and virtue]], 5 fields
1413 [[2020 01 28 Blank page]], 5 fields
1411 [[Práctica de meditación 2020]], 5 fields
1410 [[2019 01 02 Milking less than the milkman]], 5 fields
1404 [[2019 08 04 Requejada → Santillana del Mar]], 6 fields, text/x-markdown
1393 [[2018 07 12 Knotty code dread]], 5 fields
1392 [[2020 01 28 Constraints]], 5 fields
1389 [[Consuming information]], 5 fields
1381 [[2020 02 17 Silence is pursued]], 5 fields
1380 [[2019 03 16 On uncertainty]], 5 fields
1375 [[What is Runge]], 5 fields
1373 [[2019 08 29 En castellano]], 5 fields
1362 [[2019 03 05 Hesitant to cross the finish line]], 6 fields, text/x-markdown
1361 [[Fourth way group]], 5 fields
1341 [[2019 07 13 Puente La Reina → Pamplona]], 6 fields, text/x-markdown
1337 [[HN Comment]], 5 fields
1329 [[2019 07 17 Urdax → Sare]], 6 fields, text/x-markdown
1328 [[HN Comment Creator centered design]], 5 fields
1323 [[HN Comment depression and exercise]], 5 fields
1320 [[2019 10 23 Imagination vs reality]], 5 fields
1315 [[2020 05 07 KernType released (silently)]], 5 fields
1299 [[2020 01 06 Riding waves]], 5 fields
1295 [[2019 07 24 Deba → Markina-Xemein]], 6 fields, text/x-markdown
1294 [[2019 12 08 Inner and outer self portrait]], 5 fields
1286 [[2019 10 01 (authentic AND isolated) OR (connected AND compromising)]], 5 fields
1283 [[Email to Jose Luis]], 5 fields
1265 [[HN Comment rules for newsletters]], 5 fields
1260 [[2019 10 30 and again]], 5 fields
1259 [[2019 10 22 The garden]], 5 fields
1251 [[2019 10 12 Chinese box]], 6 fields, text/x-markdown
1241 [[2019 07 14 Pamplona → Olagüe]], 6 fields, text/x-markdown
1236 [[Spring out of bed into action]], 5 fields
1216 [[2018 12 17 Beast Mode]], 5 fields
1215 [[Goethe's intuition]], 5 fields
1215 [[HN Comment on watching TV]], 5 fields
1215 [[HN Comment: marketing surveys]], 5 fields
1213 [[2019 01 16 Lousy day]], 5 fields
1193 [[HN comment on building it yourself]], 5 fields
1192 [[2019 11 02 Today is the day]], 5 fields
1190 [[Avicenna and Psychomagic]], 5 fields
1181 [[Hypatia]], 5 fields
1179 [[Goethe notes on color]], 5 fields
1173 [[2018 07 23 Holding breath]], 6 fields, text/x-markdown
1165 [[2019 06 16 La Panadella → Cervera]], 6 fields, text/x-markdown
1154 [[2019 12 03 video experiments]], 5 fields
1146 [[2019 10 09 House of spiritual exercises]], 5 fields
1145 [[2019 09 06 On working with love]], 5 fields
1143 [[2018 12 19 Be like water]], 5 fields
1129 [[Draft: Letters of Hernán Cortés to the King of Spain]], 5 fields
1127 [[Dream: Virtual Reality]], 5 fields
1127 [[Exploring in development and the real world]], 5 fields
1127 [[HN Comment: on trying new things]], 5 fields
1109 [[2020 03 24 Noon]], 5 fields
1102 [[2019 02 07 Build step]], 5 fields
1081 [[Find the bullshit]], 5 fields
1060 [[2019 07 18 Sare → Hendaye]], 6 fields, text/x-markdown
1060 [[2019 07 30 Pobeña → Castro Urdiales]], 5 fields
1059 [[Viewports]], 5 fields
1055 [[HN Comment on science ignoring outliers]], 5 fields
1050 [[2018 08 12 Proof of work]], 5 fields
1049 [[HN Comment: Designers who code]], 5 fields
1041 [[Inferring location through intuition and logic]], 5 fields
1037 [[2019 08 11 Madrid]], 5 fields
1014 [[HN comment: filling the gap between engineering and design]], 5 fields
996 [[HN Comment: Europe and nature]], 5 fields
994 [[2019 03 10 Hesitating at the ledge]], 5 fields
992 [[2020 04 25 KG locking characters]], 5 fields
972 [[2019 01 31 The badlands]], 5 fields
970 [[How you dealt with impostor's syndromer]], 5 fields
961 [[Poladura de la Tercia]], 5 fields
952 [[2020 07 13 De lo tosco a lo bello]], 5 fields
945 [[2019 01 11 Wu wei]], 5 fields
944 [[2018 08 27 Hangovers happen]], 5 fields
943 [[Virtuelist 2018]], 5 fields
942 [[2019 05 23 Observations]], 5 fields
938 [[2019 07 16 Berroeta → Urdax]], 6 fields, text/x-markdown
933 [[2018 08 16 Give the present moment what it needs]], 5 fields
933 [[2019 11 09 Step out of the center]], 5 fields
927 [[HN Comment on designing cheap things]], 5 fields
927 [[HN Comment: borders]], 5 fields
925 [[2020 02 01 Quick update]], 5 fields
924 [[2019 02 04 Tired and unfocused]], 5 fields
918 [[How a building was explored]], 5 fields
916 [[2019 07 05 Bolea → Sarsamacuello]], 6 fields, text/x-markdown
906 [[Thoughts on TiddlyWiki]], 5 fields
904 [[2019 01 12 Too tired to find a title]], 5 fields
904 [[2019 06 04 Indecision]], 5 fields
900 [[2019 10 09 Quicky before work]], 5 fields
895 [[2018 08 17 Goethe had no tricks for work]], 5 fields
887 [[2019 10 25 I am exhausted but happy]], 5 fields
879 [[2018 09 10 Work logs ceased]], 5 fields
871 [[2019 08 28 It's time to polish my writing]], 5 fields
862 [[2020 06 05 maskjerseys.com]], 5 fields
854 [[2018 08 15 Madrid is closed]], 5 fields
854 [[HN Comment: on motivating yourself through binding]], 5 fields
839 [[2019 06 23 Cervera day 4]], 6 fields, text/x-markdown
837 [[2019 07 06 Sarsamarcuello → Ena]], 6 fields, text/x-markdown
837 [[2019 11 12 logs paused]], 5 fields
836 [[2019 07 15 Olagüe → Berroeta]], 6 fields, text/x-markdown
835 [[2018 08 29 Describing work routes]], 5 fields
813 [[2018 08 28 The work done today]], 5 fields
812 [[HN Comment: on timeless design]], 5 fields
810 [[HN Comment persuation and work]], 5 fields
799 [[2019 10 11 Beyond the superficial]], 5 fields
793 [[2019 2019 03 Exhaustion]], 5 fields
789 [[HN Comment: Passion and startups]], 5 fields
780 [[HN Comment: history of technology]], 5 fields
777 [[HN Comment: working without attachment]], 5 fields
777 [[Reir para escribir exercises]], 5 fields
774 [[HN comment: Lab Meat]], 5 fields
761 [[Worldviews]], 5 fields
754 [[2019 05 28 Bad day]], 5 fields
748 [[2019 07 12 Monreal → Puente la Reina]], 6 fields, text/x-markdown
746 [[There is something I can't say]], 5 fields
744 [[Citrus × aurantiifolia (Lime tree)]], 5 fields
738 [[2019 03 06 Exhausted]], 5 fields
731 [[Psycheshock Therapy]], 5 fields
719 [[2019 05 31 Brief observations]], 5 fields
714 [[Possible games]], 5 fields
711 [[HN Comment on building stuff]], 5 fields
702 [[Individuation]], 5 fields
700 [[Tolstoy on the meaningless-ness of our work]], 5 fields
692 [[2018 08 22 Shapeshifting mood and weather]], 5 fields
684 [[2018 12 13 Happiness hangover]], 5 fields
663 [[2019 06 12 Project finished]], 5 fields
647 [[2018 07 13 airbnb deep cleaning]], 5 fields
635 [[2019 01 18 Transitions are not immediate]], 5 fields
625 [[HN Comment: Gurdieff and Alan Watts]], 5 fields
621 [[Runge resources]], 5 fields
613 [[2019 02 16 Work, museum, nap, work]], 5 fields
612 [[2019 06 07 Groaning]], 5 fields
606 [[2019 10 06 Back home]], 5 fields
601 [[Authenticity]], 5 fields
596 [[HN Comment: reducing cost makes a product more useful]], 5 fields
586 [[On Psychological Therapy]], 5 fields
586 [[Urban navigation]], 5 fields
563 [[2019 07 11 Sangüesa → Monreal]], 6 fields, text/x-markdown
563 [[Today's to-do list]], 5 fields
549 [[2019 03 13 Release]], 5 fields
535 [[HN Comment: Biking]], 5 fields
535 [[Masculinity]], 5 fields
519 [[Insight - Appreciation of personality]], 5 fields
517 [[2019 03 27 Work log paused]], 5 fields
510 [[HN Comment on Charity work]], 5 fields
495 [[Hotel in Las Vegas]], 5 fields
490 [[HN Comment: stating the problem resolves it]], 5 fields
481 [[Honesty]], 5 fields
477 [[2019 03 03 Why?]], 5 fields
470 [[Tolerance and intolerance]], 5 fields
462 [[Movements of personal progress]], 5 fields
459 [[HN Comment: RISUG]], 5 fields
457 [[HN Comment: Contact people who have had a significant effect on your life]], 5 fields
450 [[Socrates on strength]], 5 fields
446 [[Projects]], 6 fields, text/vnd.tiddlywiki
445 [[04 Espiral - ¿Quién es el yo que se encuentra dentro de mi piel?]], 5 fields
441 [[2020 01 13 logs paused]], 5 fields
424 [[HN Comment on bullies]], 5 fields
408 [[Mondays]], 5 fields
406 [[HN Comment: stray dogs]], 5 fields
397 [[2019 01 25 Questioning]], 5 fields
357 [[Work axioms]], 5 fields
349 [[Persea americana (Avocado tree)]], 5 fields
328 [[Hypoestes phyllostachya]], 5 fields
327 [[Phoenix dactylifera]], 5 fields
327 [[Volcán de colima]], 5 fields
319 [[Emptiness, Openness, serenity? Or Despair, boredom, loneliness?]], 5 fields
307 [[Xanthosoma]], 5 fields
305 [[Dracaena Fragans]], 5 fields
301 [[Dreams]], 5 fields
294 [[Bougainvillea]], 5 fields
288 [[Hippeastrum]], 5 fields
286 [[Things Jero recommended]], 5 fields
279 [[Tiddlers by file size]], 6 fields, text/vnd.tiddlywiki
240 [[Kinds of meditation]], 5 fields
221 [[Inner Observer]], 5 fields
210 [[Public Domain Resources]], 5 fields
183 [[2019 03 02 Work is done, then it is forgotten]], 5 fields
176 [[Express your desires to the group, that which is not expressed is acted]], 5 fields
167 [[Introspection notebook]], 5 fields
164 [[→ Journal]], 6 fields
158 [[masculinity]], 6 fields
158 [[Project: Runge]], 5 fields
153 [[Fractals javascript]], 5 fields
142 [[Awakening without an alarm]], 5 fields
141 [[TipoType]], 5 fields
135 [[Finding the sustainable rhythm]], 5 fields
133 [[Packs of male mammals]], 5 fields
133 [[Routes for work and pleasure]], 5 fields
130 [[The domestication of land]], 5 fields
128 [[Grow towards discomfort]], 5 fields
125 [[Ecology and religion]], 5 fields
123 [[design and development]], 5 fields
122 [[introspective-writing]], 5 fields
122 [[Ruta de cortés]], 5 fields
121 [[inaccurate-intuition]], 5 fields
120 [[possible futures]], 5 fields
120 [[spiritual-exercises]], 5 fields
119 [[What is nothing]], 5 fields
118 [[proto-translation]], 5 fields
118 [[stream of thought]], 5 fields
117 [[Method of Action]], 5 fields
116 [[proto-adventure]], 5 fields
115 [[sacred-objects]], 5 fields
114 [[illustrations]], 5 fields
114 [[introspection]], 5 fields
113 [[→ Projects]], 5 fields
113 [[→ Research]], 5 fields
113 [[authenticity]], 5 fields
113 [[essay-prompt]], 5 fields
113 [[Spirituality]], 5 fields
112 [[→ Writing]], 5 fields
112 [[exploration]], 5 fields
112 [[proto-essay]], 5 fields
112 [[proto-games]], 5 fields
112 [[proto-story]], 5 fields
112 [[psychomagic]], 5 fields
112 [[translation]], 5 fields
112 [[virtuegraph]], 5 fields
111 [[→ Dreams]], 5 fields
111 [[blabbering]], 5 fields
111 [[Blank Page]], 5 fields
111 [[book notes]], 5 fields
111 [[depression]], 5 fields
111 [[espiral]], 5 fields
111 [[fourth way]], 5 fields
111 [[inner work]], 5 fields
111 [[meditation]], 5 fields
111 [[outer work]], 5 fields
111 [[philosophy]], 5 fields
111 [[proto-poem]], 5 fields
111 [[Psychology]], 5 fields
111 [[psychology]], 5 fields
111 [[Quarantine]], 5 fields
111 [[technology]], 5 fields
111 [[TiddlyWiki]], 5 fields
111 [[typography]], 5 fields
110 [[education]], 5 fields
110 [[evolution]], 5 fields
110 [[excercise]], 5 fields
110 [[intuition]], 5 fields
110 [[method.ac]], 5 fields
110 [[tolerance]], 5 fields
109 [[dream]], 5 fields
109 [[feminism]], 5 fields
109 [[personal]], 5 fields
109 [[research]], 5 fields
109 [[Runge]], 5 fields
108 [[borders]], 5 fields
108 [[culture]], 5 fields
108 [[dualism]], 5 fields
108 [[español]], 5 fields
108 [[Español]], 5 fields
108 [[Reading]], 5 fields
108 [[Rewrite]], 5 fields
108 [[science]], 5 fields
107 [[biking]], 5 fields
107 [[camino]], 5 fields
107 [[design]], 5 fields
107 [[family]], 5 fields
107 [[garden]], 5 fields
107 [[gender]], 5 fields
107 [[goethe]], 5 fields
107 [[how-to]], 5 fields
107 [[Madrid]], 5 fields
107 [[nature]], 5 fields
107 [[photos]], 5 fields
107 [[plants]], 5 fields
107 [[shadow]], 5 fields
107 [[taoism]], 5 fields
107 [[virtue]], 5 fields
106 [[about]], 5 fields
106 [[books]], 5 fields
106 [[build]], 5 fields
106 [[eames]], 5 fields
106 [[essay]], 5 fields
106 [[games]], 5 fields
106 [[keith]], 5 fields
106 [[lists]], 5 fields
106 [[oscar]], 5 fields
106 [[quote]], 5 fields
106 [[Spain]], 5 fields
106 [[story]], 5 fields
105 [[home]], 5 fields
105 [[race]], 5 fields
105 [[Reir]], 5 fields
103 [[hn]], 5 fields
103 [[js]], 5 fields
103 [[ui]], 5 fields
"""
$:/themes/tiddlywiki/vanilla
{
"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 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\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n/*\n** Start with the normalize CSS reset, and then belay some of its effects\n*/\n\n{{$:/themes/tiddlywiki/vanilla/reset}}\n\n*, input[type=\"search\"] {\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\t-webkit-box-sizing: border-box;\n}\n\nhtml button {\n\tline-height: 1.2;\n\tcolor: <<colour button-foreground>>;\n\tbackground: <<colour button-background>>;\n\tborder-color: <<colour button-border>>;\n}\n\n/*\n** Basic element styles\n*/\n\nhtml {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};\n\ttext-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\nhtml:-webkit-full-screen {\n\tbackground-color: <<colour page-background>>;\n}\n\nbody.tc-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};\n\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\nh1, h2, h3, h4, h5, h6 {\n\tline-height: 1.2;\n\tfont-weight: 300;\n}\n\npre {\n\tdisplay: block;\n\tpadding: 14px;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\tword-break: normal;\n\tword-wrap: break-word;\n\twhite-space: {{$:/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\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/*\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/*\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-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}\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\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: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\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\tmargin-right: 7px;\n}\n\n.tc-tags-wrapper {\n\tmargin: 4px 0 14px 0;\n}\n\n.tc-missing-tiddler-label {\n\tfont-style: italic;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tfont-size: 11.844px;\n\tline-height: 14px;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n}\n\nbutton.tc-tag-label, span.tc-tag-label {\n\tdisplay: inline-block;\n\tpadding: 0.16em 0.7em;\n\tfont-size: 0.9em;\n\tfont-weight: 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: text-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/*\n** Page layout\n*/\n\n.tc-topbar {\n\tposition: fixed;\n\tz-index: 1200;\n}\n\n.tc-topbar-left {\n\tleft: 29px;\n\ttop: 5px;\n}\n\n.tc-topbar-right {\n\ttop: 5px;\n\tright: 29px;\n}\n\n.tc-topbar button {\n\tpadding: 8px;\n}\n\n.tc-topbar svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-topbar button:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-sidebar-header {\n\tcolor: <<colour sidebar-foreground>>;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {\n\tfont-weight: 300;\n}\n\n.tc-sidebar-header .tc-sidebar-lists p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-sidebar-header .tc-missing-tiddler-label {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-advanced-search input {\n\twidth: 60%;\n}\n\n.tc-search a svg {\n\twidth: 1.2em;\n\theight: 1.2em;\n\tvertical-align: middle;\n}\n\n.tc-page-controls {\n\tmargin-top: 14px;\n\tfont-size: 1.5em;\n}\n\n.tc-page-controls .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-menu-list-item {\n\twhite-space: nowrap;\n}\n\n.tc-menu-list-count {\n\tfont-weight: bold;\n}\n\n.tc-menu-list-subitem {\n\tpadding-left: 7px;\n}\n\n.tc-story-river {\n\tposition: relative;\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-sidebar-header {\n\t\tpadding: 14px;\n\t\tmin-height: 32px;\n\t\tmargin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-message-box {\n\t\tmargin: 21px -21px 21px -21px;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tposition: fixed;\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t\tbottom: 0;\n\t\tright: 0;\n\t\toverflow-y: auto;\n\t\toverflow-x: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tmargin: 0 0 0 -42px;\n\t\tpadding: 71px 0 28px 42px;\n\t}\n\n\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}\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\tpadding: 14px 42px 14px 42px;\n\tbackground-color: <<colour tiddler-info-background>>;\n\tborder-top: 1px solid <<colour tiddler-info-border>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-border>>;\n}\n\n.tc-tiddler-info p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour tiddler-info-tab-background>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-tab-background>>;\n}\n\n.tc-view-field-table {\n\twidth: 100%;\n}\n\n.tc-view-field-name {\n\twidth: 1%; /* Makes this column be as narrow as possible */\n\ttext-align: right;\n\tfont-style: italic;\n\tfont-weight: 200;\n}\n\n.tc-view-field-value {\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 14px 14px 14px 14px;\n\t}\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -14px 0 -14px;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 28px 42px 42px 42px;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};\n\t\tborder-radius: 2px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\">>\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -42px 0 -42px;\n\t}\n}\n\n.tc-site-title,\n.tc-titlebar {\n\tfont-weight: 300;\n\tfont-size: 2.35em;\n\tline-height: 1.2em;\n\tcolor: <<colour tiddler-title-foreground>>;\n\tmargin: 0;\n}\n\n.tc-site-title {\n\tcolor: <<colour site-title-foreground>>;\n}\n\n.tc-tiddler-title-icon {\n\tvertical-align: middle;\n\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\tbackground-color: <<colour tiddler-editor-background>>;\n\tline-height: 1.3em;\n\t-webkit-appearance: none;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\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: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n<<if-fluid-fixed text:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 0;\n\t\tposition: relative;\n\t\twidth: auto;\n\t\tleft: 0;\n\t\tmargin-left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\tmargin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tbottom: 0;\n\t\tright: 0;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 42px);\n\t}\n\n\"\"\" hiddenSidebarText:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 3em;\n\t\tmargin-right: 0;\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 84px);\n\t}\n\n\"\"\">>\n\n}\n\n/*\n** Toolbar buttons\n*/\n\n.tc-page-controls svg.tc-image-new-button {\n fill: <<colour toolbar-new-button>>;\n}\n\n.tc-page-controls svg.tc-image-options-button {\n fill: <<colour toolbar-options-button>>;\n}\n\n.tc-page-controls svg.tc-image-save-button {\n fill: <<colour toolbar-save-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-info-button {\n fill: <<colour toolbar-info-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-edit-button {\n fill: <<colour toolbar-edit-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-close-button {\n fill: <<colour toolbar-close-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-delete-button {\n fill: <<colour toolbar-delete-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-cancel-button {\n fill: <<colour toolbar-cancel-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-done-button {\n fill: <<colour toolbar-done-button>>;\n}\n\n/*\n** Tiddler edit mode\n*/\n\n.tc-tiddler-edit-frame em.tc-edit {\n\tcolor: <<colour muted-foreground>>;\n\tfont-style: normal;\n}\n\n.tc-edit-type-dropdown a.tc-tiddlylink-missing {\n\tfont-style: normal;\n}\n\n.tc-type-selector .tc-edit-typeeditor {\n\twidth: 20%;\n}\n\n.tc-edit-tags {\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tpadding: 4px 8px 4px 8px;\n}\n\n.tc-edit-add-tag {\n\tdisplay: inline-block;\n}\n\n.tc-edit-add-tag .tc-add-tag-name input {\n\twidth: 50%;\n}\n\n.tc-edit-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\n.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {\n\tborder: none;\n\tpadding: 4px;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {\n\tbackground-color: <<colour tiddler-editor-fields-odd>>;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {\n\tbackground-color: <<colour tiddler-editor-fields-even>>;\n}\n\n.tc-edit-field-name {\n\ttext-align: right;\n}\n\n.tc-edit-field-value input {\n\twidth: 100%;\n}\n\n.tc-edit-field-remove {\n}\n\n.tc-edit-field-remove svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n\tvertical-align: middle;\n}\n\n.tc-edit-field-add-name {\n\tdisplay: inline-block;\n\twidth: 15%;\n}\n\n.tc-edit-field-add-value {\n\tdisplay: inline-block;\n\twidth: 40%;\n}\n\n.tc-edit-field-add-button {\n\tdisplay: inline-block;\n\twidth: 10%;\n}\n\n/*\n** Storyview Classes\n*/\n\n.tc-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: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-storyview-zoomin-tiddler {\n\t\twidth: calc(100% - 84px);\n\t}\n\n}\n\n/*\n** Dropdowns\n*/\n\n.tc-btn-dropdown {\n\ttext-align: left;\n}\n\n.tc-btn-dropdown svg, .tc-btn-dropdown img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-drop-down-wrapper {\n\tposition: relative;\n}\n\n.tc-drop-down {\n\tmin-width: 380px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\ttext-shadow: none;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-drop-down {\n\tmargin-left: 14px;\n}\n\n.tc-drop-down button svg, .tc-drop-down a svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down button.tc-btn-invisible:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down .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: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** 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** 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: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-static-alert {\n\t\tposition: relative;\n\t}\n\n\t.tc-static-alert-inner {\n\t\tposition: absolute;\n\t\tz-index: 100;\n\t}\n\n}\n\n.tc-static-alert-inner {\n\tpadding: 0 2px 2px 42px;\n\tcolor: <<colour static-alert-foreground>>;\n}\n\n/*\n** 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 > .tc-plugin-info-chunk > svg {\n\tfill: <<colour foreground>>;\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/*\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}"
},
"$:/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": "/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. 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/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\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 font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * 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/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. 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/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct 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/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. 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/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n"
},
"$:/themes/tiddlywiki/vanilla/settings/fontfamily": {
"title": "$:/themes/tiddlywiki/vanilla/settings/fontfamily",
"text": "-apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\""
},
"$:/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"
}
}
}
"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace
-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"
// Reflexiona un momento sobre aquellas experiencias que consideras te han conducido a ser quien eres en este aquí-ahora y cuenta tu historia a partir de la frase: El día en que nací... //
---
El día en que nací, hace cuarenta años, mi madre no se quejó ni dio muestras de sufrimiento, porque—según ella—quería demostrarle a los doctores canadienses que las mujeres mexicanas son fuertes. Nací en Montreal, Canadá, a medio día, según me cuentan.
No recuerdo nada de Montreal. Mis primeros recuerdos son de Toronto, donde mi familia se mudó cuando tenía yo dos años. En esta época soñaba muy vividamente y siempre tenía lucidez en mis sueños. Comenzaban con un vórtice que se formaba en mi cama, y girando, se hacía cada vez más grande.
La primera vez que apareció me dio mucho miedo, me intentaba alejar del agujero pero, extendiéndose, se tragaba todo a su alrededor. Me sujeté de uno de los pilares de mi litera, grité y pataleé pero perdí el agarre y el agujero me succionó, y caí en un mundo distinto. Grité para que mi mamá me sacara de ahí, pero no llegaba y algo me distrajo y comencé a explorar un mundo nuevo donde sucedían cosas imposibles, de tal manera que aprendí que el agujero no era algo malo, y cada vez que reaparecía en mi cama, me tiraba al agujero con menos miedo y más entusiasmo.
A esta edad consideraba este mundo como real. Casi siempre eran aventuras placenteras, pero en una de estas "aventuras al otro lado", mi madre moría. Desperté llorando y corrí a la habitación de mis padres, donde con gran alivio descubrí que mi madre no estaba muerta, sino durmiendo. No recuerdo cómo expliqué "el mundo del otro lado" pero mi angustia la enterneció de sobremanera y me explicó que había tenido una pesadilla.
También recuerdo que soñaba con mis amigos del vecindario, y cuando los veía al otro día les hablaba de las cosas que habíamos hecho en mis sueños. Me extrañaba que ellos no recordaran lo que habíamos hecho, si ellos estaban ahí!
Poco a poco fui entendiendo que los sucesos que pasaban en este mundo nada tenían nada que ver con el mundo que experimentaba estando despierto. Esto fue una gran liberación, porque podía hacer lo que yo quisiera sin tener que "portarme bien" y nadie me iba a regañar por ello! Ahora me tiraba al vórtice sin dudarlo un segundo.
Estos sueños desaparecieron cuando nos vinimos a vivir a México, cuando tenía yo seis años. Aún soñaba, pero los sueños perdieron su lucidez y el vórtice dejó de aparecer. Aún disfrutaba de soñar, pero entendía que estas cosas pasaban en mi imaginación y no eran reales. Esta y muchas otras fantasías de la niñez se esfumaron y conforme fui madurando y fui educado en las cosas de ciencia, pensaba que el único mundo era esta realidad física, material y demostrable.
Como niño había formado ciertas hipótesis respecto al mundo de los sueños: la gente con la que sueño también sueña conmigo. Los eventos que pasan en los sueños se manifiestan también en el mundo que experimento despierto. El portal para entrar en el mundo de los sueños es un vórtice que se forma en la cama, y toda la gente que sueña tiene que pasar a través de él. Estas creencias se fueron ajustando conforme formaba un modelo de cómo funcionaba este curioso mundo que aparecía al irme a la cama.
Como adulto también fui formando ciertas hipótesis respecto al mundo: todo lo que existe es lo medible y demostrable, que amar es un proceso químico que comienza en el cerebro, que lo espiritual es una fantasía de la gente ignorante que no entiende acerca de la realidad, y que los sueños son alucinaciones entretenidas.
Curiosamente fue un sueño lo que causó una grieta en este modelo que tenía del mundo. Estando en una fuerte depresión, soñé que una platicaba con la barista de un café y nos caíamos bien. Le pedí el teléfono y se alegró, "tienes dónde apuntar?" me preguntó. Me busqué en las bolsas pero mi teléfono no estaba ahí, abri mi mochila y sólo encontré mi diario y una pluma. Los puse sobre la mesa y la chica me pidió ver mi diario. Lo comenzó a hojear, viendo detenidamente cada página y los muchos dibujos y diagramas que había en ellas, y cuando terminó anotó su número y dijo "es precioso, asegúrate de hablarme".
Desperté con una sensación de alivio, y pensé "qué curioso, como puede ser que estando despierto me castigue tanto, y en mis sueños aparezcan personajes a quienes les gusta quién soy. Pero si esa chica era de mi propia creación, sólo puede significar que me gusto a mi mismo". Y durante todo un mes aparecieron sueños vívidos, sanadores psicológicamente, que orientaron mis acciones a una búsqueda hacia el interior, y descubrí que ese mundo que experimenté en mi infancia no era una fantasía sino un mundo en si mismo del cual había perdido el acceso que tenía en la infancia.
Desde entonces los sueños orientan mi vida. Hace dos años me encontraba descontento en mi trabajo y un día soñé que estaba construyendo un gran castillo de arena en la playa, llegaba una ola enorme, y aunque el castillo inicialmente aguantaba la embestida, terminaba por desmoronarse enteramente. Sentía tristeza: tanto esfuerzo en vano. Consideré reconstruir el castillo, pero pensé "ya estoy aburrido de esto" y me ponía a caminar por la playa y veía a otras personas absortas, construyendo sus propios castillos de arena. "Llegará una ola que se las destruya, como a mí", pensaba, "pero al menos están entretenidos, no hay que disuadirlos".
Hay sueños de los que despertamos sabiendo exactamente lo que significan, y ese mismo día hablé con mi jefe para renunciar. Los años que siguieron los dediqué a mis propios proyectos espirituales y profesionales, y aunque no ha sido fácil, ha sido tremendamente gratificante y ni por asomo he pensando que fue una mala decisión. Al contrario.
Aún sigo explorando cómo es que este mundo interior y exterior se tocan. Si estoy triste, el mundo físico me parece gris. Si estoy contento, me parece colorido. Entonces, cómo es que el mundo material es real, si es mi mente la que lo colorea? Me veo tentado a afirmar que si la vida es un sueño, como escribió Lope de Vega, entonces el sueño es la vida también. Pero esta no parece ser la conclusión correcta: la vida es un sueño, y el sueño es parte de la vida, y por lo tanto sueño que sueño.
Y así, cuando despierto de un sueño, aparezco en otro al que llamo el mundo material. Y me parece bien, porque, al igual que cuando era niño, en este sueño tampoco me tengo que portar bien ni debo de tener miedo a que me regañen. Qué liberador!
// Utilizando la imaginación, como atributo de la conciencia creadora, describe lo que en este aquí-ahora conforma el tapiz de tu propia conciencia. //
// No te preocupes porque el texto tenga sentido literario. Permite que sea tu consciencia del aquí-ahora la que dicte el flujo de tus palabras. El resultado puede ser una pintura abstracta, figurativa o cualquiera que sea el estilo que emerja de este aquí-ahora. //
---
A pesar de lo sencillo que es la tarea que es registrar la consciencia, si fuéramos completamente honestos con lo que escuchamos dentro de nosotros, la mayor parte sería ruido. Para calmar la mente cuando escribo de este modo, intento enfocarme en mi respiración para calmar todas las impresiones que suceden en mis pensamientos.
Respiro hondo y pongo la planta de mis pies en el suelo. No me había dado cuenta, pero estaba escribiendo tal quasimodo, jorobado encima del teclado. Sigo respirando. La pantalla ahora queda mirando hacia abajo, por eso estaba jorobado, pero qué inconsciencia! Pudiendo hacer que la pantalla me mirara mí, decidí yo ser el que se agachara a mirar la pantalla.
Así está mejor. También tengo el editor en el theme blanco, y prefiero escribir sobre negro. Cambiemos de claros a oscuros, porque deslumbra menos... Ah, mucho mejor. Ah, como me gustaría que el fondo oscuro con letras blancas fuese el default. Al amable compañero de la clase de la Espiral de la consciencia le recomiendo que haga click en el icono de la gota en la esquina superior derecha para probar si le gusta leer y escribir con fondo obscuro.
Una divagación y he perdido la postura yogi. Pero también está bien tener un rango de expresiones cuando uno se sienta a trabajar en el teclado. De hecho, no tienes que teclear sentado, si tienes una laptop puedes llerla a una superficie más alta y probar qué se siente teclear así. Intentémoslo.
He tenido que quitar un nido de cosas varias para colocar la laptop en una especie de barra, es interesante, estoy probando balancearme de un lado a otro mientras escribo. A veces, cuando estás muy concentrado, ayuda a llevar un movimiento rítmico para establecer una pauta, y sentado yo lo hago meciéndome hacia adelante y hacia atrás, pero esto es una limitación de la costumbre que tenemos de trabajar sentados. Desde el punto de vista de la salud es indudablemente mejor de pie. En este momento al menos, lo estoy disfrutando y seguro que lo voy a probar más en el futuro, he trabajado de pie, pero escribir, nunca.
Pero esta postura parece ser contraria a la introspección, se notan los pies físicos en la tierra, poniendo la atención en las raíces y no en las ramas. Y ahora no sé qué escribir, me quiero poner a trabajar para ver si eso me sale mejor, pero decido que hay que persistir en la tarea y dejar que fluya libre el pensamiento, dejar que los dedos sean los que escriban y quitarse uno de en medio, de dejar de controlar a dónde se va la mente, porque es como un riachuelo que decide por dónde va él mismo, nosotros le cerramos el paso cuando intentamos que fluya por otro lado. Pero en esta tarea no queremos obstruir al riachuelo, queremos que siga su camino para encontrar ríos más grandes, no?
Pero, estando de pie, no parece ser momento de divagar en cuestiones mentales. Me acabo de acordar que dejé el café hecho sin servírmelo! Es hora del café y regresaré a completar el ejercicio.
Ack, tengo una sensación desagradable en la boca, me lo eché de a full porque sé que soy muy distraído, y si me siento a tomar mi cafecito me voy a olvidar de esta tarea. Ah, pero que wey, si pude haberme sentado a tomar mi café mientras escribía. Bueno, pero todavía queda café, pos me sirvo otra taza de una vez, y ahora sí termino de escribir.
Ahora sí volví a sentarme. Siento alivio en la espalda. Es cierto, para escribir de pie tendría que ponerme plantillas! De otra forma, no aguantaría trabajando mucho tiempo. Miraré a ver si están donde creo que están... Una búsqueda por toda la casa "no arrojó resultados" como diría google. Ni modo, yo quería probar cómo se sentía escribir con las plantillas, pero ahora que me vuelvo a sentar a escribir, he notado mi espalda relajarse, y ahora estoy mucho más cómodo de lo que estaba cuando comencé a escribir todo jorobado.
Volvamos por donde comenzamos, me pongo derechito, pongo los pies en la tierra respiro profundamente, siento mi atención enfocada en la respiración y la panza se infla y desinfla como un fuelle. Con el café pareciera que hay una disposición a meditar. Voy a intentarlo. Voy a cerrar los ojos y registrar el primer pensamiento que note. Lo registraré y luego terminaré el ejercicio, que siento que me extiendo demasiado.
Cerré los ojos unos diez segundos, viendo pasar numerosos pensamientos de todo tipo, pero al intentar recordarlos para describirlos me he enganchado en una meta-narrativa: "uno tiene que desapegarse de estas impresiones temporales y permitir que las cosas se manifiesten tal y como son...", ah! ya he encontrado mi primer pensamiento, lo he pescado y realmente no sé qué hacer con ello. Es como un pez vivo, me lo puedo comer o lo puedo dejar libre. Comérmelo sería desmenuzar este pensamiento de tal forma que lo pueda digerir, y tendría que escribirlo en este momento, para no perder el hilo. Pero este es un pez demasiado grande para mi apetito en este momento.
Mejor lo liberamos. Esperaba que se me resbalara de las manos, pero el pez/pensamiento permaneció ahí, flotando unos segundos. Como confundido. Luego, un movimiento en la superficie del agua hizo que se esfumara.
Es probable que te vuelva a pescar otro día, pececillo gordo!
//Piensa en una persona que dejó huella en tu vida durante tus primeros doce años y reflexiona con la siguiente pregunta, ¿dónde está presente esa huella hoy en ti?//
---
Al pensar en las personas que han influído en mi en mis primeros doce años de vida, vienen a la cabeza mis padres y mis hermanos. Y sin embargo no siento que el ejercicio vaya por ahí, es como una mina que ya he escarbado lo suficiente y podría mostrarles: aquí encontré una veta de oro, aquí casi se me cae el techo encima, aquí casi me caigo por un hoyo, etc.
Me gusta escribir para entender, y por eso pienso: después de mi familia, quién fue una presencia significativa en mis primeros doce años de vida?
Lo conocí en la biblioteca de mi primaria, cuando tenía unos ocho años. Es ahí donde me refugiaba todos recreos, porque me gustaba leer y porque no tenía amigos. Yo era un niño muy tímido pero también con muchos deseos de hacer amigos, sin saber cómo. A veces iba al patio de recreo en lugar de la biblioteca, y veía a los niños jugar, esperando a que me invitaran, pero nunca lo hicieron. Los libros siempre me invitaban a leer, así que era mi lugar preferido para pasar el recreo.
Un día estaba leyendo una revista en una esquina de la sala de lectura (siendo una biblioteca para niños era más como un salón alfombrado con cojines y estantes con libros) y llegaron dos niños que habían llegado ahí casi por accidente. No tenían ningún interés en los libros, supongo que la curiosidad infantil los llevaría a entrar a la biblioteca al verla abierta durante el recreo, y me vieron leyendo en la esquina.
Cuchichearon entre ellos algo, se acercaron, y no recuerdo exactamente cómo o con qué excusa, pero me comenzaron a pegar, y yo, lejos de pedir ayuda, me defendí lo mejor que pude, y comenzó una especie de juego rudo en el que no estábamos seguros si estábamos peleando o jugando. La chicharra del final del recreo nos indicó que el juego había terminado.
Al siguiente día fueron a la biblioteca nuevamente, esta vez armados de estrategias para someterme, pero yo era un animal salvaje que no se apaciguaba tan fácil. Se tomaban de las manos y corrían hacia mí con la intencíon de tumbarme, pero yo ponía mis codos frente a mi cara y los esperaba como un poste, lastimándoles los brazos cuando chocaban contra mí.
Y así pasaron varios recreos, en este extraño gris entre bullying y juego, hasta que un día no llegaron a la biblioteca y me di cuenta que me gustaba más su compañía que la de los libros. Salí al patio a buscarlos y seguimos nuestro juego rudo, pero esta vez sobre el pasto. Y de ahí surgió una especie de amistad.
Digo "especie de amistad" porque hacían cosas crueles. A veces se secreteaban entre ellos y repentinamente se echaban a correr. Yo los veía alejarse y detenerse unos metros más adelante, y yo caminaba hacia ellos. Cuando estaba cerca se echaban a correr nuevamente. El juego era alejarse de mí, pero yo no tenía a dónde ir mas que con mis "amigos". A veces me aburría y me rehusaba a seguirlos, entonces se acercaban ellos, pero cuando me hacían creer que el juego ya había terminado, se echaban a correr nuevamente.
En las amistades, tanto si somos niños como si somos adultos, es difícil que haya amistades tri-partitas en las que no haya un vínculo mucho más fuerte entre dos de ellas. Dos personas son realmente amigos, y la tercera persona es casi un "accesorio" de la amistad de las otras personas. Yo era este accesorio.
Pero poco a poco, habrán pasado dos o tres años, me fui ganando la confianza el niño más dominante, su nombre era Rabetzi y era un niño fuerte y robusto, con buen apetito y con una imaginación interminable. Mi sensación es que el otro niño, del que sólo recuerdo su apodo ("El Bimbo" porque su padre era panadero), al verse desplazado, prefirió buscar otras amistades.
Y así entablamos una amistad muy cercana que duró toda la escuela hasta la prepa. En vacaciones pasaba largas temporadas en su casa, las actividades cambiaban de acuerdo de nuestra edad, pero lo que era una constante eran las tragazonas que zampábamos, siempre. Éramos como pelones de hospicio y todos se sorprendían con nuestro apetito.
Luego de la prepa nos perdimos el rastro y muchos años después nos encontramos en la calle y me invitó a cenar a su casa para conocer a su familia, a lo cual acepté gustoso. Luego de cenar, su familia se retiró a dormir, nosotros sacamos las copas nos pusimos sinceros.
Me dijo "me da mucha culpa haberte tratado con tanta crueldad cuando éramos niños, recuerdo que íbamos a pegarte a la biblioteca, que huíamos de ti para que nos corretearas, que te hicimos esto y lo otro, te quiero pedir perdón por ello".
Yo sonreí y le dije "No hay nada que perdonar, era yo un niño muy solitario, y prefería que fueran ustedes a pegarme a estar sólo. No son sus tormentos lo que recuerdo con disgusto de la primaria, lo que recuerdo es el tormento de la soledad, sentirse invisible y que no le interesas a nadie. De no haber pasado eso, es probable que todos mis amigos ahora fueran libros. ¿Te imaginas qué hubiera sido de mí si no nos hubiéramos conocido?
Y se rió mucho, porque entendió que a pesar de su crueldad infantil, su presencia en mi vida en ese momento había sido positiva. La huella que dejó fue imponente, no sólo porque Rabetzi fue el único amigo que tuve por mucho tiempo, sino porque a través de él conocí a más gente, y llevé una infancia relativamente normal con amigos y actividades y todo lo que conlleva.
Salí de su casa ya de mañana, y no lo volví a ver, hace ya 10 o 12 años de esta borrachera. Pero me quedé con una sensación de que ambos habíamos cerrado un círculo: él de culpa y yo de agradecimiento, y al comunicar nuestras sensaciones nos habíamos asistido en el trabajo interior que nos correspondía a cada quién.
Gracias Rabetzi.
//Quién fui ayer? ¿Quién soy en este aquí-ahora? ¿Quién me gustaría llegar a ser?
Reflexiona y escribe las respuestas a estas preguntas. Puedes utilizar metáforas y/o identificaciones parciales con personas, animales o con objetos que son significativos para ti.//
[[04 Espiral - ¿Quién es el yo que se encuentra dentro de mi piel?]]
Quién fui ayer? ¿Quién soy en este aquí-ahora? ¿Quién me gustaría llegar a ser?
Reflexiona y escribe las respuestas a estas preguntas. Puedes utilizar metáforas y/o identificaciones parciales con personas, animales o con objetos que son significativos para ti.
---
¿Quién fui ayer?
El Mark de ayer sentía que se estaba desintegrando, y para reafirmar su ego lo escribió en un diario, en 2014:
"""
1. Promedio 9/10 en la universidad.
2. Pensador profundo
3. Estudiante universitario del año 2008, categoría periodismo (Revista Expansión)
4. No conformista
5. Nunca he tenido que buscar trabajo
6. Hombre de integridad y ética
7. Segundo mexicano mejor rankeado en StackOverflow
8. Puedo aprender lo que quiera
9. Buen ratio de social media
10. Humilde (já!)
11. Invitado a ser mentor numerosas veces
12. Ganador de StartUp Weekend Cancún
13. Paquete tremendo de experiencia
14. Admirado por colegas capaces
15. Pensador independiente
"""
No hace falta seguir. Hay 45 de este tipo de reafirmaciones, interesantes para mi observar hoy, porque lo escribí para "darme ánimos" porque estaba llegando una etapa de cuestionamiento profesional que comenzó con un bloqueo creativo.
Cuando tu identidad está atada a tu prestigio profesional y a tu capacidad creativa, su pérdida implica un auto-cuestionamiento profundo: si ya no soy diseñador, entonces quién soy?
Esta pregunta me la hice con ahínco en aquel momento, pensaba: si tengo un coche y le quito el motor, sigue siendo coche? Y si le quito la carrocería? y las llantas? y los interiores? Pues creo que terminaría siendo un chasis, poca gente le llamaría a eso un coche.
Noté cómo mi identidad estaba compuesta por un mosaico de creencias acerca de mi mismo. Si quito algunas cerámicas de un mosaico se entiende la composición general, pero si quito las suficientes el mosaico deja de ser una composición y se vuelven piezas sueltas, inconexas la una de la otra. Hasta cuánto me puedo reducir sin perder mi identidad?
Si pierdo el uso de mi cuerpo sigo siendo yo? Si pierdo mi memoria sigo siendo yo? Si pierdo mis facultades creativas sigo siendo yo? Si pierdo o cambio mi sexo, sigo siendo yo? Estas y otras preguntas muy difíciles o ingenuas (cual es el sentido de la vida?) me las preguntaba en aquel momento.
Hay un momento particular de claridad en esta época, que a Ana María le hará gracia (espero): viviendo en el DF, entré a una librería de segunda mano. Vi un libro que se llamaba "A brief history of everything", y lo tomé confundiéndolo con un libro de historia de la ciencia que disfruté mucho, "A short history of nearly everything". Me sorprendí que el autor no era Bill Bryson, sino un pelón de lentes llamado Ken Wilber que me miraba fijamente desde la portada del libro.
El encuentro con sus ideas me acomodó muchas cosas, porque tenía una acumulación de experiencias que requerían cabida en mi marco conceptual más bien estricto en aquel momento. Veía a la gente espiritual con el desdén materialista del que a veces ahora soy receptor, y la apertura espiritual fue el reto más grande que enfrentó el Mark de aquel momento. Rechazaba la fe en favor de la ciencia, cuando en realidad lo que tenía era fe en la ciencia. Ken Wilber me resultó imprescindible para trascender y "colgar" todas las experiencias este periodo.
¿Quién soy ahora?
Hace poco me pasaron un chisme: un primo dijo que yo era una lástima de persona, que lo había tenido todo: una buena chamba bien pagada, una buena vieja, vivía en un lugar chingón. ¿Pero ahora? Mark vive en la casa de su familia en Puebla después de haber estado en Canadá y en España, tenía una chamba bien chida pero ahora no tiene ni está buscando chamba ni vieja, es un huevón que no hace ni madres ni quiere responsabilidades.
Cuando me contó esto un segundo primo, pensé "Héctor no entiende", pero aún sentí feo de que pensara eso de mi. Me imaginé reprochándole: si no estoy buscando buena vieja ni buena chamba es porque ya he estado ahí, y sé que eso no es la felicidad, pendejo". Acto seguido me recuerdo: el resentimiento es veneno, quiero parar la mente, pero siento cierto placer en estas fantasías de reproche, ¿por qué?.
Mi ego parece haber sobrevivido más intentos de asesinato que Fidel Castro, y se sigue encabronando de estas cosas. Pero está mucho más domado. Ya sabe que estas son narrativas son ficciones, cualquier intento de justificación acerca de cómo vivo es erróneo por el hecho de querer justificar como vivo. Vivimos, y punto.
Pero hay un giro poético en todo esto: Héctor, por ser una personalidad sensual, burlona y ácida, a menudo aparece en mis sueños como "la sombra": me incita a ver porno, me dice que nos robemos algo de la tienda, y también a veces aparece como un niño berrinchudo que tira de mi y reclama mi atención.
Este hecho hace que salga a la luz la respuesta que me estaba preguntando: me da placer imaginarme reprochándole a Héctor porque él es el arquetipo de mi sombra. La sombra me dice: antes eras el poseedor de estos símbolos que representan la felicidad, ahora has perdido todos tus deseos y todos tus símbolos, ahora no eres nadie.
Y el placer proviene de imaginarme apabullar a la sombra con una letanía de argumentos filosóficos, espirituales, y racionales de porqué los deseos y el estatus son piedras flojas en una pared que todos tenemos que escalar, pero ese acercamiento es conflictivo, y es la misma razón por la cual la sombra es sombra: porque no la dejamos existir un instante siquiera, para que la podamos observar y entender.
Y de esta forma espero haber ilustrado un poco de "quién soy ahora" en mi aspecto exterior e interior. Tengo la sensación de que todo lo que experimento tiene un aspecto espiritual más profundo, y puedo profundizar en el significado si quiero (no siempre lo hago). Cada suceso que me provoca una fricción me enseña algo, y la sensación es que la fe en la ciencia fue reemplazada por la fe en la vida.
¿Quién me gustaría llegar a ser?
Voy a ser honesto: me gusta como soy, pero a veces me gustaría estar "resuelto". Eso es: concluir el viaje, volver a casa, desinteresarme por mi mismo, disfrutar del presente, y al mismo tiempo sé que el deseo de ser liberado es una cadena en si misma. "Ojalá pudiera estar más presente", pienso a menudo, en lugar de entrar en presencia.
Pero al tiempo veo cómo se ha desenvuelto mi vida y pienso: si la vida siempre me ha dado cosas que superan mi imaginación! Si el Mark de antes hubiera sido efectivo en llevarme a la persona que quería ser, hoy sería pobre espiritualmente! No estoy resuelto porque hay tarea aún, no se puede apresurar un embarazo.
Entonces no lo veo como un "me gustaría llegar a ser..." sino como un desdoblamiento natural de la vida misma. Cuando pienso "me gustaría estar resuelto", le digo a la vida que no quiero jugar con sus pequeños retos que me ayudan a crecer, por ejemplo la observación de mi primo me sería indiferente, o entretenida si acaso.
Si acaso, ahora que lo escribo me cae el veinte: me gustaría ser una persona que juega con los retos de la vida como una forma de superación personal. Ya lo hago, y me gustaría hacerlo más.
Abro los ojos después de un profundo sueño, y me sorprendo de ver la vía láctea. Jamás la había visto con tanta claridad. Estoy metido en un saco de dormir en lo alto de la montaña de Gredos, tengo el cuerpo deshecho, no era mi intención dormir en lo alto de la montaña, pero ahí me agarró la noche y me desplomé en un abrigo que formaban unas piedras.
Con el cansancio el cuerpo se había rendido, pero mi mente se sentía clara. Miré a las estrellas y me comenzaron a brotar lágrimas de los ojos, pero mi cuerpo estaba tan cansado que no sentí impulso de limpiarlas.
"Aquí está lo que estaba buscando", pensé.
Sin viento, el silencio ahí arriba era absoluto. No escuché ni a mi propio pensamiento. No voy a hacer más de la experiencia de lo que fue: un observar en quietud absoluta la majestuosidad del universo. Para un buscador sediento, eso fue un oasis en el desierto.
Dos días antes había concluido mi voluntariado anticipadamente en una casa espiritual Sufí. El maestro se había tornado frío cuando me rehusé a hacer la Shahada, el bautizo musulmán. Era mi tercera vez ahí, y la frialdad me hizo sentir poco bienvenido, así que resolví irme.
¿A dónde? esa zona estaba llena de parajes preciosos, el clima era perfecto y se podía dormir afuera, lo cual era afortunado porque cargaba apenas con un saco de dormir que se comprimía al tamaño de una toronja, y una funda que me regaló René. En mis víveres había suficiente comida para dos días, pero no tenía agua, ni botella para cargarla. En las semanas anteriores había llovido a cántaros y los ríos estarían repletos de agua, así que decidí que no hacía falta pasar a abastecerme al pueblo.
Caminé directo a la montaña, y consultando el mapa y contrastándolo con el paisaje, decidí pasar entre dos picos que pude observar a lo lejos. Guardé el móvil con la intención de usarlo lo menos posible. De todas formas la pila se terminaría pronto.
Era mi segundo día caminando y no encontraba la forma de cruzar la sierra, subí largo rato por una carretera de terracería que dio con una reja maciza que resguardaba un terreno bardeado muy grande. Salté la barda, y del otro lado vi un camino que llegaba hasta el cortijo de una casa grande y bien cuidada. Rodeé la casa para pasar desapercibido, pues afuera sentí "permiso" de pasar, pero ya dentro y mi impulso fue salir de ahí lo más pronto posible, saltando la barda del otro lado del terreno para continuar mi ascenso.
Pero no había barda del otro lado. El camino me llevó ascendiendo por la montaña, hasta torcer súbitamente, y al frente se podía contemplar un paisaje. Me senté un momento. A mi izquierda había una serie de picos rocosos que formaban una cordillera hasta incorporarse al grueso de la montaña, y al frente había un barranco con desnivel profundo para llegar al fondo de la garganta. El conjunto de las cosas: las piedras bañadas por el sol, el verde de la primavera, el canto de los pájaros, todo era precioso…
Pero el paisaje también daba malas noticias: o intentaba cruzar por la cordillera de los picos rocosos (una tarea absurdamente peligrosa), o bajaba al fondo de la garganta, para subirla brincando de piedra en piedra (una tarea que me llevaría un día adicional, para el cual no iba preparado).
Resolví que era mejor buscar un paso diferente, pero mis ánimos decayeron: si no encontraba una alternativa pronto, lo más sensato sería abandonar la aventura. Seguí por el camino, arrastrando los pies, hasta que a la distancia vi unas ovejas que venían delante de una camioneta. Me detuve y saludé. La camioneta de detuvo.
—¿Estás perdido?
—Bueno, primero disculpe que me haya metido sin pedir permiso, y no estoy exactamente perdido, pero estoy intentando cruzar al otro lado para llegar a Barco de Ávila, y no encuentro cómo.
—"Hay un camino allá atrás, ya lo pasaste. Súbete y te llevamos".
Eran padre e hijo y eran los dueños de la finca. En mi memoria se habían acomodado como "pastores", pues llevaban ovejas, no hubo conversación innecesaria y vieron muy natural mi absurda misión de pasar al otro lado de la montaña. No se mencionó el hecho de que estaba ahí sin permiso.
Volvimos por el camino que anduve hasta llegar nuevamente a la curva pronunciada donde estaba el paisaje de las cascadas y los riscos. Se me pusieron los pelos de gallina, "pero no puede ser! estuve largo rato aquí sentado mirando el paisaje intentando ver por dónde se podía pasar, y no lo encontré". Se río. Apuntó a los picos rocosos que había admirado antes. "Mira", me dijo el pastor, "esa linea que ves en las rocas? Síguela." y con el dedo apunto a una línea horizontal que cortaba entre las rocas y siguiendo su dedo, la línea conectaba los riscos con el prado al otro lado del barranco!
Al momento la línea que señalaba brotó del paisaje y me di cuenta que era evidente que esa línea era hecha por el hombre. No hay lineas que corten así, horizontalmente a lo largo de la cordillera. Apenas era una línea visible, pero el dedo del pastor hizo que resaltara en el paisaje. La experiencia se me quedó tan grabada que, cuando admiro un paisaje natural, no dejo de buscar lineas como la que vi ese día.
Me dijo "Este camino es el que nosotros usamos para cruzar. Recién lo acabamos de limpiar. Puedes usarlo, pero ya vas tarde ¿vienes bien equipado?"
—"Claro que sí", mentí. No llevaba ni agua.
—"Bien, pues el camino se acaba ahí donde ves, pero está fácil, sólo hay que subir. Ya arriba no hay forma de explicarte, con la nieve y la neblina no se va a ver, pero busca un camino del otro lado, te llevará al pueblo más cercano. Puede que te agarre la noche allá arriba, y ahí sí hace frío eh?".
Me despedí con prisas, deshaciéndome en agradecimiento. El camino de piedra evidentemente había sido construido y mantenido durante generaciones, pues la piedra estaba labrada a mano. Cabía una persona cómodamente (o incómodamente si sufre de vértigo, pues no había barandal). Las cascadas se veían mucho más cerca, casi debajo de mí.
Con mis preocupaciones aminoradas me llené de una sensación de júbilo, y todo me parecía idílico. La caminata por ese paso tan hermoso, y la forma en la que se dio, formaron un conjunto que mi espíritu se alegró de experimentar, y entendí a la naturaleza como expresión divina, y pensé que como yo no estoy fuera de la naturaleza, pues mi esencia es divina también.
Jadeaba de cansancio y maldecía mi obstinación por no cargar agua. Allí arriba no se formaban arroyos, pero la nieve se había derretido dejando charcos encima de las piedras. Desafortunadamente, los charcos invariablemente tenían bolitas de excremento de las cabras del monte, y yo prefería beber la nieve cuando la alcanzara, pero finalmente encontré una gran depresión que contenía mucha agua y sólo unas bolitas de excremento, así que me lo bebí casi todo, y así sacié mi sed.
El impulso por alcanzar la nieve se extinguió, y con el sol habiéndose ocultado hacía rato, y con mi cuerpo rehusándose a seguir, encontré el abrigo en donde comencé el relato, me metí en el sleeping, y quedé profundamente dormido.
Al día siguiente me encontré reparado física y espiritualmente. La tarea de pasar por la nieve y encontrar el camino en la neblina fueron arduos. Subí por la nieve hasta la cima y del otro lado no encontré el camino, así que bajé entre matorrales cubiertos por nieve. Era muy tardado, difícil e incómodo.
Recordé el dedo del pastor, aunque en la nieve no se verán las líneas de los caminos, o sí? Miré a mi alrededor, en las laderas de los picos que ya había cruzado. Me saltó el corazón: había columnas hechas de piedras apiladas en la ladera, formando una línea horizontal. Pero claro! Como la nieve impide ver el camino, esa era la forma de marcarlo.
Subí tirando de los matorrales por la ladera y al llegar a uno de estos grandes pilares formados por piedras amontonadas, vi que efectivamente había un camino, pues a pesar de la nieve se notaba lo firme y parejo del suelo, además que estaba indicado por los montones de piedras.
Seguí por el camino, que pronto bajó a un valle donde se derretía la nieve y formaba pequeños arroyos del que se alimentaban pastizales verdes muy bien mantenidos por la fauna silvestre y doméstica, pues era primavera y seguro que los animales tenían hambre de hierba fresca, pues estaba podado al ras.
Los riachuelos se entremezclaban con el camino, hubo que salvar agua brincando de piedra en piedra, y cruzar muchos puentitos, pero al fin bajé y vi que el agua que bajaba de la montaña no formaba un gran río, como suele suceder, sino que, mediante piedras, era distribuido por los terrenos del valle en pequeños canales.
Pasé por un pequeño pueblo de casas de piedra, y seguí mi camino hasta Barco de Ávila, donde, después de comer, pregunté si había un albergue o pensión económica en el lugar. No lo había. Tomé el siguiente autobús a Madrid y volví a casa.
Despierto. Parpadeo, perplejo. Vengo del mundo donde aún no hay palabras, sólo sensaciones, y mi sensación es la de estar incompleto. Mi añoranza por aquello que me completa crece al tiempo que mi barriga se infla, y dejo salir un gran llanto llamando a esa presencia que me hace sentir calientito, que me reconforta, que me alimenta. Estoy incompleto. Mi panza se infla al tiempo que crece mi añoranza, y dejo salir un gran llanto. Y luego otro, y luego otro.
La presencia reconfortante me encuentra y me envuelve. El miedo, el hambre, y el fío se desvanecen, pero también emerge una añoranza aún mayor: la de fundirme con esta sensación. Me hundo en la presencia amorosa y nos reencontramos. Estoy completo de nuevo.
---
Despierto. Parpadeo, perplejo. Mi madre acaba de morir, pero desperté en mi cama. Vengo del mundo de los sueños, y mi consciencia aún es lo suficientemente flexible para entremezclar fantasía y realidad.
Siento el peor de los vacíos, una pérdida indescriptible, mi barriga se infla y dejo salir un gran llanto. Corro a la habitación de mis padres y abro la puerta sabiendo que no tengo permiso de entrar sin tocar, mi madre se incorpora en la cama y la veo ahí.
Mamá! Brinco a la cama y la abrazo. Se rie de mi efusividad. Qué pasó mijito? Te habías muerto, pero ya no estás muerta. Que bueno que no estás muerta mamá. Ay mijito estabas soñando, no te preocupes, estoy aquí contigo.
---
Despierto. Parpadeo, perplejo. No debería haber ruidos a esta hora, quién es? Es mi papá, viene llegando de Estados Unidos, y cuando va al extrajero siempre vuelve cargado de regalos. Me incorporo lo más rápido que puedo y la alegría que siento al verlo es indescriptible!
Ya saca los regalos papá! le imploramos. Se ríe y saborea del momento: no les da más alegría verme?, pero nuestra anticipación es tanta que pronto reparte a cada uno un juguete. A mi me toca un pájaro alado al que das cuerda y vuela, además de unos avioncitos de unicel.
Los llevaré al colegio y todo mundo querrá jugar conmigo! Ay papá como te quiero muchas gracias!
---
Despierto. Parpadeo, perplejo. Ella no me deja ni en sueños. Si no abandona mi pensamiento y mi corazón, debe significar que estamos destinados el uno para el otro. Pero ella no lo entiende, porque un rechazo de ella me destrozaría! Ella es mi todo!
Para que arriesgarme a destruir mi mundo con su desprecio! Mejor la miro de lejos. Sí, yo soy un perdedor, nunca me haría caso. Pero es que ella no entiende como me siento! Qué hago?
Me armaré de valor, le diré que me gusta, no hay de otra. Si este es nuestro destino, tengo que cumplirlo, así se queme el mundo y yo con él. Lucy, dame una cita, vamos al parque, entra en mi vida, sin anunciarte.
***
Vuelvo en mí. Parpadeo, perplejo. Estoy jadeando. Ella tomá mi rostro entre sus manos, "a dónde te fuiste?", me pregunta riendo. Me desplomo encima de ella, toda la tensión de mi cuerpo liberada en una gran explosión.
Me ruedo y alcanzo la botella de agua que nos regalaron en el hotel en el que nos vinimos a quedar este fin de semana. Recupero el aliento y le digo: sentí que yo no era yo ni tu eras tú, sentí nuestros cuerpos fundirse y me fui al infinito!
Ella ríe y me dice que la lleve a ese lugar también.
---
Despierto. Parpadeo, perplejo. No puedo creerlo, poesía emana de mi corazón sin esfuerzo alguno. Mi amada yace en la cama, te extraño aún estando conmigo, corazón. Ven hermosa, déjame acercarme, tu hombro está frío, yo te voy a mantener calientita amor.
Me acurruco con ella y las sensaciones melosas me brotan del corazon y el estómago y se extienden hasta las extremidades, como queriendo salir. El espíritu se alimenta y parece querer escapar los confines del cuerpo material!
Ella despierta, se da la vuelta, me mira a los ojos: que belleza de mujer. Me quiero ir con ella a una isla desierta, que nadie nos moleste, en años. Pasaríamos la vida dando paseos en la playa, yo sólo sacando langostas del mar, las cuales cocinaríamos en fogatas al atardecer.
"Te amo más que a nadie en el mundo", le digo.
---
Despierto. Parpadeo, perplejo. He escapado, por un momento, de la incesante charla en mi cabeza. He escapado del mundo de las palabras. Estoy ahí en donde las palabras aún no se han formado, por lo tanto, describirlo es algo que se encuentra fuera de los límites del lenguaje.
Inflo la panza y dejo salir un gran suspiro. Haciendo la observación interior, comienzo a percibir el corazón espiritual. Lo observo sin intención de encenderlo, pues éste tiene su propia voluntad. Respiro, y sigo observando.
Me siento incompleto. Mi panza se infla al tiempo que crece mi añoranza, y pido de esa presencia que me alivia, aunque es el corazón espiritual quien llama.
La presencia reconfortante me encuentra y me envuelve. El miedo, el hambre, y el fío se desvanecen, pero también emerge una añoranza aún mayor: la de fundirme con esta sensación. Me hundo en la presencia amorosa y nos reencontramos. Estoy completo de nuevo.*
* Aunque hemos trazado un círculo y en apariencia volvemos al punto de origen, el recorrido se hace sobre una espiral y terminamos en coordenadas similares pero en una ubicación distinta.
Mis cicatrices las enseño sin mucho apuro, pero la causa de las cicatrices es algo que sólo cuento a personas de mi confianza. No me preocupa que "se sepa", sino que siempre me da la sensación que hago pasar un mal rato a la persona que me escucha.
Pero los que estamos en este curso nos gusta profundizar en estas cosas. Estamos en la mitad entre confidentes y desconocidos, pues nos hemos contando cosas muy íntimas, y aunque quizás fuese correcto describir las causas de la cicatriz, he decidido dejar la causa como una incógnita que el lector habrá de despejar.
La sombra tiene formas increíblemente audaces de esconderse de uno mismo. Uno pretende darse la vuelta para observarla pero parece moverse y colocarse fuera del ángulo de visión. La única manera de observarla es _ampliando el campo de visión_, eso es, ampliando la consciencia.
Cuando comencé mi práctica de meditación me cayeron muchos veintes: estaba atrapado en una jaula de mi propia creación, y me daba miedo salir. Todas las cosas que me parecían estúpidas, como bailar, pasar tiempo con la familia, la espiritualidad, en realidad eran manifestaciones de lo que ahora entiendo como "rigidez de espíritu": el definirnos a través de lo que *no* somos, creando fronteras para contener nuestra identidad.
Pensé "Bailar no es estúpido. Sólo me siento incómodo por no saber bailar, y eso se resuelve con unas clases de baile". Así que me apunté en un estudio que me quedaba cerca del trabajo. Había más o menos dos maestras por cada alumno, y los alumnos nos turnábamos bailando con ellas (pues todas eran chicas).
En los momentos en los que estabas sentado, podías observar los movimientos de los otros alumnos. Las ocho clases a las que asistí fueron un tormento e hice muy poco progreso. Sin la práctica de meditación seguramente habría puesto la excusa de siempre ("es que nací en Canadá y me viene en los genes tener dos pies izquierdos").
Observando a mis compañeros, no pude sino comparar mi torpeza bailando. Hacía los mismos pasos, estaba enteramente tieso y mis movimientos carecían de gracia. Me costaba mucho aprenderme los pasos, sudaba como si estuviera bailando salsa profesional, pero apenas y me movía, cómo podía ser eso?
Decidí que postergaría mi intento de aprender a bailar hasta que aprendiera a *moverme*. No sabía muy bien lo que estaba buscando, pero intuía algo involucrando movimiento libre, que me permitiera soltarme antes de imponer estructura al movimiento. Buscando en internet encontré danza tribal, y lo iba a probar, pero un viaje de trabajo me llevó a España dos semanas, y me quedé en un airbnb con una señora encantadora.
La señora vivía sola, y todos los días cenábamos juntos y charlábamos acerca de nuestros caminos, pues ella también era buscadora, y me preguntó "no conoces biodanza?" y le dije "no, pero si es de danza me interesa mucho". "Sí es de danza, pero será mejor que lo conozcas a que te cuente". Le conté mi experiencia intentando bailar, y me aseguró que me serviría para soltar el cuerpo.
Volviendo a México me presenté a una clase, y como no tenía precedente alguno, no sabía qué esperar. Me indicaron que me quitara los zapatos, y que me sentara en unos cojines que había en una sala grande.
Comenzó el círculo de presentaciones: una señora con evidente sabiduría que era la "maestra de maestras" y dueña del establecimiento, un señor muy amable que era maestro experimentado, y una chica de veintipocos que iba a ser la facilitadora esa sesión, como parte de su formación como maestra.
"¿O sea que soy el único asistente?", pregunté. "Todos vinimos a hacer biodanza" la maestra de maestras contestó. "Soy muy malo bailando, puedo hacerlo sin verme ridículo?" Me aseguraron que de ninguna manera había que saber bailar, sino muchas veces era el caso contrario: la gente que "sabe" bailar en realidad se sabe los pasos, pero eso impide la expresión natural del cuerpo. "Excelente, pues ya adelanté el trabajo de desaprender" bromeé.
Pasé la clase entera apretando los dientes, literalmente me _dolía_ bailar, sudaba profusamente, y además en biodanza hay infinidad de abrazos, los cuales eran intolerables para mi. Yo soy de los que dan abrazos desganados con palmaditas en la espalda, y de repente tenía a personas abrazándome como si se quisieran fundir conmigo! Pensaba "esta es la primera y última vez que vengo".
Pero, a pesar de todo el sufrimiento, cuando terminó la clase me encontraba eufórico! Me sorprendió enormemente, nunca algo que había dolido tanto me había puesto tan feliz! Cuando volví a casa no pude dormir en toda la noche, pero era de esos insomnios que te dan cuando te enamoras, y toda la semana pude sentir los efectos de aquella terapia que la vida me puso por delante.
Seguí asistiendo a biodanza un año con regularidad. El trabajo del cuerpo y de las emociones era el que más me hacía falta. Me costaba muchísimo trabajo, pero siempre fue placentero. No recuerdo una clase que me haya disgustado, al contrario, las clases que más trabajo me costaron en esos años, siguen dando frutos.
Pero Biodanza trabaja principalmente la parte lumínica, esto es, no intenta despertar un estado afectivo "negativo". Llorar o enojarse pueden emerger naturalmente y vas a ser contenido, aceptado y apapachado, pero la clase no va en esta dirección.
Para el trabajo de sombra, Biodanza tiene un evento llamado "Minotauro", que es un retiro de fin de semana donde se danza aquello que duele. Se recomienda llevar por lo menos un año asistiendo a clases regulares, y a mí se me conjuntaban dos cosas en ese momento: me iba a mudar a España, y cumplía un año haciendo biodanza, así que supe que sería una forma bonita de despedirme de mi grupo y que tenía que asistir en ese momento.
Sólo describiré la danza final del minotauro: nos reunieron en el centro a los pocos hombres que habíamos en el grupo, y nuestra tarea sería "bailarle sexy a las chicas celebrando nuestra masculinidad" (trasgiversando palabras, obviamente). Tragué saliva: eso de "bailar sexy" inevitablemente me pone rojo de vergüenza, y sólo lo había hecho en clase con una persona.
No voy a describir una historia donde todos mis traumas y heridas quedaron atrás, y de repente me convertí en un gran bailarín, no fue eso. Fue muy simple: intenté mover las caderas, intenté moverme sensualmente, me puse rojo, pero ya no importaba si _lo había hecho bien_, hice lo que me salió del cuerpo y percibí la sensualidad ahí, todavía enmascarada por la vergüenza, pero al menos la podía percibir!
Luego del baile sensual comenzó una música más tribal, nos reunimos los hombres en el centro y danzamos pisando fuerte, luego nos quitamos las camisetas y comenzamos a correr como poseídos, yo daba unos saltos tan grandes que me sorprendía de cuánto tiempo permanecía en el aire. Las chicas nos gritaban dándonos ánimos, y fue un momento eléctrico de euforia colectiva.
No puedo sino mirar el contador de palabras y pensar que ya me he pasado mucho de la extensión recomendada, pero también puede ser mi sombra que quiere evitar escribir una conclusión. Pero ya hemos dejado suficiente tarea al lector. Seré breve.
Entendí que hay una relación profunda entre las emociones y el movimiento. No se puede bailar sin sentir, o mejor dicho: no se puede disfrutar de bailar sin sentir. Fui buscando aprender a mover el cuerpo, pero lo que tenía que aprender a mover primero era el corazón.
Prompt: A partir de tu propia experiencia escribe sobre los retos que has enfrentado a lo largo de tu vida para llegar a lo que hoy en día consideras que es tu propia verdad.
La gente dice que soy tranquilo y "buena onda", y me percibo con esa apertura, pero reacciono muy fuerte contra las personas negativas. Me he observado lo suficiente como saber que lo que me desagrada de esas personas es el mismo enfoque negativo que intento callar en mi cabeza. Siento que su discurso me va a "malviajar", y como no soy un conversador muy hábil, en lugar de desviar el flujo de la conversación pongo un dique con la intención de detenerlo en el acto.
También me sucede cuando la gente me cuenta teorías conspiratorias (muy populares hoy en día), leyendas urbanas, y otras veces percibo que la carencia de verdad hace daño, como cuando los canadienses le echan perejil en lugar de cilantro a sus tacos.
Si se me permite, en lugar de escribir acerca de los retos que he enfrentado en mi vida, escribiré el reto que tuve esta mañana con mi vecina. Mi vecina es amiga de mi madre, y es una persona de muy buen corazón, siempre dispuesta a ayudar, pero tiene una manera muy particular de ser. En estos tiempos de encierro, cuando necesita que le ayude en algo, viene a mi casa y grita "Maaaaaark, necesitas algo? Maaaaark, te vine a buscar para ver si necesitabas algo!", y cuando salgo a la puerta casi me susurra lo que ella necesita que le traiga del súper. Esto, me alegro de notar, no causa al ego revuelo alguno, y tomo su "pedido" para la siguiente vez que salga al mandado.
Esta mañana vino a desayunar a la casa. "Ayyy casi no pude dormir, me cayó mal la comida de ayer", dijo. "Me quedé viendo la tele y pasaron un programa, en Perú hay momias con tres dedos y las cabezas alargadas y deformes! Y dicen que el gobierno no quiere saber nada de ellas, pero los expertos de todo el mundo: de Rusia, de Alemania, de Estados Unidos, todos están de acuerdo en que eso es auténtico, pero no se atreven a dar una explicación, sólo pueden datar su edad, que es entre dos mil y tres mil años de antigüedad".
"Bueno, en esa época todo mesoamérica estaba poblada, y muchas culturas mesoamericanas tenían la práctica cultural de dar forma al cráneo de los infantes, cuando los huesos aún son suaves..."
"No, no, no, eso lo dijeron en el programa, pero los expertos estaban de acuerdo que esas momias no son humanos con el craneo deforme, porque tienen sólo tres dedos y porque además encontraron a una con un huevo dentro, y dentro del huevo, un feto con la cabeza deforme! o sea que eran vivíparos y nacían así!".
Esperé a que me hirviera la sangre, pero extrañamente no la sensación no llegó. Ayer hablé con René por Zoom y mencionó a Derek Sivers, un autor que ambos tenemos en la estima más alta. Esta mañana me acordé de él, y antes de que llegara la vecina, había leído unas notas que escribió acerca de un libro que leyó: "The courage to be disliked". Estas sencillas palabras hicieron magia:
> Si estás convencido de que "estás en lo correcto" en una relación interpersonal, has entrado en un juego de poder.
> Si piensas que estás en lo correcto, sin importar la opinión del otro, el tema se debe cerrar ahí mismo, porque de otra forma estarás intentando someter al otro a tú verdad.
> Todas los problemas en las relaciones interpersonales son causadas por entrometerse en las verdades de otras personas, o porque alguien se quiere entrometer *tus* propias verdades.
> Para saber de quién es la verdad, piensa, "En última instancia, quién obtiene los resultados de creer esta verdad?"
> Lo que otra persona piensa acerca de ti es verdad de esa persona, no tuya. Sólo tienes que confrontar las verdades de tu propia vida, sin mentir.
> No intervengas en las verdades de otros, ni permitas que otras personas intervengan en tus verdades. Intervenir en las verdades de otros es esencialmente egocéntrico.
(NT: la palabra original de Derek Sivers era "task" en lugar de "truth" (verdad). Lo he traducido así para acomodarlo mejor en mi experiencia interior, como estamos hablando de la verdad es importante reconocer el cambio).
Quizás esto resume el reto más grande que he tenido en mi búsqueda espiritual, y no sólo con mi vecina: no puedo sino notarme queriendo intervenir en las creencias "equivocadas" de otras personas, ya sean culturales, espirituales, científicas, técnicas o simplemente creencias de mal gusto. Y por supuesto, cuando la gente interviene en mis verdades me pongo a la defensiva.
Hasta ahora, lo más que había logrado era cierta tolerancia a las verdades de otros. Sabía que expresar rechazo a su creencia no iba a llevar a ninguna parte, así que me quedaba con el disgusto que a veces se notaba, pero me daba muchos mejores resultados que expresar mi reprobación abiertamente.
Volviendo a mi vecina, como vi que había formado su opinión muy bien respaldada por los investigadores del History Channel, le dije: "bueno, entonces cuales son las teorías de cómo llegaron esas momias ahí?" y conversamos un rato acerca de que algunos investigadores piensan que son aliens, pero luego tienen piel como de reptil y tienen huevos y tal vez son otra rama de seres inteligentes que evolucionó aparte de nuestro linaje y etc. Exploré el tema con ella con una actitud abierta, preguntando qué se había dicho en el programa, con inclusive algo de curiosidad, porque al profundizar en el tema iba comprendiendo todos los ganchos porque la vecina repetía la misma estructura narrativa del programa (le había causado una impresión muy grande).
Habiendo superado mi impulso de imponer "mi verdad" sobre la suya, entendí que ella no me quería convencer de que todo eso que había visto era verdad, sino que sólo estaba describiendo un programa que vio en la tele, que es casi ficción pero entendió como verdad, y que mis impulsos como "defensor de la verdad" sólo son nociones románticas que me vuelven reactivo en lugar de creativo en la conversación.
Luego fuimos con ella al súper, algo que intento evadir lo más posible, porque es el tipo de conductora neurótica que le grita a los otros conductores y me bajo más cansado de su coche que cuando llevo el mandado caminando. "Mira los vecinos dejaron estacionado el coche donde no se debe, como es la gente. Mira, los árboles están enfermos porque ya no les ponen cal. Mira, el río huele muy feo hoy. Uy nos tocó el rojo enfrente de la clínica, qué peligro. Pero mira cuánta gente! seguro están todos infectados de COVID, que bueno que vinimos en coche eh?".
Normalmente me hubiera retraído en mi mundo, evadiendo sus "malas vibras", pero esta vez entendí que su verdad es lo que ella experimenta en el mundo, y que no hay nada que temer de ello. La negatividad afecta y agota más porque _no quieres que te afecte_, y el resultado de esta interacción es que ambas personas pierden: el quejumbroso se siente incomprendido, el "quejumbrado" se siente hastiado.
"Sí Vero, que bueno que nos trajiste en coche. Así vamos más protegidos y además no tenemos que cargar". Esto, para mis estándares, es traicionar a la verdad. Pero la nota positiva hizo que el ambiente negativo se disipara, y la atmósfera se tornó más relajada.
Cual es entonces la verdad? Que lo que se expresa tenga concordancia con la realidad? O hay una verdad más profunda, en la que el aceptar y participar en la verdad del otro me hace partícipe de una verdad más grande? Al llegar a esta conclusión siento que todas las mentes del mundo, desde las más neuróticas hasta las más serenas, merecen expresar sus creencias, ideas y sentimientos sin que yo tenga que entrometerme o "corregirlo",
Y al escribirlo me parece tan obvio que me sorprendo de no haberlo visto antes. También admito no conocer los límites de esta conclusión: si me confronto con una verdad personal que es racista, sexista o clasista, realmente hay un valor en explorar esa verdad? Me recuerda un caso de un señor de tez negra que convencía a miembros del Ku Klux Klan a abandonar a su grupo por medio de la amistad, justo busqué la historia y encontré una entrevista. En sus propias palabras:
---
> La primera vez que conocí a un miembro del Klan estaba tocando música—era la primera vez que tocaba en este lugar, y se me acerca un hombre blanco y me dice "realmente disfruté su música". Se lo agradecí, le estreché la mano y me dice "Sabes? es la primera vez que escucho a un hombre negro tocar el piano como Jerry Lee Lewis", yo me sorprendí de que no conocía el origen de la música y dije "Bueno, dónde crees que Jerry Lee Lewis aprendió a tocar este tipo de música", "no lo sé" contestó. "Lo aprendió de donde yo también lo aprendí: de los panistas de boogie-woogie, black y blues!". "Oh no, Jerry Lee Lewis inventó eso. Yo nunca he escuchado a un hombre negro tocar así". Así que estoy ahí pensando" cómo puede ser que no conozca a Little Richard o a Fats Domino y me dice "sabes que es la primera vez que me siento a tomar una bebida con un hombre negro?".
> Ahora sí me picó la curiosidad. Estoy intentando resolver: como es que en mis 25 años en este mundo me he sentado con literalmente miles de hombres blancos y este hombre nunca lo ha hecho, y le pregunté "¿Cómo es eso? ¿por?" y al principio no respondía, pero un amigo sentado junto a él dice "dile dile dile" y finalmente dice "soy miembro del Ku Klux Klan."
> Solté una carcajada porque realmente no le creía, me tenía que estar bromeando. Pero sacó su cartera y me enseñó fotos y sacó su tarjeta del Klan con el logo ahí, y me di cuenta que era real, que el tipo no estaba bromeando. Y ahora estaba pensando "qué hago aquí sentado con un miembro del Klan?".
> Pero era muy amistoso, y la música nos acercó. Quería llamarme para saber cuando volvería al bar con la banda. El echo de que un miembro del klan y un negro se pudieran sentar en la misma mesa y disfrutar de la música, una semilla fue plantada ese día. Decidí recorrer el país y preguntarle a los miembros del klan: ¿cómo es que me odias, si no me conoces?
---
Este hombre logró que más de 200 miembros del klan abandonaran sus filas. No lo hizo queriendo "defender su verdad" lo hizo queriendo entender la verdad del otro. La verdad que abarca todas las verdades es inconmesurablemente más relevante que la verdad particular.
Que los canadienses le echen perejil a sus tacos, qué más da.
Escribe tu propio credo sobre la muerte, aquel que te hace sentir bien, que te aporta serenidad, paz y armonía. Lo que resulte de este ejercicio será aquella verdad en la que tú decidas, en este momento, creer.
Como Tagore, intenta sintetizar tu credo en una sola frase. Esta puede ser el comienzo de un texto más largo, la conclusión, o bien, lo único necesario para capturar tu creencia.
---
***
Mi credo:
Mi esencia eterna volverá a su origen.
***
Qué tema tan difícil de escribir! Se me hizo un nudo en la garganta cuando comenzaron a brotar las memorias que consolidaron mis creencias acerca del tema de la muerte. Soy el primero en decir que soy muy afortunado de no haber experimentado la muerte de un familiar ni amigo muy cercano. Soy muy afortunado al no haber tenido una pérdida importante antes de entender, en mi visión particular, cómo es que somos partícipes en el desdoblamiento del espíritu del mundo.
Me acuerdo que fui a Valencia un fin de semana yo solo. Estaba medio deprimido. Renté una suite en la playa, pero era invierno y todo estaba vacío, a excepción de unas chicas guapísimas que estaban haciendo surf en el mar. Me metí sin mucha intención de hablarles, pero supongo que uno se acerca a ver si es bien recibido.
Pero el mar estaba congelado. Yo no sabía nada de surf y que sus trajes de neopreno las protegían del frío. Supongo que habrán pensado "que chico tan raro que se mete así". Pues sólo era yo ignorante de las condiciones del mar de España en invierno.
Noté el frío del agua, pero ya me había desvestido, y como no quería parecer cobarde nadé un ratito haciendo como si nada, para que al menos pensaran "bueno, es raro pero sí que aguanta el frío", pero desistí a los diez segundos. Era demasiado frío para oculutar mi cara de sufrimiento. Regresé a la suite para cambiarme e ir a la Ciudad de las Artes y las ciencias.
Como quería conocer el casco antiguo, di el largo paseo entre la suite en la que me estaba quedando y la famosa obra de Calatrava. Las calles eran muy bonitas, comenzó a pegar el sol de medio día y me estaba calentando el alma. Las calles de valencia están decoradas de naranjos que ofrecen sus frutos impecables a los transeúntes! Pero cómo puede ser que nadie las haya recogido todavía, habrá multa?
En una privada discreta "robé" una apariencia perfecta. Ah, naranja de valencia. La pelé entera y saqué un gajo grande para saciar mi sed. Era amarguísima! Resulta que en Valencia las naranjas no son naranjas de Valencia, un mesero me explicó que sólo sirven para hacer mermelada, por eso ni se molestan en recogerlas. Se podía comer, pero no era placentero.
Creo que si cambiara la frase por "Se podía vivir, pero no era placentero" resumiría mi estado de ánimo en ese periodo. Justo me había separado de mi grupo de biodanza en México, moverme a España había causado el rompimiento con mi pareja al darnos cuenta que no funcionaba a distancia, me sentía cansado de que la vida otra vez me agarrara de un lugar para colocarme en otro, pues me he movido mucho en mi vida y percibo casi literalmente cómo soy arrancado de raíz, y tardo un poco en pegar en tierra nueva, como cualquier persona supongo. Estaba pasando por un duelo distinto al de la muerte.
Para aliviar mi dolor existencial, la semana anterior había asistido puntualmente a un grupo de biodanza avanzado en Madrid. Como regalo de cumpleaños a una de sus alumnas, el maestro le hizo una ceremonia de renacimiento. Me acordé de mi ceremonia de Minotauro que experimenté en Biodanza en México, hacía tan solo tres meses. Pensé: se supone que renací para escapar de esta nube negra, cómo es que la nube negra me encuentra renacido? El renacimiento tiene que pertenecer al género de la superstición, porque he vivido en carne propia un convencimiento de haber renacido, y luego parece que el ser renacido desvaneció poco a poco, y aquí me encuentro en la misma situación que antes.
Decidí poner mi mente en otro lado. Paseando por la obra de Calatrava vi un edificio en forma de casco que despertó mi curiosidad. Qué es eso! Ah, un planetario! Proyectarán estrellas espero! Ehhh un documental de la mariposa monarca? Bueno, pues es lo que hay. Pedí unos nachos que eran sorprendentemente peores que los de Cinépolis y me senté a ver la película.
Comenzó con la historia un niño que jugaba con mariposas en el campo los veranos, en Ontario, Canadá (cerca de donde yo nací). Al crecer se empieza a intrigar por los ritmos de las mariposas, cómo es que llegan siempre en la misma época del año? y se da cuenta que realmente no saben ni de dónde vienen, ni a dónde van. Llegan a Canadá, se mueren, nace una generación nueva, y se van. Saben que tienen que tener un destino, pero dónde?
Con la ayuda de voluntarios comienza a poner etiquetas pequeñismas en las alas de las mariposas, y logran convencer a la TV que presentaran su idea: cuanto te encuentres una mariposa con esta etiqueta, mándanos una carta y con el remitente sabremos dónde la encontraste! Y así la idea se expandió de forma viral, mucha gente se involucró ayudando a rastrear dónde habían encontrado las mariposas con etiqueta.
El chico emprende una investigación de varios años, en los que va recolectando ubicaciones de dónde le han enviado cartas. Algo sorprendente sucede: sobre el mapa se traza una línea entre Ontario y el sur de Texas, "tienen que seguir a México, sólo que no hemos pedido ayuda a los mexicanos y por eso no recibimos cartas de ellos", piensa.
Viaja a México para pedir ayuda a los Mexicanos, y como sucede con tantos Canadienses que vienen a visitar este país (como mi padre), no sólo se enamora del país, sino que ese enamora de una mujer mexicana naturalista guapísima y en su jeep se van a explorar los montes de México y aunque no encuentran muchas pistas se nota que él es inmensamente feliz.
Hasta que en una de esas exploraciones, recorriendo los montes boscosos de Morelia Michoacán, comienza a caer un aguacero que les deja el parabrisas lleno de... Mariposas Monarca! Su lugar de hibernación debe de estar muy cerca! Se bajan del jeep y comienzan a ver los árboles! Ahí están! Parecen árboles de mariposa! Se abrazan emocionados.
La película termina en que son mayores y que se casaron y que las mariposas fueron una pasión de por vida para ellos y todo eso que nos enseñan en Hollywood. Agradecí que pudiera poner mi atención en otra parte durante dos horas. Me levanté para irme. Salieron las escenas después de la película, y salían fotos de los personas reales detrás de los personajes de la película.
"Meh, seguro es una interpretación muy amplia de _basada en hechos reales_", pensé. Los nachos estuvieron tan malos que ni me los terminé. Resolví mejor buscar la mejor paella de Valencia, eso seguro me alegraría el ánimo.
Busqué en Google Maps y caí en un lugar acogedor.
"Viene a probar la paella?" me pregunta el mesero.
"Sí!" respondo entusiasmado.
"Espera a alguien?",
"No, sólo soy yo",
"Lo lamento, pero sólo tenemos paella para dos personas en adelante". "No importa, traigo hambre".
"No se lo va a poder acabar".
"Con todo el respeto, usted no me conoce", respondo con un guiño. "Bueno, si se lo acaba, el chupito va por mi cuenta", se ríe.
"Hecho, y además traigame esta botella" dije señalando al tinto más barato del menú.
La verdad es que el tamaño me decepcionó un poco, traía mucha hambre y apenas toqué el vino en lo que comía. Eché de menos el chorizo que le echamos a la paella de mariscos en México, en España eso es taboo. Como tenía que terminar la botella y comencé a mirar el teléfono, y busqué la historia que acababa de ver en el planetario. Pues resulta que sí eran hechos reales, seguramente endulazadas para el público, pero sí que la historia fue así! Anda, que buena aventura se aventó ese chico! El viaje el héroe que había realizado ese hombre había culminado de una forma tan arquetípica que lo confundí con ficción! Ya han pasado a mejor vida, pero sus nombres son Frederick Albert Urquhart y Norah Roden Urquhart.
"Pero si toda la historia no era una telenovela, tengo que reconsiderar y reinterpretar lo que vi en la película" pensé. Y la cosa más curiosa sucedió: repasando mis memorias de la película, vi una alegoría muy clara: la mariposa que emprende su viaje a México no es la que llega a Canadá. Emprende su viaje con un instinto de salir al norte, ni siquiera sabe su destino. Si tiene suerte, no se la comerán o morirá en el camino y llegará el momento en que tenga que detenerse para reproducirse y morir, sin lamentar no haber llegado a Canadá. El buscador que muere y renace psicológicamente lo hace para seguir su camino. El buscador renacido cuenta con nuevas herramientas y nuevos aprendizajes para continuar otro tramo, pero para llegar hasta el final de su vida? Eso sería cargar equipaje innecesario, o no?
Y sin embargo, la mariposa monarca, cuando llega a Canadá, se reproduce una última vez antes de morir. De esta última generación nace una "super mariposa" que es bastante más grande, fuerte y resistente que sus predecesoras, y esta vuela literalmente por encima nubes evitando los aguaceros que llevaron a su propio descubrimiento. Lo que llevó cinco generaciones recorrer a sus ancestros, esta lo recorre de un jalón. Y además: al llegar tiene que hibernar para madurar sexualmente.
Lo entendí: el renacimiento que había experimentado en biodanza era una mariposa macho muy bonita pero de las pequeñitas. Me transportó de México a España, y estaba muy bien equipada para ello, pero no está bien equipada para arraigarse aquí. Las mujeres españolas le parecen incomprensibles, carga una botellita de habanero en la bola que le echa a la tortilla española, y no sólo es ignorante de las costumbres y usos de este país, sino que le parecen ridículos. ¿Qué estaban pensando cuando sembraron naranjas amargas en Valencia?
Y así entendí que mi composición psicológica se desmonoraría cíclicamente provocando una especie de renacimiento o recomposición distinta a lo que era antes, pues con cada depresión hay una reevaluación interior y de eso emerge una nueva forma mejor adaptada para lidiar con el mundo, y _esto_ era lo que estaba experimentando.
Ya había leído (y entendido) que una vez que sufres depresión y te recuperas, es muy probable experimentar un episodio de nuevo más adelante. Racionalmente percibía que este cambio de país había hecho brotar nuevamente mi depresión, y que poco podía hacer mas que auto-contenerme y resistir, pero la comprensión de esta alegoría me permitió acomodarlo en el mundo interior como un proceso constante de renovación, y mi "lucha contra la depresión" se convirtió en un proceso más bien de duelo, de aceptación de las circuntancias y las emociones.
Desde esta alegoría entendí que moriría y renacería muchas veces más con un destino que no conozco, e intuí que en algún momento nacería una "súper mariposa" que haría el trabajo espiritual de cinco generaciones, y casi me alegré de estar deprimido. Significaba que el momento de morir se estaba acercando, y que este nuevo ser que emergería de mi muerte estaría mejor adaptado para lidar con este cambio de ecosistema. Y luego esta moriría también, y el renacido continuaría el trabajo hasta cumplir su ciclo y así sucesivamente.
Volví algo borracho a la suite, y al siguiente día tomé el autobús a Madrid. No había cambiado mi estado de ánimo, pero sí había cambiado mi perspectiva. Me tomó semanas integrar este evento en apariencia tan sencillo, pero cuando terminé de hacer el trabajo interior, entendí que mis muertes metafóricas no son sino ecos lejanos de la muerte que voy a experimentar, y si bien sigo teniendo un ego solipsista que perdura a través de estas muertes, cada vez que sucede distingo mejor lo que es eterno de lo que es temporal en mi.
Este ego no se necesita una vez que que hayamos llegado a nuestro destino, y por lo tanto quedará esencia pura, la misma esencia de la que nos originamos, y nos reintegraremos con el todo.
---
Podría quedarme tan solo con tu frase inicial a través de las que nos compartes tu credo: “Mi esencia eterna volverá a su origen”
Pero, haciéndole honor a mi amigo que dice que ante cualquier estímulo escribo, tu texto se convirtió en un fuerte estímulo que me lleva a compartir contigo lo que no quiero dejar en el tintero.
Sin duda eres afortunado al no haber experimentado la muerte de ningún ser querido. Sin embargo, si ha habido momentos en los que como lo expresas “se podía vivir, pero no era placentero.” La separación de tu grupo de biodanza, el rompimiento con tu pareja, el haber sido arrancado de raíz de tu tierra para echar nuevas raíces en tierra nueva te ha llevado a experimentar el duelo por las pérdidas de las cuales se muere a una forma de existencia para renacer a una nueva forma de ser, estar en el mundo y de trascenderlo.
Cualquier tipo de pérdida lleva consigo la experiencia de un duelo que, en distintos grados de intensidad, conducen al embotamiento emocional, sentimientos de frustración, de enojo, de desesperanza y de sentimientos a los que con frecuencia solemos llamar depresión, cuando quizás lo que se está experimentando es una especie de crisis emergente. Desde la perspectiva de la espiral de la conciencia, los giros presentan una fase descendente en la que la conciencia se detiene para cobrar consciencia y tomar la fuerza necesaria para superar cualquier tipo de crisis que se experimenta y así, continuar con su proceso ascendente. K. Wilber explica que cuando la persona no logra resolver y trascender las diversas crisis que se presentan a lo largo del proceso evolutivo, esta se estanca. También sostiene que cuando las crisis no logran superarse, la persona puede llegar a involucionar hacia estados menos desarrollados que pueden llegar a convertirse en disfunciones patológicas desde las más leves hasta las más profundas.
Compartes tu lucha en contra de la depresión y sobre cómo has llegado a contemplarla como un proceso de duelo y de aceptación de las circunstancias y emociones. Al leerte, no resistí la tentación de compartir hoy contigo algunas frases de Facundo Cabral sobre la depresión que a mí me encantan y que me parece que reflejan tu experiencia.
No estás deprimido, estás distraído del presente, donde sucede la vida. Los amaneceres y los ocasos, las montañas, los valles, los arroyos, los ríos y los mares, la selva, los guacamayos, (las mariposas), los monos, los tigres, los leones, los elefantes; el arte, la arquitectura, los seres humanos de todos los colores, el ilusorio tiempo que te empuja y la eternidad que te permite cambiar de rumbo y recomenzar a cada instante.
No estás deprimido, estás distraído de las maravillas que suceden alrededor tuyo, desde nacimientos a cosechas, desde revoluciones a conciertos, desde campeonatos de fútbol a viajes interplanetarios. No estás deprimido por algo que pasó, sino distraído del todo... que es ahora mismo.
El principio y el final, es decir la vida y la muerte, son invenciones de la mente. Deja al pasado de lado y sentirás toda la vida. La luz de la conciencia, seguirá iluminando los infinitos caminos de la vida.
En alguna parte de tu texto comentas que el buscador que muere y renace psicológicamente lo hace para seguir su camino pero entonces te preguntas si él cuenta con nuevas herramientas y nuevos aprendizajes para continuar y llegar hasta el final de su vida y sí esto no sería cargar con un equipaje innecesario. Más adelante respondes a tu pregunta cuando hablas de ese “ego solipsista” que al ir más allá de las muertes te permite contemplar que en “el fondo todo es yo”.
En pocas palabras, al experimentar que uno mismo es el Universo entero, expresas tu credo diciendo: “Mi esencia eterna volverá a su origen.” Y, la esencia, no es otra cosa más que la Nada, ese Vacío que todo lo contiene.
Abrazos.
¿Cómo sería una danza de la vida por escrito?
Sería un poema.
Pero yo no soy poeta, susurra el ego.
Eres lo que quieras ser, alienta el espíritu.
La _poesis_ es este acto mismo de creación, afirma la razón.
Entonces doy un paso fuera de mi jaula.
No me siento libre, estoy incómodo.
Pero lo intento, y escuchando la música
muevo mis pies, uno tras de otro.
Poco a poco me olvido de que soy observado,
dejando que los movimientos de mis dedos
dancen lo que quieran danzar,
pues no soy yo el que escribe esto,
le dejo mi lugar al despierto que observa.
Sí, que sea él el que escribe.
Giro sobre mis pies, viendo al cielo.
Extiendo las palmas de mis manos,
la derecha mirando al cielo,
la izquierda mirando al suelo.
Giro y giro hasta percibir la unión del cielo y la tierra.
Se aparecen los caballos de la auriga de Platón,
el espríritu como un caballo blanco
la pasión como un caballo negro
Y como conductor del carro veo a la razón.
Me invita a subir.
Subo de un brinco.
Los caballos relinchan y emprenden una gran carrera a toda velocidad, trazando un gran círculo en la arena de este desierto imaginario, pero en lugar de pisar sus propias huellas, el carruaje se eleva por encima de ellas.
Como en sueños, el caballo negro de la pasión se funde con el blanco de la pasión, y extrañamente el resultado no es un caballo gris! Es una esfera donde un polo es obscuro, y el otro el claro, y en el ecuador de esta esfera está repleto de colores puros que se desvanecen hacia los polos. El camino medio está entre la negrura de la pasión y lo clareado del espíritu, pero no es gris, es el espectro que observamos cuando la luz atraviesa una partícula de agua y proyecta el arcoiris en el cielo.
Del alma brotan los diez mil símbolos que se presentan ante la conciencia casi como brotes psicóticos. Qué difícil es la emergencia espiritual! Emergencia en el sentido de emerger, y en el sentido de urgencia espiritual. Cae como un rayo y lo deja a uno tirado en el suelo sin la menor idea de lo que le pasó, y se va uno a su rinconcito a lamerse sus heridas y de repente el mundo se comienza a comunicar en símbolos, la intuición se abre y el ego se confunde: pero quién me vino a tirar al laberinto de Creta, yo no pedí esto, ey ya saquenme de aquí!
Pero es más difícil callar al llamado que seguirlo. Se puede posponer, negociar, implorar, pero ultimadamente uno no elige la hora de hacer el trabajo: la puerta se abre y uno sabe que es hora de entrar, de pasar por la puerta, de entregarse con todo el coraje que uno sea capaz de producir en ese momento, y luego un poquito más.
Y detás de esta puerta danzo todo lo que he recorrido en este camino, ante la mirada de mis compañeros que reconocen algunos de mis movimientos en sus propias experiencias vitales, y ante la mirada inescrutable de la gran abuela, cuya sabiduría parece sobrehumana (porqué lo es). Termino mi baile exhausto, adolorido y sudoroso, como la primera vez que asistí a biodanza, y hago una profunda reverencia a todos los asistentes.
Gracias por leerme.
---
Cuando el diseñador se convierte en poeta no son los dedos los que danzan en libertad por el teclado, es la conciencia que al despertar crea, diseña, orquesta su propia danza en el escenario de la vida. No es la razón la que escribe plasmando en una página en blanco su experiencia, es la conciencia despierta que al contemplarse a sí misma, se eleva en el carro alado que, al integrar negro y blanco, despliega un arco iris completo que solo aquel que ha salido de la jaula y ha emprendido el vuelo puede llegar a mirar.
Me viene a la mente la imagen del Uróboros que forma un círculo en el que simbólicamente se representa la integración de la dualidad. Cielo/Tierra, Materia/Espíritu, Vida/Muerte, Negro/Blanco, se unen en un estrecho abrazo que trasciende el tiempo y el espacio.
Es cierto que el ego se aterra ante la idea de perder su poder y su dominio, se siente herido, enojado, confundido y, a veces, se transforma en seductor para reconquistar aquello que ha perdido. Pero puede estar tranquilo porque no es como algunos creen que “hay que matar al ego” simplemente es darle el justo lugar y valor que le corresponde. Hay que dejarlo dormir, cuando menos a ratos, para que la conciencia pueda despertar del sueño que es la vida.
La abuela, a la que me imagino que te refieres, no tiene nada de sobrehumana simplemente tiene muchos años de juventud acumulada.
Gracias por tu poesía, gracia por tu danza que también es la mía, gracias por tu apertura y tu confianza que me ha conmovido, emocionado y enternecido.
Un gran abrazo de quien podría ser tu abuela.
I have decided to begin the workday by having a 30 minute session of "consciousness stream" related to work. I usually do this in paper journals, but I see that in my affection for paper I've relegated typing, and when I sit down to write on a keyboard the experience is less focused and more editing-like. This is written with minimal editing, it will come out rough, and each day I'll set a timer with 30 minutes to write it.
I must see what is it that I want to accomplish in this sunny Sunday. I do not have a place where to publish this, so I need to set up a blog or website where to put it. I have a Movable Type installation (hopefully) still running that I set up a couple of weeks ago, but then I saw I needed to design it, to create a logo, which then expands into a "brand", and if I want UI consistency I'd need to begin designing a whole set of UI elements and everything complicates immediately. Let us not complicate things before they are done. Let things grow from a seed, which is an intention, and then keep on watering that intention. This is how projects grow organically.
It is 10:34 AM. I have time for around 3 work sessions, one in the morning and two others after lunch. Where will I work? It is Sunday and it's sunny. I'd enjoy spending some time outside, so I will pack to spend the day about, and I will find which libraries or study halls are open today. I don't like working at home, well, it's not that I don't like it, it is that usually I get more done and I'm more focused when I'm about.
What would a blog need to be functional? It takes 5 minutes to get something up and running. I could part from an existing template, and then customize it to need. But this feels inadequate. I need maximum flexibility so that I can incorporate things in the future. So I cannot start off by a template. It is enough that text is readable on a range of devices. Does it need to be responsive? It seems important these days that it would be viewable on all devices. I will write a list and add to it as the stream of consciousness flows.
Historically I've been terrible at estimating the time I have to complete a task, because I indulge in perfectionism. This wouldn't be so much of a problem if things ended up being perfect, but usually it is simply an approximation to the idea I have in my mind, the "platonic" product. Coming closer to the platonic product can be done at it's own rhythm. I'm trying to find what is most essential.
Would I need to publish it today? No, that seems to be a task for tomorrow. There was a blue underline under 'tomorrow' and it made me second guess my writing. Thought has drifted. What else would I want to accomplish in this blog? The essentials seem to be included in the "Very basic custom theme", I'll cross it out. This is more a refinement on the first point.
It seems that these two things (create a basic theme that is responsive) give birth to the product. This is enough in itself, though I know that through the act of designing and implementing many branches will sprout out. It is unnecessary to foresee these branches as they grow organically. With the intention of dedicating three work sessions today, it will be possible that tomorrow I have a blog with this (and tomorrow's entry) published.
<$checkbox/> Very basic custom theme<br />
<$checkbox/> Responsive<br />
<$checkbox/> Only essentials
How much time do I have left? eight minutes. I shall explore how this work will be done. There is a study hall close to my apartment which is open on Sundays, but there is not much of anything else around. Additionally, I've seen that I lack certain things to properly make myself autonomous for the duration of the day, so, for example, I go have a work session to the study hall, then I come back home and change for the gym, then I come back and have lunch, and so forth. I would like to pack lunch, gym clothes, possibly pool items (towel, sun block, bathing suit) so that I can spend the day outside. I've tried to fit all these items in my backpack, but it is impossible if you add the laptop, the notebook and the charger. I need a duffel bag or something of sorts. And my bike also would probably need one of those cargo things on the back tire so I can lug it around. A good idea would be to go buy these things today. So let us plan the route with the minutes I have left:
<$checkbox/> Buy bike rack<br />
<$checkbox/> Buy duffel bag
I shall now find a route that includes a sports shop and a library. If all goes well I might hit the pool. Not much else needs to be written. I'm done with a minute to spare.
!!!! Work session 1 (1.5h)
As I was going to my intended destination to work, it occurred to me it would be a good exercise to write down what I wanted to accomplish in the session, as I often leave unfinished bits of work which either are difficult to come back to, or are simply forgotten and becomes lost work. However, when I arrived to the library (Ivan Vargas, in downtown Madrid) it was closing early because of St. John festivities. I continued my task, which was to buy a duffel bag and a transport gadget for the bike, and in the end I decided that a duffel bag was undue, because I would transport my stuff perfectly well in a sturdy grocery bag. Instead, I bought sunglasses, which I am not accustomed to using, but since I'm spending a lot of time outdoors during daytime, they were overdue.
I then searched for a place to work from which was not a café (which I find distracting) but I couldn't find any, so I decided to continue my plan, which was to go to the gym and to the pool, and see if there was an appropriate place to work from. Turns out I didn't find any appropriate place, so I simply walked around the pool in Casa de Campo to find a good spot. The best spot I could find was under the shade of a tree in a secluded place, and even though it is not ideal, it occurred to me that I haven't experienced how much time I can work leaning against a tree.
It is 14:30, let this time mark the beginning of my work session.
What can be done under these circumstances? It seems publishing this very prologue would be a good task. It doesn't need any styling. I just need a textarea where I can paste this and publish it on the web. Once this is done, I can go to the dressing room and relax a pair of hours before heading back home to continue work.
---
After 1h and 30min I was able to publish this text on the server. Most of the time was spent debugging a problem: everything was going smoothly, but after saving a template mysql crashed. Apparently there was a lack of memory, I will need to monitor of this happens again and increase the memory of my droplet if this is the case. After fiddling around I restarted the server, but then plackup refused to run because of a senseless issue (I can't specify the full route, I must cd into the directory to run it. Remembering that I must run plackup to run movable type is technical debt, so I must find out how make it automatically run upon starting up the server.
I didn't last long leaning against my back against the tree. In the end I laid down and propped my head with my backpack against the tree. I could work almost indefinitely in this position. It is nice to observe that a particular set-up isn't required to focus: a shade, a flat surface and something to prop my head is enough. I have a small camping cushion which I can carry around. This would make any park a potential workplace.
Now it's well earned time at the pool.
!!!! Work session 2 (30 min)
After the pool I have come to a coffee shop for my second leg of work. The idea of going back home was not all that appealing. Now that the CMS can publish, the task will be to make it readable. So this leg of work will be to apply some basic styling. The only structure needed is to constrain the line length in wide monitors, the header and the footer. I'm pondering what is needed in a blog as this, do I need an about page? Let us keep this constrained to structure, and worry about content and styling later.
It is unnecessary at this time to open Sketch. The structure ought to be described by way of diagrams. Should I attempt to sketch it out in pen and paper if it can be held in the mind? Though implementing it directly in HTML is what I'd do first, let us think this through more carefully through sketching and projecting the direction. In this way, at the end of the session I can photograph the things I come up with, and then implement them in a future leg of work, possibly today.
{{Work axioms}}
It is 19:30, let us time ourselves.
It is just 20:00 and I'm done with the very basic styling. I didn't really expected this to become a day of work, but what better way to begin a project by experiencing it, the direction felt correct and I seem comfortable describing myself at work.
Work session 3 (59min)
I passed by the study hall next to home and it was open. It will be open until 01:00. I have time for the last work session I had settled upon but felt impeded because of St. John. Here, I suppose, are the most focused students that students can be asked on a Sunday afternoon. Let us have a session of meditational presence in these five minutes:
I am sitting crosslegged. I will position myself in a more active posture. I become aware of what I hear: shuffling of paper, mouse clicking. It is silent enough to hear my own thoughts, background music is not needed. A girl just teared up a piece of paper and distracted me. Back to the presence prompt: there is no hunger, or thirst, I am satisfied. But my skin is blazing hot from lying in the sun, but completely tolerable. I could wet my face with cold water. Indeed. I trust these students with my laptop while I do this.
The laptop is still here. My face and arms wet, some self-consciousness arises. Let it settle and breathe. Feel the air come in and out. Simply come back if you drift. Train your attention and keep it steady.
How do I feel about writing code? though professional devs would scoff at me, my output of html and css code is done for the day. I feel like something more relaxing. Let us write an article with stream of thought, which then will be edited and see what comes out. If it's not worth showing, crumble and toss away. One cannot summon inspiration, but one must be attentive to it's moment of strike
It is 21:11, I shall finish writing in an hour.
22:10 now. One hour is not enough to write an article, I will come back to it at a later date when I feel like writing.
!!! Debt
<$checkbox/> Put templates in linked files<br />
<$checkbox/> Launch plackup upon server start<br />
<$checkbox/> Pack pillow
I have decided to begin the workday by having a 30 minute session of "consciousness stream" related to work. I usually do this in paper journals, but I see that in my affection for paper I've relegated typing, and when I sit down to write on a keyboard the experience is less focused and more editing-like. This is written with minimal editing, it will come out rough, and each day I'll set a timer with 30 minutes to write it.
I must see what is it that I want to accomplish in this sunny Sunday. I do not have a place where to publish this, so I need to set up a blog or website where to put it. I have a Movable Type installation (hopefully) still running that I set up a couple of weeks ago, but then I saw I needed to design it, to create a logo, which then expands into a "brand", and if I want UI consistency I'd need to begin designing a whole set of UI elements and everything complicates immediately. Let us not complicate things before they are done. Let things grow from a seed, which is an intention, and then keep on watering that intention. This is how projects grow organically.
It is 10:34 AM. I have time for around 3 work sessions, one in the morning and two others after lunch. Where will I work? It is Sunday and it's sunny. I'd enjoy spending some time outside, so I will pack to spend the day about, and I will find which libraries or study halls are open today. I don't like working at home, well, it's not that I don't like it, it is that usually I get more done and I'm more focused when I'm about.
What would a blog need to be functional? It takes 5 minutes to get something up and running. I could part from an existing template, and then customize it to need. But this feels inadequate. I need maximum flexibility so that I can incorporate things in the future. So I cannot start off by a template. It is enough that text is readable on a range of devices. Does it need to be responsive? It seems important these days that it would be viewable on all devices. I will write a list and add to it as the stream of consciousness flows.
Historically I've been terrible at estimating the time I have to complete a task, because I indulge in perfectionism. This wouldn't be so much of a problem if things ended up being perfect, but usually it is simply an approximation to the idea I have in my mind, the "platonic" product. Coming closer to the platonic product can be done at its own rhythm. I'm trying to find what is most essential.
Would I need to publish it today? No, that seems to be a task for tomorrow. There was a blue underline under 'tomorrow' and it made me second guess my writing. Thought has drifted. What else would I want to accomplish in this blog? The essentials seem to be included in the "Very basic custom theme", I'll cross it out. This is more a refinement on the first point.
It seems that these two things (create a basic theme that is responsive) give birth to the product. This is enough in itself, though I know that through the act of designing and implementing many branches will sprout out. It is unnecessary to foresee these branches as they grow organically. With the intention of dedicating three work sessions today, it will be possible that tomorrow I have a blog with this (and tomorrow's entry) published.
[ ] Very basic custom theme <br />
[ ] Responsive <br />
[ ] Only essentials
How much time do I have left? eight minutes. I shall explore how this work will be done. There is a study hall close to my apartment which is open on Sundays, but there is not much of anything else around. Additionally, I've seen that I lack certain things to properly make myself autonomous for the duration of the day, so, for example, I go have a work session to the study hall, then I come back home and change for the gym, then I come back and have lunch, and so forth. I would like to pack lunch, gym clothes, possibly pool items (towel, sun block, bathing suit) so that I can spend the day outside. I've tried to fit all these items in my backpack, but it is impossible if you add the laptop, the notebook and the charger. I need a duffel bag or something of sorts. And my bike also would probably need one of those cargo things on the back tire so I can lug it around. A good idea would be to go buy these things today. So let us plan the route with the minutes I have left:
[ ] Buy bike rack <br />
[ ] Buy duffel bag <br />
I shall now find a route that includes a sports shop and a library. If all goes well I might hit the pool. Not much else needs to be written. I'm done with a minute to spare.
!!! Work session 1 (1.5h)
As I was going to my intended destination to work, it occurred to me it would be a good exercise to write down what I wanted to accomplish in the session, as I often leave unfinished bits of work which either are difficult to come back to, or are simply forgotten and becomes lost work. However, when I arrived to the library (Ivan Vargas, in downtown Madrid) it was closing early because of St. John festivities. I continued my task, which was to buy a duffel bag and a transport gadget for the bike, and in the end I decided that a duffel bag was undue, because I would transport my stuff perfectly well in a sturdy grocery bag. Instead, I bought sunglasses, which I am not accustomed to using, but since I'm spending a lot of time outdoors during daytime, they were overdue.
I then searched for a place to work from which was not a café (which I find distracting) but I couldn't find any, so I decided to continue my plan, which was to go to the gym and to the pool, and see if there was an appropriate place to work from. Turns out I didn't find any appropriate place, so I simply walked around the pool in Casa de Campo to find a good spot. The best spot I could find was under the shade of a tree in a secluded place, and even though it is not ideal, it occurred to me that I haven't experienced how much time I can work leaning against a tree.
It is 14:30, let this time mark the beginning of my work session.
What can be done under these circumstances? It seems publishing this very prologue would be a good task. It doesn't need any styling. I just need a textarea where I can paste this and publish it on the web. Once this is done, I can go to the dressing room and relax a pair of hours before heading back home to continue work.
---
After 1h and 30min I was able to publish this text on the server. Most of the time was spent debugging a problem: everything was going smoothly, but after saving a template mysql crashed. Apparently there was a lack of memory, I will need to monitor of this happens again and increase the memory of my droplet if this is the case. After fiddling around I restarted the server, but then plackup refused to run because of a senseless issue (I can't specify the full route, I must cd into the directory to run it. Remembering that I must run plackup to run movable type is technical debt, so I must find out how make it automatically run upon starting up the server.
I didn't last long leaning against my back against the tree. In the end I laid down and propped my head with my backpack against the tree. I could work almost indefinitely in this position. It is nice to observe that a particular set-up isn't required to focus: a shade, a flat surface and something to prop my head is enough. I have a small camping cushion which I can carry around. This would make any park a potential workplace.
Now it's well earned time at the pool.
!!! Work session 2 (30 min)
After the pool I have come to a coffee shop for my second leg of work. The idea of going back home was not all that appealing. Now that the CMS can publish, the task will be to make it readable. So this leg of work will be to apply some basic styling. The only structure needed is to constrain the line length in wide monitors, the header and the footer. I'm pondering what is needed in a blog as this, do I need an about page? Let us keep this constrained to structure, and worry about content and styling later.
It is unnecessary at this time to open Sketch. The structure ought to be described by way of diagrams. Should I attempt to sketch it out in pen and paper if it can be held in the mind? Though implementing it directly in HTML is what I'd do first, let us think this through more carefully through sketching and projecting the direction. In this way, at the end of the session I can photograph the things I come up with, and then implement them in a future leg of work, possibly today.
But this is clever thinking to put off the first professional mantra: always be shipping. Action trumps manifestos. Allow for work to do the talking. Let us get to work, the only task is to communicate, what allows for clear communication?
It is 19:30, let us time ourselves.
It is just 20:00 and I'm done with the very basic styling. I didn't really expected this to become a day of work, but what better way to begin a project by experiencing it, the direction felt correct and I seem comfortable describing myself at work.
!!! Work session 3 (59min)
I passed by the study hall next to home and it was open. It will be open until 01:00. I have time for the last work session I had settled upon but felt impeded because of St. John. Here, I suppose, are the most focused students that students can be asked on a Sunday afternoon. Let us have a session of meditational presence in these five minutes:
I am sitting crosslegged. I will position myself in a more active posture. I become aware of what I hear: shuffling of paper, mouse clicking. It is silent enough to hear my own thoughts, background music is not needed. A girl just teared up a piece of paper and distracted me. Back to the presence prompt: there is no hunger, or thirst, I am satisfied. But my skin is blazing hot from lying in the sun, but completely tolerable. I could wet my face with cold water. Indeed. I trust these students with my laptop while I do this.
The laptop is still here. My face and arms wet, some self-consciousness arises. Let it settle and breathe. Feel the air come in and out. Simply come back if you drift. Train your attention and keep it steady.
How do I feel about writing code? though professional devs would scoff at me, my output of html and css code is done for the day. I feel like something more relaxing. Let us write an article with stream of thought, which then will be edited and see what comes out. If it's not worth showing, crumble and toss away. One cannot summon inspiration, but one must be attentive to it's moment of strike
It is 21:11, I shall finish writing in an hour.
22:10 now. One hour is not enough to write an article, I will come back to it at a later date when I feel like writing.
!!!! Debt
[ ] Put templates in linked files<br />
[ ] Launch plackup upon server start<br />
[ ] Pack pillow<br />
It is 07:44. Today I have to receive guests for an airbnb that I manage. Guests arrive to the train station at 14:15, the earliest they could get home would be at 15:00, so I would need to be at the apartment for cleaning up at 13:00 the latest. It can get there early and have a work session, or work form a different place and then head to the apartment. I prefer working from a public space, so I'll hit the library first.
What needs to be done today? Though I now have a working stream of thought "published", it is not truly published until you broadcast it. So I would like, at the end of the day, to have this published. Not that much needs to be done, I'll just let the perfectionist in me take charge knowing that the deadline is today.
I consider cleaning and receiving guests to be a work session, so I will have to do the same 5 minute consciousness stream when I arrive. I usually have three work sessions per day, so I need a workplace after I've checked in the guests. I'll be carrying laundry, so I don't want to walk too far. I've been to the library closest to the airbnb apartment, but it is an uninspiring place to work. Let us try the study hall nearby which is unknown to me.
Work session at Biblioteca Elena Fortín
Work session at Airbnb
Work session at Luis Gonzaga study hall
I'd also like to hit the gym today. I'll see if it fits between one of my work sessions, or if I'll do it at the end of the day. Not much else needs to be written, I'll forgo my extra minutes and prepare the day.
!!! Work session 1 (2h, 5m)
I forget that things start off late in Spain. I arrived to the library 10 minutes before opening hours at 09:00, so I'll use these spare minutes while it opens to write down what I want to accomplish in this work session. The intention will be to know what to do when I sit down at my desk. I have the basic layout finished. It would need some colors and very basic styling. I haven 't styled any links. I don't want to get too hung up on styling matters, as long as there is enough whitespace, proper hierarchy, and good readability I'll be satisfied. The goal is quite vague. I suppose the metric is "would I send a link to this to another person?" and if the answer is yes, I'll be done.
I have around two hours for this work session, at the end I will go back home, install the bike rack, pack the clean laundry for the airbnb and then bike over there. Though it feels like I am getting ahead of myself, I won't introduce the second work session until I arrive to the apartment, so I need to make mental note of the things needed to get there. I was low on trash bags, I'll pick some up after the library.
I have a properly written announcement which I wrote a couple of weeks ago, and I'd like to publish this too. How does this fit in with the work journal? It is a different kind of information and it needs it's own space. This indeed is something to be worked out at my last working session.
It is 9:02 and the library doors are open, I shall look for a seat.
It is 11:08 and I had a sold two hours of focused work. The verdict: not terrible. It was a pleasant work session, working among focused students does wonders for concentration.
!!!Work session 2 (1h, 30min)
I arrive to the airbnb apartment with just enough time to clean up for the next guests, so I will be as brief as possible. I will write as I finish catching my breath from the grueling 40 min uphill bike trip from my house. I'm glad I packed an extra shirt, if I have a couple of minutes at the end of the cleaning session I'll jump into the shower, otherwise I'll do it at the gym. It took twice as much time to install the bike rack, I seem to be very clumsy with nuts and bolts, I suppose it's a general lack of experience buying and assembling stuff.
I'll review what needs to be done: open the windows to ventilate, clean "wet" things (toilet, sinks, bathtub), wipe dust from surfaces, change bedding, sweep, replace the bag in bin, check supplies and then I'll be done. Breath is recovered, let's hurry.
!!!Work session 3 (forgone)
I received the guests on time, a nice family from Oregon. Though not in my original plans, I saw there was a gym and an outdoor pool more or less on the way back, and since I didn't find an open gym yesterday I felt compelled to come today, even though the blazing heat and the morning biking drained my battery. This has nothing to do with work, but I just want to note the effect of body exhaustion on mental performance. My body feels tired but my mind is calm and clear. Do I need both to accomplish focused work?
I am sitting at a picnic table in the lunching area. Not the ideal work set up. Yesterday I enjoyed working lying down with my head propped up. I packed a compact camping cushion for this purpose. I'll seek the best spot possible and have a work session here. The mind seems to be wandering a bit, it seems an exhausted body has a negative effect on concentration, though moderate exercise tends to do the opposite. I will not write about experience until I truly attempt to work.
What is it that I can accomplish lying down on concrete? This pool has no green areas. I may be sitting at the best working spot possible. I'll take a look around, and if I don't find an adequate spot for work I'll simply relax and take this pending work session elsewhere.
***
There was no spot to work. I dozed of in a shaded bench, enjoyed the sun, dipped in the pool, and am coming back home at 20:00. If I pulled energy from the reserve I would be able to launch this today, but it wouldn't be a good launch and I would pay the cost tomorrow. Let the deadline move back one day, and gain by being patient. What can I do at this moment? Tend to the garden, the heat was blazing today. Wash the laundry. Have a glass of wine. That will be my third work session of the day.
!!! Debt
<$checkbox/>Put templates in linked file<br />
<$checkbox/>Launch plackup upon server start<br />
✅Pack pillow<br />
✅Buy trash bags<br />
<p class="p1">The guests are having issues with a window that won't open. It wouldn't be much of a problem if it wasn't blazing hot these days, so I'll go over to address the issue. I don't know how much time it may take me to consider it a work session, but just going over there will take me a while and I'll begin addressing digital work after noon. I'll take an extra fan for the guests because of the heat.</p>
<p class="p1">As for the rest of the work, I shall simply think by writing and figure out what need to be done. If I want to publish the work today, I'll have to fill all the blind links that I put on the design, and do general detail work. It has to be launched today, as I've seen deadlines tend to move backward once you've pushed it backward once. This seems to be the only detrimental effect of "virtual deadlines", you think you've pushed the deadline back, but you have crossed it without shipping and thus the product becomes stale. It's not easy mustering the pressure necessary to overcome the "desire of fulfillment of vision" which leads to perfectionism. Let us simply say "this is what I could do in three days" and roll with it.</p>
<p class="p1">If I must make a stop at the apartment, perhaps it is fruitful to think out where the computer work will be done. There's a library and a study hall nearby. I've been to the library before, it's not really an inspiring place for work but it is adequate. There is also a study hall nearby, which I haven't checked out. I'll go there in order to maximize experience. I don't know yet if I want to make a stop at the pool today, perhaps I shouldn't make any leisure plans until release. Indeed, today I will forgo leisure until I've shipped, not as a matter of delayed gratification but from simple practicality.</p>
<p class="p1">I don't need to write anymore in the 14 minutes I have left, I'll prepare the things I need to take to the apartment and begin the day.</p>
<hr />
<h4 class="p1">Work session 1 (1 hour)</h4>
<p class="p1">I write this after the the work session instead of the beginning, since there was nothing to plan about getting a window unstuck. It is strange how planning is sometimes useful and sometimes useless, I've seen this happen when I go hiking through nature without paths. If I have good visibility of the terrain, I observe carefully the features and then hike/climb in that direction, making sure I'm hitting the landmarks that I observed from afar. But sometimes you must traverse terrain unfamiliar and invisible to you, and in this case plans are more of an obstacle than an aid. You must constantly improvise.</p>
<p class="p1">The window handle wasn't opening an aluminum frame window. It had been wonky in the past weeks, and apparently a previous guests (in his desperation for fresh air, no doubt) forced it in such a way that he rendered it useless. I tried for a long while, but I felt that nothing in the mechanism was moving. I then tried sliding a knife between the windows and it was possible, though I was just poking randomly and this wouldn't get me anywhere. I then opened a working window and observed the mechanism, and I saw a place where I could slide the knife, and then push down on the knife to liberate the lock. I came back to the stuck window and did this, but it didn't seem to bulge. Since I had observed the mechanism, I felt confident about putting a lot of more weight on the knife that I would if I didn't know what I was doing. So I forced it with confidence and I heard the "clack" of victory.</p>
<p class="p1">In the end I came came here by metro instead of the bike, the fan was too big to transport on a bike. It's a shame because I was looking forward to see if I could improve the 40 minutes it took me to get here. I'll go to the park for lunch now, otherwise my next work session would be cut short by hunger.</p>
<hr />
<h4 class="p1">Work session 2 (2 hours, 10 min)</h4>
<p class="p1">{{Urban navigation}}</p>
<p class="p1">As nothing was going as planned, but I was still dealing with the unexpected situations adequately, I decided not to describe what I was going to do, but what I had done after my work session. I spent most of the last two hours tweaking details so the web page "feels" right. These kind of things are not visible at first sight, they only reveal themselves after use. Though one can engage indefinitely with this kind of detail work, assigning a couple of hours for it is enough to bring a web page to life. After two hours I found my energies lagging. I can either head back home or continue work here, but I need a break. This is a nice spot to work, the study hall is on the 7th floor of a building with nice views of Madrid. People are focused and silent. There's air conditioner. One of the better public workspaces that I've encountered. I will surely repeat this place as it's close to the airbnb apartment. I'll use my break to explore the rest of the building and see what else is here.</p>
<hr />
<h4 class="p1">Work session 3 (3h and 30min)</h4>
<p class="p1">{{How a building was explored}}</p>
<p class="p1">I see my personal life seeping into my workday descriptions. But at this time all work is personal, so it's fine. Let the end of the day mark the period of privacy.</p>
<p class="p1">It seems this last leg of work would be for actually publishing what I've done so far. There is some hesitance, I was thinking "if I am more productive just by imagining I am observed, perhaps I do not need to be observed, I just need to imagine I'm being observed. But here again is the mind with it's clever tricks. I'll simply stick to my original intentions. I'm aiming for 19:00, it is 16:36 at this very moment.</p>
<p class="p1">It is 20:02 and I just finished. I feel mind exhaustion. Though I am ready to announce, I will wait until I get home. I need to give my mind a break.</p>
<hr />
<h4 class="p1">Debt</h4>
<ul class="ul1">
<li class="li1">Put blog templates in linked files</li>
<li class="li1">Launch plackup upon server start</li>
<li class="li1">Create build step for blog javascript and css minification</li>
<li class="li1">Historical about page</li>
<li class="li1">Create archive pages for blog</li>
<li class="li1">Serve everything on https</li>
<li class="li1">Make blog footer sticky</li>
</ul>
<p class="p1">Timer set for 30 minutes. I'll go through the fixed events during the day: at 18:30 there will be a real estate visit to the airbnb apartment because the property is being sold. I'll need to clean up before this time. After lunch seems ideal, because I haven't prepared food for the week, so I'll go to the supermarket then prepare a meal, so it will be better to stick close to home. I better hang around the neighborhood during the first leg of the day.</p>
<p class="p1">What should I work on today? I'm torn between a new project or extending the old ones. The new project is unrelated to design. In the last few days I've been sensing that I should tend to what already exists, in doing this I give more time for the new project to consolidate. I feel the need to give the new project a code name, because I don't yet want to reveal what it is, let's call it "Arete". Arete helps in the realization of other projects, so it would be good to have an MVP as soon as possible, for my own use at first. I'll put my efforts here at least until I have something that works for me, and Method of Action design games will be extended/improved one by one according to their own schedule.</p>
<p class="p1">What would I need to get project Arete to the MVP stage? It is a massive undertaking but I already have something advanced. I'll not plan the work route now, I'll wait until I'm sitting down at the library. I like the way things came together, if I am able to release new versions of the existing games, the technical abilities gained will help Arete, and Arete feeds back into the games because it's akin to a productivity tool.</p>
<p class="p1">Does anything of the blog need to be addressed? I'd like to change the homepage, but that can be left for another day. Nothing too pressing is felt. I'm collecting an important number of "debt" items, as one does creative work one also generates maintenance work, I should not let the list grow too long, otherwise I'll get overwhelmed and address the maintenance debt only when it causes pain (a sure sign that it was overdue). Since I have a working blog now, I'd like to begin importing/translating some articles from my former online presence, as to populate with new content (new in English, at least).</p>
<p class="p1">Let us prepare the day.</p>
<hr />
<h4 class="p1">Work session 1 (2 hours, 20 min)</h4>
<p class="p1">I will continue working on project Arete and see where this takes me. When I don't know where I'm going, I write about it afterwards, not before.</p>
<p class="p1">***</p>
<p class="p1">System updates delayed starting work. I decided to finally click the "Install updates" that were pending, and when the Mac restarted it said it would take 40 minutes to finish. These kinds of updates are insanity, but I'm not sure it can even be solved. You can't tweak the engine of a flying airplane. I always feel this dichotomy: frustration as a user, and sympathy for the developers' thankless job.</p>
<p class="p1">I read a couple of pages of <em>To Kill a Mockingbird</em> in those 40 minutes. Harper Lee is indeed a master of her craft, the narrative transports you there.</p>
{{Exploring in development and the real world}}
<p class="p1">In this exploration I think I found a way of simplifying the architecture drastically, it's still too early to tell, I need to explore even more ahead to make sure it's not a dead end, but its very promising.</p>
<hr />
<h4 class="p1">Work session 2 (1h, 20min)</h4>
<p class="p1">I have come to the airbnb apartment on the bike, this time it took me 34:39 door to door, shaving off 5 minutes from my previous trip. Beginner gains are always encouraging but it's best not to extrapolate from them (I'd quickly end up traveling in time to the past if I did this). I have 1h 30min until the real estate visit takes place, but I saw there was a presentation about the trees at Retiro within an hour, I'll try to catch the presentation. I'll clean up while the Mexico - Sweden World Cup Match is in the background.</p>
<p class="p1">***</p>
<p class="p1">I went to Retiro to the presentation and the director of the park was explaining a multi-year plan for the park. It was interesting to watch, it was endearing to see people asking why they had cut down such and such tree and the director knowing exactly what tree they were speaking about, and the reason it was cut.</p>
<p class="p1">I'll call off the third work session as it's 22:00 and quite exhausted. There's still laundry to do and food to cook for the week.</p>
<hr />
<h4 class="p1">Debt</h4>
<ul class="ul1">
<li class="li1">Put blog templates in linked files</li>
<li class="li1">Launch plackup upon server start</li>
<li class="li1">Create build step for blog javascript and css minification</li>
<li class="li1">Historical about page</li>
<li class="li1">Create archive pages for blog</li>
<li class="li1">Serve everything on https</li>
<li class="li1">Make blog footer sticky</li>
</ul>
<p class="p1">Today I have to receive airbnb guests at 13:00, and I left some pending work, so I'll be there by 12:00. This leaves me around two hours for a first leg of work during the morning. It shall be done at the closest library so that I can come back for the bike and further my skills biking uphill. I recall some months ago I felt a lot of hesitance biking around, the excuses put forward by reason were that people in Madrid don't know how to share the road with cyclists, and that there were many cases of bike theft. But I also intuited that these were excuses, and that deep down I felt it was a hassle to bike around, so I pushed myself to use the bike. I'm glad I did it. It takes me the same time to reach the apartment by bike than by metro, and indeed it's more hassle, but there's more pleasure too.</p>
<p class="p1">What shall I do today? For the past few weeks I've been working on project Arete going from the foundations and building upon them, yesterday I made some speculative work sans foundations and saw that the foundations could be different. I'll keep doing the speculative work and then decide if the foundations need to be different. To be more specific: in an application one enters data to produce a result, now I'm trying to start from the result to see how the data is entered. In order to use my product I don't need an interface to enter the data, I can write the JSON files by hand. Though unwieldy, this gives me the opportunity to use the product before the brunt of UI work is done.</p>
<p class="p1">After I receive the guests I'll have lunch at a pool. I'll make sure there's a good workplace nearby and then complete a second leg of work there. From memory I know Francos Rodriguez is a good option for this,<span class="Apple-converted-space"> </span>and the library and gym nearby are unknown to me, so it will be a good change to check them out. But it is also quite far away from home, and I'd en up biking around 20-30 Km today. I'll see if I have a better option.</p>
<hr />
<h4 class="p1">Work session 1 (1h, 20 minutes)</h4>
<p class="p1">This is indeed the correct direction, it is as if I had been hiking through a wild area not knowing there was a path parallel to my route. Now the task is to get this to the "works for me" stage, then I will continue working on the Method of Action projects. I want to accomplish the working state because this would be like hopping on a bicycle, now that I now this is the correct path I can optimize for efficiency instead of exploration.</p>
<hr />
<h4 class="p1">Work session 2 (1h)</h4>
<p class="p1">I arrived to the airbnb apartment with very little margin, so I jumped in the shower to rinse myself off from the biking and I put myself to work immediately. {{Laptop slips into water}}</p>
<p class="p1">I finished cleaning up just in time for the guests to arrive, who were some young Spaniards from Zaragoza who came here to spend the weekend.</p>
<hr />
<h4 class="p1">Work session 3 (1h, 50min)</h4>
<p class="p1">I came to Buenavista library which is on the way back home. I forgot to pack my bathing suit, so the pool plan fell through. I'd gladly use my sports shorts for swimming, but all city pools here warn that bathing suits are required. From experience I've seen that rules in Spain are non-negotiable, contrary to my native Mexico. Still, I commit petty crimes such as bringing tea into the library.</p>
<p class="p1">I've come here without having lunch yet, so I won't be able to extend my work session for too long. But I've seen I'm more productive when I'm hungry, so let's make the most out of it. I'll try to finish the proto-MVP for project Arete in this time.</p>
<p class="p1">***</p>
<p class="p1">In the end I completely forgot about the hunger. I finished the proto-MVP within 15 minutes! Then I tweaked the games to include María's credit and wrote the page for the first period of Method of Action. I'll now head to the park for lunch, and a fourth work session if the mood is right.</p>
<h4 class="p1">Work session 4 (1h, 15min)</h4>
<p class="p1">I came to Fuente del Berro park and after lunch I had a nap under a majestic cedar tree. There's a study hall within the park with high ceilings and beautiful views of the park, there's no air conditioner, only fans, but open windows in a nice park are a good trade-off.</p>
<p class="p1">The study hall closes at 19:30 and it's 18:00, so I have 1½ to work. I don't want to dive in a new codebase without being able to dedicate the full day to it, so I'll work on my technical debt so it stops accumulating.</p>
<p class="p1">19:15 and it seems I cut down a substantial amount of debt. I'll publish this, hit the gym and then call it a day.</p>
<hr />
<p class="p1">Debt</p>
<ul class="ul1">
<li class="li1">✅Put blog templates in linked files</li>
<li class="li1">✅Launch plackup upon server start</li>
<li class="li1">✅Create build step for blog javascript and css minification</li>
<li class="li1">✅Historical about page</li>
<li class="li1">✅Create archive pages for blog</li>
</ul>
<ul class="ul2">
<li class="li1">Serve everything on https</li>
<li class="li1">Give some decency to that ugly footer</li>
<li class="li1">Redirect duopixel.com</li>
</ul>
<p class="p1">Today it's Friday and--following Madrid's tech schedule--my intention to work until lunch time. I've worked intensely five days straight, and the inertia wants me to keep on moving, but it's better to develop sustainable habits early rather than to pay the price later.</p>
<p class="p1">I've decided to work on the bézier game. I'll go through the things which I have thought would be cool to add/modify, and see how feasible it is:</p>
<p class="p1"><b>Add support for different app keyboard conventions</b></p>
<p class="p1">The original game uses Adobe Illustrator's keyboard conventions for the bézier tool.<span class="Apple-converted-space"> </span>I've received requests to add support for Inkscape (which I have never used), so I would need to install it to check out how it works. I'd also like to add support for Sketch and Figma. What other vector apps are out there? The challenge here is not to much to remap the functions to different keys, but the subtle interaction paradigms that each app has. In Sketch, for example, you don't hold the alt key in quasimode but you switch node type modes through pressing numbers between 1 and 4. I'll have to rearchitect this part of the application.</p>
<p class="p1">Recently I helped proof-reading the readme of <a href="https://github.com/soska/keyboardist">keyboardist</a> by fellow Mexican designer/developer Armando Sosa, I looked at the API and it was a really intuitive. I'll use this to get it done. This last point takes me to...</p>
<p class="p1"><b>Add a credits section</b></p>
<p class="p1">In one of my first attempts at project Arete I decided to deliberately attempt to do it without the use of any third-party libraries or frameworks. I knew this would be doomed form the start, but I just wanted to see how far I could go reinventing the wheel, in part so that I could understand how wheels actually work. The experience left me more appreciative of open source work.</p>
<p class="p1"><b>Add levels which introduce concepts progressively</b></p>
<p class="p1">I've received a lot of emails from frustrated users not knowing how to complete a level. The problem lies in that the progression is too harsh, the tutorial levels skim over fundamental concepts which, if not understood, impede completing stages further ahead. Instead of a complete tutorial at the beginning, the solution implies to have levels that introduce new concepts: how to draw lines more efficiently through constraining axis (shift key), where and how to use different node types (one for each level) and such. For this I need new vector illustrations, which takes me to the next point:</p>
<p class="p1"><b>Add new stages</b></p>
<p class="p1">The bézier game supports a subset of the SVG line commands, so if I use a random vector illustration, I need to manually convert any unsupported command into a supported one. I need to look into the codebase, but I think the reason for this is because I need to convert SVG path commands into canvas ones. There are libraries that support this, but at the time I created the game they were too bloated. The situation might have changed, so I'll revisit my decision. This would allow me to add any vector illustration easily, which I could take from the noun project and give credit.</p>
<p class="p1"><b>Save progression</b></p>
<p class="p1">A frequent request I receive is to save progression, so that I can close the browser window and come back where I started. At the time I created this, I thought the game was too short to merit this feature (which is not trivial, because it needs to save your solution and scores, and then if you repeat the stage and have a worse score, keep the better solution and such). With added levels this becomes a must have.</p>
<p class="p1"><b>Nice to have: add graphics tablet support</b></p>
<p class="p1">Another common complaint is that the game does not support graphics tablets. I don't own one, and I never have. It would be interesting to look into this, as I intuit that it the solution is trivial, as graphics tablets are meant to emulate the mouse and part of the keyboard on a single device. Where this might get complicated is in the interaction with with the different keyboard conventions. When the time comes, I'll ask around to see if anyone has a graphics tablet that I can borrow.</p>
<p class="p1">--</p>
<p class="p1">It's 10:20 and being realistic I only have time for one long work session. Perhaps the best place to start is to swap my home brewed SVG to canvas path translation code to a proper library.</p>
<hr />
<p class="p1"><b>Work session 1 (2h)</b></p>
<p class="p3"><b></b></p>
<p class="p1">Hmmm, it turns out I had already put a library in place to convert from SVG to canvas. Instead I remembered some pending bugs and got acquainted with the codebase again. It turns out that, at the time I made it, I couldn't find a way of centering elements and also center the coordinates of the mouse to account for the offset of the translated element, so I chose to translate the path coordinates instead, so that the mouse and path coordinates would match. This was a poor architectural choice, because further down the road it impeded me from centering elements upon resize because of all the hackery that was underneath.</p>
<p class="p1">I now know better, and the task is removing all the hackery. It felt nice deleting so much ugly code but at the same time it has to be done with care as to not cause problems elsewhere.</p>
<p class="p1">I was reading that modern cities have separate storm and sewage drains. I know, from experience, that most (if not all) cities in Mexico don't separate them. This makes it almost impossible to treat the water before releasing it back into nature, because you can't treat that volume of diluted sewage. The solution would be to replace the sewage lines of the entire city. The cost would be astounding and it would take decades. This is the importance of architectural decisions.</p>
<p class="p1">But, at the same time, if we worried about the implications down the road of everything we do, we'd become paralyzed. It is simply not possible to foresee all outcomes. I prefer prototyping and then throwing away when I have seen the implications, rather than to getting the plan right from the beginning, for perfect plans are only possible after endless previous mistakes.</p>
<p class="p1">Work day is done, I'll enjoy the weekend.</p>
<hr />
<h4 class="p1">Debt</h4>
<ul class="ul1">
<li class="li1">Blog: Serve everything on https</li>
<li class="li1">Blog: Give some decency to that ugly footer</li>
<li class="li1">Redirect <a href="http://duopixel.com"><span class="s1">duopixel.com</span></a> and <a href="http://duopixel.ca"><span class="s1">duopixel.ca</span></a> to method.ac</li>
</ul>
<p class="p2"></p>
I'm writing this from Streaky, which is a... what would we call it at this moment? At the time it is little more than a textarea and a word counter. It is in such an early stage that I find myself reticent to pin down what it is. The project is a collaboration with my friend René Galindo and I will be writing about it as I dedicate work sessions to it.
What needs to be done today? I need to be at the airbnb apartment at 10:00, because guests arrive at 12:00, so it is better that I hurry up instead of dedicating the full 30 minutes to writing this. As I do it, I notice that 30 minutes is too long. It is enough to project the day with a couple of paragraphs and leave it as an intention.
I've been wondering if I should write the work logs before or after work. It would would entirely change the narrative. Last week the work log was written mostly _before_ work was done. As a matter of experience, it follows that this week it will be written _after_ work is done. So instead of a prologue it should have an afterword, the summary of what happened in the day. I will stick to this method for this week. Let's get to work and keep writing _after_ work is done.
---
!!! Work session 1 (1 hour, 30min)
The guests, a pleasant latino family from the US, arrived 40 minutes early. I wasn't done yet, so I directed them towards the bedroom while I finished sweeping floors. Not much remarkable happened, I decided not to get here by bike, as my intention is going to the gym today, and I've seen that, when I both bike long distances and go to the gym, physical exhaustion impedes focus.
---
!!! Work session 2 (1 hour, 45min)
45 minutes were dedicated to project Arete. The project involves cycles, and last week was one cycle. I needed to do a bit more work in order to support more than one cycle and begin the week. It seems growing in the direction of need was the right choice. Now, allow us to continue with the bézier game.
15 minutes for the bézier game and I solved the centering bug from last week. I deployed it because isn't a feature for the next version, rather than a bugfix so that I do not build on quicksand. What shall I solve now? Let us work on streaky.
45 minutes for Streaky. I implemented most of the design sent by René and redid the proto-MVP that I had done yesterday. I'm pleasantly surprised at the usefulness of such a simple product. I can't say it's more useful than a text editor for me at this time, but it will soon be.
---
!!! Afterword
I come back home 18:36 and I call it a day. Everything took me less than I expected, I am satisfied with the day. Nothing else needs to be written. Logging off from work.
!!! Prelude to the workday
I'd like to explore an area of the city which I haven't explored before. I've chosen [Usera](https://es.wikipedia.org/wiki/Usera). It has a pool, two study halls and a library. Looks perfect for three work sessions. I'd like to dedicate the day to the Bézier game, with minor intrusions into other projects.
!!! Work session 1 (2 hours)
In the end I stayed home during the morning, I begun working spontaneously mostly on exploratory work regarding the keyboard bindings of the Bézier Game, though I was left a little disheartened by what I saw. Due to small differences in implementation, it is not a matter of just remapping keys, but changes in implementation.
!!! Work session 2 (2 hours)
I came to the "José Hierro" Library in Usera. It's well stocked and it was a pleasure to work here. It took me a long while to figure out exactly where and how each app applies it's conventions. Since I can't install many of these apps I have to figure out how they work exactly by following video tutorials.
I modified the tutorials so they would display the appropriate key and pressing mechanics (mode vs quasimode). Quasimode is a term coned by Jeff Raskin to refer to the temporary mode one enters while pressing a key, in the Bézier Game this happens when you press the alt key while dragging.
Many people get stuck here because it's an unfamiliar convention, I'll see what I can do to ameliorate this problem. Now I'll go to the pool for lunch.
!!! Work session 3 (2 hours)
Came to a Study Hall in Usera for a last work session. It's almost 20:00 but I feel willing to go for another session after a break. This study hall is on the smaller side, it's quite unremarkable but I can't discern why I like it. I enjoyed the neighborhood, I'll be back soon.
I unexpectedly finished implementing most of the keyboard differences between vector drawing apps. It's done on the technical side, but I won't implement the UI until it is clear how I want to extend the game.
!!! Afterword
Nice pleasant day. I wouldn't change anything, just note that it takes me quite a time to gather all the things needed for a workday out of home. Better to pack the day before.
!!! Prelude
Today I shall keep exploring the southwest of Madrid in the Usera district. I liked it yesterday, so rather than to put my finger on the map at random and go there, I come to realize that cities can be explored in the same way as nature, searching for nice spots for work and then optimizing the route there.
Workwise, my plan is to dedicate most of the day to the Bézier Game, with sprinkles of Streaky here and there. I'm writing this from Streaky, as in the past two days.
!!! Work session 1 (25min)
I passed in front of the cristal palace of Arganzuela, which is a greenhouse with tropical and desert ecosystems. There is a space in particular which reminds me of my native Mexico, and I thought it would be nice to work here briefly, because there's no electric outlets. It's nice, I suppose I could post a picture:
I chose to work on Streaky, because I could implement a feature quite quickly which is useful to me: write x words in a determinate amount of time. So now there's a bar running out on the top of the screen which lets me know how much time I have left (as of now, around 2min). I suppose I could post a screenshot.
Five minutes seems too long to describe a work session, but perhaps I ought to register more experience rather than to reduce the time for the writing session. I'll be persistent in it's use so that I can suggest good time breakpoints empirically.
<img alt="palacio-cristal.jpg" src="http://method.ac/writing/uploads/palacio-cristal.jpg" style="width: 100%;" />
!!! Work session 2 (1h, 25min)
Five minutes to write this. I came to a study hall in Usera and they placed me in a classroom intended for chess, as the study hall was being used for a workshop. The place is quite dark and not very inviting, but fortunately I was able to let myself go and have a focused session.
<img alt="study-hall-usera.jpg" src="http://method.ac/writing/uploads/study-hall-usera.jpg" style="width: 100%;" />
I finished the keybindings and exceptions for all vector drawing apps that I know, and it should be easy to add more. I built a temporary UI so that I could test, now I find myself wondering how and when is the best way to ask what app you want to practice.
I lost around 30 minutes attempting something quite useless, which was passing a nested array of HTML elements and have the function unravel it as to append the HTML to the corresponding parent. When I encountered problems I stepped back and thought: how often do I need this? it was only twice on the codebase. So I ditched the feature. I tend to waste a lot of time in these kind of useless things, sometimes wasting hours (or days!) because I become engaged in the challenge. Some of these things result in unexpected pleasures, but it seems when the challenge is highly technical and invisible to the end user, it is a matter of pedantry.
!!! Work session 3 (30min)
A short work session from the pool, as the day is comfortably cool yet sunny, this weather--especially in July--is exceedingly rare. Again five minutes to write, way too much time for the work I did. I adapted the tutorial levels so they would display the appropriate shortcuts dynamically. So I declare this feature complete, the Bézier Game can now be configured to conform to different vector drawing apps.
<img alt="pool-penuelas.jpg" src="http://method.ac/writing/uploads/pool-penuelas.jpg" style="width: 100%;" />
Next feature will be the addition of levels which have multiple stages. Lines, smooth curves, corners and such. Many exercise per level. Perhaps ten. This implies that progress will be saved, but I don't want to do user registration. LocalStorage will suffice. I'm terrible at estimating how long tasks will take me, but I will give it a stab and verify my estimation: 4 hours.
I read the first chapter of Piaget's book while at the pool. What an astounding intellectual. While most of us desperately grasp at whatever certainty we can, Piaget puts certainty to trial until empirically verified and made reproducible, yet admits that all worthy science is born in metaphysical intuition. This gives me some food for thought for Project Arete.
I shall go to the nearest library now.
!!! Work session 4 (1h)
Not all that focused in this work session. I found a way of integrating levels quite easily, though I have the feeling it has shortcomings and constraints I don't know yet. Tomorrow I'll advance quickly in this direction to see the feasibility.
This Library working area (Pio Baroja) is little more than a glorified basement with office furniture. Can't say I won't be back, but I'll keep an eye open for better places to work.
<img alt="pio-baroja-library.jpg" src="http://method.ac/writing/uploads/pio-baroja-library.jpg" style="width: 100%;" />
!!! Afterword
Nice productive day. I see a pool can be a better place for work in a nice day than a basement library. Again it took me quite long to get out of home today. Everything in Madrid opens at 9am. I ought to make my first work session hit opening hours.
!!! Prelude
Today I feel quite exhausted. I'll take it easy and remain around the neighborhood. What needs to be done? A good aim would be to have the Bézier Game levels implemented. I could stub the stages, but I think I prefer to begin collecting actual stages. Working with real data allows you to catch problems earlier.
!!! Work session 1 (2 hours)
5 minutes to write the stream of thought. I have been going back into habits of editing the text I write. I'll just mark that this comes from stream of thought:
When one is not in the disposition for work, work becomes to find that disposition. I am fortunate to live in a building that has a pool and a small gym. I went to check out the gym, and though it is small, I found it challenging enough as to know it can be of good use.
I then went for a couple of underwater laps at the pool. I don't know its dimensions, perhaps 12.5m x 4m? I was able to swim to one end and back. This is a good benchmark for physical progress, and I can observe (part of) my condition for this measure: 2 laps underwater.
I come back home with a much clearer mind and focused disposition. Let us now put ourselves in an appropriate workspace, and see what comes from it.
!!! Work session 2 (2 hours, 15 minutes)
I came to the study hall closes to home for my work session. It is now deserted, but a month ago this was packed with young students for their final exams before enjoying the summer. I had a productive session, but I have the feeling I have created more work for myself instead of advancing. However, I am satisfied with the results.
{{Viewports}}
Regarding the work actually done (and related to the nested boxes problem), I played around with the possibility of scaling the vector illustrations according to the viewport size. This could be done easily through the `viewport` attribute, but I'm using some filter effects which I suspect will cause problems. Instead I explored a percentage based coordinate system and it seems to be working fine. The problem is that I'm currently drawing bézier curves in my head and writing them down, perhaps I ought to have a script that could convert the hardcoded units into relative units so that I can use any svg path without having to manually transform it into the coordinate system.
The levels hack that I did yesterday has demonstrated itself to be quite flexible. I wouldn't have implemented it this way should I start over, but it works very well in terms of interaction. Since the nature of these things are hierarchical ("stages" are contained in "levels" which are contained in a "game", boxes again!) this would seem the natural way to structure the data. But, if you simply describe that each level contains x consecutive stages, then you don't need to add another frame. Instead of dividing 50 apples in 5 boxes, I'm simply lining them up and putting space in groups of 5.
!!! Afterword
I've decided to write the afterword in the morning of the next day because it creates some distance from the work day, then allowing a better view of it. Yesterday I found myself unsatisfied with the amount of work done, yet today it feels the rest was necessary and the manifestation is a willingness to get good work going today. I'll begin the day then.
!!! Prelude to the workday
I received an email from the library at the Reina Sofía Museum that my library card was ready to pick up, so today I'll check out the library today. There's another unexplored library nearby near Retiro, so I'll check that out today too.
Today is a matter of advancing in the direction of completion. I seem to have all the necessary features for the v2.0 version of the Bézier Game, and that it is a matter of fleshing out these features. I'm still missing the ability to save progress through localStorage, but this will come later, as the implementation will become clear when I design the levels. It seems it is here where the levels hack rears it's ugly head: since I do not have a hierarchical structure, querying for stage completeness per level (2/10 completed) requires grouping logic. But it is a good trade-off.
!!! Work session 1 (1 hour)
I came to the library of the Dance and Music Documentation center near Retiro. It's not a good library (even if it were specialized in Music, which it's not, it's selection would be very poor) but the workstations are great. They close at 14:00, so I'll need to move on in a pair of hours.
I dedicated one hour to Streaky, it is quickly reaching MVP status and by using it on a daily basis I'm finding it natural to extend it. Now let's dedicate the next session to the Bézier Game.
!!! Work session 2 (1 hour)
I dedicated one hour to the Bézier Game. I was all over the place: reorganizing code, adding new stages, fixing the layout of things I placed temporarily, considering my options to convert from fixed to relative coordinates... This kind of work is necessary now and then, now I need to choose something to work on to complete it. But first I shall have lunch, Retiro is the perfect place for this. There's a study hall nearby which I haven't visited yet, or... I'll decide after lunch.f
!!! Work session 3 (30 min)
The day was too nice to go indoors, so I decided on having a quick work session at the park. I completed a simple feature: when you switch keybindings (Sketch, Illustrator, Inkscape, etc) the shortcuts displayed change too.
!!! Afterword
I went to the Reina Sofía Library after the park. This is a private library, which requires you to sign up some weeks before hand and they hand you a library card for free. I had received an email that my library card was ready, but when I got there it turns out I needed my passport to pick it up, and since the pool was nearby and it was Friday afternoon I decided to chill out.
!!! Prelude to the workday
During the weekend an idea on a more sane way to create bézier curves came up, I think the direction is correct, but I would have to prototype it to get a feel of it. But what is the value of a technique that can't be used in the real world? An ameliorating factor is that I could use this technique in Method Draw, but it's still... not useful enough.
I had set myself to finish the Bézier Game in two weeks, and I'm on track, but this unforeseen feature would prolong the release, possible by a substantial time. I will first focus on finishing what I've started, and and the end of the week I shall decide.
I will also dedicate some time to Project Arete. As the product is used in novel ways, it asks for features which I need to incorporate in order to use them.
I've seen that, after a visit to the pool I seldom feel inclined to keep work going, so it is best that I leave it for the end of the day.
{{Mondays}}
!!! Work session 1 (1h, 45m)
I came to the library of Reina Sofía, this time with my passport, and they let me through. A beautiful library, except the entrance is a hassle. This library has quite a massive selection of design and and art books, it's a pity I don't enjoy reading these subjects. Art and design books tend to be written by historians and academics, often as contract work paid by a publisher, or to pad their résumé. They are a chore to read. Books by practitioners are another thing, I shall sift through the collection to see if anything catches my eye.
I dedicated the work session to Project Arete. Nothing can be written about something that is still undercover, so I shall keep on describing what I found at this library: it has a good selection of academic journals. Since entering and exiting this building is a hassle, I thought it would be a good idea to read them during a break. So this I will do.
{{Hypatia}}
!!! Work session 2 (50min)
I opened the Bézier Game and took it from where I was taking it last week. I was making some example levels with my homebrewed relative SVG units and I noticed this wouldn't scale when I reached more complex paths. So I made a quick exploration into using `viewBox` in combination with the little known property `vector-effect: non-scaling-stroke;` and I saw it indeed worked. Further investigation revealed places where complexity was reduced (coordinate system) and others where it increased (`stroke-dasharray`), but all in all it is a win.
This is a big deal, because it will allow me to dedicate more time to the implementation rather than to creating levels. I can use any SVG path to create a level, instead of converting it by hand or investing time in a script that does this for me. Let's celebrate with lunch.
!!! Work session 3 (1h)
Even though at the beginning of the day I said I would not come to the pool until later in the day, I was really close by and thought about working laying on the grass, as usual. However, I asked the attendant if it would be fine if I worked from the bar terrace and he said yes, so I enjoyed an hour of focused work here.
I dedicated this hour mostly to drawing the first exercises of each level. I now have 15 levels complete, with around 35 to go. They should be dispatched in about four hours of work. One thing towards which I feel ambiguity is that I haven't set my conviction if this is a game to help you learn to use the pen tool of existing apps, or a tool to demonstrate what it could be. I see Figma's implementation is way more advanced than anything out there, I can't implement vector networks just to make it justice. I'll keep on working and tackle these things if there is time at the end (read: probably never).
!!! Afterword
The sensation of yesterday's workday is a productive and efficient day. The only thing I would change is lunch. I hadn't prepared anything, so I packed a large avocado and a spoon. It proved itself filling but bland. Things must be going good if this is the only thing that stands out as "things to be improved".
!!! Prelude to the workday
I'll set my intention towards releasing the new Bézier Game on Monday of next week, so I have four workdays to complete the work. It should be enough, but perfectionism would probably drag the release a day or two, this is fine.
I feel certain hesitance towards implementing more stages without having finished what needs to be programmed, because events up ahead might mean that the stages I created need to be reworked. I know this to be an untrue idea, because now I can use any SVG path as a stage, though I have not accounted for the `MOVE` command.
I'm not sure I want/need to implement this command, for it changes the mechanics a lot. It becomes a composite path, so the stage ends not when you are able to connect A to B, but when you connect A to B in all paths that compose the composite path.
(I am writing as a tool for thinking here)
It is not all that difficult to implement, but it changes many assumptions that I made programming the original game. I could split the composite path by virtue of their `M` commands, and then iterate over the segments until they are completed. But then I would need to have a start and endpoint for each segment. Yes, it is quite straightforward, but it will require many changes to the current code.
Allow us to reason of this feature is worth it. What does it allow?
* To punch holes into paths
* To have unconnected overlapping strokes
* To have a closer experience to a vector drawing app
It seems worth it indeed, I shall explore this feature in a work session and see where it takes me.
!!! Work session 1 (1h)
I came to "Pedro Salinas" library next to Puerta de Toledo. It is a nice pleasant library. I worked on Project Arete, since it is an unveiled project I shall not write about it. What shall I write about instead? I will just drink smuggled tea and observe the kind of people who attend the library at this time of the day. Nothing needs to be written.
!!! Work session 2 (1h, 15m)
I begun the work required to support composite paths on a single stage. It's going easier than I expected, but the code is very knotty. I had much pleasure in deleting substantial amounts of code regarding gradients and bevel effects, it took me so much work at the time but now it feels a naïve place where to put effort, and there was no value in it (except for the questionable aesthetic experience).
I'm actually surprised I don't think this code stinks. I've been able to be productive on the codebase I have and I generally know where things are, though it is structured in a very idiosyncratic way. I wish I could swap the GSAP dependency for something more lightweight, but that's very down on the list of priorities.
I'll put a "bookmark" of sorts for the last place of work: a stage has a startpoint and an endpoint.
`⬤──────────────◯`
Now, I have not multiple startpoints or endpoints, but they change position as you complete each segment:
`
⬤──────────────◯
──────────────────
──────────────────
`
And then:
`
──────────────────
⬤──────────────◯
──────────────────
`
And so forth. When you finish drawing all the segments, the stage is completed.
!!! Work session 3 (1h)
I came to the pool for lunch. I worked a while without much focus, there's just too many distractions for the kind of work I'm currently trying to do, but I did advance. I know when a composite path segment has been finished drawing, now I need to reposition the pulsator and to begin a new stage within the stage, so to speak.
!!! Afterword
I came back home yesterday quite wasted and had a two hour nap. The source of tiredness seemed to stem from sleeping six hours. I've been exploring a lot lately, and today I feel like taking it easy. I'll wait and see the inclination of work.
!!! Prelude to the workday
I begin the day kinda late, I'll remain home for the first work session and see from there. Work needs to be done in the stages so that you can complete a multi-segmented stage, and during offtime I remembered an event driven architecture that's already in place, which will greatly assist in accomplishing this.
!!! Work session 1 (perhaps 3 hours?)
Oh dear, I've reached the knotty parts of the code, it is so full of exceptions it makes me wish to rewrite the entire thing. Though it would leave me satisfied, it would take me a full week I estimate. I'm slogging through it, adding even more exceptions as I go. When this is done, I won't want to touch this code again with a ten foot pole.
I finished the multi-segment mechanics, but now I must do more work to support undo. With evidence of exploding complexity, I now see my original estimation was naïve, but I will take no stab at a new estimation until I advance more. I feel like taking a long break. Perhaps I am done for today, when I make some distance I will perceive the remaining energy.
!!! Afterword
I took a break the rest of the day to think it through. I slept at the airbnb, but did not bring the macbook, I shall write my conclusions today.
!!! Prelude to the workday
There was no prelude written today.
!!! Work session 1 (perhaps 8 hours?)
I slept at the airbnb apartment, I woke up early and deep cleaned the entire house during eight hours. I resupplied, cleaned the floors by hand. Interesting, I would rather procrastinate on this rather than to touch that stinky code!
!!! Afterword
A stab must be made at rewriting the path creation code, or better yet, to find something that suits my needs. I shall embark on this quest today.
!!! Prelude to the workday
I've taken a look at Paper.js and it seems to have everything I need, but the renderer is canvas and I prefer SVG (I simply feel more comfortable working with DOM elements). Well, it's time I learned canvas if the exploration into Paper.js results promising. What would be a good target to accomplish today? It's Friday, half a day is worked, it needs to be simple. Let us aim to simply have a path in which it's handles can be manipulated.
!!! Work session 1 (2 hours)
As I packed the things I needed for a day that would be half work half recreation, I thought lugging around my computer was unnecessary, I could simply go to nearest study hall and then leave the computer at home for the rest of the day. And this I did.
I begun my trial of Paper.js, I'm on good track, I could manipulate bezier handles within two hours. As is usual with any new library, most of the time is spent trying to understand the author's intentions. I feel quite anxious about some implications, because I get bézier handles for free, but at a cost which I have not understood yet. I'll see with more experimentation.
!!! Afterword
Feeling bullish about Paper.js, plus it has many other features that could be used in projects into the future. I'll keep on exploring what and how things can be done so that next week I'm prepared.
I shall begin the day with the same experience as yesterday, from presence, but this time sober. Yesterday all that had to be done was done, though it costed me at least four times more than normal in effort. I breathe in and breathe out, and think about the things which wish to be accomplished today, and no clear idea comes up. There seems to be a cloud of responsibilities which have not condensed into action. Perhaps this task is best suited for the Study Hall? Nah, I need to do the laundry before leaving, so I have time before I leave, but not much. First allow ourselves to have a little bit more of coffee.
There we go. Breakfast has been had, and the stomach is at rest. I have enough food for today and tomorrow, no supermarket needs to be done. Regarding the virtuegraph: what would I like to get done today? Perhaps I need to understand the data structure. Yesterday I investigated the Dendogram, which is a data structure that allows for the fractal structure of what I’m aiming to do. But I also see that — I was interrupted by Isa, and then hung the clothes. Let us see then.
---
I have come to the study hall again, and again I shall register my experience to compare it when I am smoked. Feel the breath, what is felt inside? Is my mind quiet? No, it’s not. I need to focus on the breath. I sneezed. I have come to the table outside of the study halls, the “reception” table. I enjoy sitting here because I see everyone whom enters and leaves the study hall, but at the same time perhaps I am isolated. In any case, I’m only coming here a couple of minutes, I wanted to investigate one of my “working routes”. What makes a good working route?
# Availability of exercise: To have a gym or a possibility of good physical activity, such as Yoga or calisthenics.
# Close to nature: that it has a park where to have lunch
# That it has a library or good workspace such as a study hall
# That it has a museum
#### Prelude to the workday
I often find myself wondering what I'm going to do in the next hour. As an experiment I want to plan the day, follow it, and at the end see what/if it was done.
The general outlines of the day: hit the gym, work session around the neighborhood, go to the supermarket, prepare and pack lunch, second work session at a new-to-me library in Orcasur, pool, and lastly an optional work session.
Workwise, my experiment with paperjs went great, a played around with it a bit more yesterday and it seems a perfect match for the Bézier Game. I find myself recriminating not having used it earlier, but then I realize: if I hadn't built the Bézier Game from scratch, I would understand nothing of the API. A mantra of programming is "don't reinvent the wheel", but when you are working with axles, bearings and tires you need to put the wheel apart so that you understand how everything is put together.
#### Work session 1 (2 hours, 15 minutes)
I was done with my soft objective of the day, which was to have a pen tool working. with Paper.js it is a breeze. I had it done in under an hour, but then I wanted to incorporate the "snap to axis" feature, and it got me in a rabbit hole for a while. It's working like a charm with just 75 lines of code (which I could surely reduce).
#### Work session 2 (45 minutes)
I came to a new pool where I hadn't been before (San Fermin) it has nice expansive green areas for Madrid's public pools, and nice tables where I can work. I will definitely repeat. I used this time to introduce the same mechanics I use in the Bézier Game: you can only begin a stage by clicking on a start point, and you end it by adding a node on the end point (if the created path matches the problem). I finished within 45 minutes, and I will take work to a library, as I forgot to charge my laptop before leaving home, and I'm running low on battery.
I'll dip in the pool before leaving of course. It's cool and sunny, perfect weather for Madrid.
#### Work session 3 (1 hour)
I came to a new library, "Gabriel García Marquez" in Orcasitas. It's large, nice and pleasant. I'm liking Usera for work, it has many workspaces and pools. I saw there was a public gym nearby and I checked it out, it was small but it can be combo'ed into the workday formula.
I worked on the multi-segment feature that I wanted to add to the original codebase. I didn't have enough time to finish it, but it is coming along nicely. I'm slightly concerned over how I'm going to integrate this code into what I already have, the stage code was the "brain" of the original code, and this would be like a brain transplant. It seems I will connect the body parts to this new brain one by one, rather than putting the brain into a body and hoping the transplant is not rejected.
#### Afterword
I'll start publishing again on the same day my workday ends, there was no "aging of experience" that I expected by putting sleep between the workday and the afterword.
I was pleased with the day. I see that I enjoy checking out new places, I'll do more of that this week. My projection for the day went exactly as I had envisioned it, which is strange, I usually plan one thing and something different comes out.
The more I work with Paper.js, the more convinced I am that this is the correct route. Getting familiar with it will allow me to create more things down the road. I also see that, if I come back to developing Method Draw, there are many things which I can borrow from this library.
<p>Prelude to the workday</p>
<p>Last night I had my good friend Sebas stay over, he is making his way back from the World Cup in Russia to the US, and he will spend the day here. I always find it strange working on passion projects while hosting friends, because there is no obligatory workdays or hours. You don't "have" to go to work.</p>
<p>In any case, since my job is not all that formal, I proposed that he join in the workday. Dress code: shorts or swimming trunks.</p>
<p>Work session 1 (1h, 30m)</p>
<p>We had many problems finding a bike for Sebas. Ofo is in town, but as of late I can't seem to find any of the bikes that show up on the map. I suspect thieves extract the GPS and throw it somewhere inaccessible, because there were many "bikes" on the railroad tracks but nowhere in sight. In the end we got a BiciMad and rode through Madrid Río. By the time we got anywhere it was already lunchtime, so we hit the pool and had some chicken tacos.</p>
<p>After chilling out we came to Conde Duque Library. First time here and I had high hopes for this library, as it's within a fancy cultural center. The space is modern and spacious, but there are not many books and it severely lacks electric outlets. Internet is nearly useless.</p>
<p>But, despite all odds, important work was accomplished today. Paths are being drawn beautifully, and code is reasonably understandable. UI code for design tools is inevitably tricky, code is inherently hierarchical, but what is the hierarchy between a hammer and a chisel? Tools do not contain each other.</p>
<p>Afterword</p>
<p>Working on your own gives flexibility. How to use this flexibility with responsibility? In former times, this flexibility became too loose and little was accomplished. I perceive that one must tense and relax conscientiousness according to circumstance. Ah, this too belongs to the realm of the transcendental and goes beyond work.</p>
#### Prelude to the workday
Today it's best to stick around the neighborhood to prepare lunch and complete other house chores. This morning Facebook and Instagram accounts were unceremoniously deleted, they were discarded as old shoes that only take up space in the closet.
Sebas left early in the morning since he flying to NYC. Groggy farewells pointed to the fact that wake-up hours have been slipping later in the moring. The intention is to begin the day at sunrise and to end it at sunset, so any temptations to nap will be forgone in order to take intention to action.
What needs to be done? Yesterday code was imported from the Bézier Game, but today this feels premature. It's better to first replicate the path overlap code which detects when your path matches (or mismatches) the challenge.
A challenge has been added to the work logs: to remove the use of "I". This has been done before in personal journals as spiritual exercise, and the stylistic constraint resulted in a very different kind of writing.
This tends to shift the syntax from the active to the passive voice, but beneath this, the subjective identity ("I") ceases to perform actions on objects, and the object becomes the subject, gaining agency. So _I used a disguise to fool the policeman_ should become _The disguise fooled the policeman_, avoiding both "I" and the passive voice.
This will be tried out during a couple of days. Right now this reads old-fashioned, hopefully some fluency will be gained with practice.
#### Work session 1 (1h, 15min)
Trying compute full overlapping of what the user draws against the reference path is a tough challenge. Though Paper.js has many functions that would seemingly assist in this task, in practice it was not performant nor easy to implement, so the code from the original game was imported.
The original code is a shameless hack, but it works quite well: there is an invisible canvas over which the reference and the user's paths are drawn, then a difference bitmap filter is applied on them. If there is a difference between paths it will generate a specific (green) color, so the code searches through the bitmap trying to find green pixels. If it does, then it means the user went off-path and the solution was not valid.
The hack worked just as well with Paper.js as it did under SVG, so it will remain as it is.
#### Afterword
Concentration becomes challenging under when sleep is lacking, so the rest of the day became free of work. Forcing oneself to work under these circumstances would only deplete the energies that remain, creating a deficit for tomorrow. It's best to take it easy.
#### Prelude to the workday
This is strange: today omitting the "I" seems much more difficult. Perhaps tiredness removes agency from the self, an effort will be made in any case.
The airbnb needs to be visited at 6pm, so this structures the rest of the day. What needs to be done? The Bézier Game has reached a state of stability, so it is not mandatory to give continuity to the code today. Perhaps a work session for Streaky (now re-baptized Flow) is in order. Since the evening is taken up, it might be interesting checking if the pool is a viable option to work during the morning, since there will be less people and less distractions. Let's see.
#### Work session 1 (1h)
A breezy work session on Flow at the nearest study hall. The mind was latching to tasks with surprising dexterity, but the codebase is reaching the complexity where you need to shuffle code with care. It's been observed that it is best to reorganize the code in the earlier stages, otherwise the plant grows hobbled by unneeded complexity.
#### Work session 2 (1h)
The guests at the airbnb apartment not only left almost no cleaning work to be done, they replaced the supplies that they used and bought a plant for the apartment! People like this are the salt of this earth.
> There are those who give and know not pain in giving, nor do they seek joy, nor give with mindfulness of virtue;
> They give as in yonder valley the myrtle breathes its fragrance into space.
> Through the hands of such as these God speaks, and from behind their eyes He smiles upon the earth.
_Khalil Gibran, On Giving_
#### Afterword
Not all that much was worked yesterday, but what was done was productive. We tend to equate satisfaction in work by the effort and the time expended, but these are illusory measures, if I run a dozen kilometers instead of walking them, the result is the same.
#### Prelude to the worday
I shall make an exception to the avoidance of the "I", because of special circumstances.
I have set my timer to 5 minutes to try the latest version of Flow. I will write until time runs up to test a bug, and then have another five minute session with the bug fixed (the bug is related to the timer).
I am coming back from receiving a Spanish couple at the airbnb apartment. Since the apartment was already clean, I had taken the computer to do some work while I waited for them, but I think I have grown accustomed to cleaning when I am there, because I couldn't help taking care of the details.
This I do not count as work as I did not write the prelude until now, and to be honest it did not feel like work.
My five minutes are up, let us try to fix the bug.
Well, I went through a rabbit hole and spent more time than I expected, but it is fine, it is like the cleaning that took place today: it didn't feel like work, it's simply something I need to fix in order to write my stream of thought. Let us not count this as work.
So, what shall be done today? I think it's best to keep it simple, take work to the nearest study hall and then enjoy the rest of this Friday. Sounds like a plan, let us wait for the timer to run out the five minutes so that I verify that I have fixed the problem. Little more than a minute left, I will allow for time to run out.
Yes! It worked!
#### Work session 1 (2h)
I spent the sprint bringing Project Arete back into it's digital form. There is still work to do, but I can complete it over the weekend so that it's ready to use beginning Monday or so. It's Friday afternoon and the weather is nice, I'll call it a day for today.
#### Afterword
It may be easier to come to the nearest workspace, but I know from experience that if I overindulge in comfort I eventually get bored. Just a note to myself not to get too used to walking to work, but to use the faculties of exploration.
#### Prelude to the workday
I begin the day late. I liked the idea of repeating yesterday's style, but today I find myself with less energy, the intensity was taxing. It seems it's either work or pleasure. If it is pleasure, then that will be today's work.
I can either go to the nearest study hall, work, and flow from there, or repeat yesterday's work route oriented in pleasure.
I don't know the answer yet. I shall begin the day as I did yesterday: a Wim Hoff breathing session at the park. I will probably know by then.
#### Afterword
This time I lasted 01:15 without air. A substantial increase over yesterday's 00:50. The ride on the bike cleared my mind and before the breathing session my choice was to pursue pleasure, but after the session my decision had changed: I'm missing my weekend day. Though not pressing, I have pending chores which would consume time from the rest of the week. There is a time of preparation which I skipped yesterday, let this afternoon become one of preparation.
#### Prelude to the workday
I begin the day early, at 5:00am. What needs to be done? Pressing matters: I'd like to finish the Bézier Game sooner rather than later, but I'd also like to finish that which is close to completion because unfinished things have the faculty of _unfinishing_ themselves more as they grow stale.
I have two quick wins: one is for Project Arete, and the other for Notebits flow.
At this time of the morning I have no workplace available, everything in Madrid begins and 9:00AM and not a minute earlier. I can either work home during the morning, or try using a bench at a park adequate for work. I'll prepare for the workday and see from there.
#### Work session 1 (2h)
I remembered about carrying the proper tools for the proper task, so I thought: if I can carry around laundry for the airbnb apartment on the cargo rack, I can carry anything. And so I packed a ridiculous amount of stuff which I'll cull if I see I don't use in a normal workday.
One of the things I packed was a hammock, and I hadn't noticed that the place in the park where I do my Wim Hoff breathing sessions has to perfectly spaced robust trees, and so I had a work session from the there, it was awesome!
I worked on a project which had remained touched in a while, which I call Runge. It is a tool that helps me choose good color palettes, and as I find myself applying color to the three active projects (Notebits Flow, Project Arete and the Bézier Game) I notice both it's usefulness and it's shortcomings, so I took some time to extend it. Works like a charm, I'll share it when it's more mature.
The sprinklers chased me away from the park, and now I'm at the terrace of the pool. I'm growing hungry, but I'll push out another work session before lunch.
#### Work session 2 (1h)
I finished what where I left off in Runge after being chased out by the sprinklers, then I incorporated the generated color palette into Notebits Flow and it worked quite well. Now I'll have to see if René notices his colors are slightly off! Now I'll have lunch on the grass and then dip into the pool.
#### Work session 3 (1h, 30m)
I completed the pending tasks for Notebits Flow. Didn't go as smoothly as usual, the code is getting gnarly inside. Will have to refactor eventually, but I will put it off until the knots truly slow me down. The MVP is always rewritten from scratch, so there is point in doing it at this time.
#### Afterword
I'm slowly figuring out the local maxima of this work route. I'm liking it a lot, though certain things could be improved. For me, rising early seems to be key in having a good work day.
#### Prelude to the workday
I begin the day early again, at 5:30am. I ran some household chores and then began spontaneously working on Project Arete, more or less by accident. I shall write it down:
#### Work session 1 (1h)
[Project Arete: Confidential].
Now let's get out of home to work.
#### Work session 2 (1h, 50m)
I came to the pool for a work session, I reinstated the node count code which lets you know how many nodes you have left. As the codebase gains complexity, it resembles more the original code. I don't want to get to the same rabbit hole, so I shall refactor soon.
I'm also scaling the paths depending on the size of the viewport. The game is quite playable now, but the devil is in the details, already some edge cases are rearing their ugly head.
#### Work session 3 (1h)
I came to the library within La Casa Encendida, but I'm wasted. I'm not used to getting up so early. I fiddled around some of the bugs in the Bezier Game and I answered emails, but this cannot be called work.
When I work in a library and I see someone who's not focused, I think it's time for him or her to go home or take a break. It's nothing but common sense, if you can't place your locus of attention to the problem at hand, it probably means your attention should be placed somewhere else. Where should mine go?
I'll go back home and see from there.
#### Afterword
Came back home, relaxed a bit, decided to call it a day, even if it's early-ish. Rising early also means ending early.
I had written my work log in the way I always do, and because of the constraints of Notebits Flow I lost what I had written. It's fine, Notebits Flow was designed for exercising your creative capacity, not for reliability or security. And the theme of the day was loss, so it was perfectly appropriate that this happened. So, I have set the timer for 20 minutes to describe the day in stream of thought.
I arose at around 8:30, and spontaneously begun working during two hours on Project Arete. Instead of putting the work under the confidential status, I had described the work I did and revealed what Arete was about, but now I have no inclination to repeat what was written. I'm not the kind of person who says "everything happens for a reason", but it feels exactly like this at this time.
I then went to the park to exercise a bit, and when I was on my way to the pool I noticed the sun was blinding me: I had left my sunglasses at the park! I went back to fetch them and then hit the pool. I worked one extra hour on Project Arete, and I recalled my phone was low on battery, so I felt through my pockets and it wasn't there. I went through my stuff, and it wasn't there either.
I wasn't really concerned about it, for some reason. I had lunch and I pondered what life would be without my phone: working from the pool would become more challenging without internet, I would have to find an alternative for chatting with friends and family, perhaps I would need to make more phone calls, and I would have to plan my routes and further my geographical exercising instead of relying on Google Maps.
Of course these were constraints I didn't want to deal with at this time, and I thought about using Find my Phone to locate it, but I didn't have internet. How would I find it's whereabouts? By calling it of course! So I asked the person nearest to me to dial my phone, and a man answered that he found it just some minutes ago, and that he'd be at the exact same spot where I had been before. I told him I'd be there in 20 minutes.
He was not a man, but a 15-ish year old latin american kid. He gave me the phone and I thanked him profusely. I asked if there was anything I could do for him, and he said no. "Are you in need of money?" I asked. He hesitated for a fraction of a second before replying no again. I pulled out a bill from my wallet and he took it, saying this was too much money. "Well, it's just enough to invite a girl out" I replied. He smiled and he said that's just what he would do. I turned around to leave and he said "thank you" and I replied "no, thank _you_", and it became obvious we were both elated to help each other out.
I then head to a different pool which was just beside a place where a free concert under the lunar eclipse would take place. I worked from the grass a little while, and at closing time I went to the concert. The eclipse was underwhelming from Madrid, and the music not of my taste, so I left early-ish and came back home.
Today I arose at 5:00 again, sleeping five hours, seemingly well rested and clear of mind. I tried sleeping more of course, but both body and mind protested, so I began the day.
What needs to be done? I feel I've been beating around the bush this week, not addressing the project which I feel is crucial for this period: the Bézier Game. I'll try to dedicate the full day to it and get down to the boring stuff I'm avoiding.
#### Work session 1 (4h)
Well, so much for plans, in the morning I began using Project Arete and I needed a feature, this took me down a rabbit hole in which I became deeply engrossed, and though I knew I was supposed to be doing something else, leaving it half baked would break it.
I'm glad I did it anyways. I've been struggling with the data structure of Project Arete and this incursion revealed that using recursion vastly simplifies the code. I had been avoiding tree traversal I couldn't wrap my head around the code. But, by virtue of a very simple problem it became clear:
In an array of arrays of varying depth, how do you append an element to the last of the last of the last [...] array?
Or, in pseudocode, how do you do `array.last().last().last()` without knowing how many `last()` you need?
Or, using the tree analogy, imagine you are blind, and you want to tie a ribbon to the last branch in a specific direction. You would feel up the trunk, then find where it branches out, follow the branch in the desired direction, and repeat following branches until you find a twig with leaves where to tie the ribbon.
#### Afterword
After work I hit the gym, had lunch, had a nap, went to the pool, went to meet up with old friends from Cabify, and I come back home late. I almost feel guilty about not feeling guilty for not working on the Bézier Game today. But how can one feel guilt about not feeling guilty?
I'm more intrigued about the fact that I sometimes propose myself something, and then I go on to do something completely different. When I recall these encounters of will vs action, I notice a deeper wisdom which overrides my conscious will.
Yet, at least at this moment, I'm sure I'll dedicate tomorrow to the Bézier Game.
#### Prelude to the day
I brought down my laptop to my building block gym to put on some music. As this is a hole, very few neighbors exercise here. In the half dozen times I've been here I've yet to encounter anybody else, even though changes in the arrangement of things reveal that there are some people who use it.
I decided to plan the day here because exercising clears the mind, and there's nobody here to think it's strange that there is a man writing on his laptop between sets. I intuitively know nobody really minds you if you don't interfere with their routine, not only at the gym but in the city at large, and the most disapproval I could get is a roll of the eyes. Just an observation pointing to the fact that I prevent myself from doing things because of my own perception of social approval.
It's time for the next set.
What needs to be accomplished today? It is Sunday. Yesterday I marked as rest day, and rest I got indeed. My body was quite sore from the physical activity of the week. Despite my leisurely schedule I still need at least one day of rest. So, last last week, my weekday begins on Sunday.
I have guests coming to the airbnb at 14:00. I'll need to be there at 12:00. It is 9:21 at this moment. I'll be done by 10:30, then I have one hour to shower and do some chores. Shall I take the bike? When I both hit the gym and bike to the apartment my body ends up exhausted and it makes it more difficult to work, so it will be better to simply take the metro there. I'll probably be back home at 3pm.
It's time for the next exercise.
I can come back home for lunch and then hit the library of Casa Encendida, which is open on Sundays, and if I end early enough I will hit the pool. Two work sessions today, in the first one (the airbnb) the tasks are very clear, no need to write them down. The second one, I almost feel hesitant to call out what I'm going to do, because in the recent past I've planned to work on the Bézier Game but I end up working on Project Arete.
Time for the next set.
Damn, deadlifts are always intense. I think the bursts working on Project Arete came from a need in the product. If the need is resolved, then it can become a dormant project once again so that I focus on the Bézier Game. In order for me to verify that the need is resolved, I need to become the user and work around the minefield that is the project at this early stage. This I will do, and I've already extended my prelude way beyond what any reader can possibly tolerate (ah, there it is again: a perception of social approval).
Next exercise
I used Project Arete between sets, having in mind that I wouldn't touch this next week, and there is still more work to do if I want to accomplish my intention of putting more attention to Notebits flow and the Bézier Game. So the second work session for today will be dedicated to Project Arete instead of the Bézier Game. I don't need to do much, so I'll have the rest of my sunday free.
Next exercise
I must question myself: what would be a good position where to leave Project Arete? Since I'm mostly prototyping, the UI for data entry involves writing JSON in sublime. It has become more unwieldy and error prone as the data grows. I already have some very basic inputs in place so that I don't have to dive into code every time I wish to use it. But these inputs are really the values for a widget in which you use the mouse, similar to how you use a color picker to represent three dimensions (red, green, and blue; or hue, saturation, and lightness).
In my usage, I've seen that inputting numeric values influences the way in which these values are picked. The color picker analogy is quite accurate: if I'm writing code I might pick `#ccc` for a gray, whereas if I used the color picker I would come up with a coldish or warmish gray because able to see what the visual result of the values I'm picking.
Next set
Another thing to take into account is the capacity to register these values more than once per day. As a user, this is perhaps more important to me than inputting values with a picker. So it seems that I have two tasks for Arete today:
1. Allow to register values more than once per day.
2. Implement a rudimentary visual picker for values.
Shouldn't be too complicated.
My gym session is going much slower with this technique. I think it's useful, but now that my next steps are clear, I'll finish my workout without touching the computer.
#### Work session 1 (1h)
I'm coming back from the airbnb apartment, I put the laundry on a 1h cycle, and I'll use this time to prepare lunch and pick up after myself, and write the work session of course.
The lovely French couple left the apartment better than they found it. All I needed to do was to put fresh bedding and replace supplies. When guests arrive I now estimate with a fair amount of certainty how clean they will leave the apartment, but some people just go out of their way in a good way. I've lost count of how many guests I have received, but averaging ten per month, I'd say 10% of people go beyond their duty and leave the place as clean or cleaner than they found it.
These outliers I'm unable to predict. This time it was a French couple, other were a family of Canarias (mother, grandmother and two children), the other were two ladies who came to Madrid for a course on a two week stay. I don't know why this happens, but people like this are the salt of this earth.
The guests who were supposed to arrive today didn't answer my messages, or show up at the apartment at the time they had indicated. I was left wondering what to do: should I have my computer I'd simply do a work session, but I left it at home expecting to to wrap things up over there. I left them a message to give me a call when they knew their arrival time. I'll need to remain mobile for the day.
Now I'll have lunch and then have my last work session of the day.
#### Work session 2 (1h)
Just as I was finishing lunch, the guests who hadn't arrived informed me they'd be there in 30 minutes, and I saw the message 20 minutes after the fact, so I told them I'd be late. When I arrived to the apartment, there was nobody there, and they hadn't answered my messages. I waited another hour until they finally showed up. Taxi strikes at the airport and a lack of internet had made it both difficult to communicate and thrown off the schedule. They were a surfer-type couple from Australia, vibe told me they'd leave the apartment a little below average in cleanness, I just write this here to verify that my intuitions are currently accurate.
So, being thrown off schedule I came back home to work at a leisurely pace. I didn't finish what I intended to, it turned out to be a more complex problem than I had thought, so I left it for the morning.
#### Afterword
Hmmmm... interesting, I enjoyed the planning at the gym, but there is an aspect of life which is unpredictable and throws off any schedule. I see that the conclusions are still valid: I need to leave Project Arete in a useful state in order to advance the rest of the projects.
//I am removing unnecessary structure from the work logs, so there's no prelude and afterword. I'm hoping to weave through narrative instead//
Today I come again to the gym to exercise and plan the day. This morning, once more, I had a spontaneous work session of Project Arete:
---
!!! Work session 1 (90min)
I completed one of the tasks for Arete that I had set out to finish yesterday. Project Arete can now go to the icebox, I hope. I will use it inbetween sets to see if what I did indeed resolves things for me.
I find it interesting that, no matter what I do, I can't work at home except when I'm working on Arete. Not only that, but I can't _prevent_ myself from working on it. I may think "I want to be out of home at 10am" and then go down rabbit holes for hours on end.
It breaks the myth that I made for myself: "I can't work from home". So now I have to say "I can only work from home when working on a specific project". Perhaps here lies the answer: allow Arete to be done at home, and take it out of the work sessions because it happens spontaneously. Indeed! I'll stop thinking about it as work. If it were work, I wouldn't be able to do it at home.
---
Let's lift some weights now.
I think, now that I give myself permission to work on Project Arete from home and outside the worklogs (now, this sounds suspiciously like a side project) I can focus on where I was going with "real work" (if I were to express this in person I'd be very emphatic with the air quotes).
What needs to be done? I'll probably know after the next set.
Two active projects: Notebits Flow and Bézier Game. Notebits Flow is very close to being completed, but René is on vacations, so even if I complete it it will sit completed for an entire week. Better to come back to the Bézier Game.
Next exercise.
I remembered something I know from years of exercising: don't strength train every day. It's not that I will feel exhausted today, overtraining manifests when the body gives out, and in my case this happens after a week of daily training. I shall throw in calisthenics and cardio at the park. But will I be able to plan my day there? I don't see why not.
Next set
I'll begin the day at the pool. The first work session will have no intention except to understand and simplify. In this way I can stir the codebase once again, as it's oils and waters have settled separately.
Next set
What do I need? Last week I was carrying a huge load on the cargo rack and I progressively made it lighter. It is not a hassle to bike around, but it is a hassle to secure it and then unlatch it when I get to my destination. I can either use my laptop backpack and sacrifice cargo space, or attempt to use my hiking backpack, which is much larger.
Next exercise
I'm done at the gym. I'll take the hiking backpack simply as a matter of experience. I won't know if it's useful until I try using it.
---
So the hiking backpack is not compatible with the bike. I was hoping it was, because I wanted to do a combined hiking and biking trip in the near future, but the ergonomics of something that was designed for walking is very different from biking. I'll figure out how to combine biking + hiking later, at this time it's biking + working. The simple solution would be to purchase a larger backpack, but at this time the constraint is to do it with little or no money, so I'll figure out something else.
On my way to the pool I realized that I didn't bring my bathing suit, and I was almost glad, because this meant I didn't have to bike around with a hiking backpack latched on to me. So I came to the park and hung the hammock for a work session, with the intention of going back home to change the luggage.
---
!!! Work session 2 (1h)
So I revisited the Bézier Game code, I fiddled around and then compared to the older version I had. I'm afraid I understand my older code better. This left me a bit deflated, one week of wasted effort? But continuing working on this direction would incur in sunken costs fallacy. What is more likely to get the product out of the door? The older code for sure. I will try not to fret on wasted time, the lessons that I learned in this incursion into paperjs are my reward.
---
After the work session I exercised a bit and wrote an opinion piece on the state of gender language policing. I'll let it simmer a bit before publishing, but it has already taken the topic off of my mind. When thoughts aren't carried away by meditation, creation usually does the trick. Now, let's get back home.
---
After getting home I fixed myself a quick lunch and had a short nap. {{Two hats}}
Now I'll have a work session at the pool.
---
I fooled around, but I wouldn't call it a work session. I tried to simplify the code, to no avail. Frankly today I'm feeling hopeless, it's like climbing a mountain through another face, finding that the face that you were climbing was easier, and now I'm drudging the way back. I stretched in the sun, completed a lap underwater, and then came to the library closest to the pool, in hopes of having better luck in a setting more appropriate for focused work. Let us try.
!!! Work session 3 (1h)
I warmed up to the codebase and fixed some things that had broken in my last foray trying to add segments to the Bézier Game. Not feeling as hopeless as I was feeling minutes ago. The library is closing, so I better get back home
This time I begin the work log at the pool. I felt like I had been hit by a train this morning, the body aching all over because I overexercised yesterday. I'll give my body a break today, biking will be done at a leisurely pace, and I will engage in no form of endurance or strength training.
What needs to be accomplished today? Today I am not sure. I'll just dive into the codebase and see what happens.
#### Work session 1 (30 min)
I was able to resolve some further bugs. It seems I'm warming up to the codebase and it becomes more intuitive with use. A bug that took me considerable debugging effort involved removing the reliance on private properties (`_`) of an object. Things are learned by trial and error. I've kept the work session short because I will not be able to focus here for much longer. I'll move work to a library after stretching and dipping in the pool.
***
I came to _Ana María Matute_ library in Carabanchel. I hadn't been here before, it's a nice modern library, but architecturally it's a disaster. It would seem that the intention was to have three entrances, but I infer that this would require more staff and only one entrance is open (the least convenient and hidden one). The other two entrances have prominent signs directing you to the open one. Too much signage is unequivocally a symptom of bad (or misused) architecture.
At this moment I have a nice view of Madrid in front of me. Perfect for work. Let's get down to business...
***
#### Work session 2 (1h 30 min)
Nice focused work. Just all around the place refactoring code. Hadn't had a flowing work session in a couple of days. Hope is restored.
***
I went to a different pool after the work session. At the entrance, I found former workmates from Cabify, and I joined them. We had a good time playing a card game that's called "liar", and the mechanics of the game involve a lot of lying, of course. The game intrigued me because it made me notice I have become accustomed to evade lying, and that threw off the other players because I'd only lie if I truly needed to, not as an element of strategy. Some years ago I decided to try out what would happen if I didn't lie, and when a difficult situation showed up I'd make an effort towards being honest. Now, I don't consider this moral high ground, from experience it felt very clearly that lying was the easy thing to do in the short term, but in the long term you carried an "honesty debt" which you had to keep track of. Honesty was a means of simplification.
But, in some situations lying was not only merited but necessary, and I'd lie noticing why I had done so, and I'd deal with the debt as soon as possible. An example: my mother asked if I had smoked pot, I responded "no" without hesitating. Why? I later reflected that if she dug more, I'd have to lie about the frequency. "Ah, if I smoked sporadically I'd be able to tell my mother the truth, so this is the correct direction".
In the end I lost a match not because I didn't lie, but because of my habit of honesty I didn't notice I had a winning hand and gave the match to my opponent in a very naive way. I see it as the moral dilemma of stealing an expensive life-saving medicine for somebody who will die if he doesn't have it, except you are so focused on the conundrum of stealing that you don't notice there's a box lying on the street.
We seem to lie a lot out of habit, and the cure to this is conscious honesty. But once the habit is uprooted, conscious honesty is a burden. If the Nazis ask you if you're hiding Jews, you lie. If a border agent asks how long are you staying, you lie. If you play a game of lying, you lie.
This morning I went to the gym and I felt weak, so I only had a light workout. I then came back home and dragged my feet to get out to do some work. Went to the bathroom like 4 times before noon. I went to the nearest study hall, and heat was blazing, but it felt particularly uncomfortable today. Then I had the most painful stomach ache I've felt in some time, so I came back home and it waned away after a couple of hours. Yesterday my body was aching all over. I think it might be gastroenteritis.
It's interesting to observe, because I made all sorts of reasons why I wasn't performing as I expected, but sickness hadn't crossed my mind at all (diarrhea is so common in Mexico that I don't really consider it a symptom, but I had forgotten I've been diarrhea free for a long time in Spain).
I suffer from the opposite of hypochondria, I observe symptoms and I attribute them to my state of mind or to circumstances. Is there a middle way? Any symptom you observe can come from your mental state ("I can't lift as much today because I didn't sleep well"), environmental circumstances ("Sure it's hot today"), or health ("I may be sick"). People in Spain seem to attribute everything to sickness, perhaps because of their excellent health coverage, while I tend to put off going to the doctor until it's very necessary. Nothing bad has come from this, except one time that I suffered Salmonella during an entire month because I thought it was a minor stomach upset that refused to go away.
Now that I think of it better, there _is_ something bad that comes from this: the blame that one inflicts upon oneself for not performing to one's expectations. As I realized I was sick I felt much more accepting about my state, I wasn't being lazy or weak.
Workwise, I did end up dedicating around three hours of work to Project Arete. Not all that productive, but some territory was gained. I shall take it easy this week.
Yesterday, feeling sick, I was able to get to bed early. In the morning I woke up quite refreshed, free of symptoms, and in a good mood. I began ruminating if it was true sickness or just a coincidence of symptoms, but then I thought it's the same: you are sick if you feel crappy, and I felt grateful for feeling good today. Still I chose to remain close to home in case if my state should deteriorate, so I came to Vallecas to check out a pair of study halls which are new to me.
I'm currently in a study hall in an employment office, it's modern and evidently underused. Vallecas is a working class district, on the way here I passed a park where all the picnic tables were occupied by people having a breakfast of beer, smokes and cards at 9am. No judgement arose from this observation which I found strange. I suspect that if I were on my way to a job which I didn't want to do I'd feel more judgemental.
Let's get to work.
''Work session 1 (2h)''
Project Arete work. Made a little experiment with some dom diff libraries instead of allowing d3.js to render everything. Didn't get too far. I wanted to use [Brutal.js](https://github.com/dosyago-coder-0/brutal.js) but it wasn't rendering. I just hate JS preprocessors so anything that implies JSX is out of the question. Brutal.js uses ES6 templates, so the fact that it didn't work was a bummer. Almost everything out there requires preprocessing.
---
I then went to a pool in one of the most dangerous neighborhoods of Madrid: Entrevías. To my Mexican eyes, it just seems a middle class neighborhood. The pool and gym facilities were top notch. The only difference I noticed were younger Spaniard parents, and senior people with tattoos. I had lunch and a nap, I didn't get into the pool because I'm not entirely positive that I'm not sick. I had seen a TV show about this neighborhood, it showed a lot of gypsies squatting apartments, drug addicts, and prostitutes, but I saw nothing of this. Surely there is a street where these kind of activities are commonplace, but it was the entire neighborhood painted in a negative light. If they made a balanced assessment they wouldn't have a TV show.
''Work session 2 (2h)''
I went to a library in Entrevías neighborhood, but it was closed for remodeling. I decided to go even further away, to Villa de Vallecas, which is a satellite town to Madrid. The library is old but serviceable. I worked on the Bézier Game, trying to scale the paths by their pathData instead of scaling them through the viewport. I searched through many js libraries, but all of them would be _killing flies with cannonballs_ as they say in Spain. Then I remembered [Method Draw](https://github.com/duopixel/Method-Draw) inherited this code from SVG Edit, and I spent most of these two hours extracting all the necessary functions. Finally I got it to work! This is good. Time for a break, I'll head to the Villa de Vallecas market to get a bite, then I'll visit the second (more modern) library of Villa de Vallecas.
''Work session 2 (30min)''
The entire market was closed for vacations during August, so I grabbed some fruit from the fruit store. Then I came to Luis Martin Santos Library in Villa de Vallecas. It's an astounding space, I think this is why the other library was almost empty, it's just a few hundred meters away but decades ahead in quality. I begun working on integrating what I did a while ago into the actual game, I ran into some problems, but my mind has run out of gas. I'm simply too tired to focus. Ah, but as I write this I notice there are some things which I can do which don't require a sharp mind: I'll search through the noun project for good icons to import into the Bézier Game. Let's see... Nah, I'd need a coffee to get through this. Let's call it a day. I hope to come to this library some other day, it's a pleasant space.
---
{{Fall from the bike}}
I came down to the building block's gym to exercise a bit. Today I receive guests at the airbnb apartment at 21:15, this means I should be there at around 19:00 to prepare things for the guests. Also means I should be back home at 18:30 to pick up towels & bedding. I have a guest myself at home, a Mexican friend of my roommate, I'm not sure about his plans but I'll propose that he joins the work route if there's none. If this is the case, then I will work from libraries close to landmarks, otherwise I enjoyed the experience of exploring new workplaces.
What work needs to be done? The Bézier Game.
I don't think anything else needs to be planned. I'll continue my workout.
---
I went out with my Mexican guest to search for an [ofo](http://ofo.com) bike, but they all turned out to be "ghost" bikes. Apparently, thieves dispose of the GPS and throw them away to inaccessible locations. The day started late and was lost mostly due to this search, so no computer work was done.
!!!! Work session 1 (1h, 30min)
I received a Spaniard couple at the airbnb apartment. I had left my phone at home, so when I was done cleaning I set camp at the window to see if I could see them arrive. Since I had no means of knowing the time, from the window I asked some random person to give me the time. His body language seemed to reflect a "really?" attitude, it seems asking for the time has become _passé_. I left them two bags of ice in the freezer, Madrid's August heat is in full force and the apartment doesn't have AC.
Monday and Tuesday rolled into a single work log. I did almost no computer work, yet I still felt busy and productive. This makes me inquire into the nature of work. What is work? Labour for a wage? If that were so, I haven't been working for a while.
{{Animal work}}
How does this map out to my situation? We had a guest over the weekend, he got very sick and though required no special attention, it still felt rude to simply leave him at home while I went out to do my "work". So I focused on house chores: preparing meals, cleaning up, repair work and such. The company we provided to each other was pleasant, and it felt intuitively right.
When I started writing work logs I knew a couple of these days would come up, and I wondered how they would be dealt with. Now it feels they should simply be passed over without much thought, but I wanted to write down the experience to extract the wisdom out of it. Activity in the benefit of one's "tribe" is always work.
When you stumble, it's best to quickly acknowledge it and persist with the task. The cause of my stumble is that my bike was stolen, and this disrupted my schedule for a couple of days. But, but an orphan bike has been finally found a place at home, so I may continue my explorations about urban Madrid while working publicly. The downtime has led me to reconsider how I engage in work, I shall write this down as a commitment to it.
I dislike the word "deadline", because it implies you're dead if you exceed the line. In practice, we simply drag the deadline a little further away, so that neither author nor project lose their lives in the creative process. In the past few years I've reframed the problem as one of _cycles_, there is a project which dictates a structure of work, and to change the structure of work one has to finish the project. A deadline is simply an estimation of how long the cycle will take. The delta that results should be improved with deliberate practice. It is also an antidote to perfectionism, because projects tend to expand to the time they have assigned to them, and if _all_ the time is assigned to them, then the task will never end.
{{I'd like to change the textual nature of the work logs}}
There are a couple of other minor intentions, but these I will address in practice. Today is Sunday and I will do as I please, though I know some preparation needs to be addressed. Let us begin the day.
#### Work session 1
Work done: Notebits Flow
<video width="100%" controls>
<source src="http://method.ac/assets/notebits-flow.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
Where: [Miguel Delibes Public Library, Madrid](https://goo.gl/maps/o7nTC9i3PZo)
<img alt="moratalaz.jpg" src="http://method.ac/writing/uploads/moratalaz.jpg" width="100%" class="mt-image-none" style="" />
#### Work session 2
Work done: Bézier Game, resizing tutorials based on screen size.
<video width="100%" controls>
<source src="http://method.ac/assets/bezier-exported.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
Where: [Moratalaz Public Library, Madrid](https://goo.gl/maps/Dmxd4re4PWq)
<img alt="morrra.jpg" src="http://method.ac/writing/uploads/morrra.jpg" width="100%" class="mt-image-none" style="" />
This morning I went out of bed with a sense of dread for work, which means I'm not enjoying the work I'm doing. I've been pondering the meaning of this, for there are multiple tensions inside which are pulling in different directions; and coming to no solid conclusion I write this down as to stabilize the tension. From experience, I've observed that inner conflict is a handicap to work, and the conflict can come from any source. At this time there is little else than work going on in my life, and so the source of conflict is easy to pinpoint.
As I work on the Bézier Game, I see that it's not as engaging as I thought it would be. It feels like a chore to complete stages. Perhaps it's the structure that I thought out, introducing concept by concept and building upon those concepts at--I must interrupt my train of thought. The purpose of becoming adept at using the pen tool is to be able to draw, if I restate the purpose of the game "A game to help you learn the pen tool" into "A game to help you learn how to draw vector images", perhaps the sense of chore is diminished, because the creative aspect of the game is highlighted.
Anything I commit to must not extend the length of this cycle, I can intuit a possible direction where these conditions are met, but I will need to invest the day in completing this. Yes, the inner conflict is diminished when I project this possibility. It will be worth exploring.
Conflict diminished, I'll think out loud about (yesterday's work log)[http://method.ac/writing/work_journal/work_log_day_130.html]. I did not enjoy it as much as I enjoy writing--No, actually I did not enjoy it at all. My idea in trying new things is that something new must be learned, and I learned from producing the videos, but the photos are simply not a source of learning. As it's technically illegal to take pictures in libraries, I snapped the pictures surreptitiously. Now, I care very little wether it's illegal or not, but there is a double concern in the fact that people did not consent to appear in my pictures, and that I cannot put the effort towards improving those pictures. So, from experience it felt clearly that this will bring nothing good should I persist in this task.
---
Well, I've tried to work, but nothing seems to be able to catch my attention. Some days this happens to me. I then meditate for a long while, and I try to come back to work. Sometimes it does the trick, other times it doesn't, and this time it didn't. The good thing about meditation is that it allows you to observe without judgement. Shrug of the shoulders: today I can't work. Perhaps tomorrow I'll be able to do so. I don't think any less of myself because of this.
I do find an inclination to keep on writing, as it seems to act as a kind of self-therapy, but I'm afraid that if I propose to myself any kind of work the interest will wane. So I'll just write notes on my latest reading: Goethe's Theory of Colors.
---
!!!! Notes on personality
> It is useless to attempt to express the nature of a thing abstractedly. Effects we can perceive, and a complete history of those effects would, in fact, sufficiently define the nature of the thing itself. We should try in vain to describe a man's character, but let his acts be collected and an idea of the character will be presented to us.
> --Goethe's Theory of Colors
I found Goethe's idea of describing a man's character by his actions thought provoking. Lately I've become interested in the measurement of personality traits, and I've become skeptical about the way research is done.
Personality testing is performed by asking participants to self-report agreement on a variety of statements, such as "I don't mind being the center of attention" (for extraversion) or "I make a mess of things" for conscientiousness. If you've answered one of these tests, a question that often arises is _in what context?_, because, unsurprisingly, we seem to behave differently depending on the situation. The subject is expected to balance the assessment, so, if he is neat at work but messy at home, then he'd score himself somewhere between two and four in a five point scale.
Many problems arise from self-assessment. Consider an undeniably conscientious student at height academic activity: he may leave clothes and dishes unwashed in order to squeeze more time for finals. The same conscientiousness which allows him to focus on what's important bites back in the form of guilt, he is keenly aware that he's a mess, so his self-assessment will be biased.
Or an example that I recently encountered: a subtly neurotic woman arrived to an event with 30 minutes to spare (or so she said), but couldn't find the exact location of the event. She walked around the venue asking everyone about the event, nobody knew about it (we were a small crowd). Finally, somebody attending the event who arrived late overheard her, and told her it was in the cafeteria. Both "conscientious" and unconscientious people arrived at the same time.
Furthermore, you've surely encountered the fact that exceptional people often make less of their talent, and people who lack talent make more of it. Some months ago I encountered an endearing lady who expressed guilt that she had attended a free impro session and liked it, but then she discovered she had a class just minutes away from her home instead of a 45 minute drive. She didn't want to "betray" the person who gave her the free class. This is an example of a person high on Agreeableness, and I pointed this out to her. "Oh, for sure I'm not an agreeable person, I disappoint people so much". She wouldn't care about the disappointment if she weren't agreeable!
All these problems of self-reporting personality are related to the ego. The ego, in the broadest terms, is the person who you think you are. To see your ego, you can describe yourself in three phrases, each phrase with an adjective and a noun. Example: I'm a caring father. I'm a diligent engineer. I'm an enthusiastic runner. We tend to protect this self image, so when a personality test says "I'm careful about not making mistakes at work" we tend to agree not based on factual premises but on the self-image we have created for ourselves. If we were truly honest with ourselves, we'd leave the test shaking, for very few are truly aware of the dissonance between the way they think and the way they act.
In _Goethe's Theory of Colors_ the author proposes a series of experiments to verify his subjective observations about color. Here, I propose the same with personality: choose a person whom you know well, and first answer these questions for them. Then ask them to complete them themselves.
Note the difference between your assessment and your subjects own assessment. Note too, that nobody holds the upper hand in the objective assessment. You have a more objective perspective, but you also don't have access to the entire life of that person. It is not a matter of finding who is more accurate, it is a matter of finding if there is a substantial difference in the assessment.
Rate from 1 to 5 how much you agree on the following statements:
# I am the life of the party.
# I feel little concern for others.
# I am always prepared.
# I get stressed out easily.
# I have a rich vocabulary.
# I don't talk a lot.
# I am interested in people.
# I leave my belongings around.
# I am relaxed most of the time.
# I have difficulty understanding abstract ideas.
# I feel comfortable around people.
# I insult people.
# I pay attention to details.
# I worry about things.
# I have a vivid imagination.
# I keep in the background.
# I sympathize with others' feelings.
# I make a mess of things.
# I seldom feel blue.
# I am not interested in abstract ideas.
# I start conversations.
# I am not interested in other people's problems.
# I get chores done right away.
# I am easily disturbed.
# I have excellent ideas.
# I have little to say.
# I have a soft heart.
# I often forget to put things back in their proper place.
# I get upset easily.
# I do not have a good imagination.
# I talk to a lot of different people at parties.
# I am not really interested in others.
# I like order.
# I change my mood a lot.
# I am quick to understand things.
# I don't like to draw attention to myself.
# I take time out for others.
# I shirk my duties.
# I have frequent mood swings.
# I use difficult words.
# I don't mind being the center of attention.
# I feel others' emotions.
# I follow a schedule.
# I get irritated easily.
# I spend time reflecting on things.
# I am quiet around strangers.
# I make people feel at ease.
# I am exacting in my work.
# I often feel blue.
# I am full of ideas.
---
Well, that was written mostly stream-of-thought style with light editing. It's not worthy of publishing as an article, but it felt very reinvigorating to flow a pair of hours. I'll leave the workday here and hope to find a better disposition tomorrow.
I'm writing this from the patio of a bar. I went to a library, found it closed, went to another one further away, it had closed early, again I went further away to another library, closed again. Seems like Madrid is closed off these dates and I've wasted the morning searching for a place to work. What a string of unproductive days! I'll need reassess the way in which I'm doing work these days, I'll need to stick to what is known to be open during the rest of August.
At this time I feel like simply taking the rest of the week off, but I know this decision would come from a place of frustration. Instead, I will take the rest of the day off. If I have no intention of work, then perhaps work will finally find me.
I took the day to perceive in what I'd work if I were to let work find me. I felt the direction clearly. Now, the direction is an important change, but if there is where flow is to be found, then I shall flow that way. I have encountered no flow in a while, and today I did. I need to find if the direction persists. If I err, it will be a big mistake, but courage would be gathered beforehand. {{Give the present moment what it needs}} What do I need now? I need to go to sleep.
Today I allowed for work to find me again, and it came clothed as a German genius.
"I am not worthy of you" I exclaimed. Instead of answering he simply showed me how he did his work. There were no tricks, all was based on honesty, humility, curiosity and courage. Work wouldn't consume him, quite the opposite, so unattached he was that he would finish a manuscript, put it in a package, and then merrily move on to the next thing.
I sensed there was a lot I could learn from this man. It's been decades since I've had a master, and though I expected to find him in this world, his light transcends worlds and he offers his wisdom to everyone. I must be willing to unlearn in order to accommodate his lessons.
I begin my lessons tomorrow.
<p>Following Goethe's advice to attend to the present moment, I've been itching to change the way in which I register my gym progress. The first part of this puzzle is a widget that allows me to register two dimensions and the same time, and that also has discreet steps. The purpose is to be able to register both weight and reps lifted with a single gesture.</p>
<p>Now, suppose you keep within the 8-12 rep range, and your dumbbells come in increases of 2.5Kg, now it would look like this:</p>
<div class="fieldset">
<div>
<label for="x">weight:</label>
<input type="text" name="x" value="0" id="x">
</div>
<div>
<label for="x">reps:</label>
<input type="text" name="y" value="0" id="y">
<div>
</div>
<div id="gymrat"></div>
<div id="tenbyten"></div>
<p>Not much to see here, a simple way of <strong>se</strong>tting <strong>xy</strong> (sexy!)</p>
<pre>
var sexier = new Sexy({
el: document.getElementById("gymrat"),
min: { x: 5, y: 8 },
max: { x: 15, y: 12 },
step: { x: 2.5, y: 1 },
value: {x: 10, y: 10},
onChange: function(){...}
});
</pre>
This is in prototype quality (design and code-wise), but I'm looking forward towards developing it. It will come useful for Project Arete too.
<script type="text/javascript" src="https://method.ac/assets/sexy.js"></script>
<script type="text/javascript">
var x = document.querySelector("[name='x']");
var y = document.querySelector("[name='y']");
var sexier = new Sexy({
el: document.getElementById("gymrat"),
min: { x: 5, y: 8 },
max: { x: 15, y: 12 },
step: { x: 2.5, y: 1 },
value: {x: 10, y: 10},
onDrag: function(d){
x.value = d.x;
y.value = d.y;
}
});
</script>
Notebits Flow set for 500 words in 10 minutes. I've been wondering what to do about the work logs. It's been great for warming up to publishing again, but I feel that the fact that I have to write every day detracts from longer, well thought writing. I'll continue doing it at least until the Bézier Game is released. When I set out to do this, I said I would do it until August, but that was because that's when I expected to release the Bézier Game. So many unexpected turns have taken it quite behind schedule. But there is no regret, strangely. I've enjoyed the process, and I've enjoyed the detours. And I'd be worried if I had nothing to show for it, but soon things will be released.
This morning I went to work to the nearest study hall. It was packed, which unsettled me: these weeks it's been empty everywhere. But then I remembered: they closed the nearest library, so probably this study hall has twice the people it would normally have, and one wing was also closed for AC maintenance, so it would have four times as much density if these conditions were not met.
I worked for a bit more than an hour on the Bézier Game. I've decided how to proceed: this is like opening up an electronic device with the intention of upgrading and polishing many pieces, but then you realize: this was done some years ago, it's not as elegant as I'd do it now, but it's also a quite complicated piece of machinery, so I cannot redo it from scratch. So, I re-scaled my ambitions and decided to simply put it back together with minimal upgrades. There will be new levels and new stages, of course, but probably no localStorage saving or some fancy ideas for mirroring the pen tool in order to be more efficient drawing. And no dynamic grid lines which would allow you to use shift in cool ways. Oh, I see that my writing suffers when I have to write this fast, but I need to write fast in order that my writing is not lost, so it really is an effective tool for letting your thoughts out. I'm banging at the keyboard to reach the time bar. I shall not delete anything. Let's go on.
So I continued doing some levels, slowly putting everything back together, and fixing bugs. It was a productive morning, and I was satisfied with the work done. Then I came back home, had lunch, and went to the gym. After this, I wondered what would I do, I went to the pool and took again Eckermann's notes on Goethe, and as much wisdom was extracted from the book as possible. I've been underlining with a pencil the things which I find relevant, in order to write an article when I finish it. I feel kinda guilty underlining a book taken from the library, but I suppose I can erase everything when I'm done. I confess too to have drawn some things on the margin of the pages.
After this I went to the Reina Sofía Library, to finish off the latest things of Notebits Flow, which I'm using right now. I'm excited that _finally_ something is going to be released, and I'm hoping this rolls off things from the production line. I feel constipated by so many projects. Goethe says that we should prune ourselves as plants are pruned so that their energy is focused on less branches. Indeed, what a wise person. Never writing at this rythm again, oh my. Or perhaps I should. To any reader to reads this: thanks and apologies. I might just continue doing it to see if I can become more coherent at this speed.
Notebits flow set for 500 words in 10 minutes.
This morning I woke up at 6am and couldn't go back to sleep, so I prepared myself a coffee and worked a bit on project arete. At around 7:30 I felt sleepy again, so I went to bed and woke up at 9am.
I went to the nearest study hall, I've been avoiding going on the bike, since I don't have all my stuff prepared--better said: I need upfront time investment to go off on the bike, so when I'm not prepared it's best to simply head to work to the nearest place. I had forgotten I actually like the place, it's quiet and people are focused. In some places I encounter people who are less focused, and they are a distraction. Sometimes _I_ am the distraction, I suppose.
At the study hall I worked on the Bézier Game. I resolved a long standing bug that was giving me a lot of headaches. I've been toying around with the idea of becoming a more structured programmer, but I completely dislike the direction front-end programming is taking at this time (React + Redux). It does indeed feel like everything is over engineered. NPM and dependency hell, I feel like I'm putting things together instead of programming. I dislike having to fire up so much stuff just to get started, I enjoy simply opening my editor and my browser and iterating very quickly, and build step detracts from flow. Anything that gets in the way of instant feedback tends to not work out for me, if I have a couple of seconds waiting for things to compile, my mind goes somewhere else and I lose track of what I was supposed to do. In any case, I was glad to be able to resolve the bug, the rest of the tasks that I need to release the new version of the Bézier Game are not very difficult, but also not very engaging. It will be a long list of chores. I was not very hopeful today.
I went back home for lunch, had a nap, and then went back to the same study hall. I tried to advance on the Bézier Game, but I was done for the day, so I opened Notebits Flow and it was a breeze. It's so pleasant working on a small codebase. I wish I could work on projects of less that 500 lines of code. That seems to be my sweet spot. After that, things get messy and I have trouble loading it all on my memory, so I have to debug much more in order to advance. Notebits Flow is quickly gaining MVP status, and I'm enthusiastic that something will finally come out of this period, as I have many open fronts but not many battles won.
I shall continue working with the intention of releasing quickly, I find pleasure in simple straightforward work, but I know I must also release stuff so that I can have something to show for my time. Creative work creates, it's not work for work's sake.
Today the sky in Madrid shapeshifted. Most of the time where was a dull overcast, but at times the sun would come out and shine intensely, only to yield to heavy dark clouds that refused to rain. I felt just the same. {{Two bulls}}
In days like these I know it's best reefing the sails and waiting for more favorable wind.
I write this work log the next day, at the gym between sets, as I did during a couple of days in the past. I find great pleasure and clarity writing during exercise, though it inevitably brings a dose of self-consciousness: only a fool would do things like these. But a fool indeed I am.
Yesterday I received a mother and her daughter at the airbnb apartment. They were coming to Madrid to visit their son/brother who had just had a child, and it was their first time using an airbnb. I was treated like a friend of the family, and I soon found myself completely at ease with them. Instead of a check-in to the apartment it was _personal_ check-in of sorts, peppered with tips about the apartment. It was obviously a pleasant experience for both parts, and we said farewell with two kisses and best wishes for the new member of the family.
I then headed to the Cabify offices to catch up with René of Notebits. As he was busy wrapping up a user research interview I waited in the lobby, and I had the chance to greet former workmates who were coming out for lunch. I also caught up with members of my former team and we promised lunch together. René and myself had an interesting business lunch in which some possible futures were sketched, and also more practical, immediate matters. We bid farewell, and I headed back home, and then to the pool to keep on underlining Eckermann's notes on Goethe.
When I came back home, Isa, my roommate and owner of the airbnb apartment, pointed out the possibility of taking charge of a new airbnb during the month of September, as the apartment that I am managing now has been sold and our last guests will be in August. I thought it would be a good idea, though this changes my plans a bit. My 30 day work log cycle was projected on the fact that I would be free during september, so I would need to finish a project in this time and then head off for some adventures into nature. This change of circumstances extends the cycle by 30 days and pushes my vacations into the beginning of October, which adds time and thus possibilities. I wish to project what I ought to do with these possibilities, and to correct the course of the current cycle as I've found difficulty navigating with these winds.
Let us see then what frontlines are active: Bézier Game, Project Arete, Airbnb apartment, work routes, Goethe and Notebits Flow. Let's dedicate some time to describe each, and then decide what to do about them.
#### Bézier Game
I have this advanced enough that all the interesting challenges have dried up. From now on, it will be chores. Many of them. As trite as it sounds, my creative sensibilities are hurt by sustained work on chores, and though I could engage in war to finally release this, it will come at great cost and I would need to take vacations afterwards. This was my original plan, but with 30 extra days, instead tackling all the chores in a short period of time, I can spread them out until late September. But, is this procrastination? Ballpark figure is 35 days, and before these news I was planning on completing it in around 8 days. I work around four effective hours per day when I'm in a good state of mind, so that 32 hours. One hour per day during 35 days should be enough. Commitment: Bezier Game chores: 1 hour per day.
#### Project Arete
Project Arete has accomplished a more or less stable "useful for me" status, though not in any way shareable yet. The sexy picker is part of this project, and I would like integrate it into Arete so that it is more useful. I think that, if I dedicate one hour to project arete too I will see great advances, but I will need to make it public so that I can share the work I'm doing. I have generally disliked the experience of having some work that is private, and the main reason as to make it private was that I wanted to sense if this was the right moment to tackle it. And it has felt this way, it is the right moment to tackle it indeed. Commitment Project Arete: 1 hour per day.
#### Airbnb apartment
As my savings are not enough to dedicate the 100% if my time to pleasure projects, I am willing to do some work in order to extend my runway. I find that I cannot sit down eight hours a day doing focused work anymore, I'm 38 and my capacity for this has diminished. As in the case with partying, I can do it if necessary, but I must be willing to pay the price later. So I'm more than willing to sell other kind of skills in exchange for extending my runway. In the case of cleaning, I have glimpsed what it is to find pleasure in cleaning, and though I cannot reach this state of time with the regularity I would like, I think has become more or less of a challenge. There are treasures in cleaning. Receiving guests has always been pleasurable, the variety of people is staggering and everybody causes a deep impression on me. These are random samples of middle class people from Spain and abroad, who visit Madrid for the most varied reasons (probably 30% tourists) and they all come in so different patterns and personalities that I wouldn't be able to pinpoint anything in common except that they have been nice and pleasant people. It restores faith in humanity. So doing this activity has a positive impact in my mood, in my finances, and it doesn't compete with my pleasure work. An hour of computer labour takes away from my pleasure labour, but this is not the case with physical/social labour. Commitment: on demand.
#### Work routes
In the last few days I've been going to the nearest study hall to keep it simple. And I must confess it is also because there is a person there whom I like. I have not crossed even words with her, just a few furtive glances. But this stasis is not satisfactory in the least, I must make a move in order to free myself of this attachment. As if there is mutual interest as if there's not, this allows me to free myself to keep on exploring. So I will do something about it. Commitment: speak out and continue exploring libraries and study halls.
#### Goethe
Since my early twenties I have not been taken away by an author as Goethe has done it. The breadth of his intellect and sensibility is staggering. When something like this happens to me, I must produce something so that the intellectual nourishing has an outlet. I will write the article which I have in mind, and afterwards, if I feel like it, I will conduct Goethe's experiments on color. Goethe has a peculiar way of doing science: he puts forth a series of simple experiments with light, and annotates his observations. He makes it very clear that you must experience them with your own senses so that you can gain insight into what he is speaking about. I happen to have Phillips Hue lightbulbs which would greatly assist in the task, but I would need to find some lamps to use them effectively. It would seem then, that the first task is to finish reading Eckermann's notes on Goethe and write the article, and then see from there. Commitment: finish reading Eckermann's notes on Goethe during my off-hours.
#### Notebits Flow
I had no intention of taking up freelance projects, but René's product was very aligned with my vision and the experience of collaboration was throughly positive. The problem with most clients is that they have a schedule, and the schedule brings deliverables, and the deliverables bring a plan, and so forth. Soon the creative person finds himself managing the project rather than creating it, and in this aspect René and myself have understood each other seamlessly. I have no roadmap, just a couple of open-ended tasks without a deadline that I tackle as I see fit. And it has worked out great for our own peculiar styles. We are in a state where we have an MVP already, but since we are in no rush to release it, we are allowing the grapes to age into wine. Commitment: on demand.
***
It seems nothing that I have on my table is unnecessary. These are enough fronts to keep me entertained for a while, and it seems the last global commitment is to convert these intentions into a Project Arete cycle. The task for today then is planning.
Some days are not very productive because hangovers happen. When you force yourself to work through discomfort, the displeasure of work carries on and motivation is diminished. Simply acknowledge that hangovers on Monday are not a good idea. This was the work done today:
<table>
<tr><th>Project</th><th>Duration/Intensity</th><th>Description</th></tr>
<tr><td>Bézier Game</td><td>60min/0.5</td><td>Fixed redo bug where segments were not positioned correctly</td></tr>
<tr><td>Virtuegraph</td><td>null/null</td><td></td></tr>
<tr><td>Notebits</td><td>null/null</td><td></td></tr>
<tr><td>Airbnb</td><td>null/null</td><td></td></tr>
<tr><td>Goethe</td><td>60min/0.3</td><td>Underlined Conversations with Goethe</td></tr>
<tr><td>Work routes</td><td>null/null</td><td></td></tr>
</table>
This week I will simply state the work done. The intention is to dialogue less and create more. I'm trying a metric, time × intensity × importance.
<table>
<tr>
<th>Project</th><th>Time</th><th>Intensity</th><th>Importance</th><th>Total</th>
</tr>
<tr>
<td><strong>Bézier Game</strong></td><td>60min</td><td>0.7</td><td>1</td><td>42</td>
</tr>
<tr>
<td><strong>Notebits Flow</strong></td><td>60min</td><td>0.8</td><td>1</td><td>48</td>
</tr>
<tr>
<td><strong>Goethe</strong></td><td>120min</td><td>0.3</td><td>0.3</td><td>10.8</td>
</tr>
<tr>
<td>Total</td><td>240</td><td></td><td></td><td>100.8</td>
</tr>
</table>
I've begun describing the workplaces where I do my thing, [here is an example](https://method.ac/workplaces/madrid/pio-baroja-library.html).
<table>
<tr>
<th>Project</th><th>Time</th><th>Intensity</th><th>Importance</th><th>Total</th>
</tr>
<tr>
<td><strong>Method of Action</strong></td><td>120min</td><td>1</td><td>0.5</td><td>60</td>
</tr>
<tr>
<td><strong>Notebits Flow</strong></td><td>60min</td><td>0.5</td><td>1</td><td>30</td>
</tr>
<tr>
<td><strong>Work routes</strong></td><td>120min</td><td>1</td><td>0.5</td><td>60</td>
</tr>
<tr>
<td><strong>Total</strong></td><td>300min</td><td></td><td></td><td>150</td>
</tr>
</table>
I begun the day late and after hitting the pool I went to the library at La Casa Encendida. I wrote the [workplace setting](https://method.ac/workplaces/madrid/library-of-la-casa-encendida.html) quite quickly and enjoyed the experience, and then put myself to work. I needed to set the DNS of [notebits.app](http://notebits.app) to René's server, but after much frustration I preferred to to set things up at my own hosting provider ([digitalocean](http://digitalocean.com)) and worry about transferring the host later.
While checking nginx's logs I found an unrelated error: php-fpm was raising `access denied` errors on my old blog and I tried to hunt down the reason why this was happening. I had set up the server to serve html files as php and it had stopped working. After much google-fu, I found the correct config file where to make the change, and soon enough things were being served without errors.
I found server administration to be a refreshing change from what I had been doing, though I sometimes wonder if being this close to the metal is truly needed. Unix philosophy of having specialized tools that do one job is at times empowering and at others frustrating. There's been times when I've gotten stuck and needed to ask for help to more experienced people, and I'm surprised that they actually have to do pretty much what I do: google the problem and poke at the entrails until it starts working again.
So many things to write about, where to start? Perhaps by the day activities, in this way the situation will explain itself:
I woke up at around 8am, had my coffee, and then went to the airbnb apartment that I manage. I waited for the truck to arrive, we were moving the furniture to a new house, since the apartment was sold some weeks ago and owner will take possession in the next few days. The new house is a duplex, not really in the suburbs, but quite far away from the city center, which I will be inhabiting for the next month. My mission is to paint it and do some minor refurbushing work during the month of September.
Two guys and a child showed up, and we moved the furniture in about three hours. I learned quite a number of tricks putting sofas through doors, and should the situation arise again, I think I'd be at least more adept as I was before. It's not that I have never put a sofa through a door, but one of the guys was quite experienced and he explained the principles behind making things fit, and how to know if it's simply too large for the space you need to put it through. After we were done I was quite exhausted, for Madrid's heat was in full force today, so I had a nap and then went back home.
After lunch I perceived that, if I were to put myself in front of a computer, I wouldn't be able to do much, so I put _Conversations with Goethe_ in the backpack and hit the pool. I finished the important parts (book I and II) because the third book is not really written by Eckermann, but by a fellow named Soret, who had a more objective disposition, so instead of trying to register Goethe's exact words, he tends to describe his interactions in a more synthetic way. Where Eckermann, being a poet, might try to reenact the mood, setting and words of Goethe, Soret would simply write "Goethe discussed with great eloquence about the virtues of a moderate life", and there is not much wisdom to be extracted from this kind of writing.
But the change in narrative illuminated the fact that I swing between both styles, and that {{The poetic}}
The furniture was moved, but my life is still not moved into the new house, so I suspect that the next few days will be physical rather than intellectual work. I welcome this phase because the last two weeks I've felt stagnated in my current situation, so any change is welcome.
Well, that was an interesting experiment. Writing work logs was at times self-organizing, at times a chore, and at other times a distraction. I still don't know what to make about the experiment. I consider it successful, because it was a great source of experience, and at the same time it was a failure, because it's intention was to help me produce more and better work. Yet nothing came out of it (yet!).
I have the sense that I work a lot, and yet it seems most of the stuff I work on (personal and professional) tends to go stale, and then it becomes difficult to pick up again. I feel I need to tackle simpler things first in order to get into a _shipping habit_.
So let that be the intention: quiet the mind, write less, ship more.
I have decided to resume my work logs. I enjoy writing, and if I don't do it online, I tend to fill notebooks with journaling. Though journaling is more intimate, the fact that you publish something out to the world changes the feeling of how things are written and I kinda miss that.
Today I woke up at around 9:30AM and was hitting the library by 11am. My waking time has slowly been slipping later and later, and though--by my standards--this is not a bad time to wake up, I came back from walking the Camino de Santiago waking up at 6:30am or so, and I wanted to retain the habit. From experience I know I don't get much done until I leave the house, so instead of setting a goal for waking up, it's better to set the goal to begin the work day earlier. So, getting into the library at anytime before 11am is good.
The library at this time is packed, and I didn't find a seat with a table in which to work, so I took a seat at the reading room and worked with the laptop on my legs. I actually feel it more comfortable to work like this now. It seems the body remembers certain positions are meant for mental work, and it does away with the fiddling and the shuffling so I can focus on the task at hand.
I abandoned the Bézier extension project. Entropy rotted it from the inside, and in the end I could not but admit that I was no longer enjoying what I was doing. "Not enjoying" is an euphemism here, because I'm aware that one of my problems is that I often not finish what I start, and I forced myself to continue working on it well beyond my tolerance, to the point where I didn't want to work anymore. And so I had a couple of weeks of confusion, trying to reboot myself without success, and I knew something had to be done. So, to clear my mind, I went on a 45 day walk on the Camino de Santiago. I walked some 1,000 kilometers, and I found my thoughts coming back to work, but at a higher level. Many conclusions were reached, and now it is time to put them to practice. There is no point in writing them down now, they surface with work itself.
After work I went to buy an avocado and a piece of bread, as I was standing in line absorbed in thought I suddenly came to a moment of presence. I saw the lady ahead of me: she was speaking on the phone hands free, and on the conveyor belt was two liters of milk, a package of cheap cheese, and a sausage. I thought "I can be happy whenever I choose it" and I put my attention in my heart, and strangely enough I felt happy. I left the supermarket with a smile on my face, and came back home for lunch and a nap.
{{Fighting wolverine}}
In the afternoon I worked a little bit more at home, again working on a chair with the laptop on my legs. I got sidetracked first by reading about Enrico Fermi, and was awed by his certainty predicting the result of his experiments, which carried on to his personal life. Then this took me to Oppenheimer, and was in awe of his powerful introspecting mind, "Now I become death, the destroyer of worlds". Few physicists dare to put their great intellect to work beyond their area of expertise.
Then this took me to the difference between Soviet and American rockets, and I came across an answer which I had often wondered: [Why is the Russian approach to the aerodynamics of their rockets different?](https://space.stackexchange.com/questions/7992/why-is-the-russian-approach-to-the-aerodynamics-of-their-rockets-different), and then I came across the bio of [Sergei Korolev](https://en.wikipedia.org/wiki/Sergei_Korolev), and I was also in awe of a great manager who was able to leave resentment behind (he lost all his teeth from scurvy working in the Gulag) and dedicate his life to his craft. Not really admiration but awe for him, for despite his health failing in incapacitating ways, he wouldn't stop working. Furthermore, his work wasn't known until after he died, because the Soviets had to conceal his identity so he wasn't a target of foreign intelligence. Even Cosmonauts didn't know his last name, they would call him "Chief Designer".
And this is why I prefer working from the library.
I woke up late, at 10:00am. I had trouble sleeping last night, simply from the siesta I had in the afternoon. {{Virtual Reality}}
I made it to the library 10 minutes before the time I arrived yesterday, at 10:50am. This was not my idea of "earlier" but the fact that I was able to quickly have breakfast and not lose much time made me notice it takes me longer than necessary to get prepared. So my goal is not be waking up earlier, it arriving to the library closer to the opening hour.
I worked during two hours, deeply concentrated, and it was a throughly enjoyable experience. I didn't have internet (the reason is irrelevant), so I instead of checking the API documentation online, I relied on Web Inspector's autocomplete to figure it out. I may try this out more to see if the lack of internet may be a boost to concentration.
I felt hungry and came back home for lunch, then had a brief nap, and got back to work from home. I noticed a certain layout problem which would be tremendously difficult to work through, and started seeking for less time consuming alternatives. I had an idea in mind, and after two hours of working I had it implemented, but it looked terrible! I was deflated and wondered if I should call it a day. But what I would do now? I would have to go to the gym, since I've been putting it off under the excuse that I'm busy at work.
I had a great workout and came back home cheerful. Why did I deflate from not achieving what I had in mind in just two hours? "The activity itself is the reward, don't attach to the results" I thought. And I remembered my mantra when I don't want to exercise: I will do it simply because it makes me feel better afterwards. This should be my mantra for work too: "I will focus because it makes me feel better afterwards". Losing oneself in any activity has that virtue.
I then went to a monthly event called "Encuentros con lo sutil" (_encounters with the subtle realm_) where they usually have conferences on _new agey_ topics, but this time there was a practical approach to the topic at hand: dance therapy. And so they made space in the auditorium for some 70 people to dance. It's been a year since I've done this kind of work, but it was exhilarating and was able to once again lose myself in work.
A strange day: I woke up early and was ready to go to the library at 9am, but I looked out the door and saw it was pouring rain. Then I felt immensely tired and I had a morning nap instead. I woke up and felt depressed. This happens often to me: I have *happiness hangovers* and a day of joy is often followed by a day of gloom. But is causes no distress, it is simply observed as a bad day for navigation. I still worked at home around two hours and completed some chores. Slept a lot.
If the pattern holds up, tomorrow my mood should stabilize.
Last night I slept around 12 hours. As I expected, my mood recovered, but I went out of bed quite late. I took my time, got in touch with old friends via email, prepared brunch + extra for later, showered, yada yada. At 3pm I hit the library.
I was deeply concentrated and I advanced a lot, though I noticed something: I don't use git because my method is haphazard. I don't work by features, instead I sketch possible paths in code, and if they turn out promising, then I detail them. However, today I lost an hour pursuing an exotic interaction. When I was done I saw it wouldn't work, so I rolled back my changes by hand, which took me an hour. "Ah! This is what solo git is for!" I thought.
Today I repeated the experiment of working without internet, and again I was able to focus deeply. After two hours it was necessary to consult the documentation and I sidetracked on hacker news whatsoever. I notice that information "pushed" on me (via a news site or aggregator) becomes a mish mash of information in my head. I recall one or two things by this time of the night. On the other hand, a couple of days ago I followed a rabbit hole regarding the atomic era, and that information is still fresh in my mind. Just now I blocked my news fix from my hostsfile to observe if this makes attention flow in the direction of curiosity.
While working I would take breaks by bringing up my gaze and staring into nothingness, feeling my breath. The inner sensations were cycling in intensity, like waves pulling back and then breaking. There seems to be more to inner perception than thoughts and feelings, if you are able to quiet both it is not emptiness what remains, it is inner movement.
Eventually I grew hungry, and today I wanted to hit the gym, so I went back home to finish eating what remained of brunch and I walked to the gym. My workout was uneventful and my mood didn't change, but I was almost glad because this means I won't be hungover tomorrow (if the pattern holds up).
I observe that I put a lot of attention towards my inner state, but in times of turbulence it is necessary. When stability is regained I will be able to put my attention elsewhere.
Today my focus was phenomenal. I woke up at around 10am, went to the library, and implemented the "feature driven development" method I had in mind, and I saw that it really worked. In comparison personal method feels more like... giving shape to a piece of mud. I found myself in the flow most of the time. Unfortunately, as it's Saturday, the library closes at 2:00, so I came back home for lunch.
I prepared a personal recipe of high-protein bolognese sauce in large quantities, so that I don't have to spend so much time cooking next week. Again, I was focused while cooking, and I got three meals prepared in the time I would have prepared one.
Then I went to bed to have a nap. I've been reading a book on lucid dreaming, and I had fresh in my mind the fact that you must continuously ask yourself "am I dreaming"? and so I tried to sleep with this mantra in my mind. But I was so focused I couldn't fall asleep, so I turned it into a meditation.
After a while I jumped out of bed, but this time I found resistance in coding. I was banging out too many features without design, just placing the necessary information on the screen without a plan. So I opened Sketch and begun designing. Again, deep focus. I can't pinpoint to anything special that allowed me this level of concentration, but I am grateful for it.
Last night I set up a private blog to post my dreams. I write down all my dreams, and sometimes I need to come back to them for some reason (an event in real life reminds me of it, or I dream with a person and I want to see what I have dreamed about that person before), so I was careful with the taxonomy so that I can filter dreams by person, place, topic and such. This blog will always be private, but perhaps in a couple of decades something might come out of it!
Today I woke up early, and arrived to the library before it even opened. I waited outside, it was cold, and I was sleepy. I was afraid that my state was not appropriate for work, but when I sat down it was just me and the code editor. A day like this I haven't had in years perhaps, to the point where nothing that happened in the day seems relevant except work.
I shall write about work then.
During the weekend I dove into Sketch and designed pieces that were missing of The Boolean Game (working name). I set myself to implement the design, and I saw how to slice things up in a modular way so that I can reuse components for other games. I banged out a lot of good quality code without any attachment.
I know better than to extrapolate this good experience to the next days, in fact, I know it not to be sustainable. _Beast Mode_ is what René Galindo calls it. Though I very much would like to have the power to summon Beast Mode, it's more akin to a divine gift that must be used wisely. Though it should be time to wind down I find no inclination to do it. Back to coding.
It's going good, the days are on repeat: wake up, have breakfast, go to the library, work until I am hungry, have lunch, take a nap, go back to the library and work until tired. I feel emotionally numb, autistic-like, and yesterday I attended a social event where I noticed my mind unable to unlatch from coding.
This comes at a temporary personal cost, I've developed a case of seborrheic dermatitis on my scalp, which usually comes under stress. But I don't feel stressed, just stiff in the mind, the body, and the soul. Throughout my career I've interacted with a variety of developers, and some identify with this _way of being_.
Others, however, have the quality of remaining social, soulful and flexible when they're not working. But put a code editor in front of them and they become systematic, analytic, and rigid. This is the highest virtue: being like water, taking the shape of the container.
After this sprint it will take me some time to unthaw. But I'm glad to understand what is going on.
I've heard from plenty of older people in tech that the capacity to concentrate during long periods of time is lost with age. I too believed this, but this week I could not help but notice going back into college levels of concentration (and also college level of habits).
What is interesting is that I've been seeking for years to recover this state by doing all the _right_ things: meditation, exercise, healthy eating, pacing my work, getting a good night's rest. But, it was by letting go of all healthy habits that I could focus at the level which is required of me at this time.
I know better than to sustain this pace indefinitely, and the fact that I worked on my habits before getting sucked in by this project means that I can cook myself healthy meals and go to bed at a proper time more or less on autopilot. Should I rely on the amounts of smokes, coffee, modafinil and junk food that I did in college, I'd drop dead in a month.
Lately I've been recalling thoughts I had when I had a creative block some five years ago. The event required me to widen my perspective and apply my creativity beyond my identity as a designer or developer. The experience was that of zooming out on a fractal: everything that I had learned about my profession could be applied to all areas of life, because my expertise of the fractal repeats within other domains of knowledge.
Now it feels like zooming back in to my domain of the fractal: the world becomes design and development. Everything else exceeds my field of view. But there's a crucial bit of knowledge now: I no longer identify with this part of the fractal, and I know I can zoom out when I'm done with this project.
Today I refactored a lot of code related to how the stages are loaded into the game. It is surprising how difficult is implementing flexibility in a system without delving into chaos. I have settled on 50 stages, and when it comes time to implement them, I see that I could do a thing slightly differently on each stage, and how these exceptions are handled are key to keeping a sane codebase.
Over the last few months I had been working on personal projects that have since gone stale, but surprisingly I find myself using a lot of the knowledge I gained trying (and failing) at this. I coded a surprisingly simple implementation to save game progress into localStorage in just a couple of minutes, but I understood how to do this only because of previous experience.
Another thing I explored in my stale projects was The Bézier Game in paper.js. I didn't get too far, but this time around I'm leveraging the library to it's full potential. And I see my understanding of the library comes from my experience with vector editors. Without this experience it would be tremendously difficult to understand what is going on.
I'm actually grateful and surprised to see my stale project come to life again in a different form, even without reusing any of the code. To the person mourning a failed project it's no consolation understanding that some knowledge was gained. The consolation is gained when the knowledge is put to good use.
Today is Saturday, I woke up early and went to the library to work. I implemented a dynamic color scheme on The Boolean Game, an idea of my stale projects that again, gained new life in this project. I was very pleased with the results. When I was done I came back home, had lunch and then a nap, I dreamed this:
{{Working on vacations}}
I then woke up and immediately worked on what happens when you complete a stage (the _success_ state). I thought it would be nice that each stage had a custom animation, and begun experimenting with what could be done in canvas. I came up with some animation effects which were eye-catching, but they had nothing to do with the purpose of the game. I felt I was unto something, and I think I have my next project after the Boolean project is completed. Here is a teaser:
<img alt="boolean.png" src="https://method.ac/writing/uploads/boolean.png" width="881" height="566" class="mt-image-none" style="" />
Today I woke up very early and sat down to meditate. The meditation was very welcome after a week of ceasing my meditation practice, and I thought I ought to do this regularly again, now that work has established itself on the top of my priorities. Then again I hadn't done any exercise in a week either, so I decided to go to the gym after a short session of work.
The "short session" turned into deep focus, and I could barely pry myself from the keyboard in order to go to the gym before it closed (at 2:30pm, because it's Sunday). After the gym I went to a library which I know to be open on Sundays and found myself less focused because I was tired. I take note that exercise should be the last thing to do in the day.
On my way back home I passed in front of the cathedral, and went inside for a meditation, but I found mass taking place. I stayed for mass while practicing presence, and I enjoyed the experience. The priest said the archbishop is giving mass tomorrow (Christmas Eve) at midnight, I will probably go. I'm not religious or consider myself Catholic, but contemplative practice has lead me to willingly participate in all devotional ceremonies.
After mass I walked in front of the Royal Palace, and there was a dude leading a group of small children in a dancing choreography. The dance was actually good and plenty of fun, it never occurred to me that something like that was actually genius: a street performer's job is to entertain his public, and by getting children to participate (and have fun doing it) the parents are captive to the performer. "Ah, that how it's done, it's better to help others shine rather than trying to shine yourself", I thought.
Yesterday was Christmas, and I spent the day leisurely creating stages. I didn't write a work log, because it didn't feel like work, and I didn't get much done anyways. I encountered an icon that made me reconsider the way in which the stages worked, but this would require me to rewrite some parts of the application, and the stages would take even more time to create. I was torn.
But then I had an idea: since I suffer so much creating stages by hand, what if I created a stage editor? Most of the pain comes from editing json by hand. I found great inner conflict in this idea: this could push the finish line beyond my energies. A risky move that could reap great rewards.
I went to bed with this idea in mind, and as I was slipping into sleep I could see that my "early sleep hallucinations" had changed: for the fast few weeks, as I was dozing off, I would hear voices, more like mumbled conversations. But last night I saw imagery: a staircase going down to an ocean. It was like a holograph that gained more realism as I dozed off deeper, and it dispersed like smoke when the verbal mind would intervene.
Suddenly I had a very clear idea of how the game was to be structured, mechanics and all. I opened my laptop in bed and in five minutes sketched what came to mind, then I went to sleep.
In the morning I woke up and saw that indeed this was the correct direction, but I was still not convinced this was a good idea: the downside of the creative mind is that it can't keep still and commit to an idea. So I decided to spend the day working in this direction, and make a decision by the end of the day.
I went to the library and felt the right way of going forward was to start a new repo and begin importing code as needed. I begun with task with the outmost resistance, something in me was protesting repeating work, and I could barely get things started before lunchtime.
I had lunch with former Method of Action partner María Munuera, we got up to date with each other and then I went back to the library. This time I had no internet access, and I worked through resistance, but soon was breezing through the code in deep focus. I felt this new version materialize, its integrity transcending all manifestations: the design was correct, the code was correct, the interactions were correct, and the work was correct. I was happy to have found the clear indication that this was the right path.
Even though the day is supposed to be over, I'm too excited to let go, so I will get back to work.
I got to the same state I had with the previous incarnation, and I'm very satisfied with the result. I structured things so that it would work in vertical orientation, opening the possibility not only for tablets, but for all mobile devices.
It didn't go without a hitch, I had changed the design and I lost framerate on the dragging of objects, a couple of tests blamed CSS dropshadows for the loss, so I put them on canvas and it went smooth as butter. I came back home very excited and I wanted to hit the gym, and on the way there I was thinking about how difficult it had been for me to find any sort of personal satisfaction in the past few years.
There's been a couple of sources that I can recall: walking the camino, hitting personal development milestones, and some personal relationships. And I had thought I was beyond finding satisfaction in work, but when I compare the experience it's up there. It's wonderful finding fulfillment in work again.
But I also notice myself working from a very different place. It is not "I want this project to be very successful" as I thought in the past, but "I am materializing this idea from the platonic world" and that makes the ego take the back seat. When features come up I'm not asking "will this look cool?" (i.e. will people think highly of me?), but "is it useful?", and that makes the project take shape by its own. I think this was the missing ingredient from my previous efforts. Work without attachment.
I worked mostly on the stage editor, and came out with a crude version which works. Knowing that this is not publicly facing, I did not concern myself with good implementation or design, so I was as messy as I pleased. This turned out to be not a very good idea, for I soon found myself swamped in spaghetti code, and I noticed a sharp decrease in working focus and pleasure..
At lunch time I came back home, and I was opening the door a woman approached me and said something along the lines of "I'm very embarrassed about this but..." and she began sobbing. I immediately knew that she was going to ask for money, so I said "Oh sorry, we're on the same page, I left my job months ago and..." she turned away, cutting me off without letting me finish the sentence. I was dazed, but then thought "this is a good way of figuring out if somebody truly needs help or is just putting up a show".
After lunch I dragged my feet to the library, not wanting to face the unpleasant code I had just programmed, but a part of the editor required me to face a challenge I've been putting off: resizing the window made things fall apart. Since canvas doesn't have layout niceties I'd have to redraw and resize the stage entirely, and this was a chore I was avoiding, but I'd rather do this than dive back into my mess.
Surprisingly it went smoothly. With the refactor in place, I had anticipated some triggers which would allow me to layout shapes properly, and pretty soon I had a had a robust layout adapting to the size of the window. Then, as I only had an hour left, I put my time on visual details, and I recovered the sense of pleasure in work.
I think tomorrow, when my energies are recovered, I will be able to face that steaming pile of editor code.
This morning I went to the library with my mind set on completing the stage editor, I sat down, and noticed that in order to get it done, I would need to commit to certain data structures and behaviors beforehand, otherwise I'd double my work, because any change that takes place in the game needs to be reflected on the game editor. So I set myself to this task.
I lost myself in flowing work all the morning, and since it is Saturday the library closes early, so I went shopping for groceries to replenish for the week. Came back home, had lunch, a nap, and then begun working again, this time in the small details: hovers, shadow, color tweaking and such. I throughly enjoyed the polishing activity, though at this stage it's probably not the best use of my time.
I picked up drawing some years ago, and I noticed I dislike sketching the big picture and getting to detail progressively, I want to get into detailing too early, and this reflects in the way I work too. This leads to loss of work. As in sketching, you often miss the proportions or the perspective and need to start over.
The upside is that, when the visuals come together, there is an unmistakable sense of pleasure which motivates to march on. I had been eyeing dribbble to get a sense of what visual designers are up to these days: soft shadows, saturated colors against stark white and such. I had implemented a design of this kind and I was OK with it, but in my coding mishaps I accidentally removed all shadows, and the stark white became a creamy color. The accident caused sensory pleasure and at the same time reduced complexity, it was aesthetic both to mind and eye. After some polishing I'm actually excited about the visual direction.
But it's not time to celebrate yet, the frosting does not make the cake.
Today is Sunday, and the closest library was closed. The only library that was open is a 40 minute walk, so I tried working from home without success. I would sit down to work but I was soon distracted. I went outside and saw that the sky was blue, it was warm for december, and the sun was shining, so I decided to walk to the library.
Being Sunday the streets were full of people, crisscrossing among strolling people I stumbled upon something soft. I looked down and I saw that I had accidentally kicked a young child. I asked her if she was OK and apologized, I was expecting her to cry becuase I felt my stumble was forceful, but she just hid behind the legs of her mom. Then I heard the parents tell me not to worry and I apologized to them profusely.
As I continued walking I felt some relief: in my deep focus I was worrying that my emotional state had become stunted. But I was concerned, and the concern came out naturally. It's mostly that I haven't been exposed to emotional content in the last few weeks.
At the library I didn't have one of my usual flowing days, but I made good progress. I finally addressed the stage editor, but this time instead of focusing on a graphical user interface, I put a command line interface that allows me to use the editor from Web Inspector's console. I was satisfied with the result.
New Year's eve and I spent the entire day working, and I actually enjoyed it. These will be memorable holidays for sure. The date put me in an introspective mood. I thought: there is no point in describing my work day, what ought to be done is the stoic excercise of reflecting upon what went good and what could have gone better.
#### The good
I could work from home: how? I had no other option so I wasn't torn between "I would focus better at the library" and "I want to stay home". It seems the trick is in commitment, though the library is still the superior workplace.
Following up on signs: some days ago, while I was waiting for Maria for lunch, I entered a bookstore and came upon a book called "memorias de un caminante", my curiosity was drawn to it and though quite esoteric and mystic in content, I found myself understanding it perfectly. But I wasn't carrying a single euro (and that was it's cost), I thought "if I care about this book enough, I will come back for it".
Getting some sun: as I came back home, book in hand, I saw that the sun was shining and it was quite warm outside, so I went to the nearest bench to read a bit. Soon after I was feeling warm, so I took off my jacket. The reading was engrossing and again I had to take of my sweater. Soon I stripped of my shirt and I was sunbathing on 31st of december.
#### Could be better
The focus: I'm not sure why, but I was making more syntax mistakes than usual. I lost track of what I was doing more than usual. I opened new routes of work without having finished other ones. What can I control of this? When I worked in git branches this helped. Let us experience it again: **action: work in feature branches".
The social aspect: I worked though people cheering to the New Year. For a couple of seconds I thought there was a football match, but then I remembered the day and looked at the clock: 12pm. I just kept working. I know that is what I'm supposed to be doing at this time, but when I'm done I'll have to work equally hard on the social aspect of my life. **action: reconnect when finished".
There will be a lot of documentation work regarding the virtuegraph, and after some thought I've concluded that the best moment to write the documentation is as _I'm using it_. So I will change the format of my work logs so that I can use them as documentation when the product is released.
***
!!!! Getting Started with the virtuegraph
Most people have a long list of wishes, resolutions, yearnings, goals and aspirations. Should the average person list everything that they want to accomplish during their lifetime, and compare it to the things they have actually accomplished, it would become very clear that the rhythm of accomplishment is insufficient for their ambitions. Therefore, we must **combat dispersion and put our energies into a small subset of our will**. What we choose for focusing our energies is not necessarily what is most important, but it's what is most important for _the cycle_.
!!!! The cycle
A cycle is a period of time in which you wish to accomplish something. For example, I know that I wish to finish the Bézier Game within 30 work days. Now, the amount of days is not set in stone, it is simply an estimation to which you can add or remove days. It is best to begin having a flexible schedule. Accurate estimation is not one of the goals, through practice you will learn to become more accurate.
!!!! Choosing what is most important for a cycle
Though, like plants, we like to extend multiple branches at the same time in order to capture sunlight, in practice our self-image rarely matches reality. Though certainly I've met people who are tremendously effective, and could use the virtuegraph right off the bat, I think it's best to handle the task with the humility of a seedling.
If you had just one leaf to capture sunlight, what would that leaf be? In my case it's the Bézier Game, the reason why this is important for me is irrelevant to the reader, as long as you can set a limit on the duration of a goal, and you find enough personal relevance, any goal will do.
But, a leaf has a trunk from which more leaves can appear! What is the trunk of the Bézier Game? It is work. If the Bézier Game had siblings, who would they be? Well, I need to outline this out:
* Work
* Bezier Game
* Virtuegraph
* Notebits
* Airbnb
* Goethe
* Work routes
Though clearly "Work" can have siblings too ("Exercise" for example), it is important to resist adding more branches for the time being. We need to make sure this branch is healthy before dispersing the energy into a new branch.
!!!! Registering activity
_I will stub this paragraph, as a table is not the correct way to register activity, but I need to do so in order to advance_
<table>
<tr><th>Project</th><th>Duration/Intensity</th><th>Description</th></tr>
<tr><td>Bézier Game</td><td>105min/0.5</td><td>Repositioned start and endpoints upon resize and upon undo/redo</td></tr>
<tr><td>Virtuegraph</td><td>75min/0.7</td><td>Wrote documentation</td></tr>
<tr><td>Notebits</td><td>null/null</td><td></td></tr>
<tr><td>Airbnb</td><td>null/null</td><td></td></tr>
<tr><td>Goethe</td><td>40min/0.3</td><td>Underlined Conversations with Goethe</td></tr>
<tr><td>Work routes</td><td>null/null</td><td></td></tr>
</table>
***
I will end the work day here, as it's Sunday and I have a social engagement.
#### Prelude to the workday
Flow set for five minutes. I receive visitors to the airbnb today, Sunday evening. I decided to make it a workday, and to begin searching for the most adequate default working route, because I have spent the last three weeks exploring libraries and study halls within reasonable biking distance between my home and the workplace, and though it has been interesting, I also see it requires a lot of planning.
In an ideal situation, I would have the nearest library and study hall if I need to stick close home, and then have a good default work route that I don't have to plan to complete the workday. When I grow tired of this, or feel in exploratory mode, I can visit new workplaces. I have a map with all the study halls and libraries in Madrid, and I have worked in perhaps 30% of them.
I've begun the work route by coming to the nearest park and having a Wim Hoff breathing session. I could only go breathless for a ridiculously brief time, 50 seconds. But the positive effects are there, and when I completed the session I was greeted by a beautiful scene: a huge, brown dog came running towards two tiny pomerianian dogs to play. The small dogs were aggressive, so the big brown dog ran off with the tiny dogs on its tail. The smaller dogs were truly trying to "hunt" the large dog, but the large dog made a game of it, running in circles with that interspecies expression of joy on its face, outrunning the two tiny rabid dogs.
I have the sensation that scenes happen all the time, but I lack the presence required to be aware of them.
#### Work session 1 (55min)
After the breathing session I decided to come to the pool through a very different but shorter route which I haven't done before, but without the help of the map. Lately I've been exploring into geographical orientation, and when you prescind of Google Maps, interesting things happen. You begin noticing the position of the sun in relation to the time of the day as an orientation device, changes in the orientation of the streets let you know you've reached a new neighborhood (at least in Madrid), and asking people on the street if you're going in the right direction reveals you're not the only one lost (or ignorant of the neighborhood). In the end I did not shorten the commute, quite the opposite, but it was worth the exploration.
The pool has too many people not to be distracting, if it were not Sunday would be more calm at this time of the day. I will repeat the same schedule tomorrow (Monday) to try it out.
I worked small things of the Bézier Game, which I should list here:
* The stage doesn't disappear when you resize the window
* If you keep on holding shift after completing a stage segment, it doesn't insist on constraining the axis according to the last node.
* The stage no longer adds a node if you do so outside the reference path
* The cursor changes when you hover over the reference path, so that you know you'll be adding a node if you press there.
I'm still considering my options regarding the bouncy animation that happens when you attempt to add a node which does not match the reference path. I would like for it to bounce off at the point where they stop overlapping. But this is detail, perhaps I should continue working on structure. For now, I'll stretch in the sun, and then see if I can finally swim the length of the pool underwater. Then I will take work to the library.
#### Work session 2 (1h)
I'm short on time, so I set Focus to one minute of stream of thought. After the pool I came to "La Casa Encendida" which has a private library open to the public. I worked on Project Arete on a feature which I need for next week. I dislike writing about work I cannot share, because I cannot express what I'm doing. Until it is unveiled, I shall simply annotate [Project Arete, classified].
So, [Project Arete, classified]. Now let's run to get to the airbnb on time!
#### Work session 3 (1h)
I came to the airbnb apartment from home, and I noticed I wasn't carrying the keys. I was tight on time, so I grabbed a Cabify to and from Home to pick up the keys. Fortunately, the guests arrived on the later side of the time I was expecting them, so I was able to finish cleaning up just in time. They were a lovely French couple.
I then met up with René to discuss future possibilities for Notebits Flow, but this goes beyond the work session.
#### Afterword
Day was very good, ended late but glad to be paying the late start today. Note to self: make sure we are carrying the tools necessary to perform the next work session.
I shall start using Notebits Flow in the expected manner, which is to set a constraint (500 words) and a goal (15 minutes) with somewhat cogent text, for it is easier to write non-sense than it is to make sense (most of the time!).
Today I woke up hopeful. I was receiving guests at noon at the airbnb apartment, so I had little margin for anything. In terms of the work log, I would have had one work session of 1.5h. The past guests had left the windows open, so the apartment was more dusty than usual and required more cleaning, so I had little margin to finish.
In the end I had just enough time, and I received a guy in his early twenties with his parents. From the context I understood the young man lived in Madrid, and his parents were visiting. Though why his parents would come to Madrid in August is beyond my comprehension (most people go _out_ of Madrid).
I went back home at lunch time, and after lunch I debated if I should work, for it is Saturday. I felt more like spending the day at the pool, so I found the compromise: I'd take Eckermann's notes on Goethe and I would annotate the book so I could write an article later. This I did, and I spent around two hours doing it.
Knowing it was Saturday and summer, I knew there would be an event tonight, turns out there was a good band at a park in between the pool and my house! So I came here. I found the outdoor amphiteather packed, but I wasn't really interested in _seeing the band_ as much as hearing it. And so I found a nice grassy secluded spot, and I'm writing this as the concert is taking place.
I'm happy with the direction this is going, the last few days have been tough, mostly out of frustration about things not going the direction where I wanted them to go, but there is something faulty about this reasoning. Now I feel as if I had taken apart a lego set with great ambitions of extensions, and now I'll have to put it back together with revised ambitions. It's really simple, I had thought about abandoning the work done on the Bézier Game, but another force fought back: you should finish everything you do. Throwing away work is the same as throwing away money, or food, time, or perfectly good clothes. It's wasteful. But putting in more time is also senseless, forcing myself to do things I do not enjoy is a sure way of gaining a distaste for work.
It seems a lot of wisdom is required to work for oneself, one can be the most tyrannical or the softest balled boss, finding the elusive middle ground is the art. And by the way, I hate the term "middle ground", is implies that the matter is simply not being so hard or so soft. If it only were that easy, the question is of being hard when circumstances require you to be hard, and to be soft when softness is required. I shall aim to be like water, cutting under pressure and flowing in relaxation.
Mission accomplished, 500 words in under 15 minutes. Next time I shall aim for 750 words in 20 minutes.
I spent the day trying to implement the sponsored stages, and I found great resistance in doing so. There seems to be a friction between ideals and the urgent task of making some money. The inner conflict left me quite depleted, and when I met up with René at the gym, the conversation naturally turned towards monetization and then money in general.
It's a really strange feeling: I honestly understand the motivation and the compatibility between creative endeavors and money making. I understand there is a transaction of value, and that it's never wrong to take money from someone, provided that you provide them with equal value. But I seem to resent that the need for money is what is directing my actions.
A memory I have from my early internet days was a design blog which I admired. The author had become hooked to a _telenovela_ and wrote a blog post about it. Suddenly, his blog became flooded with Google traffic, which was really positive for his AdSense income. Soon one out of every three posts was about _telenovelas_. The need for money subtly or evidently has an effect on our creative output.
It would seem the solution to this conundrum is that the transaction of value happens between the author and the end-user. Things get messy when the value is sold to a third party (Facebook selling users to advertisers, or writers selling to publishing houses, for example).
What am I selling then? I'm not selling users, for sure. I'm not selling my skills, that can only happen in commissioned work. René said it seems to be a rare chance where the advertising doesn't get in the way, and the user gives it attention willingly. I think I'm selling brand recognition in a pleasant package.
Hmmm... that's not a bad aim. I think the resistance has to do (at least in part) with the uncertainty over how much control to give a sponsor. The guiding principle seems to be: if it gets in the way of the user, then it's a no go. We have enough annoying advertising on the internet, let's not litter anymore.
Whew. I feel a bit of relief. With this in mind, I'll create the landing page for sponsors sometime soon. I was dreading it, nothing good could come out of the feeling that I'm selling something out of need rather than conviction that it's good value both for the user and the sponsor.
The first day of 2019. I probably put around ten hours of work today. I was deeply focused, though in the last two hours my performance has diminished, so I decided to call it a day after finishing a feature. I used to think I no longer had gas in the tank to pull off something like this, but I had forgotten that when you get swallowed by a creative project the activity itself is renewing. There's no possibility of burn-out because work is not stress inducing, but the body takes a beating from sitting long hours and sub-par nutrition.
I went out to take the sun with my book, but I found myself unable to put my mind away from work, so instead of reading I brought out the computer and worked a while in the sun. The sun was pleasant, but I needed better lighting conditions to truly focus. Perhaps tomorrow I'll set aside some chores that don't require that much attention so that I can do them under sunlight.
The material world and the inner world have become distant, it's a familiar state of being, but in former times I used to identify with it. I thought I didn't enjoy nature much, and I used to think there was nothing more to the self than thoughts. In this state this is indeed true, but it is simply a state that will pass when my conditions change. It's necessary and welcome at this time. The concept of leisure repels me in this state, I noticed just now.
Yesterday I wrote that I would do the stoic exercise of reviewing the day, but the day is a blur of work. At various times I felt myself sidetracking, but when I came back to do what I had proposed myself, I discovered my intuitions were pointing in the right direction, before doing this I had to do that. So, instead of doing feature driven development I'll do intuition driven development. I take note that this methodology only works when I'm in the proper state.
{{Milking less than the milkman}}
I the morning I hurried to the library, only to find that it was packed and there was not a single space available to work, so I came back home and lost myself in a flurry of activity. After lunch I went outside with a coffee and sat in the sun. I meditated for a bit, and I noticed my thoughts drifting towards the challenges I'm having with the code.
How interesting it is to notice one's thoughts. In former times these thoughts would have been of inadequacy, but I had more control over them. This time around the mind refuses to unlatch from work. Urges that I'm wasting my time sitting, back to breath, how am I going to tackle this problem? back to breath, what am I going to do for the release? back to breath.
I then went to the library and worked until exhaustion. This is the first time in this period that I've felt it throughly, my body was aching and I had a slight headache. I called it a day and came back home.
Edit: and then I put four more hours. I couldn't help it.
I opened my eyes and reached for the phone. 7:30. I'd been turning and tossing for the past hour, but I couldn't get past the grogginess to pull myself out of bed. My entire body was sore, as if I had worked out, but I've been avoiding the gym lately.
I don't remember what information junk I had for breakfast, but surely it was the equivalent of cheerios.
--"Is this any better than Instagram?" I thought,
--"no, this is worse".
So I unglued myself of the covers and prepared for the day.
--"How funny, this feels exactly as when I had a day job: I don't really want to be doing this, but by now it has become a habit: breakfast, shower, the library. I'm not sure if I should be proud or ashamed of myself", I thought.
I was ready with 15 minutes to spare, and I saw the black little notebook where I used to journal. "I might as well practice my handwriting", I thought. I wrote a pair of pages and then left for the library.
--"Something is different, I sense it", I thought as I walked. "My inner voice is very loud".
The gypsy lady who sleeps on the street said good morning to me, and I didn't answer, or even notice, I realised it some meters ahead. I always answer greetings. Something is surely amiss today.
I sat down and put myself to work. Something inside me was protesting, and I found myself staring blankly at the screen. I forgot what I was doing several times. I didn't have internet, otherwise I would have mindlessly browsed during the morning.
So many days in deep focus, and suddenly it's gone! But I can't even pinpoint to a reason! Yes, I was exhausted yesterday, but this feels like being thrown back into my former state without notice! I will never finish this project if this voice in my head is speaking all the time.
So I went outside, and found a bench in the sun. I closed my eyes, and focused on the breath. My eyes were darting from one side to the other, making saccadic movements. Can't stop them for more than a couple of seconds. Where is my mind going? It's a chorus of voices, indistinct chattering. I try several times holding my eyes static, without success. "This is interesting" I thought, "now it's more curiosity than frustration".
This is the state in which I've been for the past five years, but the sudden regression makes the difference quite striking. But I am not the state, I don't need to shake myself out of this, as I would have tried to do in the past, this is how I woke up today and I welcome the loud voice. But perhaps a nap might reset the state.
I came home and laid down. The voice in the head draws energies from the body, tensing it up, so it was difficult to relax. The most minimum noise was startling me. Usually I'm a deep sleeper. I focused on the breath again "oh, it's easier to accomplish laying down in a dark room... shut up! no you shut up!" and this went on for a couple of minutes. I surfed the line between sleeping and waking states for some time, and I could clearly how the voice in the head was drawing energies not only from the body, but from other areas of the mind. I would begin hallucinating visuals and they would cease when the voice narrated them.
{{Flooded emergency exit}}
After lunch I went back to the library to code, this time with a little more patience and compassion, taking on easier tasks, and things went better. I had to take a dump, and I saw a book of Roberto Bolaño on the bookshelf, "Oh, I've been meaning to read him since a long time ago" and so I put it under my arm, hoping that the librarians wouldn't notice me smuggling it into the bathroom. It's been years perhaps since I've read non-fiction, and I recognized the narrator as the same voice in my head. "Ah, perhaps this voice needs a creative outlet" I thought. "Ok, I'll let you write today's work log" and with this it grew quiet, and I was able to enjoy a couple of hours of uninterrupted work.
I opened my eyes early in the morning, it had no idea about the time, but I felt like I had rested long enough, so instead of reaching out for the phone this time I sat on the bed to meditate.
Something had changed, the voice was a little quieter, and ceasing the mind brought pleasure. The body begun speaking, my nerves reaching out all the way to the tip of my toes. I felt refreshed and got out of bed. It was 6:30am. I wasn't hungry or sleepy, so I cracked open the laptop. The code editor was still there, so I naturally begun filling things which were missing. When I took notice of the time again, it was time to shower and pack up for the library.
Something changed at work too, I was focused but not tunnel-vision focus as I had been in the last weeks. Each kind of focus has it's pros and cons, it seems, because without tunnel-vision focus it would have been impossible to resolve some tough geometry and layout problems, and without a wider but softer global focus it is impossible to create a good product, because the mind is directing all the attention to a single spot.
A guy sat in front of me, and he wouldn't stop chatting on whatsapp with the volume turned up. A couple of glares from the people at the table didn't dissuade him, so I asked if he could turn off the volume. I was surprised my request didn't come out with a hint of resentment, as annoyance was building up. He showed me that the volume didn't work, and I showed him how to mute iOS devices and I got back to work. Or so I thought.
My lack of tunnel vision meant being distracted by the fellow's fiddling the entire morning. I couldn't help but notice he didn't advance one page of the textbook he was studying. Finally, after some time, I was able to get into flow: "wow, what happened?" I thought, then the guy came back from a break. _Ah, distracted guy wasn't here_. I thought about going back home, but decided it would be instructive trying to maintain flow with him in front. I would have changed seats of course, but this library is always packed.
Like many others, I've pondered if I have some sort of ADD. It's tremendously difficult to sustain attention on something that's boring. But saying "something is boring" is the wrong way of seeing it, it's simply that the mind doesn't want to latch on a person, conversation, task or idea. The best that one can do is set up things so that focus becomes more likely, and the source of distraction may be inside oneself as well as in the outside world.
It seems to apply not only to attention, but to emotional response: objects, people or ideas are not annoying, pleasant, funny or disgusting, they happen to arise these emotions in us. But if enough social consensus is reached, it is fine to apply these attributes to them. Few would argue that vomit is not disgusting, for example.
And so I came back home, meditated for a while, went to the supermarket, and saw that the sun was setting when I came back. I prepared myself a tea to observe the sunset over Casa de Campo. As the last rays of the sun were drowning in the horizon a family stood right behind me and a man said:
--"look, the sunset is beautiful!"
--"that sunset is shit, dad", a teenaged voice responded.
--"That's because you just missed it, the sun waits for those who appreciate it."
I smiled. Truth indeed.
Today I received excellent news: a friend will borrow his apartment while he's out of the country. This extends my stay in Spain for some time (God willing), and sets the stage for nursing my project upon release. I was fearing a premature departure, as moving from a country is a complicated proposition, and recently released projects require careful attention.
This, and a focused day of work tying loose ends presented a product which I can already taste. I left the study hall elated and I walked four blocks in the opposite direction before I noticed I didn't know where I was. Having the time constraint removed, ideas begun pouring out: "If add this feature it would really improve the gameplay!", and I had to stop myself from projecting too far away.
I came back home and had a nap. After the excitement calmed down I begun adding stages, seeing how they could be improved. I identified some mechanics which would be useful, and decided to dedicate the day tomorrow towards exploring their feasibility. Should they prove quick wins I will implement them, otherwise they be axed. My intention is to have a good working demo by the end of the week.
An immense sense of gratitude followed the excitement, I've lucked out in so many ways in this period it feels the universe is conspiring towards success. This is a big wave that has swelled, and it's up to me to surf it wisely.
I went to bed late yesterday, I felt sleepy but I wasn't able to get past the REM phase during at least an hour. I would close my eyes and have imagery emerge naturally. _Perhaps I can control the imagery_ I thought, and sure enough, not only images emerged, but images in motion. I was quite delighted and begun imagining animations that I have to implement for the game. Animation tends to stump me, I have to experiment a lot to get attractive solutions, but in this state I was able to project images in motion. This is icing on the cake, so I will leave it for last and to confirm the validity of REM imagination.
In the morning I went to the study hall and implemented the features that I had proposed to myself yesterday. As I had a series of tasks to do on the codebase, I missed my notebook to jot down the steps, but then I thought: _how strange, this is the first time I miss my notebook_. In beast mode the tasks find you.
As I was walking back home for lunch I lamented the loss of my focusing super powers. I had lunch, a nap, and as I was walking back to the study hall it stroke me: this is simply a different state that brings a new approach into the project. If I were hyper-focused all the time I wouldn't be able to see different facets of the problem I'm trying to solve. The mind is still engaged, but it's seeing the forest and not the trees.
With this in mind I was able to use my energies better. I also saw a lot of the code with a different perspective: beast mode code is also trees and not forest, so I took some time to refactor the shortcuts I had taken. At the end of the day I had gone further than I had intended, the codebase was in better shape, and I implemented a pair of features which will vastly improve the gameplay.
Beast mode is over, but what is this new state? I'll keep on working to find out.
Edit: I just noticed I had written 2018 on all my 2019 entries until today (Jan 7). Corrected. I guess the new state is already manifesting itself.
A strange day full of dualities. I woke up from a dream early in the morning:
{{An urgent about me page}}
Though I now see the dream with humor, I was horrified when I woke up because I knew what it meant: this is no new state, the ego is in charge again. I know that challenging its command only reaffirms his position, and inner violence leads to great loss. I sat down on the bed to meditate, and despite the state of inner turmoil I sensed I was meant to nurture the true self so that the ego would take its proper place in the whole affair.
I left home and headed for a library that opened earlier in the morning. The sun was just coming out, and the cold of the morning was piercing. I felt like a character of a Russian novel tormented by the misgivings of my own mind. The inner voice was louder than ever and impossible to shut up.
Work provided some relief, though I was trying to accomplish things for which I simply didn't have enough presence of mind. Frustrated, I decided to create some stages which require less attention. I was trying to find a good example for the _difference_ boolean operation, and I was stumped because this operation is seldom used, it's easier to predict _subtraction_. If I have two groups where there's overlap, say, doctors and runners, there's four possibilities of combination:
# All doctors and all runners (Union)
# Doctors who are not runners (Subtract)
# Doctors who are runners (Intersect)
# Doctors who are not runners and runners who are not doctors (Difference)
In this way, two subtractions create the same result as one difference. But there's a couple of cases where _difference_ is godsend. In a flash of inspiration the perfect example came: the taijitu! (the yin-yang symbol in common parlance). I made if from scratch in Sketch, and then implemented it on the game. I put all the shapes on the stage and hit the _difference_ button: boom, the taijitu appeared in a single operation! I was relieved and hit the gym soon later.
Exercise and engaged work put my mind in a much better place, I walked back home and difference was astounding, the ego had receded to a distant voice which I could easily quiet by focusing on the breath.
I had lunch and the had a nap. I dreamed again, this time that I working and I visited paper.js's website, and there was an announcement for a new project called "textstyler", and it was decorated with beautiful mandalas, and I was looking closely to try to understand how they had been built.
Then went back to the library and put in three hours of deep concentration, just as in my best days. I came back home happy, worked here more until I got sleepy, and was about to go to bed without writing today's log simply because I forgot about it. A sure sign that the ego is no longer on the driver's seat.
At nap-time I had an amusing dream:
{{Javier's sound advice}}
After my nap I head to the library to work, but I ended my session early because I had a horrible realization: the way I had set up the entire interaction wouldn't work on phones. I could see a solution which would work, and vastly simplify the code, but it would mean rewriting a lot of code. I felt a cold sweat, closed my computer, and head home. It was difficult not feeling defeated, but I could not help but begin implementing it. It will work and it's the best thing in the long run, but I wish I could have foreseen this before. A lesson well learned. In the back of my mind I know all the things that I explored will come back in a different form, but at this moment I'm fed up. I'm hoping some sleep will restore my enthusiasm.
This morning I woke up in a better mood. I was still dreading the work ahead, but with renewed energies it didn't seem so far away. I sat down to meditate, and my thoughts kept coming back to the game, but this time it wasn't a doubting voice, it was visual imagery solving the problems ahead, so it let imagination express itself, only coming back to the breath when imagination turned verbal.
This is something new to me, I've always thought I had no capacity for projection in interaction, I only end up with acceptable interactions because I fiddle endlessly in code. But what I saw was good, and though I couldn't project too far away in the interactions, it showed me the blindspots and I opened some apps to gain insight on how to resolve them.
With this in mind I went to the library early in the morning. As I was walking I was thinking _if I were my boss I would have fired my ass by now_, upon further reflection I thought _no, I'd quit, this boss doesn't plan anything_, and finally I chuckled at the realization: _It's the boss whom I'll fire into oblivion_.
I had solid work done today, and after implementing what I had in mind I can see this is the right solution. Not only it feels pleasant, it cleans up the codebase and it opens new possibilities for growing the product in the future. As I delete dead code I still greive all the hours I put into it, but then I use the game and it's obvious that I came to the right solution by speding so much time doing it.
My only concern is burning out before I have an MVP. It's been a month since I've taken a day off, working through Christmas and New Year's Eve as if they were any other day. I've done two major reworks on the codebase, a third one and it would be game over. Fortunately my boss is being replaced by someone who insists on taking breaks and meditates upon the implications of the interactions I'm coding.
He's starting tonight, and his first task is to define what is needed for the earliest possible MVP that will serve as a private beta for friends and family.
Last night I made a list of tasks that I needed to get done in order to have an MVP ready, and when I got to the library in the morning to do them I found myself unfocused. The tasks were menial but necessary: toggle the menu, fix the colors, that sort of things. I meditated a bit and came to the conclusion that this inner division of boss vs worker is spawning virtual instances which have differing goals and thus enter into conflict with each other.
I went back to the library, this time without a todo list, and was able to focus better. This project will require a lot of _wu wei_ and tackling things by intuition rather than reason. At this moment I find myself tired, which is normal. I won't even plan on working or not working more today or during the weekend. Allow for the moment to decide what it needs.
I had proposed not working during the weekend, but as I woke up I grabbed the computer and began coding something peripheral to the game. I got deeply engrossed and didn't cease working all day. I'm too tired to describe what was done, but I am happy with the result. I will go to bed now.
Edit next day: I shall describe what was done--one of my stale projects was a dynamic color scheme generator. As I wanted to plug this in to the game I spent the day on this, completely free from it's integration with the game. I worked until the point of exhaustion. Today I woke up and liked what I saw, a lot. It integrated seamlessly. Then I looked at the code: 100 lines! And I started with 300 from the stale project. A reminder that productivity has many facets.
Yesterday is the first day I've taken off in a month. But then I didn't sleep most of the night, because today I was moving to a new house and I had to pack and clean up before the René arrived. Since I was moving to the new place until the evening, I was homeless from the morning to the evening, so I had to work through my sleep deficit.
The last time I've done something like this was in in college, so it was throughly interesting to observe. I chose tasks that are less demanding to account for my sleep deficit, even then I would find myself staring at the screen mindlessly. I usually have the presence to know what I'm thinking when I catch myself doing this, but this time it was a blackbox.
Certainly my mind was complaining _jeez I'm tired_, but this time I could not _see myself tired_, I was tiredness itself! So there's no observer who can assess the state. In fact, I find great difficulty writing these things down, I re-read what I write and I don't know if I don't understand it because I don't make sense, or because I'm too tired to understand what I've just written. Probably both. I should call it a day, but I will allow for my fingers to continue writing and I shall make no effort to understand what I've just wrote.
I created a couple of stages and saw that, again, my solution can't accommodate for all possibilities, and I played in my mind with an idea of how to solve it, but in this state the creative mind is not to be trusted. It's not that the idea was wrong, but that the mind is not sharp enough to see the constraints of the problem. Actually, I'll recant that and write: the creative mind can be trusted in a state of sleeplessness, but wether the solution is practical or wise, I don't know.
Oh dear, I see my thoughts mangle in my head before my fingers can write them down. This is losing a whole lot of capacity for attention and awareness. I'll go to bed now.
Today was the first day staying at my new place. In the morning I bid farewell to my friends who are leaving for Mexico during two months and generously left their home for me, and I went to the nearest study hall. It was hot and had cramped quarters, but is perfectly fine for me, and I dedicated the day to fix the things I had broken moving fast. Once I saw I had the game in working order again, my enthusiasm renewed: I think I'm shaping a good product.
One thing that had me vexed was the ceaseless fiddling with the colors, or more accurately: the information hierarchy of the visual design. I just couldn't figure out what was more important and I found myself going back and forth options. Finally walking to the study hall, it came in a flash: I can't figure it out because I'm thinking in terms of visual systems. The hierarchy is changing because the state is changing. When I hover over a shape, I want it to gain prominence. Simple enough. But when I press it, I want to know where I can drag it. The focus changes to the target. When I release the shape, it moves to the target and I'm back to the initial state. With some more subtleties I was able to reason out the proper hierarchy for each state, and I saw that the color scheme I had envisioned had proved insufficient for the hierarchy I needed. Fortunately this will be trivial to implement, and I was glad to have reasoned it out, because--in design as in code--one can come to an acceptable solution through endless fiddling, but understanding the generalizing principles gets you there faster. And the result is the quiet confidence of an intelligent solution.
A similar thing happened with code, in my rush to have a working prototype I had cheated and wrapped functions which were firing before expected in timeouts. I took them out and traced what was going on: turns out these cheats were cascading into needless complexity, so I took the time to trace the flow of execution carefully, and with this most of the unexpected behavior disappeared. This gave me exactly the same pleasure I had solving the information hierarchy problem: an understanding of the underlying structure that gives hope moving forward.
After work I hit the nearest gym. It's very nice (for a city-run gym). Had a great workout. Home is perfect for work: it has a standing desk and an external monitor, besides being pleasant, comfortable and well-located, like René's place where I stayed before. All is lined up to have a great couple of weeks finishing this off.
Today I don't feel like writing the work log, the day was partly frustrating, but I look at the reasons and they are not worth a grumpy mood: I spent most of the day trying to resolve a nasty bug in which callbacks weren't firing at their expected time. The animation library I had chosen wasn't doing what I expected: having simultaneous animations firing dynamically seemed to require a pattern I couldn't wrap my head around, and in the end I gave up and replaced the library for anime.js, which worked like a charm.
Then I went to buy a DisplayPort to HDMI adapter in order to use the 4K monitor I have at home, but the inventory at the store was not the same as their website. I went to another store, same story. Then to a third one, same thing. I came back home and placed the order on Amazon.
I sense the events didn't cause the mood, but I woke up sensitive to frustration and it grew from there. I came back home and had a nap, then meditated. I felt better and put an extra hour towards fixing more bugs. Grand scheme of things: awesome. Day: crappy. Accept and move on.
Another meh day: I stayed home to receive the package from Amazon, when it arrived the displayport to HDMI cable didn't work. I tried with a simple HDMI cable around and things worked fine, so the purchase was unnecesary.
I spent the day... I don't remember much about what I did, I just fixed things around the codebase, went back to mobile because I had been working on the desktop version and unforseen things tend to crop up if I focus too much time on one side. My intention was to work on the scoring mechanics, but when I sat down to code it I realised I hadn't thought things through: there were too many unknowns, so I chose the path of least resistance, giving some time for the problem to resolve in the background. I'm glad I did, because now I have a better idea about how to tackle the problem.
{{Dangerous wave pool}}
After this I browsed pinterest to find vector images that would suit the game, since I'm relying too much on icon sets. And I did find some pretty cool stuff that will make great stages. Then I went to a Meetup event and put my mind off the project for some time.
I find myself worrying about running out of motivation for closure, but in the grander scheme of things no product comes to fruition without moments of self-doubt and frustration. I'll wait for the waters to calm down before trying to tackle anything too ambitious.
I begun the day slow.
I had a nap. I dreamed that I solved what I was trying to accomplish. I didn't remember how.
I went back to the computer, I had some solid hours of deeply focused work and solved the problem.
But I second guessed myself and I undid some of the work, and then I lost some spirit.
Then I thought: the transition between states is seldom immediate. Today was better than yesterday, and it is possible that tomorrow will be better than today. I'll be patient.
I had delirious sleep last night, constantly dreaming about solving problems in code. My dreams have ceased to be visual, I mostly hallucinate voices, and when imagery does come up, I see geometric shapes inside the black frame of the screen. The various dreams I had led to successful outcomes, and I woke up before sunrise possessed by a desire to get things going. I got to the desk before even preparing coffee, and worked for three or four hours before hunger got the best of me.
I prepared coffee and a plate of oatmeal, which I ate at the desk, and pondered how to continue: there was a challenging UI/programming task ahead and I was in a good state to accomplish it, but I was unsure about the path I was going take. My mind and body were in tension, like when you want to jump into a cold pool but can't summon the courage to do it. Finally I thought: I'll just prototype it and see if it's this is the correct way to do it.
I blazed through the prototype, and I was surprised at the speed of my fingers, but it wasn't a flowing sensation, it was a "let's get over with this as soon as possible" feeling that got me there. When I observed what I had done, I thought: not ideal, but it works. I filled in the functionality blanks, and when I begun using it, it felt quite deficient.
I decided to hit the gym, not really wanting to go, but knowing I had to put my mind somewhere else, at least for a while. I arrived and didn't feel like working out, and wondered if it would be a better idea to go back home to work instead. But I was already there, so I lifted some weights, and with each exercise I felt my mind clear up and the voice inside my head fade out. I thought: _I will not overdo this today so that I came come tomorrow, I need this every day!_ and I left the gym quite happy.
I have a friend who gets especially cranky when she doesn't eat, but what's disconcerting is that she had no idea that she's hungry. "You're like a child!" I would tease her, "you don't listen to your body so you don't know what's happening to you!". I felt like I needed to accomplish some real progress to leave my rut behind, but it turns out I'm simply being unaware of myself. I've experienced the positive effects of exercise and meditation time and time again and yet I seem to forget when I'm stressed.
I came back home and sat down to meditate. Finally I was able to find some degree of inner silence, I felt my mind and my body relax and I realized I was dozing off when I begun hallucinating voices again. I went to bed for a nap, and then decided to undo my previous work, this time without any attachment. I salvaged the functionality and threw away the UI. I was in a better mood to experiment, and though the maths are way above my head I decided to dip my toes into isometric perspective to solve a visualization problem.
After a couple of missteps and with a bit of patience, I was able to get what I had in mind. It looked beautiful! Then mom called and I caught up with her and with my sister. I came back to work for some last touches and saw that this is the best solution, even though it still requires some additional work. I was pleased. Even though it is too early to declare the bad rut gone, today was better than yesterday, and I know what to do for tomorrow to be better than today.
There is no point in describing my work days, it is only the conclusions that are reached that have any value, and if the conclusions are related to the events lived, then some reference to the experience lived should be described.
The change in approach is due to the very obvious phenomena of experiencing the self as a character in a fictional story. When something interesting happens, I think in terms of how to frame it in writing. I've experienced this in the past in my personal journals, and I know it to be psychologically unhealthy. This is why sometimes I challenge myself not to use "I" when I write, it submits the ego because the voice in the head can't do the writing. Just a word of warning for the imaginary reader.
Exercise time and time again proves to be the best remedy against an agitated mind. The difference in working performance one feels after going to the gym is remarkable. However, if the body is pushed too far, fatigue takes its toll on mental performance. This is why the ideal workout is quick and intense, enough to get the proper brain chemicals flowing, but short of the joys of a good workout. It's surprisingly difficult to self-regulate this!
Working at places where people are deeply focused, such as a library or a study hall, is sometimes superior to having a quiet office with a large screen and many amenities. When you _can't get a coffee_, you don't wonder if you should be _getting a coffee_. But then you _need_ a good internet connection, or a snack, or a coffee, and you come back to the office to satisfy your needs. Variety is the name of the game.
Enough already. When both body and mind ask to go to bed, one must take heed of their advice.
There's something wonderful about tool making. It hits the sweetspot between creativity, egineering and meaningful activity. When you create something that allows you to accomplish something that you couldn't do before, a sense of empowerment is felt. "I'm the only person in the world who can do this!", and then an irresistible urge to share it with the world comes.
Why would you want to share something that gives you competitive advantage? Finding pleasure in extending the natural capabilities of our kin is--I suspect--in our genes. Some people have found ways of gaining monetary and status out of it, but tool makers are not primarily driven by these incentives. The jaded person sees otherwise, but this is because he has never experienced it in flesh. If a person were to put a hundred million dollars on the table for something objectively innovative in a specific domain, it is unlikely that somebody with more passion for money than the domain itself could come up with an innovative solution.
Open source is born out of this phenomena (_bias_, some people would call it). Very little prestige, status or money is gained by sharing your code, in fact it's quite the opposite: users demand features, support, updates but very little is offered in return. Some Open Source developers nothing short of modern saints: infinite talent accompanied by infinite patience, pure manifestation of divine attributes.
In ancient, prehistoric times there was a stone technology called Oldowan, it was little more than crudely but deliberately shaped rocks. We lived with this technology for more than a million years. Then a new technique gradually emerged, paleontologists call it "Achulean". These are carefully flinted bifaces which require planning and fine motor skills to accomplish.
Looking at images of Achulean tools, their aesthetics are self evident. We can imagine one of the tool makers come upon with this solution, and his immediate desire to show it off to his mates.
Yesterday I didn't write a work log, because I didn't work. I woke up at 7am, tried to get work done, found myself distracted, so I had breakfast, did some chores, and had a two hour nap. I woke up at around lunch time, prepared lunch, and surprisingly felt myself sleepy again, so I slept another two hours. Then I woke up, had a snack, felt sleepy, and went to bed again, this time feeling guilty, but I thought _I've been working like crazy during 45 days without rest, I deserve this_ and promptly went back to sleep for another two hours.
Then I went to the gym, shopped for groceries, and went to bed at my usual time, expecting everything to go back to normal today. But it didn't happen as I expected, I found great trouble concentrating today. As I was working on code, I found myself looking at code written by someone much more lucid than I am today, and I could feel aversion towards working, procrastinating much more than usual and such.
I went to the gym to clear my mind, coming back from there I thought _It's time to look under the hood_. I had [a day like this](https://method.ac/writing/work_journal/13-12-2018_work_log.html) before, and though the cause is quite different, I see that I overcame it simply through acceptance and putting myself at the right place (the library) at the right time (the morning).
It is now clear that avoiding the _I_ in my work logs was an evasion of writing about a degrading mood. Since moving to this new home, the biggest change has been working from home much more, so tomorrow I'll go to the library early and see how it goes from there. I also abandoned the _feature driven development_ plan that worked for me at the time, so I'll come back to it.
I've been going to the gym on a daily basis, but I think this is more a compensation of a degrading mood, thought it's possible that physical fatigue might have an effect on my focus. I'll just keep it in mind moving forward. I'll be more consistent about my meditation practice. So, in summary for myself:
1. Go to the library to work.
2. Meditate.
3. Register all experience as it comes out.
Edit later in the night: I went to bed early, and had troubled sleep with a dream about incompetence. I couldn't put my mind to rest, so I meditated. Through breathing I was able to get into a state of deep relaxation, full acceptance, and quieting of the mind. I got up and worked 90 minutes in deep concentration. I felt it clearly: with a quiet mind nothing needs to be changed, if I work at the library it will be because I enjoy it, not because I want to focus more.
Only until I relaxed was I able to perceive how stressed I truly was, and how things truly are. The more I put myself in the middle of what I do, the more I obstruct what wants to come through. Less of _me_ gives way to more of _this_.
I'm writing this from write.now, the offshoot that came out of Flow, the writing app of René Galindo. I've been programming it the last few days. It's been surprisingly difficult to put it where I want it to be, mostly due to my unstable mood.
I see physical manifestations: my face has an irritation, lunch caused me to bloat (very rare in me) and I got an infected zit behind my ear, all this appearing at once. It's surprising that the mind can drive itself to stress.
The easy way out seems to be to take a break, but I know will either completely unlatch from the project and find an aversion to further work, as has happened in the past, or I won't be able to unlatch at all, causing further frustration. So the strategy is to not force anything, to meditate a lot (which I've done today), and to be aware of what is going on.
Today I went to the study hall, and I tried working for about an hour, but it clearly felt it wasn't helping. I was irritated by everything. So I came back home and had moments of focus and moments of frustration. Some progress was made, and all in all I'm satisfied with the day.
{{Hedera helix dream}}
I worked intensely during the morning, and in the evening I paid a visit to René to catch up after a long stay in Mexico. He saw The Boolean Game and was frustrated by some interactions. I'm undecided as to wether follow his advice. I need more time to think about it.
I woke up in the middle of the night restless, I went to the computer to work, but I couldn't get anything done. _What do I need to find my groove again!_, I was exhasperated, and in a moment of desperation thought that I needed to find flow in a new project in order to regain confidence in my coding abilities. I begun a new project, and while searching for images I could use I came across one that struck me as myself at the moment:
<img alt="fullscreen.jpg" src="https://method.ac/writing/uploads/fullscreen.jpg" width="830" height="1280" class="mt-image-none" style="" />
But soon tiredness overcame me and I went to bed.
I woke up depressed, I felt hopeless, and my desperation bout gave way to a profound tiredness. I half heartedly ate breakfast and sat at the computer. Again, couldn't get anything done. _I need to find where to head with this project, but I need to do it with a clear head_, and so I went to bed again.
I had some uplifting dreams which I do not remember, I've observed this before in moments like this, there seems to be a compensatory effect from the subconscious when the ego gives up. If dreams exclusively echoed our waking state we'd drive ourselves to madness, for the echo would grow louder and louder until we'd be unable to listen to anything else.
I woke up knowing how to proceed without much reasoning: there's two different products: one mobile and one desktop. I've been trying to produce both from the same codebase, but this is impossible. I must finish one and then tackle the next. I chose mobile first, not that it makes much difference, but at this moment mobile is closer to being finished.
Then I understood I'm trying to get into high gear from standstill. _I'll begin by doing something enjoyable_ I thought, and whatever little progress I can accomplish is good. And so I begun tweaking bits here and there, and soon enough I was deeply absorbed again. I throughly enjoyed my session, and though my mood isn't quite there yet, I'm now distanced enough to see that it's simply foul weather that I need to let pass through. Today I identify with this guy:
<img alt="fullscreen (1).jpg" src="https://method.ac/writing/uploads/fullscreen%20%281%29.jpg" width="831" height="1280" class="mt-image-none" style="" />
This morning I woke up early, and was about to get out of bed to work, but thought: _no, it's Sunday, I won't make any intention to work, work will find me when I'm bored_, and I promptly fell asleep again. I got out of bed at 10am and sat at the computer. No inclination towards work was felt.
I did my chores and went to the gym. The day was sunny and I felt suprisingly uplifted for my average as of late, and when I came back home I prepared a very large salad. {{Working on a text editor}}
I woke up and sat down at the computer, this time work did find me, but I took it easy by taking many breaks and not trying to extend my states of flow. I was facing something that I thought would be tremendously challenging and I wasn't sure I wanted to do it, but things went surprisingly smooth. I don't know the slightest thing about matrix transformations, but reading a bit of documentation, having a relaxed attitude towards failure, pretty quickly I was able to do what I had in mind. I felt excitement again. It's coming together!
There's an aspect of automation which has always unsettled me: the binary nature of computers ultimately draws a stark _yes_ or _not_ line between two states. Take for example an admission exam. A single point is the difference between being admitted or not. There's no space for the personal history of the student, and the closer one is to this line, the more it depends on luck. The student could have a rough night, a personal problem, or a simple distraction makes a world of difference in the outcome.
I used to think there was no automated way of distinguishing between these special case scenarios, perhaps anyone close to the cut-off line had to be reviewed by a human, but today I encountered this scenario. I wanted to be a little bit more clever about the dropping hints in the drag and drop mechanics, so if you moved a shape in the direction of a drop area, it would highlight that drop area.
However, I encountered scenarios where the cut-off area between one target and the next would cause a continuous flicker, the angle is right between this binary state, causing the target to jump from one place to the next:
<video width="364" height="398" controls>
<source src="https://method.ac/writing/uploads/media.io_drag.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
Then I understood: it depends on momentum. If I drag towards a target, it must take into account not just my last data point, but the history of my data points to make an accurate prediction of where I'm intending to drop. The parallel with the admission exam is that an average student on a steady decline should be rejected over a below average student on an ascent. The single data point of an exam score tells us where the student was at the moment of examination, but it doesn't tell us where he or she will be in the future.
I suppose I'm rediscovering statistical trends here, it's just fun to find to figure out things and find parallels in one's niche.
This morning I woke up at 4am and couldn't go back to sleep, so I came to the desk and found myself a bit stuck. In order to incorporate René's feedback I'd have to embark on a fourth major rewrite. _Fuck it, I'll just create a new branch and move fast and break things, I can always come back to the current state if I see it's too much work_. Surprisingly, things went smooth, and got a lot done.
Yesterday I went to the gym and I didn't have a coin to place my backpack (with my laptop) in a locker, so I just left it a discreet corner, reasoning that any thief would look inside the lockers but not in an out of sight corner. I wasn't all that comfortable of course, and I realised it's been a month since I last backed up the project. But then I thought: this has been 90% exploration, I'd get back to speed in a week!
Thought today turned towards the existential. This project mirrors many of the things I've lived in the last five years: cycles of hope and despair, amazing people who have lent me their support, and also profound isolation that leads to altered perceptions in dreaming and waking life.
In the afternoon the sun came through the window and hit my screen. I was about to close the curtain, but then I saw the sun coming down behind some buildings. I sensed the earth rotating and for a moment the sun ceased coming down; I was on a giant sphere rotating away from a static sun. The sensation was disconcerting _but this was actually happening!_. We live in poem!
_A throughly unremarkable day. I made progress, nothing else to add. I had proposed to myself to write bits that I intend to publish upon release, so I'll do that._
### Behind the scenes
#### Paper.js
From the website:
> Paper.js is an open source vector graphics scripting framework that runs on top of the HTML5 Canvas. It offers a clean Scene Graph / Document Object Model and a lot of powerful functionality to create and work with vector graphics and bezier curves, all neatly wrapped up in a well designed, consistent and clean programming interface.
This description is accurate, albeit vastly understated. Paper.js is incredibly intuitive for developers accustomed to working in vector editing applications. Layers, groups, boolean operations, primitives, blend modes, selections, segments, nodes; it's all there. It's fast, it's clean and it's a pleasure to use. My only regret is not having used it before.
I lost count of the times Paper.js surprised me by foreseeing my geometry needs. I'd think _I want the coordinates of the bottom right corner, so I need to know the width and height of the object and add the current coordinates, let's see how this is done..._ OH! `item.bounds.bottomRight`, sweet!
Other times I'd even have to replace my buggy implementations because I never expected to find my needs resolved by the library. I suffered greatly making a shape match the size of a rectangle, and then saw that `item.fitBounds(rectangle)` did exactly what I needed.
That said, I was also flustered by some things that didn't behave the standard way in Javascript. I guess this is what they call "magic". If I do...
```
item.style = { fillColor: "red" }
item.style = { strokeColor: "red" }
```
Then item.style will be
```
{
fillColor: Color.instance,
strokeColor: Color.instance
}
```
But, after using the library extensively, I came to appreciate the convenience of this feature. And like this, there are many asterisks to the things you do Paper.js, particularly regarding functional programming. Always append a `.slice()` to `group.children` if you don't want to shoot yourself in the foot, or simply do it the Paper.js way.
All in all, I'm very glad to have used this library and can't recommend it highly enough. This game wouldn't have been possible without the library. Jürg Lehni & Jonathan Puckey are nothing short of geniuses and I'm grateful to have such a powerful creative tool at my disposal.
Grinding my teeth while working. Finding myself solving the same problems over and over. Feels like Groundhog Day. I used to think I couldn't work if I didn't enjoy it, but I guess I've gained enough momentum that I wouldn't know what to do if I tried to relax. Gym and meditation forgone the past few days, but in this state I don't even know if it would be useful.
I feel on autopilot, and I need things to remain this way. Any inspiration or expansion of consciousness could make be go off-track. No distraction is enticing enough to rouse my curiosity. My inner landscape is dry. My neck hurts and music irritates me. Dreams happen, but they are distant. This work requires no imagination, so my state is adequate.
This dissociative bypass may come at a great cost if done for long. I will hurry through these monotonous badlands.
A day of great psychological suffering. {{All worries left behind}}
The sensation is pervasive uneasiness, and it's an old acquaintance of mine. My escape used to be pot--the relief is immediate and quite striking, but soon the guest becomes the master, and this for sure sets the ship astray; not meditation or exercise, as I wrote yesterday.
I find myself holding my breath while working, as if every bout of concentration required submerging myself into muddy waters, and then I gasp for air and I feel the tiredness of my mind and my body. My lower back hurts from sitting long hours, the eczema on my face is spreading, and my mood is rock bottom.
As I write this I see the time has come to take a break. It's Friday and it's logical that I would take the weekend off, but weather is crap and the only thing that appeals to me is a long walk in nature. Early next week it will get better. I will walk then. I guess the second best that I can do is go to the gym, though I feel no inclination. I will do so and come back to register the difference.
---
I come back a different person. Sometimes the difference is striking, others it's subtle. It's only when you expect to feel better that the experience is disappointing. I read what I wrote and it's sound: I need to take a break (even if in my current state it feels unnecessary). I'll make a goal: complete the game features without UX or design, take a day or two off for a long walk, and then come back to polish it off. The first part requires tenacity and grit, the second love and patience.
I'm enjoying the _chiaroscuro_ of this project. It's like it's going through many different hands: some cheerful and some somber, others hesitant and others self-assured. Some imaginative and others practical. Each hand provides what is necessary for a well-rounded product. And I'm also enjoying writing about the experience.
Yes, the difference is striking indeed.
I remember very well the occasion when I first came to Madrid to work for a man of great insight. We were completing a design project which was to be implemented by a less-than-stellar technical team, and I came back with a design which I thought satisfactory. My boss looked at it and said "this is correct, but our technical muscle is not strong enough to execute it, come back with something easier".
These words come to me time and time again with this project: I feel the constraint of my development skills go back and forth with my desires as a designer. The concessions are generally easy to reach, but the changes also mean that the design is never final. My intention is to approach a functionally complete prototype for next week, but when I try to advance I notice unaddressed dependencies.
So a stage is completed and I have that part ready. But I want to assign a score to the stage. The score will depend on the actions that are performed on the stage, so the stage actions need to be complete before I decide how to compute the score. But the stage actions also depend on my capacity to implement what I have in mind, so the chain of dependencies makes itself evident, and I can't advance without having certain mechanics into place.
I was, however, an interesting challenge that has kept me engaged. Even if I don't hit my goal for having it feature complete for early next week, the philosophy is correct: mind the structure before the surface.
There's another game in the back of my mind taking form, after I'm finished with this game I want to implement it with a two week deadline. The purpose is to put into practice the insights gained in this project to help them settle, and my main concern in this is efficiency. I'm letting it grow on it's own as a purely mental construct, and when it comes time to work I sense that it will have become quite clear.
I will append an insight which came today from my working activities: I spent a considerable amount of time chasing a bug, and though it was critical, I could have placed on the "do later" pile, according to current strategy, but some bugs are like mice: then peek out a corner, you chase it, and then you know it's hiding behind the fridge. You have more important things to do than to kill the mouse at this moment, but if you don't, then who know when you will have it cornered again!
So I "moved the fridge" but alas, it was not behind it. But looking closely, there was nowhere else to escape, it _had_ to be inside the fridge, but this would require me to dismantle it. Virtual mice don't escape fridges, so it would remain there if I chose to do it later. Still, the thrill of the hunt was too great, so I begun dismantling hoping I'd find it in the surface, going deeper and deeper, I could hear it's presence, but I couldn't get ahold of it.
Finally I caved in and spread everything open. It turned out to be a problem with high resolution displays: I had gone low level in a particularly expensive function, the coordinates that were being provided by the library were in client pixels but they needed to be in screen pixels, so I had to multiply the values by the screen pixel ratio and it was solved.
I'm undecided as if this was the right way to proceed, but I note it down for next time: any bug that escapes my immediate stomp will live another day, and I will observe the outcome of this.
Today I spent a large amount of time hesitating how to implement the scoring system. There were other decisions which I had to make beforehand, and to measure up these decisions I begun implementing them. They were difficult to implement, they turned out fine, and by the end of the day I have a clear idea of how it will be implemented tomorrow. I noticed that--even though I was facing very challenging problems--I was not stressing out over it. It's Sunday, so I decided to take it easy, and I took as many breaks and naps as I pleased, yet I got a whole lot done.
I came to the conclusion that stress is optional, completely self-inflicted, arising from an attachment on how I should be working, and the self-perceived productivity I'm having. In the past days I've thought that it is necessary for keeping engaged with the project, but today it became obvious that it is just a side-effect of attachment. How to minimize stress shall be within my awareness in the next few days. The eczema is gone, but today a cold sore appeared on my lip.
I ran out of tobacco, and since it is Sunday most tobacco shops are closed. So I had a long walk to one that was open. The sun was shinning, and I enjoyed the walk even though it was through the city. I'll keep to my promise of taking one or two days off in the upcoming week when the weather forecast indicates it'll get warmer. I'm coming close to having a functionally complete product, and though great temptations arose to polish non-essential things, I contained myself and went through the terrain I had planned beforehand. My only question is: where shall I go?
I finished the scoring system. I'm quite close to having the functionally complete product, which I will accomplish tomorrow. Now my biggest worry is: where I'm going to walk. I'm inclined to begin the Camino from Madrid to Santiago, walk two days, and then come back. Feeling tempted to bring the computer along, but deep down I know I shouldn't.
Today I had trouble focusing. I tried to take it easy, as I did yesterday, but I wasn't making much progress, so I went to the library and after some initial resistance I came into flow and finished what I had set myself to do. I take note for the future.
I'm too tired to describe other things that happened. I'm looking forward to tomorrow, leaving everything in a good state so that I can come back from my walk to finish this off.
Today I saw the feature complete product, and felt temptation towards forgoing the walk. It's close to being finished, just one last push and it will be done. But I was reminded of a quote of the Tao Te Ching:
> People usually fail when they are on the verge of success.
So give as much care to the end as to the beginning;
Then there will be no failure.
My eczema has spread, and I must have enough cortisol in my body to stress out a small nation. In any important endeavor, there is always some amount of wreckage done. The wreckage must be managed.
As I was walking back from the library I thought: _what would make me feel I've been successful in this endeavor?_. There is financial success, of course (which is very much needed) but beyond this I'd be satisfied with a modest popularity that opens doors to unknown things in the future.
Failure would be that it's met with indifference. _Would I feel disappointed?_ I asked myself, and surprisingly the answer that arose was _no_, the only alternative to this period would have been idleness, and that would have even more taxing on my wellbeing. We can only find our way through trial and error, and any miscalculation is a lesson, however hard to swallow it may be.
I decided that I would walk with one change of clothes in the direction of Santiago. My intention is to walk until exhaustion, there's plenty of bus stops along the way to come back, and two hostels if I decide I need to stay an extra day. Fortunately there's nothing to resolve mentally, it's simply a reset to come back to do things with patience and love.
After some inner deliberation, it's been decided that the contents of my walks are intimate. Feet are destroyed and legs are sore, enough has been said.
Today a list of the things missing for release was produced and ordered by importance, and then tackled something important-ish which would be adequate for the current disposition: a build step which would transpile and minify everything to be ready for production. The JS ecosystem is hell on earth, and many hours were lost trying to make everything play together nicely, but at the end of the day it was done.
Since the code can be transpiled to ES5 easily, temptation was felt towards checking it on an old iPad 2 lying around. After some minor fixes it was up and running. Frame rate is choppy, but it is quite playable. It's been almost nine years since it's release! This should provide a good baseline for all low powered devices.
More things need to be added to this work log, but it's time to go to bed.
Today experimentation with sound begun. Never has this web bricklayer come across this art before, and after some reading it was decided that the best form of learning was through experience. A sound spritesheet was abandoned as quickly as it was produced, for it became clear that--not knowing what makes good sound in a user interface--the task would require a more flexible approach.
Erik Spiekermann says good typography is like air: you only notice it when it smells bad. This maxim applies to many fields in communication. Many sounds seemed too subtle at first, but when more bold choices were used on the interface, they caused the same effect of a fedora hat on an unexperienced head.
The taste which underlies all of creation was kind enough to make itself evident by manifesting the transcending principles. If you drag a shape into the stage, then it will need an opposing sound for when you drag it out of it. The parallel in visual design would be contrast. Then, when you perform a sequence of steps in which each step increases in value, the sound's pitch must increase accordingly, this is akin to visual sequences. And so the day was spent in exploration of these principles, some progress was made, but much lies ahead; not in matters of implementation but of understanding.
Sundays are currently for leisurely work, but today this maxim was put to the extreme (and I actually enjoyed it). I had a particular sound in mind for a part of the game, and most of the morning was spent getting it right. Garage band got me to the effect quickly enough, but to get things working I needed it to be able to fade in, fade out and loop.
There are some libraries that do this, but since it was Sunday I could afford to squander time. Web audio is something I have never touched, and some anxiety is felt when I don't understand what is happening underneath the library that I'm using, so I put some time towards implementing these features. It worked quite well in the end.
Then, in the evening I took a sweet long time implementing a single stage which I wanted to get right. I've been implementing stages haphazardly, more to test the limits of the interface that I'm creating, rather than optimizing for gameplay, so I came across the biohazard symbol which is a perfect use case, and I tried some different starting points to understand when it becomes a chore.
<div style="width:480px;height:0px;position:relative;padding-bottom:100%;"><iframe src="https://streamable.com/s/fynx8/ciootq" frameborder="0" width="100%" height="100%" allowfullscreen style="width:480px;height:100%;position:absolute;left:0px;top:0px;overflow:hidden;"></iframe></div>
Finally I understood: deliberate complication in the name of challenge is a boring. The entire symbol can be completed with just two shapes, but it is obvious how to make the ring, so it's better to provide it completed rather than to make the user complete it. This is an example of an intermediate level of difficulty.
After work I hung out with René at the gym again, and we reached an agreement on how to exchange a gym membership in ways that would be of benefit to both. For the first time in weeks I _feel_ rather than _think_ the project will be successful, and enthusiasm renewed on its own. What a pleasure it is to feel the heart becoming alive again!
I'm writing in the morning. Yesterday I went to bed tipsy and felt no inclination to write it. Today it seems wise not to write under altered state of consciousness, enough variance comes through mood swings introducing vastly different perspectives of the same events. Perhaps some day, if stability is found, it may be useful to aggregate perception of events in altered states.
Yesterday I finished placing sounds. As soon as I placed a sound I knew what was wrong with it, but I resisted the temptation to fool around, because in design it's not only about the elements, but how the elements are put together. For example, for some buttons there was a digital _beep_, and for other events I used marimba notes. The parallel with typography was felt immediately: on their own these sounds are adequate, but by being together they clash. I can either go for something more organic on the buttons, or for something more digital on the animation events, but I would not understand this gestalt if I were to fiddle with the details at this stage.
Even though I found some pleasure in these activities, I was throughly drained mentally and physically. In the evening I met up with René and we went to his gym, which has a spa. Never had it crossed my mind that a viable option to deal with stress is investing in relaxation, perhaps because of financial constraint, but after a light workout and spending time between the sauna, cold showers, and moments of contemplation I felt myself throughly renewed and hopeful, and the event made obvious that this is a missing ingredient in my current work setting. After the gym we had some beers, and as always professional synergies arose naturally between us, and--Universe willing--these agreements will manifest themselves in the upcoming weeks.
I opened my eyes with the strangest sensation of waking up to a different reality. Instead of a confused mind and an exhausted body, I was alert and well rested, and I came out of bed to prepare coffee to put myself to work at 6:30am. I wanted to hit the gym in the morning, but I couldn't pull myself away from the computer until the sun began hitting the monitor at 5pm.
The work tackled was very challenging, and I had been putting it off because I knew I wasn't in the right frame of mind. I noticed myself no longer grinding my teeth or holding my breath, no voice in my head complaining, and I took no unnecessary breaks. A metaphor came suddenly to my imagination: I was a hot knife cutting through butter. _What was I before?_ I thought: a dull saw cutting through metal.
{{Have your ever dreamed about working?}}
I finally hit the gym and found a great working spot where I put another hour of work before my workout. Then I relaxed myself at the sauna and meditated with a clear mind for a long time. I left the gym somewhat mystified at the sudden upswing in mood. I'm not attached to it (I only know too well that by trying to hold on to it, it would squeeze right out of my hands), but I can only help at being disconcerted at the seemingly disproportionate effect on mood.
{{Alicante}}
And walking back from the gym it hit me: it's kindness which struck my heart once again.
_Thank you RG and SL_
Something intrigued me today: I was finding great difficulty designing in the morning, so I looked at my todo list and chose the opposite: figuring out how to install an nginx log parser so that I could get visitor stats (more on this later). This went extremely smooth, I was deeply engaged with the challenge and I found myself speeding through the task, understanding what I was doing at every step.
After lunch I had a nap and my REM activity was purely auditory: mostly rambling voices. Weeks ago I had a period when my REM activity was visual, and one morning I sat down to meditate and I could project how things would look even while in motion. At this time this is unthinkable, yet programming tasks seem easier. My hypothesis is that REM sensory hallucinations reflect on the ability to do certain kinds of work. Some years ago I asked my mother if she saw images or heard voices before sleep (I suppose this is an ongoing topic) and she said she always saw faces. She is a visual artist. When I come out of this isolation I'll surely ask around.
The reason why I put so much effort towards installing custom software for visitor stats is because I've been circling around an idea on how to give advertisers what they need, while respecting user privacy.
I recall one time when I searched on a travel website for a specific hotel in Mexico and introduced my dates of travel. Some days later I booked it on a different website, but the advertisement for this website, telling me that there were still rooms available on the dates I had selected, was following me all over the internet. I was disgusted at their tactics, and soon installed an ad blocker.
At the same time, now that I need to cater to the needs of advertisers I see that it is utterly unreasonable for them to take a leap of faith and just buy something which they don't know if it will be a good return on investment. The mechanics are valuable, since I will be selling stages. Advertisers usually track their effectiveness with a single empty pixel, so they know how many visitors are seeing their ads. The problem is, as far as I understand, if you have a Facebook account this pixel will identify you to it, and thus your privacy is breached, and the logo could follow you all over the internet.
This breaks the _don't do to others what you don't want done to you_ maxim, so I could just register unique visitors and sell the stage on people who loaded the game. The problem is: there's no warranty that a person who loads the website will play a sponsored stage, they would need a good idea of how many visits a sponsored stage would get. Here Google Analytics shine, you just send an event and this is registered independently from unique visitors, but this would entail the horrible experience of cookie consent and all that "we care about your privacy... but we have no idea what google is doing with our data" hypocrisy that pervades the web nowadays.
After many deliberations I realized I already had the capability in my own server. I could get the information I needed from nginx's logs, I will use a marketing pixel on a sigle "sponsored" stage and this will register as the event, and then I could confidently sell a stage saying: "this sample sponsored stage has had XXXX plays this week", and the information would never leave my ecosystem.
And here (goaccess)[http://goaccess.io] was godsent. Not only that, it will allow me to publish visitor stats publicly, to both users and advertisers. I'll eventually come around to writing the Privacy Policy where I explain how this works in detail, but I think it's a great win in the data-sensitive environment that we live nowadays.
Do you hate onboarding instructions? I do. With all my heart. _skip skip skip just let me try it dammit, I'll figure it out!_. But when it comes to creating my own products, I fear people may get stuck. To this day I receive a couple of emails per month telling me the Bézier Game doesn't work, despite having animated instructions (which could be improved, but anyways).
I came to this challenge again. I'd say the interface is self-explanatory, but there are _some_ features which are not obvious and need to be pointed out. I was reminded of my time as an airbnb host: you either drop off the keys and wish them good luck, or you provide a full tour of the house, but you can't just show them the quirks of the washing machine and leave them to their own devices.
This particular washing machine had a peculiarity where some people got stuck: the door needed to be opened by pushing instead of pulling. At first I'd mention it in passing, but when I got contacted by whatsapp I noticed people weren't paying attention. And I can relate, after arriving from a long trip I'd be thinking about the bed and not the washing machine. So I devised a way in which they would remember: I'd point out the quirk and then ask someone to actually open it.
I'm trying to translate this concept to the onboarding, where you can interrupt the animation by simply interacting with the interface, no need to skip: you skip by doing what you're supposed to do.
I had a melatonin pill and I'm near dozing off. I felt tempted to leave the work log for tomorrow, but I opened write.now to let my fingers do the typing. I will write stream of consciousness and see what comes out.
Let's see... I wanted to change the initial stages. I feel that, in apps as in real life, first impressions count a lot, so I wanted to get it right. I thought: perhaps it would be cool that the first thing you do is the logo, this way I can forego the intro screen and have the user basically build it. My clever idea hit many rough spots, it was not ideal as a first stage.
But then I thought: what if it is done sequentially? Not the entire logo, but piece by piece, and then at the end of the tutorial you have the full logo. Ahhh, and then you could set the favicon--but that would be a nice to have, and probably people wouldn't notice it at all, even if you pointed it out. But what if you make it explicit? "Build the Favicon"... Hmmm... I hadn't thought about that. It would be cool. After this, you could have a call to action to save it as a PWA on your home screen.
My thought is diverting: calls to install a PWA always happen at the wrong time, I don't know if I want to install it until I know that it is useful or interesting to me. Notifications would be cool so that you know when there's new stages installed, but that requires work beyond what I'm willing to invest at this time. I'll leave this for later, this is not necessary for release.
The tutorial mechanics seem to be working: non-obtrusive, non-verbal, simply a touch pointer showing you what to do that disappears when you interact with the app. Even if you tap on it, the tap goes through and the animation disappears.
I think, what I ought to do tomorrow, is to think of the game in a narrative way. I'm completing the game from start to finish, and all steps along this experience have to be pleasant. Yes, I'll try this out tomorrow. Time to go to bed.
This morning I found great difficulty putting myself to work. I was strangely shifting between thoughts of great success and great failure. I was reminded of a reading that helped me go through a creative block: Karma Yoga by Swami Vivekananda. I read it again, and this time I understood much more.
A passage which particularly stuck in my mind is (paraphrasing), _a man can have a library of ten thousand books, but he will only understand those which he deserves_, and it's by his actions (karma) that he will come to understand them. As the old reading offered fresh insights, I could only realise I'm not the same man that read this text some years ago.
I then went to a new library and found three hours of deep focus, then I came back home and I had a nap.
When I woke up I didn't like what I had done. When one is in a less than ideal state of mind it's difficult to distinguish between bad work and a _perception of bad work_ due to mood. I undid what I didn't like and I kept what was useful.
I then went to a yoga session at the gym. I had gone before, and despite the apalling quality of the teacher, I found myself much improved after then session, so I was willing to give it another try with a different teacher. This session was much better, and when I layed down for savasana I came into a profound state of relaxation. I hit a peak experience, I remembered why I'm doing all this, things fell into place and I thanked the teacher for the class with the outmost gratitude.
For a time I've been thinking it's time to wind down this frenzy, it's taken a tremendous emotional and health toll, but I was saying to myself I'd have to wait until the game was released to begin. But this experience told me it's time already. I intend to hit my release date, but I'll do it as I detach from the work that has been done.
> The ideal man is he who, in the midst of the greatest silence
and solitude, finds the intensest activity, and in the midst of the intensest activity finds the silence and solitude of the desert. He has learnt the secret of restraint, he has controlled himself. He goes through the streets of a big city with all its traffic, and his mind is as calm as if he were in a cave, where not a sound could reach him; and he is intensely working all the time. That is the ideal of Karma- Yoga, and if you have attained to that you have really learnt the secret of work.
[Karma Yoga](https://www.vivekananda.net/PDFBooks/KarmaYoga.pdf)
> Therefore the sage goes about doing nothing, teaching no-talking.
The ten thousand things rise and fall without cease,
Creating, yet not possessing.
Working, yet not taking credit.
Work is done, then forgotten.
Therefore it lasts forever.
[Tao Te Ching](http://www.with.org/tao_te_ching_en.pdf)
I went to the National Library of Spain to work.
I used my bike for the first time in months.
I had three hours of deep concentration, and other two not-great hours, because of hunger and other discomforts.
I then went to the National Archeological museum.
I couldn't stop seeing boolean shapes everywhere, so I snapped a couple of pictures in case I decide to implement them as stages.
I came back home for a nap
I worked until late implementing stages.
Resistance to work again. I once saw a TED Talk on introspecting where the main point was that introspecting should be done trying to examine the _why_, but the _what_. In essence, we can come up with ten thousand reasons why we feel like we feel, but useful thought is not directed at the why, but _how_ do I change what I feel. Looking at the _why_ only makes up unhappy.
My release date was set for tomorrow, but I won't make it in time, at least not in the scope I was planning. But I will make a run anyways, and at the end of the day I will decide if I shall have a private release or a public one. Towards this end, I will need to put myself in a library instead of working from home, where resistance seldom finds me.
I'm not even sure why I don't do this every day. I _know_ I'm more productive from the library, but then at home I have my coffee, my bathroom, my desk, my large monitor. There I am getting into the why!
I was walking towards the gym feeling quite miserable, and I thought: _even the most wildly successful release wouldn't excite me_. But, as usual, exercise put things into place, and as I was coming back I thought: _It may be true, but failure wouldn't sink me down either_. I ought to take note to see if any of these outcomes truly matches the predictions that I'm making in this state.
I was about to write a closing sentence, and then I remembered that today is my birthday. It went by like Christmas and New Year's: working, thinking nothing about it. I spoke with mom on the phone, and she told me a story which I hadn't heard before: my father left for Canada while my mom remained in Mexico with my older brother. She called him to let him know that her period was a couple of days late. When it was confirmed that she was pregnant the family was reunited in Canada. While there, my grandmother counted the days and predicted I'd be born in the first days of February.
My mother interpreted this as doubt of fatherhood by her mother in-law, which would be verified by the date of birth. So she grew anxious as the days of February dragged on without me being born. Fortunately the effect of my father's genes on my physical appearance is evident, more for the relief of my mom, because I don't think my grandmother meant it this way.
So I had predicted my project would be born tomorrow, but in creative endeavors it's the project itself whom chooses the date of birth. I'll just nurture it until it's ready.
I'm writing this the next day because of the constraint _don't write work logs in an altered state of consciousness_ and, after some beers with René I felt compelled to write a work log, but I left it for today. And I'm glad, because yesterday was important.
I woke up with a very different sensation, the cloudy mood of the last few weeks was lifted, and I was mystified by it, since I couldn't pinpoint to a specific source. In my sleep I had many dreams, among them one in which I won a modest lottery of 1,054 euros and I was incredibly relieved. The dream was not the source of my uplifted state, but it pointed to the fact that some of the stress is financially induced, and that relief will be found if I make even a modest amount of money.
I had proposed to myself to work from the library, but then I sat down at the computer and had an incredible focus run from 8am to 12, and only then I took work to the library, where my focus was somewhat diminished. Throughout the day I could only notice the difference in experience my mood was causing, and despite my best efforts to simply enjoy it, the ego was constantly trying to find the signs where I found this oasis in the desert.
Though various candidates were found, I had to admit it was simply a fluke. I have no control over my mood any more than I have control over the weather. And today, with a very minor hangover, the positive mood has dissipated. The sun came out briefly through the clouds and illuminated everything, then it was obscured again. Assigning a personal reason for this would be superstition. But it's a big consolation to be reminded that that the grayness is not in the world itself, it's simply a veiled sun.
The entire morning was spent with great resistance to work. I could barely get anything done, so I decided to take a break and go to the gym to explore an acroyoga class. The teacher was terrible: a woman got tangled in her acroyoga hammock, and as she struggled to free herself, the teacher anxiously barked "stop stop stop", causing more stress to the poor woman. After this, the teacher kept a close eye on her, correcting her at every movement so she wouldn't err again. But in her zealousness, she made the woman nervous and only caused her further mistakes.
It was interesting to observe, _I do the same to myself_ I thought. Zealousness in self-observance is killing spontaneity and flow. I took a deep breath and put my attention in the body, which was difficult given the nervous energy hanging in the class, but I came to enjoy the asanas by ignoring the teacher.
After the class I took work to the library, and the first 45 minutes were a struggle, but with the lesson fresh in mind, I stopped barking at myself, and soon enough I entered deep state of flow. I liked my work (a lot!) and I felt rejuvenated. Is it this simple? I'll have to continue my practice.
I came back home to write the [Privacy Policy for Method of Action](https://method.ac/writing/legal/privacy_policy.html). It's simple and legalese free, good enough for the time being.
I woke up at 6:30AM after having slept 5 hours, feeling refreshed. I put myself at the desk and work flowed endlessly. Finally, at 2pm I decided it was time for a break, so I went to the gym of a yoga-ish session with the teacher I like. It was great, again in savasana great feelings of oneness. I came back home expecting to fall exhausted after lunch, but instead I put myself to work until I felt my attention lagging. I had a bit of trouble falling asleep, but it eventually came.
I've been working on the tutorial, which in the past days has presented a lot of resistance, but now I'm enjoying more than ever. I'm applying my full creativity, going well beyond my duty (perhaps even spending too much time on it). But it's stellar, I'm really satisfied with the result. I think I've detached from observance of my mood, now more than ever it's obvious I'm not in control over it, so I accept whatever emotional state God provides and my only duty is to work through the things appropriate for my state.
{{Sleeping hallucinations}} I'm almost certain now that I'd be diagnosed with hypomania disorder, which is a more mild form of bipolar disorder. I just shrug at the concept, to me it's a way of experiencing the world in its full contrast, shadows and light. When I meet happy people I can relate to their experience, and when I meet depressed people I can relate too. I sometimes wish I had better advice than simply "accept yourself as you are, unconditionally", but that's the only thing I've learned dealing with it. And also: do things appropriate for your station. I'll leave for a social event now.
One of my walking days I thought I was trying to answer too many things to myself which could only be answered by experience, so instead of answering, I asked myself questions and recorded them. It was a useful exercise. I will try to do the same thing on my work log, giving context from where the questions arose.
### On mood
I slept terrible. My working hypothesis about mood being out of my control soon found it's counterpart, and yesterday's sharpness gave way to dullness. I just deleted a large amount of text because I was going into abstractions, I will simply ask myself questions which are interesting to me at this time:
1. Is it worth trying to influence my mood at this time? Or shall I simply work through it until I release the game? (assuming the basics are in place: nutrition, meditation, exercise, sleep).
### On my workplace
I signed up for a tour with a free day at wework. Frankly I just wanted to try out a new workplace and there was no chance of me buying in, but there were some things I liked: it has the best of the library (focused people, though the library is more quiet) with the comforts of home (coffee, tea, and different settings where to do work). Questions:
1. What can I do to bring the pleasures of home into the library?
2. What can I do to reduce distractions at home?
### On work
I tried to implement René's sponsored stage, and I realised I was missing many things in order to make the deal appealing to sponsors. I'm dutifully working on it, not only for René but for future sponsors. Some questions arose:
1. If the sponsor wants to share his stage on social media, many people will not be familiar with the game, and may find themselves at a loss. Should I give them hints? Should I direct them to the tutorial? Should I charge extra for hinted stages?
***
That's enough questions to ask to myself in a day. I try to keep them in mind so that I can answer them from experience (and bring more questions if this works out).
Saturday. A day of leisurely work and catching up with sleep. I dedicated most of the time towards peripheral work: favicons, open graph images, cron jobs, testing on actual devices. I'm leaving important work for better states of mind.
I'll follow up on the questions I asked myself yesterday:
### On mood
1. Is it worth trying to influence my mood at this time? Or shall I simply work through it until I release the game?
I had a meditation session, and it made me feel remarkably better. Meditation is where I am less regular, the rest (sleep, nutrition, exercise) I have them as well established habits. I'll meditate after my first work session in the morning.
### On my workplace
1. What can I do to bring the pleasures of home into the library?
I'll smuggle coffee into the library. I don't know if I'll go tomorrow, since it's Sunday, but it's going to be warm. Perhaps I could go to the library in Retiro. I'll just sense if I want to do it tomorrow, it's not a bad idea.
2. What can I do to reduce distractions at home?
Since this desk is not mine, I have not bothered personalizing it. It's extremely cluttered. I'll remove everything non-essential, Sunday is a good day for this.
### On work
1. If the sponsor wants to share his stage on social media, many people will not be familiar with the game, and may find themselves at a loss. Should I give them hints? Should I direct them to the tutorial? Should I charge extra for hinted stages?
I found René at the gym and showed him what I had advanced from the sponsored stage. Since he hadn't done the tutorial, he didn't know how to complete his own sponsored stage! It's clear that some assistance is needed. Perhaps this is a good task for tomorrow.
In the work done today, I came to realize that I'm not intending this to be a play-and-forget game, because if I get many sponsors, I need to add "unsponsored" stages to balance the ratio, and both sponsors and myself want previous players to come and play the new stages. The answer to this is notifications, but this is a complex issue and I need to wait until the game is released, for my own sanity and because I should not scale prematurely. But I will put the question on the back of my mind:
2. What are the best way of notifying people that new stages are available?
***
Enough tasks have been set up. I'll see how this shapes up for tomorrow without making and specific plans.
Sunday. I optimized for mood rather than productivity. Again, I'll follow up on the questions I asked myself yesterday:
### On mood
1. <del>Is it worth trying to influence my mood at this time? Or shall I simply work through it until I release the game?</del>
I optimized for enjoyment by biking to libraries, sunbathing at retiro, meditation, evening at the spa. It reminded me of my first months writing worklogs: the events of the day take precedence over actual work. This is perfect after the game is released, when work requires less prolonged periods of deep concentration.
The answer that came from experience is: wait until the game is released. This question is answered, I will accept my mood as it is, and will cease introspecting on it until the pre-requisite is completed.
### On my workplace
1. <del>What can I do to bring the pleasures of home into the library?</del>
I was sitting next to a floor-to-ceiling window, and I observed crowds of people go by. I took out the tea I had smuggled in, and enjoyed watching the crowds for the length of the tea. It had been so long since I had done this! But I need to buy a thermos, because the one I found at home was small and it leaked.
I think this question is answered, there is little else I can bring into the library. I fixed my bike today, so the walk to the library will be reduced and I will be more encouraged to go there.
I will also try to add the gym as a workplace. I haven't been able to eek out a good work session there, but I think it's because I try to do it _after_ the workout, I'll try _before_. So the new question to be answered is:
1. Is the gym a viable workplace?
2. What can I do to reduce distractions at home?
Decluttering done. I can already sense more calmness. I think simply closing the door of the office may be a good psychological hack. I don't leave my seat at the library for hours, I should be able to do the same at home.
### On work
1. <del>If the sponsor wants to share his stage on social media, many people will not be familiar with the game, and may find themselves at a loss. Should I give them hints? Should I direct them to the tutorial? Should I charge extra for hinted stages?</del>
It's very easy to add tutorial code, so the answer is yes, in some way. Today I worked more on the tutorial code, it's shaping up nicely. I consider this question answered.
1. What are the best way of notifying people that new stages are available?
Withheld until release.
I came out from the library, and I was unlocking my bike, when an idea came seemingly out of nowhere: I can charge by month, through Patreon. Advertisers can use marketing pixels if they are proxied through my server. I can hire someone to implement sponsored stages, it is not hard. I jumped on the bike and despite navigating through traffic I couldn't take this idea off my mind. It makes a lot of sense: I have two needs, one is the immediate need of money, and the other is a recurring income so that I have the freedom to pursue passion project without the worries of monetization. The first month I can offer a liftime account for a fixed price, and worry about recurring revenue after the launch, and only implement it if the game is succesful. So I put this in the format of a question:
2. What is the best way to monetize through recurring revenue?
***
Good day after all, in the upcoming week I'll ramp out for release.
Monday. I woke up at 5:30 AM and despite feeling tired I couldn't get back to sleep, so I set myself to work. It seems I'm almost done, but it's strange: just yesterday I has the feeling I was weeks away from release. I won't fret about the release date, I'll just know when it's done.
### On my workplace
1. Is the gym a viable workplace?
I didn't try this out today, I was working quite well at home so I let it be.
2. What can I do to reduce distractions at home?
Yesterday I committed to closing the door of the office as to reduce the interruptions, but I found myself mindlessly opening the door as if nothing. I then put an obstacle on the door and I surprised myself yanking at the door forgetting about the obstacle. I was amused at the realisation that I forget myself so throughly when I'm at work, it's the opposite of presence. I'll continue the practice of working with the door closed with an obstacle, not to prevent myself from leaving the desk, but just to remember I inhabit a real world.
### On work
1. What are the best way of notifying people that new stages are available?
Withheld until release.
2. What is the best way to monetize through recurring revenue?
The idea is maturing, but I'm not finding the right tools. Patreon rewards can't have a set-up fee, so If I charge $50 USD per month and the patron cancels on the first month, then it will not be worth my time. I'll have to investigate on PayPal subscriptions or something
***
Though I find this format useful, I don't particularly enjoy writing it. It feels too much like work. I think I'll simply add a "questions on the back of my mind" at the end of each work log.
Tuesday. I woke up at 6:00 AM and put myself to work. It's a blur, but I remember very well transitioning between feelings that the game is almost ready, and that it's weeks away. {{Co-workers see my work}}
The dream pointed at the cause of the shift of feeling between completeness and incompleteness: if I didn't care about my colleagues opinions I'd remove all the auxiliary stuff that makes it a "good product" and I'd be done with it. But I care too much, and this is not virtue, it's attachment to results. What's more: my coworkers weren't even criticising, nothing bad happened, they were just playing the game but I knew how much was half baked.
Lately I find myself quarreling with imaginary people who point out at this or that defect, and I respond to them "fuck you, you don't know how hard this is. Think you can do better? Be my guest. Can't do it? Go back to posting your vanity shots on Dribbble, asshole". Every creative endeavor brings it's share of critics. The internet is full of good people, but unfortunately it's the assholes who are the loudest.
After this dream I sat down to meditate, and I found a tremendous amount of relief in it. It was finding a warm, cozy shelter in the middle of a storm. Marcus Aurelius image came to me repeatedly, I recalled he writes about an inner shelter in which one finds comfort in difficult times. I was looking for the quote, but I found this snippet which is appropriate for this time:
> But perhaps the desire of the thing called fame will torment thee.- See how soon everything is forgotten, and look at the chaos of infinite time on each side of the present, and the emptiness of applause, and the changeableness and want of judgement in those who pretend to give praise, and the narrowness of the space within which it is circumscribed, and be quiet at last. For the whole earth is a point, and how small a nook in it is this thy dwelling, and how few are there in it, and what kind of people are they who will praise thee."
Five years ago, in storms of very different nature, I used to "translate" the meditations into my own language so I would understand better. I'll make an attempt:
> If fame torments you, see how soon everything is forgotten. Put yourself in the present, look forward into the future, and back at the past: it's only chaos. The present is all you have.
> People applaud because the person next to them is clapping, not necessarily because they liked the performance. Other people pretend to give praise because they expect favorable judgement in return. Even if sincere, praise is necessarily narrow: your entire professional domain is but a drop in the ocean of knowledge, and your field is just a cluster of molecules. Understanding this, all praise is insignificant.
Ahhhh relief. It's time for bed.
### Questions I'm asking myself
1. Is the gym a viable workplace?
2. What can I do to reduce distractions at home?
3. What is the best way of notifying people that new stages are available?
4. What is the best way to monetize through recurring revenue?
4. *Added:* Where is meditation practice leading me?
Wednesday. I woke up at 9am, because I went to bed very late. I was finding trouble concentrating, so I sat down to meditate. I dozed off for a couple of seconds, and a dream presented to me:
{{A few screws loose}}
When I grabbed the bag I came back into the meditative state without transitioning to the waking state, and it was a novel sensation. I immediately knew the meaning of the dream: my screws are loose and it's possible that they get lost.
I then grabbed the bike to the library and had some solid hours of work. I dedicated most of the time to Emojinote's sponsored level. I spend a considerable amount of time on it with the knowledge that with this stage I'm not only selling Emojinote, but sponsored stages to possible clients. When I met up with René at the gym I was glad he liked it.
I'm coming closer and closer to release, and I see new possibilities sprout out. I will withhold them and polish what I have. I admit to being immensely tired, but it's not burnout tired, I'm not fed up with what I'm doing but I look in the mirror and there's bags under my eyes, I'm so up in my head that I notice that even my gait has lost it's rythm.
What I want most is to come back into the world, to be able to enjoy walks in nature, to be present, to pursue breadth instead of depth in projects, to learn things outside of my field that hold no relation to work, to reconnect with my spiritual practice, to fall in love, to make new friends, to broaden my horizons.
Indeed, I'm glad I'm coming to this conclusion, because I was setting up a roadmap for the new features that could come up. Instead, the roadmap is to wind down work and come back into life. The recurring revenue question has been answered.
!!! Questions I'm asking myself
# Is the gym a viable workplace?
# What can I do to reduce distractions at home?
# What is the best way of notifying people that new stages are available?
# <del>What is the best way to monetize through recurring revenue?</del> Recurring revenue is recurring work. Avoid.
# Where is meditation practice leading me?
Thursday. I woke up at 6am. I spent an inordinate amount of time with a simple widget, trying to design it in code, but in the end I jumped into Figma to prototype it and then implement it. I was not in a designerly attitude but, since I was already started I worked through it. I must remember to work according to my disposition.
At lunch time I went to the gym, and finally understood how it's meant to be used combined with work. I went to a yoga class, then worked for about two hours, but my concentration was not great but I advanced, then I worked out, then I felt compelled to work again but I was getting hungry, so I relaxed at the sauna and came back home.
The understanding was this: as long as I don't have tasks that require deep concentration, I can alternate work with exercise and relaxation at will. This will be best put at practice when the game is released.
I came back home and had a nap, this time without any dreams, and when I woke up a deep sense of gratitude came again, as in some days in the past. I felt the game was going to be successful, but the feeling didn't cause ego inflation, it caused a desire to get in touch with the people who have been involved and make them part of the success. This celebration is premature, of course, but it was a great source of motivation to imagine sharing good news.
I had always been perplexed at the expression _being humbled by success_, and I understood it as coyness of being in the spotlight, but I think I've glimpsed into the true meaning today. I'm finding it awkward to write about success without having it, but these things are simply observed and registered as facts without passing judgement. Nothing that you feel is wrong.
In completing the game I've lost some performance because of glut. I was getting concerned about it, because I could see the experience suffer from jittery frame rates. I don't remember when the idea came to me, but I realized that I could render paper.js elements on a canvas, and then animate the canvas with the GPU. I tried this out this night, and it gained some smoothness on desktop. I was not sure it was worth the hack until I opened it on the phone: it was buttery smooth!
It will take me probably an entire day to complete the performance upgrade, but it's completely worth it. I will get native-like animation performance from it.
!!! Questions I'm asking myself
# <del>Is the gym a viable workplace?</del> it is, for tasks that don't require deep sustained concentration.
# <del>What can I do to reduce distractions at home?</del> The distractions are mostly in my head, I've optimized what could be optimized.
# What is the best way of notifying people that new stages are available?
# Where is my meditation practice leading me?
# Where am I going in April?
Today I worked on a Keynote presentation. I hadn't used it before, I used to do all my presentations as pages in Sketch and then export to PDF. This works good for me, but this time I needed video.
When doing public speaking I usually present my own work, so I need to jump between the PDF and a web browser. Most of my work is heavily interactive, and this lends itself to a lot of real-time mistakes. I'm clearly no Steve Jobs on the stage. I fumble, mumble and tumble. However I think people prefer my awkward style better than an eye-glazing powerpoint presentation. It's the difference between seeing a drawing painted live rather than after the fact.
It's late and I'm tired today, I'll be brief:
- Today I ceased smoking. I don't call it quitting, because I often come and go. With less attachment it's both easier to quit and easier to come back. I still write it down here because it becomes _work_ in itself.
- Concerning meditation: I meditated during one hour, before leaving home to work at the library. Then, at the library, I could enter the meditative state almost immediately. In fact, I can still do it at this very moment. This capacity fades if I'm not persistent.
- I was coming back home from the library, and since it's a long ride (one hour by bike) I put on earphones for the first time. I listened to @naval's podcast, which I enjoyed, and then I put on music. I was pumped up, and went full throttle on the bike. What a rush! I'm usually more measured with my energies, too much physical extenuation brings the mind down with it.
But it is springtime, and today was one of the first truly warm days of this year. So fuck conservation of energy. Blossom like nature does after the cold winter.
Friday. I woke up at 8am. I had some troubles finding focus, it seems that everything that remains to be done are things which I don't particularly like and I left for last, but I'm finding ways of getting enjoyment out of it.
I had originally implemented sound with a homebrewed solution, but I've seen that cross-browser consistency is a pain in the ass. Safari Desktop had some glitches which were different from Safari iOS, but Chrome and Firefox were performing as expected. In the end I replaced my homebrewed solution with howlerjs. I was quite surprised that I didn't even have to change the code I implemented! Since sound controls are very standard it was almost a drop-in replacement, and I got consistent behavior across platforms and browsers.
After lunch I went to the gym to work, I took coffee and was productive. I hit the gym, then went to yoga class, worked some more, and then hit the sauna. When I came out of the gym I felt a different person, it never ceases to strike me just how much exercise changes my mood. I remember my ex-roomie once suggesting I might suffer from muscle dysmorphia, I laughed at the suggestion: I'm just being chased by depression and this is the way I outrun it.
Since nearby libraries are closed, and I've found how to work at the gym, it seems this will be my workplace for the next two days. Today an old app idea resurrected from the graveyard: I register my progress in a notebook, and I want to do this on the phone, but I'll wait for the intention to mature before even putting thought into it.
Regarding the question: "What is the best way of notifying people that new stages are available?", I've come to a conclusion: it's not about new stages, it's about communicating what I'm doing to whoever might be interested, through the channel he or she finds most convenient. This includes social media, so I'll probably open a Facebook, YouTube and Instagram account for Method of Action, and I will treat them as notification channels in addition to email and RSS. I will make it clear that these are not geared at content since I'm not competing for attention, I'm simply using them to tell people something interesting has been released. I'll probably post something twice per month, tops.
_Where is my meditation practice taking me?_ no longer seems relevant. I'm doing it every day and I'm seeing very positive effects, and one of those insights is that knowing where it is taking me is utterly unnecessary, it's a question of the ego who thought the water temperature might be disagreeable, but it wasn't.
_Where am I going in April?_ Sam and his wife come back early April. They generously borrowed their home while they were away. I have one month left to find another dwelling. I had put off the task of even thinking about it, because the game is not released and I might need to go back to Mexico, but as success is in the air, it was only today that I sensed where is my next move. But I'll withhold the answer until success ceases to be a fantasy. So I've answered all my questions, for now.
It's time to quiet the mind and make a push this weekend, hopefully I'll have it ready early next week, _inshallah_. All questions answered, writing work logs doesn't even seem necessary. I guess I'll just mark them as one checks a box: work was done.
### Questions I'm asking myself
1. <del>What is the best way of notifying people that new stages are available?</del>
2. <del>Where is my meditation practice leading me?</del>
3. <del>Where am I going in April?</del>
This log is intentionally blank.
I experimented with not writing work logs to see if the mind calmed down, it did not. I'm moving through tremendous resistance which I found strange, there seems to be something within that doesn't want to be finished. Any conclusion would be speculation and it's not worth inquiring into the _why_. I will simply continue with the _why_ in the background.
I got a lot done, but most of it was writing. I had been putting off doing it because I never felt in the mood of writing, but now that I'm approaching release it became urgent, it's become much easier than before.
However, it is not without it's quirks: my writing now resembles my worklogs, but I've learned to work with it. I let the words flow out, I allow it to take detours, and when I'm done I put it in order.
Something which also presents difficulty is writing things like "you can contact me" or "you can contact us" or "you can contact Method of Action". Hmmm, now that I write it down it seems the correct option is the last one.
I wrote "Method of Action is the creative endeavor of a human being, so I communicate as a human being", perhaps I ought to give it more thought. But no time for now, the first person is what and I will leave it _as is_.
When I was done with all this writing my mind was in a state of chaos, so I went to the gym, and after the workout, an older man came into the sauna and greeted a younger man already there. They begun chatting, and the topic turned towards feminism. The younger man begun whining about the state of things, and the older one, with great skill, defended the cause with compassion.
I was mystified, because I identified with what the younger man said, but from the exchange it was obvious that the man who was in the right was the older one. He invited the younger man to the presentation of a book on gender violence during the Roman period next Thursday, the older man turned out to be a scholar and a prolific author on Roman Law, and he would present the book of one of his most talented female students. I barged in the conversation and asked if it he didn't mind that I attended, to which he responded positively.
Some days ago I participated in a discussion on minimum guaranteed income and the discussion was quite acrid. I don't hold strong views on the issue, but the fact that the person was strongly arguing against it made me polarize to the other side. Some days later, the same person posted an article on _the ideological Turing test_: if you can convincingly argue for the other person's side, then you are not an ideological robot. Things connected and we had the same discussion, this time roles reversed, and it was much more instructive than the polarized discussion.
I feel, regarding feminism, the same thing has happened to me: since I've interacted with people whose views are quite extreme, I have been pushed to the opposite camp. I know intuitively that it's a bag of very important issues mixed with superficial ones. That it has done great good and great harm, but when I try to think of the "great good" I have difficulty to come up with an answer, while the "great bad" flows out naturally (hence my identification with the younger man's whining).
So I'll surely attend the event next Thursday.
I spent the morning working on [Emojinote's landing page](https://emojinote.app), I surprised myself being quite agile in the implementation, it seems I've leveled up in front-end. As I've been consistent at the gym I see a parallel effect: skills which were gained a long time ago are easy to regain, what is difficult is breaking into new ground. After I was done I found the greatest difficulty getting engaged with Boolean work and drove myself miserable, so I went to the library to see if I would find better concentration, and the usual happened: after 30 minutes of resistance I found flow, and I left the library with my hopes restored.
The finish line is just up ahead, but I find myself hesitant to cross it. Funnily enough, the thoughts that arise are not of self-doubt, they are about being uncomfortable in the spotlight. I suppose it's a positive forecast, but I can't help but notice any kind of expectation is useless. One just has to do the work that needs to be done and deal with the effects as they happen, stressing over outcomes is useless stress. But these things are met with acceptance, I knew that coming to the finish line would be the most difficult part.
A day of extremely low energy without an evident cause. I shared the game with two people whom are not related in any way to the design community, and they "didn't get it". It didn't put me down, and I did gather some useful feedback. I've been debating wether to create a landing screen or to simply throw users into the game, and the feedback made it clear it requires a bit of context for the casual user.
I went to the library, this time it didn't do its usual magic. I meet my mood with acceptance, but I'm exhausted. I wanted to be done today, but I intend to release tomorrow. Let's see how it goes.
A strange thing happened today: I spent the morning beating around the bush, not procrastinating but spending time on non-essential things: performance, tweaks, and such; not really wanting to tackle the big things for the release. As I wasn't progressing and feeling quite miserable, I took work to the library, and I set myself to implement the landing screen, but no amount of effort put me beyond the title. I was exhausted and complaining to myself.
Then I remembered an experiment I had done weeks ago: that the logo would be constructed by the game itself. The experiment was thought as a stage, but it presented many problems and I abandoned it. This time I found the same problems, but as it was a perfect fit for the landing screen I just flew through it. I flowed like I haven't flowed in weeks, and I left the library in a very different state of mind: hopeful and energetic, despite having pushed the release later (again). I find tremendous difficulty in implementing work I don't like, but when I like what I'm doing it emerges naturally and it revitalizes the soul.
So I'm not done with the landing screen just yet, but I'm happy with the result, and wondering just how work can drive me both crazy and sane, depending on the approach. Exhaustion comes from resistance to work rather than work itself. I'll keep on exploring this phenomena.
I didn't sleep well and woke up at 9am. I groggily put myself at the desk, and was about to procrastinate, but I saw yesterday's work log still open and though: I just need to jump in the water, and very soon I resolved things that last night would elude me. I then took work to the library, and again, I became deeply engrossed on what I was doing.
I came back home for a nap and woke up feeling as if had been resuscitated from a coma after being bludgeoned with a bat. I took myself to the gym for yoga class, and feelings turned towards the mystical. The spiritual thirst seems to have come back in full force. I sense that it is not a fleeting fancy, but I must let it mature a bit more to see if it's my next calling.
The game just needs tying some loose ends and it will be done. By now I've learned better than to set myself hard deadlines, but Monday would be a good day to launch it. I guess it will be another week of frenzied work, but after that I hope to be able to put it in the background and reclaim the life I've put on hold during these three months. I just checked and Monday 11th of March makes it three months since I begun writing daily work logs. A good day to launch, indeed.
I don't know if time has passed quickly or slowly, at this precise moment I recall so many varied experiences, moods and dreams that it feels like years since I begun, and at the same time all of it is a blur. Have I enjoyed it? Yes, though I've tormented myself much more than I needed to. There's a tremendous amount of lessons learned from this period, when I officially put the game into the background I'll come back to my work logs and extract the knowledge gained and distill it into an article.
Today I came to realize that many of the things that are crucial for me to enjoy and be successful at work are a recipe for disaster for other people. For example, I prioritize flow over all things: I only `git commit` as a checkpoint before embarking on major changes, and even then I only remember `git stashing` once. The few tests I wrote were abandoned long ago, and to this day I'm still changing and breaking things, you cannot test when you don't know what you're building.
But what's the point of writing an article that distills knowledge only useful to you? I think this question connects to a larger question I was asking myself earlier in the day: if spiritual work is also work, should I write about it? Oh my, so many questions, let us finish first, and then sense from experience.
Workwise an uninspired day. The highlight is that one of my beta testers came back to me with a very interesting (and major) bug. Same browser, same codebase, made sure everything was in the same condition and I couldn't replicate. After much thinking, it is either a problem of pixel density (pixelRatio), or of platform, because he was on a Windows machine. But neither of these make sense to me. What was interesting to observe is that as I discarded all the usual and even unusual possibilities, the problem grew more and more interesting.
In the evening some people from the meetup groups that I attend invited me to dinner and movies at their place. Little do they know I've been a hermit for the past three months, and I was concerned that my behavior would be "off", but it turned out to be just fine and I greatly enjoyed myself. I felt flattered at the invitation and I shall surely return the gesture.
As I'm finishing this period it seems life is providing clues as to where to put my attention next, and so far I've gathered spirituality and friendship, I'll keep myself open to experience, because some things can't be projected by reason, they have to be perceived by sensing them. I want to be finished to put more time into this.
I wont plan for tomorrow. I know what remains to be done and it's simply a matter of getting down to it.
By now I'm amused at my avoidance at tackling the bigger things, I've spent the day staring at what the important things that remain, but no amount of effort would get me through it, so I spent most of the time doing unimportant things. I'm not sure I'll have it ready for tomorrow, my plan is to go to the library and see what happens.
I don't want to force things to happen, usually the avoidance gives way to more elegant solutions, but I'm also eager to finish and the conflict is taking it's toll. Release brings an extra leg of work, and I need to be in the right frame of mind to do it. It seems all this stress is optional, yet I haven't found a way of avoiding it.
There's a kid who is hesitating to make the jump off the board and into the pool. I could push him, but I'm waiting to see if he can muster the courage to do it on his own.
I could have launched today, but there's no point. It's a good time to announce, but it's late in Europe and I'm getting sleepy. I'll use the day of tomorrow to polish things off and get some rest to be in the right frame of mind. Though I fully admit it may be false bravado, the shadow has ways of hiding from awareness that would elude the most meticulous detective.
This morning I woke up in a neutral state, quite early. I did some work and decided it would be good to work in the library. As I was packing up, out of nowhere I felt butterflies in my stomach _am I nervous?_, no, I felt... I felt in love. How strange. I walked to the library dwelling in the sensation, enjoying it. As I worked the sensation transmuted into focus and then clarity. By now the sensation is gone, but it was pleasant.
I'm surprisingly calm today, I'm equanimous regarding results: _que sea lo que Dios quiera_. I've put forward my best effort given my current circumstances and my current knowledge. I notice many things that could be improved, but these kind of projects are usually tackled by teams of specialists. If I could do this by myself it's only because I've relied on what those saints called _open source developers_ have built before me.
But I am also concerned about a midway success: the path is clear both in failure and success, but the middle ground puts me in an ambiguous situation. Though I know it useless worrying about this, I find my thought gravitating towards the scenario where I have to produce another project quickly, and I wouldn't be able to muster the energy to accomplish it. I'll consider take the way of failure then, the only difference is that I'll be in a better financial position to handle it.
The game was released an hour ago. It's still too early to know if it will catch on, in fact I feel as if it won't, but I know all too well that I always feel this way when I release something new, perhaps as a buffer for disappointment.
Initial reports: it's difficult. I'll see how I can ease the learning curve, nothing kills a product faster than frustration. I'll go to bed now, I'm too tired to fix anything anyways.
Well, the game is not released yet, but I'm happy. I had the strangest day: I put myself to work, wasn't finding flow, took work to the library, couldn't find it there either, and I walked backed home dragging my feet. Never had I felt so defeated, and no amount of detachment brought me consolation.
I went directly to bed but I couldn't sleep. I had a very brief dream:
{{What are you going to do?}}
I had lunch and felt sleepy again, but my sleep was very light and restless. Finally I put myself in front of the computer and little by little I gained momentum, entering flow as to lose track of time, and when I thought _I could release this as it is_, I got up and prepared myself tea, and pondered the situation: it was 11pm, a good hour for release.
The Tao Te Ching came to mind:
> Do you have the patience to wait till your mud settles and the water is clear?
> Can you remain unmoving till the right action arises by itself?
> The Master doesn't seek fulfillment. Not seeking, not expecting, she is present, and can welcome all things.
I went back to the desk and decided I'd continue working until midnight, then I would decide upon the release. When midnight struck, I knew my decision to release it came from a different person who was exasperated with the project. It needs to be released soon, but it doesn't have to be today. Work never ends, there's then thousand things that can be improved, so the decision of releasing has to be deliberate, but it should arise from stillness and not from frustration.
From happenstance I came across a quote which resounded with me:
> The hardest part about this or any endeavor--finding the courage to call it out or claiming it as your art--the hardest
part is that moment in the making when you discover that
you, the maker, are implicated in your own work; that the
work reflects on you--the part of you that is hidden
inside--that you are hiding inside, you hide this inside.
--Truong Tran, from The Book of Others
I'm sitting at the barbershop waiting for my turn for a much needed haircut. I set myself to work, but I don't have internet, so I decided to write my work log even though the day is not over yet. Both mind and body gave out today, I woke up with a cold and a mental haze accompanied by a slight headache, reminiscent of a hangover. I checked the stats for the release: below what I expected. I was equanimous about it and actually relieved that there was little attachment to the results, but also concerned: in the possible scenarios I hadn't seriously considered I might make zero revenue from the whole endeavor, but it's just a matter of asking for help.
In this state I was able to get very little done, fixing bugs here and there, but the relatively cold reception indicated an underlying problem: on the web it's as easy to gain visitors as is to lose them, and some of the feedback I've gathered is that _the game is difficult_. In creating the game I shortened the tutorial as much as I could, because tutorials suck. But one of the last things I did was add a "tutorial toggle", so that you can turn it on or off, and I hadn't put both together: it is not necessary to have a full tutorial at the beginning of the game, just have a single tutorial stage and then the next three stages or so can be related to the concept just learned. In this way the difficulty curve is eased and the chore of learning full instructions before playing is reduced.
When I came to this conclusion I was glad that the game didn't caught on as much as I wanted, because it would give me time to restructure the stages.
***
The barber did a meticulous job on the hair that's left on my scalp. I can't help but notice I sacrificed a lot of hair to this project. I shaved my beard too, and it's strange looking at myself in the mirror.
***
I implemented part of the idea of breaking up the tutorial into the places where you need to learn the concepts, and it seems to be the right path. I will finish it tomorrow. Thought has turned sharply towards spiritual/philosophical matters, and I feel more and more compelled to write about it, even if it would premature at this stage.
I've been reading Goethe's Theory of Colors and his approach to science struck me as deeply original: he sets out a series of experiments, for example: light a candle next to a window near sunset. You will observe two shadows, one from the light coming through the window, the other from the flame. The shadows are of different color. And he goes on with these experiments, and from here he gathers a generalizing principle.
Goethe argues passionately against Newton's Theory of Color, though time has put Goethe on the losing side of the argument, but I'm not convinced he was entirely wrong: Goethe's approach has to do with how the mind and the eye perceive color (the subjective), while Newton's approach studies light itself (the objective).
As scientists come to study consciousness, they are doing it from the place it yields less results, from the phenomena observed through instruments. They will put someone in a brain scanner and stimulate his senses so that they see where brain activity takes place. While it's surely useful finding the material correlate to subjective experience, it doesn't tell you anything about the experience itself.
The parallel I see in design is our crude attempts at making it data driven. You could argue that alignment has no value because it doesn't have a behavioral correlate, but even to the untrained eye the pleasure perceived from experiencing something well arranged is evident. Designers are well aware that most of our work cannot be measured in a meaningful way, and there's a couple of radicals that say that things which cannot be measured do not exist, but Goethe's approach struck me as valid: do the experiments, and see from your experience if it is true or not.
I'm just scratching the surface on these ideas which have an application well beyond design, but I'm toying with the idea of first replicating Goethe's experiments (he insists on this vehemently), keeping in mind that I'm not only learning about the nature of color, but also learning his method of dis-covering subjective experience. Ultimately, the application of this goes well beyond the field of design, but I must first come to an understanding within the field I know best.
I'll pursue sideways, as a distraction from current work. This narrow view of the world as a single project has proved to be insufficient for a healthy mind.
_One of Rudolf Steiner's [exercises for spiritual development](https://en.wikipedia.org/wiki/Rudolf_Steiner%27s_exercises_for_spiritual_development) involves journaling backwards, from the end of the day to the beginning. The purpose for this is not clear to me, but I thought it was an interesting creative constraint. Reader beware._
I sipped my tea and sat down to write my work log. I had just read about Notre Dame's fire and a great sense of loss invaded me. Usually I'm oblivious to world events, so this feeling took me by surprise. It's a tragic loss of one of humanity's cultural jewels.
Moments ago I was cycling back from the study hall. I was pedaling along a cycling path at the edge of the city, and I could see sheep grazing the spring-time green dehesa of the outskirts, with the sun coming out some clouds to reach the horizon. It was exhilarating, it had been a good day combining focused work, chores, meditation, exercise and a sense of hope in the future.
The study hall was small and and somewhat vandalized, but I found a good isolated spot to work, and the students there were focused, which inevitably compounds on me. I dedicated the session to work on write.now, and since this is coding work I was able to forget about myself, and immersed into the task with great flow.
The study hall is a large building where I hadn't been before. As I arrived late I didn't have a chance to explore it all (which I usually do when I come into a new workplace: I want to know exactly what the facility offers), but just arriving I knew this is perhaps my perfect workplace: the building is a _centro de interpretación de la naturaleza_ a small museum of sorts which doesn't have a collection, but instead offers information on nature.
At the entrance there's a garden with native species (chestnut, pinus pinea, lavender and other plants which shapes I recognize, but names I ignore). The garden might seem unkempt at first sight, but it has its natural charm which no human hand can give. There's picnic benches under the larger trees, perfect for having lunch.
After the garden you enter a courtyard flanked by three buildings: one is the museum/study hall, another is a small chapel, and the third I'm not sure (door was closed). I entered the chapel and found a very quiet place perfect for meditation. By now I knew I didn't care about the condition of the study hall, the amenities would make up for any bad conditions.
I had come to this place because the closest study hall closed early, because it's easter week. I didn't know about this, and just as I was getting into the zone I observed most of the people packing up and leaving at 6pm. I asked what was going on and I was told it was closing soon. So I grabbed my bike and pedaled an extra four kilometers to get to the next study hall, and I'm glad I did it.
Before leaving for the first study hall I sat down to meditate, but soon I was dozing off. I find the experience of dozing off in meditation quite interesting to observe: you are observing your awareness, say, your breath. When you get distracted in meditation your attention wanders and you begin thinking, but when you doze off attention doesn't wander, it dissipates and you begin hallucinating. It's like ethereal dreams which don't quite have visuals or language, I can't say what exactly are they, because there are no symbols involved, but _things happen_. {{To kill or to integrate}} I will surely welcome ancient Morpheus when he arrives in meditation [what a great loss to override ancient archetypes with modern ones, but perhaps this is the only way to keep them alive].
Before the meditation I found my bank's token for online banking. I had searched it everywhere, and I was very worried because losing it would put me in a tight spot. I am quite disorganized, but there's an underlying order in my disorganization, so I had an "electronics, arts and gadgets" suitcase where it *had* to be, but it was nowhere to be found. I searched the rest of my suitcases, completely emptying everything, but I couldn't find it. I had given up, and I picked up a document binder where I have my passports and important papers and thought: "there's a chance I may have thought _let's put the really important stuff that I can't lose in the same place_" and there it was!
I was reminded of a time when I had to recover a very old Yahoo account, I could only get access by answering my secret questions. I was presented with a question I had no idea why I had chosen: _what was your favorite food as a child_. Either I had forgotten, or 17 year old me was being clever. After some deliberation I decided it was unlikely I had forgotten. So I had to think like my teenage-self. Closed my eyes, breathed in, breathed out, regression to my teenage years. I opened my eyes and wrote "pussy". Access granted.
I'm writing this work log the next day: I went to yoga and came back so relaxed I went directly to bed at 10pm. I met Isa for lunch, and part of the conversation turned to a topic which I hadn't inquired into: some people seem to move more comfortably in uncertainty. Not knowing what the future will bring seems to serve a two-fold purpose: not giving up on the range of possibilities life offers, and keeping spontaneity alive.
The lack of direction seems to unsettle some people, they get nervous for you, and they seem obliged to help you "figure things out", but there's nothing to figure out. Sometimes we have to pretend to have things figured out in order to let people be at ease.
I see this happen in my creative endeavors too: setting up fixed points makes things difficult to change later on, and I only come to commit myself to certain decisions when the constraints mandate that there must be fixed point in order to advance.
As I'm redoing part of the game flow I find myself in this uncertainty again, and I'm debating wether it's a net positive or a negative. I'll try to do the opposite of what I usually do in order to experience it: commit to a path, walk it in faith that it's the right choice, and see what results.
I debated wether to write this as an article or as a work log, because enough pieces have been collected arrange them into a coherent piece, but I decided against it: trying to produce something out of experience brings about exertion, and I'm quite sick as to expend any energy.
I first noticed something was wrong in the morning: sensing my sickness was a simple cold, I went to yoga, and though the workout was especially light, I was feeling dizzy. I came back home and had a three hour nap, and woke up feeling beat up. I tried opening a jar of chickpeas and I felt a sharp pain in my shoulder, not the kind where you tear muscle, but simply a magnification of body aches.
With my nose and ears stuffed I stood up and remained still, and pulses of vertigo come accompanied with a higher pitch of tinnitus, and decided I had to go back to bed. I laid down and felt miserable, I had already slept so finding sleep again would prove impossible, so I put myself in front of the computer. Not surprisingly, I couldn't put myself to work, but I remembered my days in college where I worked through sickness with ease: was it simply youth or there was something else at play?
I decided to try taking work to the study hall, and was surprised to find myself quite focused. It's as if the mind preferred to focus on work rather than how it feels. It was interrupted by bouts of coughs and a runny nose, but I thought it was remarkable that one can use work to avoid these feelings.
I recalled reading Solzhenitsyn's account of writing the Gulag Archipelago under the most harsh conditions. Since he didn't have access to paper, and even if he could somehow smuggle it, getting caught would be disastrous, he took to memorize everything he "wrote":
> I started breaking matches into little pieces and arranging them on my cigarette case in two rows (of ten each, one representing units and the others tens). As I recited the verses to myself, I displaced one bit of broken match from the units row for every line. When I shifted ten units I displaced one of the "tens"...Every fiftieth and every hundredth line I memorized with special care, to help me keep count. Once a month I recited all that I had written. If the wrong line came out in place of one of the hundreds and fifties, I went over it all again and again until I caught the slippery fugitives.
> In the Kuibyshev Transit Prison I saw Catholics (Lithuanians) busy making themselves rosaries for prison use... I joined them and said that I, too, wanted to say my prayers with a rosary but that in my particular religion I needed hundred beads in a ring...that every tenth bead must be cubic, not spherical, and that the fiftieth and the hundredth beads must be distinguishable at a touch.
> I never afterward parted with the marvelous present of theirs; I fingered and counted my beads inside my wide mittens--at work line-up, on the march to and fro from work, at all waiting times; I could do it standing up, and freezing cold was no hindrance. I carried it safely through the search points, in the padding of my mittens, where it could not be felt. The warders found it on various occasions, but supposed that it was for praying and let me keep it. Until the end of my sentence (by which time I had accumulated 12,000 lines) and after that in my places of banishment, this necklace helped me write and remember.
I was quite surprised by this story: we eternally fiddle with our work setup, finding fault in this or that. But when work is a refuge from hardship, any set up will do.
When you're sick you're told you should "rest", but what is rest? Avoidance of toil, effort, stess, exertion. If you can avoid this while working, then work becomes as good as a movie for distraction from sickness. I put around two and a half hours before feeling it was enough, and I felt better afterwards.
At night I had a fever, and in feverish dreams I was still trying to resolve what was wrong with the game. Interestingly enough, I came up with a theory in my dreams which I may attempt to verify: the inter-stage score screens are messing up the dopamine rewards for people to become engaged.
I'd never express design in these terms if I weren't in a flu-fever, and when I woke up in the morning the idea of the game as a slot machine was mildly repulsive, but as the day went by, a new game flow unwillingly designed itself in my mind, and it may prove to be good for engagement.
For now, I have broken the tutorial apart, and the guided stages only appear before you need to apply the concepts. This is all I can do given my current circumstances, and I will publish these changes today after further testing.
I think I'm over the worst part of the flu, even though last night was rough, the day was better than yesterday. It's too early to see if this is a pattern. Though yesterday I avoided the sensations of illness, there was a moment last night where I couldn't sleep, and I sat down to meditate: _bring it on, I want to feel everything_. And so I quieted the mind, and the tinnitus grew louder and louder, and all sorts of auditory effects were produced. I brought awareness my body aches, and discovered they weren't all that different from a good workout. But the most interesting thing I discovered was that when you bring awareness to a headache, not only it ceases hurting, but when you lose the awareness the pain reminds you to come back to it.
And then, finally, I came to the center and was surprised to discover that the inner refuge was still standing. I became still for a long time, and the tinnitus, the stuffiness and the aches completely faded away, and after a while in silence I sensed I would be able sleep. Many spiritual traditions say illness can be a great teacher, I just scratched the surface here, but it's useful to see avoidance is not the only option available.
_I've grown tired of writing about myself. I'll try a streak on writing articles arising from the experience lived in the day. Since these articles are written in stream of thought they will surely have a rambling quality. Reader beware_.
[Do things. Tell people.](http://carl.flax.ie/dothingstellpeople.html). Some people enjoy tinkering in solitude, eyes behind their shoulder makes them nervous and takes out the pleasure of creation. Let's call these _makers_. The other side likes the sensation of _having created_ rather than creation itself, and you will find them selling things that don't exist yet, in hopes that the interest will bring them enough momentum to actually work on it. Let's call these _sellers_.
It's easy to fall in love with makers and hate sellers, but as usual reality is a bit murky: the seller is also responsible for most of the products that we have today. The seller is the person who builds the landing page before the product in order to gauge interest before building. It's the person that seeks investment before building because he or she doesn't know the joy of brick-laying.
To the superficial observer it may seem obvious that the maker needs the company of a seller, so that they may live in a symbiotic relationship. Unfortunately this causes the same arrangement of the mind and the body in an individual: the mind thinks he's the master of the arrangement: _I sell, therefore I exist_, he says to himself _and so the body must do what I say_.
It is said that taking into account the life of an author in order to judge his work is an _ad hominem_ fallacy. However, in the case of philosophers, who pretend to teach us how to live, their life (and death) is testament to their work. And so, Descartes died a premature death from putting his entire existence in his mind and ignoring his body.
The body-maker has a will of its own. It's noble enough to put up with the machinations of the mind-seller for some time, but acting against its own wisdom it is driven to sickness, and if the partnership proves parasitic, the body will eventually wither and lose its creative capacity.
In these manifestations of the inner world that also manifest in the outer world, reasoning from both sides of reality help us clear the picture: the mind-seller needs to listen to the body-maker. Claudio Naranjo says that the body has an inherent wisdom and that rebels against the machinations of the ego, only when the ego is transcended and the decisions come from a deeper place does the body comply with the mind.
When the seller's motivations are fame and glory, the maker's nature rebels against it, for fame and glory are only distractions to his purpose of existence. It is perhaps too much to ask to the seller to completely forgo these desires, but let them be superseded by a higher purpose, so that the conflict is at least reduced.
The author seems to have reached the end of the terrain explored so far, and so more terrain shall be covered so that it can be described later.
Experience is weaving in novel patterns, and I was waiting for some consolidation before writing about it, but no consolidation has come. So I will write about the bits and pieces that have formed here and there:
---
I've been experimenting with a pressure cooker. I had never used one before, and it brings novel possibilities to cooking. I've been learning by trial and error, and one mistake I made was thinking I did not have to release all of the pressure in order to open the lid. I knew it was standard procedure, yet I thought: _what is the worst that could happen if there's still some pressure inside? The lid would just pop_. The lid popping was accurate, but I didn't foresee a small explosion that splattered the kitchen with tomato sauce and scalded my hands. I reacted with surprising indifference to the event: _ahhh, a lesson well learned_ I thought. Today I have blisters from the burn. Strangely, I don't regret the experience.
---
I met with Javier for lunch, and among other things he spoke about the function of pleasure in design. We are both reformed Ulm zealots, and the zealousness was transcended in different ways. Javier's link of reasoning was well developed, coming through the German protestant reformation and its relationship to the Catholic church, and a whole constellation of different ideas related to the shift in consciousness happening at the time.
It's as if someone pointed at the night sky and said "Polaris is not the true North Star" and I replied "I've noticed that too, but I can't explain it", and then some hints are given about how the stars are moving, but in order to verify it one must sit down and observe the sky carefully for a couple of nights. These are navigational references not only for professional but inner work and it's crucial to understand from within.
---
I had been struggling with the most simple of tasks: add The Boolean Game to Method of Action's homepage. How this improvised homepage came to be: long after Method of Action as-an-online course fell apart, it was posted to Hacker News, and people were getting exciting over a dead project. In the space of one hour I came up with what's up now to replace the homepage as to not disappoint anybody.
Now that its revived the current homepage is inadequate, but I know this to be a larger project than what I would like to tackle at this time. Still, I just could help take a couple of stabs at the direction I wanted to take it and then hold myself because this is not what is important at this time. Finally, I set myself an artificial constraint: I was sitting at the gym and I had a spare hour until yoga class started, and I thought _this is perfect, I have one hour for this task and whatever comes out will be an improvement_. And this is finally how I worked through the impossibility of a redesign at this time.
---
When I got sick I stopped lifting weights and begun going to yoga every day, as my body would protest vehemently against any other kind of physical activity. I used to go only once per week, because the teacher I like only gives classes once per week. However, I've come to appreciate the different approaches each teacher has.
My favorite teacher has this natural disposition towards yoga, she is calm yet energetic and has a permanent uplifted mood. She doesn't need to teach yoga, she can simply embody it and it rubs off on you. Other teachers evidently didn't arrive to yoga through a natural disposition, they evidently needed it in their personal lives and by practice they came to be able to teach it.
The difference between a natural yogi and a trained one is that the trained one knows the path from neuroticism to calmness, whereas the natural one has never traversed this path. And so trained teachers will often prompt with little pointers about how to come into states of deeper relaxation which the natural one doesn't.
More bits of experience:
***
I frequently come upon resistance to work, only when I give up and think _I'm not in the mood for work_ do I find something to work on. It's by finding the path of least resistance that I find the stepping stones to advance. For some reason, this lesson doesn't seem to sink in.
***
I went to yoga twice today, once in the morning the other in the afternoon. I no longer find weight lifting enticing, yet I can't help but notice the quick progress is due to the strength developed through lifting weights. I suppose when I come back to lifting weights I will also see improvement, both disciplines highlight different things, but what is highlighted on one side plays a supporting role on the other. For example, I shake a lot on the bench press, and no technique would help me out. And I also shook a lot starting yoga, but through the emphasis in breathing the muscles seem to get in sync, and shaking has been greatly reduced.
There seems to be a parallel between this and intellectual matters which I will explore in time.
***
The mind seems to finally have put the game at its appropriate scale. On Monday I'll publish a batch of changes and then do my best to promote it. If this doesn't work out I'll be
equanimous. It was a great adventure and I find some similarity to the first time I walked two years go: I just barely arrived to Santiago with my ankles so swollen they looked like elephant legs (after just 200Km).
Despite the pains I enjoyed the experience, and I've walked ten times this amount since then. My ankles haven't swollen again, in part because I don't go stomping around as amateurs do, I also know the difference between normal and abnormal exertion pain, and simple hardiness that grows out of practice.
It was a well earned experience.
I've been observing my dreams carefully for the past few years, writing them down when they're not evidently "mental noise". I have periods where I recall my dreams a lot, and others where they fade into the background. It is usually when real life becomes more intense that the inner world quiets down, though this is not always the case.
In my observations I would venture to say that it is impossible to interpret another person's dreams without knowing him or her profoundly. In fact, it's difficult to interpret your own dreams if you haven't observed them for some time. But I didn't set out to describe what little I know about dreams, I wish to describe the dream I had last night:
> {{Running with a druid}}
The casual reader of this work log would already have a better hand at interpreting the dream than a trained dream analyst without the context, I think. To me it said clearly: it's time to go outside. Between the release and my sickness I've stay put, moving exclusively between the gym, the supermarket and the library for weeks.
But in the morning I had this uneasiness of leaving my comfort zone. _I could just stay home and work_ I thought. It felt as if grabbing the bike and working from the library at Retiro would be a hassle, that I was still weak from illness, that it's all uphill on the way back, yadda yadda.
And then I thought: that's an interesting experiment, I had a dream of yearning for adventure, yet my rational mind predicts that I will be miserable doing it. Let us see what arises from experience.
The dream was right. I had a simple yet wonderful and productive day.
Today I had the vague goal of "incrementing traffic" in whatever way I thought appropriate. I thought of the Bézier Game: I hadn't added a notice that the game didn't work on touch devices, but now that I have a game that does, I might as well redirect this traffic to the Boolean Game.
When I checked the [stats on The Bézier Game](https://bezier.method.ac/stats.html), I was surprised to see it still gets 10,000 visitors per day. So I added a simple notice suggesting that you play the Boolean Game instead.
I also posted the game on [Product Hunt](https://www.producthunt.com/posts/the-boolean-game), [Designer News](https://www.designernews.co/stories/101523-show-dn--i-made-on-puzzle-game-on-boolean-operations), and [Reddit](https://www.reddit.com/r/web_design/comments/b5cf03/i_created_a_puzzle_game_to_learn_vector_boolean/). When I logged into Reddit after several years, I came upon my own profile and had completely forgotten that [I used to create Rage Comics on Reddit](https://www.reddit.com/user/duopixel/posts?sort=top) when they were a thing.
Here's my favorite one:
<img alt="rage-comic.png" src="https://method.ac/writing/uploads/rage-comic.png" width="50%" />
Some of the Rage Comics were bad, others were good, and others were good enough but completely unappreciated. It gave me some consolation that some good things simply go under the radar. After wasting some time I checked how it had done in the aggregators and the reception was quite mild. I packed up and hit the gym.
As I was walking there I was quite surprised that I was not too disappointed with the result. It's the game where I have put most effort and time, and also the most "unsuccessful" one. I remembered that weeks ago I had projected what I would consider success and failure, so I checked it again:
> As I was walking back from the library I thought: _what would make me feel I've been successful in this endeavor?_. There is financial success, of course (which is very much needed) but beyond this I'd be satisfied with a modest popularity that opens doors to unknown things in the future.
> Failure would be that it's met with indifference. _Would I feel disappointed?_ I asked myself, and surprisingly the answer that arose was _no_, the only alternative to this period would have been idleness, and that would have even more taxing on my wellbeing.
According to my standards, the game fell right in-between these two. It opened new doors, and it was met with acclaim from people that I admire, but it was met with indifference from the public. After my yoga session I saw that there was nothing new on the front, but I ran my visitor analytics and was surprised to find 30,000 visitors, compared to 600 the day before. It's still to early to tell if this is meaningful or just a traffic blip, but I had already made peace with this lukewarm reception so it was nice to end the day in a positive note.
As the Boolean Game enters maintenance mode, I find myself less inclined to continue writing work logs. I really enjoyed writing it during times of creation, but now I find myself thinking it's unnecessary, continuing out of habit.
There's already another game wanting to emerge, but I tell it to be patient and wait for it's turn. When it comes, I will surely resume this work log.
Over the last few days I've felt inclinations towards writing again, and I was letting it soak to sense if it was a persistent sensation. Last night I went to bed too exhausted to do it, but with the intention of beginning today. When I woke I had received an email from somebody who had stumbled upon my work logs and encouraged me to continue writing, and of course this was perceived as a _sign_ that my inclinations were indeed correct.
I'd say I've developed a light hearted approach towards signs of this kind. I used to be the hyper-rational person who'd discount signs as fantasy and superstition: the universe does not bend itself to make evident the path you should walk, that would be giving you too much self-importance. As a hyper-rational person you proactively fight the meaning life seems to offer. The gut is the inferior brain which must be kept in check by the neocortex.
But at some point the meaningless life becomes so barren you become willing to indulge in some fantasy. "Well, I know these signs to be fantasies, but I might as well follow them and see what happens". And then life gives you feedback on your gut instinct.
Some years ago, in Mexico City, I was particularly distressed, and I went to a buddhist ceremony to meditate. Among the dozens of practitioners, a tall, slender man in his fifties caused a big impression on me. He simply had a strong presence and a perfect lotus posture, but aside from that I can't pinpoint what caused the impression. I sensed that I had to speak with him.
When the mediation finished I sought him out to no avail. I shrugged and put a minus one score to "follow the signs" directive that I was exploring at the moment.
Exactly one year later I encountered him waiting at the elevator at the building where I used to work. I froze on sight: I was certain it was him, but again this could be my mind playing tricks. We got in the elevator and I saw that he was carrying "Surely You are Joking, Mr. Feynman", a favorite book of mine. I mustered the courage to commend his taste in books and mentioned that he seemed familiar from meditation at the buddhist center. He apologized for not remembering me. I laughed and introduced myself, and he mentioned he worked at the Chinese school in the building.
Of course, the first thing I did when I arrived to the office was to google him, I had gathered his first name and his workplace, and soon enough I had his LinkedIn profile: ex-developer at Microsoft, owner of the Chinese school. I thought it humble of him just saying he "worked there". I let my excitement subside before contacting him to propose meeting over coffee, which took me two weeks.
After a substantial amount of time in business related conversation I explained honestly my conundrum: I had seen him only once before, his face had burned into my memory, and lately the problem of "signs" was causing a lot of distress in my life, because it was not compatible with my worldview. I explained that his presence was a sign to me and perhaps he could give me more insight into the problem.
I was relieved that he didn't take me for a crazy fellow, and at the same time his response left me unsatisfied: he shrugged, and said everything happened for a reason. "But let's take Feynman, for example. He was next to his wife when she died, and her clock (which was a gift from Feynman) stopped at that precise moment. He decided there was nothing mystical in the experience, the clock broke down frequently, and perhaps the nurse picked it up to note the time of decease, and that's how he explained away the coincidence". He shrugged again, "it doesn't seem like a coincidence to me".
We spent some more time speaking of synchronicities and anecdotes and what not. At the time I was disappointed at the whole thing: a huge build-up of signs for the new age woo of _everything happens for a reason_. Still, it was a pleasant meeting and I was glad to have followed through. _Signs may not be truth, but at least they take us down interesting rabbit holes_ I thought.
Then, as the years have passed, I've come to understand a couple of things better: the signs are a product of your consciousness, but this doesn't mean they are not real. They are subject to your biases, desires, yearnings, fears and emotions. If you encounter the girl you like at the supermarket, you see it as a sign that you should speak to her. And there is wisdom in this! You walk at night in an unfamiliar neighborhood, and a cat jumps out the trash and scares the shit out of you. Your consciousness might interpret it as a bad omen. There may be wisdom in this too.
However, understanding these signs up as literal messages from the universe will only set you up for disappointment in the best of cases, and restraining orders in the worse ones. These are prompts, suggestions and confirmations from your subconscious that you are on the right or wrong path.
As I recall the conversation I had with this Buddhist man I find myself more in line with his attitude: it's not that important, accept it as meaning, not as truth. It's wonderful to experience shared signs and meaning with other people, don't be that person that shoots down other's people fantasies because you identify as a rational person.
Today I begun a month long project with a former mentor of mine, Javier Cañada. After lunch I was alone at his office, so I sat down to meditate. {{Munching on carrots}}. [I had dreamed about carrots](https://method.ac/writing/work_journal/24-03-2019_work_log_on_dreams.html) before.
I had a pleasant, productive day. I went to a favorite library of mine and enjoyed the shared focus from students there. I put most of my time towards administrative/organizational tasks, which I generally feel distaste about, but this time it was pleasant. I observe that I'm addicted to the sense of flow that comes from deep concentration while programming, and my sense of distaste is simply a contrast between light and deep focus. However, when I don't achieve focus while programming I often feel frustration. I should simply switch the task to something more akin to my state.
After the library went to a Buddhist meditation event. As I killed some minutes outside I tried to sense what I expected about it, and I noticed I was expecting disappointment. I took notice of the forecast, then went to the meditation, and I'm glad to report my intuition was wrong. I enjoyed it.
At the end of the session we had a shorter _metta_ mediation (loving kindness). The facilitator gave instructions to think about someone who had annoyed us in the past few days to wish happiness, security and love to that person. I couldn't recall someone who had annoyed me (except myself, of course), and later on, in the subway, I recollected the past few weeks to try to find that person.
Then it came to me: some days ago I went to a study hall, and a woman with a huge ass 19 inch HP Dragon laptop annoyed the hell out of me mainly because she had _bad taste_. It was a horrible computer and the fans made a lot of noise. But it was mostly about bad taste. I was surprised at my own reaction, labelling it as juvenile and snob.
So, in the subway I wished for her health, her happiness and her wellness. And I could not help but to wish for the improvement of her taste too. I noticed that my own juvenile and snobbish labels for myself faded with this task. _Ah, so that's how it works!_ I thought, _by balancing the equation we perform spiritual algebra_.
Some days I feel like nothing that happened in my work day that is worth mentioning: it's all ok, not great, not bad. What are you supposed to write on those days? I'll force myself to walk through my work day, in order to see if by recalling experience I might find something interesting to write about.
I woke up after having slept 9½ hours, it felt nice. I always sleep all I can. Sometimes it's six hours, others it's ten. At the slightest hint of sleepiness I have a nap. Usually naps last between one and two hours. I love napping because A. dreams usually happen at nap-time and B. It resets my focus battery, and I always get most out of the day if sleepiness is absent.
I think schedules were invented in times of mechanical labour. We were required to act as machines, because there were no machines available to perform the work. A line of production can't deal with unscheduled workers, but modern workplaces have little excuses to deny a nap in the middle of the day, yet it seems taboo to shut yourself in a conference booth for a nap. You're allowed to take a drink if you're thirsty, to eat a snack if you're hungry, to use the restroom if you need to take a dump, but take a nap? Hell no, better sit on your chair with your eyes glazed over and click around mindlessly, because you're getting none of that until you get back home.
When I think about these things, I think like a kid: when I grow up, I will give my children all the toys and all the candy they want, because parents are so unfair. And so I make the same vow: if I ever have a company, I'll provide napping facilities.
Anyways, I digress.
I alternated day rituals with light work tasks, preparing coffee/ answering emails, breakfast/collecting resources, showering/light work and so on. Though pleasant, I rarely indulge in this kind of activity, because I'm much more efficient at single tasking than the alternative. I'm proudly not a productivity zealot (as anyone who reads this may know) but work *is* somewhat sacred to me, and like all things sacred it requires the proper space and time to perform.
Light, semi-focused work _is_ work, of course, but it can't compare to the cascading flow of deeply focused work. This kind of work renews the soul and often leaves you feeling pumped up rather than drained. It usually involves the full use of your body and your mind, and the computer feels more like a musical instrument rather than a tool. I absolutely love this feeling, for some people it reaches spiritual stages because it dissolves the ego: there is no "I" and the experience is that of chanelling something that wants to emerge from it's own will. The person who creates, along with all his doubts and fears disappears, and the act is a rapture of oneness.
Anyways, I digress.
After lunch I took work to the study hall. As usual, my focus was better there, and I tackled a larger challenge I had in mind for some time. I won't write about the details of the project, since this is client work (and both you and I find details of implementation boring). But an interesting observation came up:
In the Boolean Game I didn't have to communicate or justify any decision with anybody, yet there is still inner conflict and communication between the self that designs, the self that implements, and the self that organizes and schedules things. What is interesting is that there is actually less conflict in collaboration than in solo work (at least so far). It's still too early to tell, but I will most definetely put awareness here.
A larger amount of time goes towards documentation and justifying your decisions, since clients and collaborators don't have direct access to your brain (fortunately!), and I've also seen that the larger the company, the more of this they need, because they must justify decisions across teams, even if they are not directly involved in the project. Some people say that you [cannot over-communicate](https://www.weforum.org/agenda/2015/03/why-you-need-to-over-communicate/) but I'll be damned if it's not evident just how much effort and time is put on communicating effectively. And, unfortunately, many creative people get caught in this machinery, and instead of creating they end up spending their entire day in meetings. Of course you can over-communicate!
Anyways, enough digressing, it's time for bed.
Yesterday I was running late, and the fastest way to get to the office (other than an Uber) is to bike, fast. I had biked once before and the experience was much different (it was drizzling, and I had extra time, it was drudgery). The time constraint made me focus on arriving fast, and this has the effect of getting you into the zone.
In the zone sometimes you experience a paradoxical effect: you are both present-in-the-world and simultaneously experiencing a straight train of thought which is completely unrelated to physical reality. So, as I was biking to the office a thought consumed my mind: why is it that we consider some experiences negative?
Barring traumatic events (which I wouldn't call negative experience, they would be traumatic events), experience is neither positive or negative. Experience _is_. Negative experience would be the loss of memory, amnesia, forgetting. We are so attached to experiencing pleasure that we feel disappointed when something fails to entertain us.
And yet I could only recall my first trip on the bike. Oh yes, that felt like a negative experience: body was aching, cold water hitting my face, somber mood. Even though it wasn't _that_ bad, I would have very much preferred to have a comfy ride in a car.
Then I a thought came to mind: my first trip felt miserable in only in contrast to what I was experiencing at the moment, I hadn't given it further thought until that moment. Until then it seemed simply a crappy commute. The _chiaroscuro_ provided contrast and I was rewriting a memory as more negative than what I had actually experienced at the time.
Is there any solution to this? It seems my original train of thought provided the answer: if there is no _negative_ experience, there is no _positive_ experience either. One simply experiences, and any value judgement about it (either positive or negative) causes attachment. This seems to be the origin of thoughts like "I used to be much more happy years ago, but I didn't notice at the time" or "I had a very unhappy childhood, but I'm happier now". Judging experience, even as positive experience, brings about its opposite polarity.
How should we remain above judging experience? I think meditation trains for this. You experience a whole range of sensory experience but don't attach any meaning to it, you simply put awareness and allow it to run through.
I woke up in the middle of the night after a strange dream. I considered writing it down, but this usually interrupts my sleep cycle and the dream was so strange that I thought there would be little chance of forgetting it. So I rehearsed it in memory three times and went back to sleep.
As soon as I woke up in the morning I knew I had a dream to remember, but no amount of effort could bring back the content. I went about my day and at some point I came across DMT elves on my Twitter feed, and somehow this jogged my memory and I thought "apes". And then, like a rope that one pulls from a dark well, the dream appeared in a bucket:
{{Brain or mind transplant?}}
Though there is meaning behind the dream, it is irrelevant. It stands as a short story on its own and it's kinda cool I think.
After breakfast I went to the nearest study hall. I couldn't focus much. Sometimes I suffer from unspecified psychological pain, and I know it alleviates through meditation (and Tylenol too, but I prefer meditation), so I decided head off to the study hall I discovered yesterday, which has a chapel where I wanted to meditate.
On my way there I was laboriously pedaling uphill when three girls in horse riding gear asked for help: they had a flat tire. They must have been between 16 and 18 years old. I let them know I had never changed a tire, but I've seen it many times, and I felt confident I could do it. After some googling about the precise spot where to place the jack I was surprised it actually went so smooth.
Some guy appeared thinking I was hit, since I was on the floor. I asked him if he had changed a tire but he sped off saying "every car is different", which I knew was an excuse not to help, but I just wanted some verification that I was doing things right!
After the change was done they said thanks, and one of them looked at me in a particularly kind and grateful way. I was amazed at the effect: my psychological pain was immediately lifted, I smiled profusely and thanked _them_. I bid farewell and head to the chapel.
I don't know how long I meditated, but when I came out I was calm, clear headed and saw that the day was beautiful. I might as well bike some more to the next library. I pedaled an additional 8Km, most of it downhill, and was concerned because I would have to pedal uphill all the way back.
I arrived to a large building where I haven't been before. The study hall of this library was massive and also packed. I've been to 50 different study halls in Madrid, and this was by far the largest. It also had nice large windows and natural light. Should it be closer to home this would be one of my regular spots, for sure.
I was finally able to focus better, got some work done. Then I got hungry, had lunch outside, and head off to a second library which I wanted to check out. It was much more modest and it smelled funky. Not worth it, but worth the exploration.
The way back seemed downhill again, thankfully. I also caught sight of a beautiful sunset.
I'm currently writing 750 words in 15 minutes on write.now, so please bare with my stream of consciousness writing. The past few days work logs were not written because I went to walk the camino of Madrid. I see that my mood is much improved after walking, it was just three days, and I took my computer to experiment walking and working. The idea was to walk the least possible, so that I would have time and energies in the evening to put in some work, but in practice it was complicated.
I knew it was possible that I wouldn't get any work done, but it was Easter break and I was willing to carry dead weight for the sake of experience, no work was urgent. During my walks I sensed a parallel with the visual artist: you could sketch and think a lot, but deep work requires you to be in your studio with a good set up.
Some albergues along the camino have the right combination of requirements: a kitchen, decent seats, nice views where you could stay a couple of days in order to find the silence that deep work needs. My next experiment to try is staying put at a single place for a couple of days to get a small project out of the door, and then continue walking.
The most difficult thing about this set up is that you grow attached to the people you're walking with. Taking work to the camino would make it a different kind of experience, but I've done it enough times to know what I'm losing out and what I'm gaining.
The fact that you have a time constraint (ie I'm staying here for five days) could help you complete your projects in the allotted time. But these are just hypotheses, I'll have to verify them when I repeat this experiment on a larger scale.
For the past few days I've been touching write.now here and there. I can only help but notice I lose practice on the codebase, it's as if I could load the codebase into my brain's RAM, and getting proficient with it again can take me a lot of time. But once this is done, it's a joy to work. You know exactly why things are going wrong. It is during these periods that I'm most productive, and I sense I can fit some cool projects in windows of 5-7 days which can be worked from albergues.
During my walk I listened to some podcasts related to the projects I'm working on. Usually I wouldn't do this on the camino, but again: mix things up and find what works. I liked it. The receptive part of work (reading, listening, observing, thinking) is easy while on the road. It is the creative part that is a challenge and I'd like to explore more profoundly.
I arrived last night, and after walking some 90Km in three days I was pretty beat up this morning. During the camino I observed that my sleeping habits had gradually deteriorated. They are not bad, but I'm waking up at 9am and by the time I'm at work it's around noon. I walked with two older ladies who had the habit of waking up very early, so I let them pace me, and I felt the ego protesting "you don't have to do this, you can start at whatever time you please", but I simply found it easier to leave the albergue with them.
This gave me the idea: new habits are tremendously difficult to instill on your own. Anybody who had tried to change himself will tell you just how damn hard it is. The use of willpower comes at a great cost to the creative mind, I think. There should be something like "work pacers": people who work alongside you (on their own thing) but simply have their habits in place so that you may mimic them.
But, like a running pacer, he begins at your baseline and pushes you progressively towards better habits. I'm reminded of a dog trainer I met: she said behavioral problems of dogs are mainly problems of routine. If a dog doesn't pee when you take him outside, but pees inside the house, notice the time when he pees and take him outside in that hour block. Once he's peeing outside on his own schedule, move it progressively towards the time when it's most convenient for you. I found this wisdom applicable to humans too: we often want to force ourself to change from state A to state B from one day to the next, which causes either great suffering or catastrophic failure (or both).
Oh my, this is a very rambling work log I've written here. I'll keep on experimenting with format and constraints.
The past few days I haven't written work logs, each day has a different excuse, none of which is laziness or distaste. Sometimes more important things arise and these exceptions are observed with detachment. I'll list some thoughts and activities from the last few days regarding work:
***
On Sunday a friend came home. My roommate mentioned that I had released a new game, and he wanted to play it. We opened the Boolean Game on his phone, and I set up the opportunity for it to be a quick usability test: I told him I'd look at him interact with the game and I'd keep quiet.
There were some interface issues which had been mentioned by René, but I didn't give them that much importance at the time. Seeing it happen in front of my eyes changed my perspective: indeed, it was a problem. I was reminded of an essay by Joel Spolsky, in which he argued that hired usability tests were a waste of time: it is necessary for the creators to see the problems first-hand. Hiring someone else to do so is just paying someone else to learn the lesson.
I took note of what I saw, and decided it could use another week of programming to kink out the issues. I'll do this when I finish my current projects.
***
For the past few days I thought I'd rather write essays than work logs, and yesterday I published a piece on workplaces. But writing essays takes a bit more time, and it's less enjoyable. This activity of sitting down and publishing my thoughts doubles as journaling, it helps me clear my mind, and it is pleasant. Though I don't set out to weave anything beyond what I experience in the day, when I come back to read what I have written, I observe larger patterns which arise out of registering daily experience.
Still, I only noticed this through action in the opposite direction. More understanding-through-experience and less mentating seems to be the lesson.
***
I wish I could write more about client work. The project I'm doing is not classified, yet it's common sense not to publish anything about it. I'll address thoughts in the most general terms: with client work you step into a new reality, this reality is fresh and unconstrained. Solutions arise and shift form as new information and experience is gained, without having to execute them. Most of the hours go towards justifying your product intuitions, making it seem like a rational process.
This seems to be akin to the way mathematicians work. They are exposed to a problem, they gain information about who other mathematicians have tried before. They try new approaches, but ultimately the answer often comes in a flash of intuition. The hard work is actually communicating it to others.
***
I'm finding myself itching to begin a new project. Something that I can complete within a week. Something so simple I find myself embarrassed to publish it. Something that people say: is this all?
The 1st game I made took me two weeks, the 2nd one three weeks, the 3rd one four weeks, the 4th 8 weeks, and the 5th 12 weeks. There's no correlation between execution time and popularity. I want to plant many seeds and see what grows!
I'm collecting ideas for this. Quick brainstorming:
1. Kerning pairs: a remake of the kerning game which is closer to the activity of typographers.
2. Alignment: a puzzle game where you learn to align/distribute elements.
3. Crop it: crop hi-res photos based on different tasks (ie a spacious image of a customer support person that needs to be placed in a specific design).
4. Unscale it: given an unproportionally scaled image, try to get it back to its original proportions.
I'll keep on adding to this list.
Yesterday the library of La Casa Encendida was full. It tends to fill up on Sundays, because it's one of the few work places in Madrid which is open all day on Sunday. As I was waiting for my turn, I overheard a conversation
-- "You know which is the best library to study in Madrid?" (this caught my attention, of course).
-- "Hmmm, Pedro Salinas?" (I could barely contain my contempt)
-- "No, stupid. It's the library of la Universidad Complutense. There's so much space. It's a shame it's not open to the public on weekends. Yeah, they ask for your Complutense ID on weekends, rest of the week is free access".
I was tremendously intrigued. The Complutense University is quite close to my house, I just had to check it out. The next day, after some fumbling around my bike on foot paths through the campus I reached the library. As in Mexico, much of the public education buildings are graffitied with leftist slogans. My heart wrenches when I see this: public property should be sacred for people of leftist inclinations. But I am a guest in this country so I observe these things with detachment.
I might as well add equal disappointment in libertarian groups I've met in Madrid. They espouse science as their highest ideal, yet when faced with difficult questions which don't fit their ideology (say, environmental issues) they go to extremes to avoid or minimize the issue. I recognize the behavior from fundamental Christians: when faced with difficult questions they behave exactly in the same way.
Back to the topic: the library at UCM is massive. It has all kinds of work settings: a spacious hall where you are allowed to talk (for group studies), Ikea Poäng Rocking chairs all over the place, small private study areas, large tables for social yet quiet work. It's difficult to convey the size, it surpassed the largest study space I've been in Madrid, perhaps by a factor of 10.
But, I couldn't connect to the internet. I approached the help desk, and the lady gently asked me if I had a UCM card. "No". "Ok, from which university are you coming from?". _Erm, university of life?_ "Sorry, I thought this was a public access library". She was gentle enough to make an exception, and gave me a login and password which would work for the day.
The bustle of university students made it an interesting day, but not very adequate in terms of focus. At lunch time I went out to the grass and produced a tupperware of chickpeas. It was the most boring meal I've prepared myself, ever. It wasn't even unsavory, it was simply so bland it was remarkable. I inspected into the sensation of blandness: there is nothing to hate, nothing to love. It was so boring I felt more compelled to swallow and get done with it faster. Chewing was a waste of effort. I don't even know why I'm wasting time describing boring chickpeas.
I went back into the library to finish the task I had set myself to do, but I felt an outmost resistance to it. I felt the blandness of the chickpeas in work, and felt I had to go back home to add some spice to work. I was in a bad mood, and I couldn't recognize why. Then I remembered I had ceased smoking. Perhaps it was this.
I'm sitting at a hostel in Barcelona, waiting for my phone to charge. In a while I'm leaving for the beach, and since I didn't have much to do I decided to write my work log, which I have left on pause during some days.
The only reason I've foregone writing work logs is because I've been connecting from semi-public wifi's with draconian firewalls, and they don't recognize the domain where write.now is hosted. I've grown so fond of the product that I refuse to write my work logs anywhere else. It'll become public in a month or so, and though I'm sure it wont make a big splash when it's released, it may grow on some people as it has grown on me. Working with René has been a pleasure, and I notice it has made me more open towards all kinds of collaboration.
The past few days were mostly spent on preparing a presentation for a client. Again, I find myself bemoaning so much time invested towards steering the client towards the right choices. But in the end I could see it was effective, a client is rarely a single person but a group of individuals with different goals, and preparing things this way allows them to align themselves internally towards a single goal.
In the presentation to the client I was reminded of some feelings I felt when I was programming the Boolean Game: never diss other people's work. You don't understand the constraints they faced. Shipping anything is a damn miracle. People put their best effort given their personal and professional circumstances. I've seen evidence of deliberate sloppiness only on people who have come to hate their job and lash out their resentment in their work. As Khalil Gibran writes:
> Work is love made visible. And if you cannot work with love but only with distaste, it is better that you should leave your work and sit at the gate of the temple and take alms of those who work with joy.
Time to hit the beach.
_Work was done but I feel no inclination to write about it. Instead, I'll explore a different topic._
In the past few months I've been attending a MeetUp group called [Madrid TED Talks Discussion Group](https://www.meetup.com/Madrid-TED-Talks-Discussion-Group-MeetupT/). I'm not a fan of the TED Talks format, but the participants are a diverse crowd, and I often find myself thinking _oh, I'd never seen that angle if it weren't for this group_, because we tend to hang out with people who share our own opinions.
Some months ago I read Eckermann's [Conversations with Goethe](https://en.wikipedia.org/wiki/Gespr%C3%A4che_mit_Goethe) and one habit of Goethe stroke me as an intellectual exercise I had to put in practice: in a discussion, don't reveal your position. Simply help the other person elaborate his train of thought. You gain more by exploring a different perspective rather than by asserting your opinion.
Multiple times I attended the event with the intent of not expressing my opinion, but inevitably I'd be drawn unto revealing it by my own folly, often within a couple of minutes. It would be easier for me to commit to remain silent rather than help another person develop his or her train of thought.
I observed this same phenomena when I attended an improv course: one of the basic rules is called [Yes and...](https://en.wikipedia.org/wiki/Yes,_and...), and this implies never shutting down a proposal made by another participant. Suppose the teacher instructs you pretend you're sweeping the floor. Another participant will come in to the scene and propose a situation. You have no idea what will be proposed, so you rehearse a couple of scenarios in your mind: you're a janitor at an office, you're a monk at a monastery, you're a city worker sweeping the sidewalk. When the other participant comes in and says "Mom! I can't find my shoes! Help me find them!" and your first impulse is to respond "Child, leave me alone, I'm a monk on duty". But this causes a standstill on the scene and it's really awkward for both the participants and the public. So the "Yes and..." directive comes in and you can respond with something like "**yes and** today is your first day at school, you can't go to school barefoot!" and the scene unfolds naturally from here.
In a group discussion its part of the game to provide some resistance to other people's assertions. You're not meant to shut them down by "winning" the discussion, it's more or less a friendly sparring situation which, when done correctly, is both an entertaining spectacle and can reveal concealed truth. Often times this requires a good arbitrer because it's almost impossible to keep the meta-discussion in sight as you're speaking. People can go into long diatribes, inadvertently shut down other participants before exploring their point of view in fairness (my problem), or constantly go off tangents which require getting the discussion back on track.
The most enjoyable events of this kind are not when I've felt I've asserted my opinion effectively, it's when I've discovered points of view which I hadn't considered before. If the discussion topic were an object, I would have observed only one face of it, and someone turned the object a little bit, putting more of the topic into view. With enough perspectives we can confidently say that we've gained a full view of it.
I begun by writing that my intention was to not express my position, but as I finish this text, I understand that my own perspective is another face of the topic. It's worth sharing what I see, but my main challenge is to understand what other people are seeing. I'll try to put it into practice at the next event.
Some days I sit down to write my work log with no idea what will come out. I will simply allow my fingers to do the chore of describing the work day.
I woke up with some urgency towards finishing pending work, but I felt my mind in such a state of disarray that I should better meditate before tackling it. As I calmed the agitated respiration, I noticed the thoughts had nothing to do with work, but were noise. I now wonder: how is it possible for the mind to reel at such speed in sleep? With the calming effect I also felt somnolence, and I went back to sleep to wake up again with a clear mind.
Again I sat down in bed, and now tried to visualize how I was going to tackle the pending work. To my surprise, I could simulate work with ease, and so I spent some time "working" in this way. When I sat down to do the work in the material world I was more confident I would be able to produce it.
As I was short on time I worked from home, the urgency taking precedence over my usual distractions when I try working from home. I was wrapping up when I received a phone call: the work I was urgently finishing off couldn't be reviewed until Monday. I felt relief: I didn't even have enough time to judge it's quality, and this would allow me to review it before signing it off.
As it's best to allow recent work to cool off before reviewing it, I went to the nearest study hall to perform ancillary tasks. I found a note on the door saying that the opening hours had been extended because of final exams, which is welcome because this particular study hall closes during two hours at lunchtime, which is a bigger hassle than it seems.
However, when I opened the door a blast of warm, smelly and moist air welcomed me, and the place was absolutely packed. I searched for a place to sit and was about to give up when a friendly fellow signaled that there was a free seat if they just made some space for me.
I always eye over what people are studying when I sit down: to my left a woman in her thirties was studying nutrition, and to my right a younger fellow was studying law. The exams seem to require a lot of rote memorization, as I often see students mumbling to themselves definitions, dates, codes and what not. I feel for them: in this age the information is one search away, yet in education it seems they haven't caught drift that humans are very inadequate devices for information storage and retrieval. I suppose that when the calculator was invented it took math teachers some time to grow comfortable with the idea that bringing one into the exam was not cheating.
I sat down got to work. When I was done I closed my laptop and saw that the woman studying nutrition was not at her seat, but she left a multiple choice self-exam on the table: 44 out of 100 answers correct. Poor thing, still a long way to go.
I was planning on hitting the gym but I felt tired. So, now that I have an income, I treated myself to a 40 cent coffee from the vending machine (actually a robotic barista, you can see the process trough a window). The man behind me asked how the machine worked: I showed him: you can get regular coffee for 40 cents, or Lavazza coffee for 60. "Do you often get coffee here?" he asked, I said sometimes. "How much better is Lavazza?"--I have no idea, I'm so cheap I've never tried it. We laughed and he ordered Lavazza.
I then went to the gym and also found it crowded. This city-run gym is in a sad state (not all are), and I couldn't help but be reminded of my former swanky gym. It was five times more expensive, but worth every penny. It made me wonder: perhaps the 50% price hike on Lavazza coffee is worth the price. Is austerity uncomfortable only after you're pampered with higher quality offerings? Will regular coffee taste like crap after I try Lavazza? Actually, that's an interesting experiment: next time I'm at the study hall I'll try them both, and see if I'm missing out of affordable luxury.
Again sitting down without to write without an agenda. I had a meeting in the morning, where some of the work done yesterday would need to be revised, nothing major but I was glad to have left it in tentative setting, because today I incorporated what was discussed.
{{Goethe's intuition}}
I had left my bike tied to a light post in front of the police station since a week ago, and I found it still there with a strange mixture of disappointment and relief. It's a cheap bike to which I possess no attachment, so I kinda hope it's stolen so I can upgrade, and yet at the same time there's no need to upgrade, it serves me just fine.
---
Edit some hours later:
I came out of the office to grab my bike and head to the TED Talks MeetUp Group, but my bike was no longer there. I rubbed my eyes: I'd seen it just three hours ago! What sorcery was this! Was this a test of my statement that "I feel no attachment to my bike"? Well, it worked. My heart sunk, yet I was still amused at the synchronicity. But then I thought: the police might have taken it, thinking it was abandoned, and if not I'll just report it stolen.
So, without giving it a second thought I went into the police station asking if they had picked a bike that had been parked outside. Two middle aged policemen were at the desk.
--"It's been outside several days"
--"I know, I left it there at night because I reasoned it would be safe in front of a police station". I said that my intention was to pick it up the next day, but _it got complicated_.
--"Well, it's illegal to tie bikes to traffic signs, so you're getting fined".
--"Noooo! You can't do this to me!" I cried holding my hands up looking at the sky.
--"What do you mean with _you can't do this to me_".
--"I was speaking to the Lord".
The police man eyed me suspiciously. He asked for my ID. My heart froze: in Spain it's illegal not to carry an ID, and it would be an additional fine if I didn't have my passport on me. I don't usually carry it as it's more likely that I lose it than needing it, but fortunately it was in my backpack since my trip to Barcelona. But then my heart froze again: I've overstayed my tourist visa, and this would be a major problem if they inspected closely.
A policeman went away with my passport, while another stayed behind. We had a friendly chat and I sense he was playing the _good cop_: their boss had scolded them for not doing anything about the bike and so on. I apologized and continued the friendly chat for a long time. He remarked that it was taking more time than usual and I was getting nervous, and after what seemed an eternity the man came back with a pad to write down the fine: 30 euros.
I felt genuine rapport with the _good cop_, and this was confirmed when he apologized for the fine saying "que pena que haya pasado, pareces un tío majete" (it's a shame this happened, you seem like a good guy), then he gave me a handshake. I assured he was doing his job right and jumped on the bike to head to the meetup. As my lock had been broken, I simply left the bike leaning on a post. When I came out three hours later, it was still there.
Today I moved out from where I was living back to René's house while he's in Mexico, for three weeks. Despite looking forward to the elegant simplicity and good location of this home, I found myself reeling at moving once again. For the past few weeks something inside me has been protesting against this nomadic lifestyle. Being homeless is not fun at all when you're bound to a city, but it's wonderful when you're a vagrant. When I finish the work that's bounding me to Madrid, I'll surely wander off and make the most out of what is perhaps my last summer in Spain. I don't have any plans yet, but in my heart I wish to spread some roots. Though I love Spain, I don't see a sustainable way of staying here much longer. But time and time again unexpected doors have opened, so I set intentions only in the most general terms.
Today I read a quip on Goethe's autobiography that intrigued me: when you write about generalities, it's a symptom of spiritual sickness. He remarks this after engaging in it during some pages, and the contrast is quite striking. Goethe clamors for a _poetry of the moment_, engaging in overarching themes is a folly which will distract you from the present moment. I found this remark surprisingly modern, in accord to what contemporary spirituality teachers repeat ceaselessly. In this state of feeling _rootless_ I also find myself examining my life in a more abstract way. It's rumination. I'll root myself in present experience.
I'm in José Acuña Library in Argüelles. It's Friday evening, near closing time. People are getting restless, I hear pencils being put away. Someone behind me is packing boxes with scotch tape. A phone vibrated. A lady drank from a bottle of water. A phone rung with a sound I've heard often, but I ignore its source. The person next to me has begun chatting. Now the one in front of me too. There is no focus in this library. People want to leave already. I peeked at the tablet next to me, the guy is pretending to study hydrology, but he's whispering something to someone at another table. I just noticed that the person in front of me is wearing a white polo with Spain colored stripes on the collar and sleeves, and instead of the Ralph Laurent polo horse it has a Spanish fighting bull. A student stood up and is packing up. Multiple zippers closing. It's time to leave.
Today I finished the last pages of my written journal. My usual pace is one notebook every two months, but this time it took five months. I've been doing most of my writing in my work log and I'm liking it, so there's no need to buy another notebook for the time being.
This morning I found resistance towards work, meditation eased it, and then I had a great work session which left me quite upbeat. It's striking how work has the capacity for both elation and misery. I've been reading a book which I found at René's home: [Daily Rituals, how artists work](https://www.amazon.com/Daily-Rituals-How-Artists-Work/dp/0307273601). What struck me most is the variety of schedules and habits, there is no single recipe for the conditions to do good work. Finding what works for you is a matter of self-knowledge and consistency.
There's early birds and night owls, alcoholics and monks, those who work through bustle and those whose work requires absolute silence. There are authors who seek prolonged periods of isolation to bring about creation, others can work around an intense social life.
There's a lot of talk on the amount of hours that these people put into their work, if it's healthy, yadda yadda. By happenstance I was also listening to a psychologist on YouTube explaining that some people just can't get out of bed in the morning because _they don't find it compelling enough_. And I knew exactly what he meant: should I know the joy I would have found working, I would have jumped right into it, but as I was expecting toil I put it off until I had done all my chores, and then more. Chalking up numerous hours doing work you don't enjoy is compromising on health.
In the afternoon I grabbed the bike and head to La Casa Encendida (the only library that is open on Sunday afternoon). It was full, and I got to work on some tables they have in the hallway outside of the reading room. As this was drafting work, I couldn't space out as well as I do at home, and I found the situation uncomfortable. There was also a beautiful, helplessly unfocused student next to me, shaking her legs and constantly chatting on the phone. Beauty helps me focus, be it in nature, architecture, or in human beings. But I always discover new exceptions to the rule. I came back home to complete my work.
One of the nicest perks of Rene's house is that the sunset is just half a block away. I stayed here during the winter and I'd come out to see it at 18:30, these mid-spring days the sun is coming down at 21:00. I'm sitting on a bench at Parque del Oeste (West Park) and the sun is two fingers distance at arm's length from the horizon at 20:50. I shall register the increase as the days pass. But it won't be long, in June I'll find another place to stay. I'll try to finish this work log before the sun disappears from the horizon.
I came into the office early and finished some pending work. At noon the work was reviewed and there was a big pushback on a feature of the design. In my times as an in-house designer I preferred to think of myself as an instrument for other people's agenda, but today I pushed back.
In the design field there's been some years of 'siding with the user', and this fact is accompanied with many titles and disciplines (User Centered Design, User Experience, Co-Creation, etc). If we look at the field exclusively from this perspective, we're missing out on a larger perspective: you can design the ideal user experience, but you often run into problems such as business strategy, technical implementation capability, organizational culture, and more things I haven't encountered yet.
Today I encountered one of those constraints which I hadn't taken into account: in organizational hierarchy there's different product goals, and sometimes these goals may be in conflict with each other. No matter how integrative is your vision, often times you must pick sides because it's impossible to satisfy every stakeholder.
Not without pain I had to concede that I had chosen the wrong camp to support, and then put myself to the toil of completing the puzzle in an alternate configuration. At first it was literally painful to do, but as the pieces fit together I understood this second solution was just as valid as the first one. I could have taken the task home but I did it immediately, by now I know better to put off painful work. But in the end I was pleased.
When I was done I biked back home, and on the way I found a political rally. I was intrigued because I've never seen one in Spain, so I sat on the grass for a while. I was disappointed. Politics seems to be the same all over the world, 60% blaming the opposing party, 20% saying what people like to hear (tax the rich!), 20% saying what you'll actually do (in the vaguest terms). It was interesting to observe, because I was actually sympathetic to their goals, but it was expressed in such bitterness that I was shooed away by the negativity.
The sun has just come down the horizon at 21:15, I'll head back home.
For a time I'll try writing my work logs in the morning, as Morning Pages. The reason is simple: in the morning I prepare coffee, sit down and 'idle out' on useless information while I come into my senses. These things are like moving furniture to a different place: the fist few days it may seem uncomfortable, but the validity of the solution reveals itself after some time.
Yesterday I came in early into the office, and we saw the revision of the revision, but in the end Javier proposed an entirely different solution which grew on me. It was a novel, original solution and I was more enthusiastic on implementing it rather than patching up what the work I had done the day before. It made more sense. Doing work which you don't believe is correct is the most difficult thing in the world, but when you are executing in the name of a different entity (company or person) it's a necessity. So I was relieved to align on an alternative vision where things aligned better.
In the evening I received an invitation to attend a lecture on the astrophysical properties of light, which I enthusiastically accepted. It was a good counterpart to Goethe's Theory of Colors, as this would be a Newtonian approach to color (wavelengths, color signatures, etc).
The study of color illustrates a blind spot of modern science: it attempts to remove human perception from the equation, so when the speaker was mentioning "light", he would often remark that "what I mean by light is not only visible light". Goethe would remark that "if it cannot be seen, then it's absence of light". In Goethian Science, human experience is at the center of observable phenomena. In Modern Science this subjective experience is proactively discarded. Each has its use. A designer who arranges colors to produce affective results will learn very little from the Newtonian approach, and an Astrophysicist who studies the colors of celestial bodies to understand their properties will get nothing from Goethe. The great mistake, I think, is to make these realities exclusive. Modern science (or should I say: scientific materialism) tends to dismiss the subjective experience as a hallucination, what is real is what remains after our interpretation is dismantled.
This is why science has such uninspired things to say about the human realm: emotions, art, love, health and self-realisation are seen from the outside, where we can only see the slightest material correlate in the form of brain activity. 'Love is in the brain' the scientist will claim, yet the person in love will feel it with his entire body and spirit. Science has some crude instruments to measure self-reported subjective experience (Likert scales), yet we cannot compare our experience to other human beings. If you are asked "In a scale of one to five, how intensely are you in love?" the only benchmark is former experience. You may observe that some people seem to be "crazy in love" more than you are, yet you don't know if they're just exteriorizing it more. You can feel very intensely, yet keep it to yourself. Behavior is not an accurate scale for the subjective experience.
I have more questions than answers on this issue, but the topic has stayed with me long enough to know that I'll keep placing attention on it for a while. So many things could be said about it, but I'll keep it as this for today.
I had a major sidetrack here. I'll just add that I felt great intellectual stimulation by the talk, then we had dinner at an Ecuadorian place and it was delicious.
I don't have much time, but I want to write my work log. I'll simply point out short observations:
* In the spectrum of tiredness there's a "[Ballmer peak](https://xkcd.com/323/)" where you can become productive. Tiredness prevents you from being self critical with work, so you bang it out without regard for outcome. Unfortunately this effect is shortlived, but it can be extended by small bouts of meditation (just stare out the window and focus on the breath for a couple of seconds).
* When swimming underwater while holding your breath, you cover more distance at a regular pace rather than trying to swim as fast as you can. The increased heartbeat rate will reduce the time you can hold your breath.
* After overhearing many conversations between people of different nationalities, I can say with a degree of certainty that the most banal conversations are between American women.
* I discovered another possibility for an adequate workplace: the mall of Madrid Río. There's sofas with electrical outlets (thought for phone charging), free wifi, and countless amenities around.
* When I'm very tired my capacity to speak declines sharply. This is the same case when I'm drunk. Sleepiness doesn't seem to affect people in the same way. I wonder if people who lose a lot of motor skill while sleepy manifest the same symptom while drunk.
Because of exhaustion I was able to get into bed at 9pm, I slept a good 9 hours until 6am, feeling refreshed. It took me a while to get out of home. This seems to be a constant which I want to improve, from the moment I get out of bed to the time I'm leaving the door it may be two and a half ours on a good day. When I was in beast mode with the [Boolean Game](https://boolean.method.ac) I'd get down to business right after making coffee, but these days I'm finding it impossible to get anything done at home.
I shall describe how I tackle habits in order to remember how to put things into practice. First and foremost there is the "habit of habits" which is remembering what you're working on for yourself. We make many commitments which we never follow up upon, there should be a space early in the morning to reflect upon this, but even this can be challenging to remember some times.
For some time I practiced uttering a phrase first thing in the morning: "I am here", which is a prompt to escape the automatism of life. Some days I would utter it as soon as I opened my eyes when I woke up, others it would be an hour until I remembered my commitment. This serves as an anchor for the commitments we've made in consciousness. The commitment in this case would be "I am here, and my present purpose is to get out of home as as quick as possible". Doing it is quite easy, remembering it is not.
Back to the day: I biked to the office and put myself to work at around 9am. I found great concentration arising from the fact that we had to send a deliverable to the client later in the evening, and I found myself breezing through work. I had long forgone mice, but there was a mouse at the office and I found my UI dexterity greatly improved from using it.
I also programmed a prototype, and the process of bringing the design to life was delightful. This has always been the most exiting part of work, its breathing life into a lifeless form. I'm reminded of a quote of the Bible: "And the Lord God formed man of the dust of the ground, and breathed into his nostrils the breath of life; and man became a living soul".
I worked as fast as I could, in full stillness and concentration, yet I was only able to send the work a bit late in the day. After the email was sent I felt the full tiredness of my body and mind, so much that I wanted to forgo a social event later at night. But then I though: "where is it that I find most displeasure from the idea of the event?" and I noticed it was biking uphill 4 kilometers. So I cut a deal: I'd take the subway but still attend the event.
It was a MeetUp called "Meaningful Discussions". The topic was love. I could write another full work log based on the conversation we had, but it's time to leave home now.
_I woke up and said "I am here" and yet I didn't want to begin writing, so I lay in bed until I couldn't sleep anymore (which was 8am). I'm tired of describing days, so I'll post something I wrote a long time ago. As our design team grew we found pains cooperating. I'm very much against tyrannical design systems: they make mediocre designers better, but also they cap talented designers, forcing them to conform to system's constraints. We were a team of tremendous talent, and I intuited a common plain visual/behavioral base over which everyone could bring their skills. Unfortunately I didn't have the energy or skill to champion it. Tyranny won._
**Allegory of the Chefs (on design systems)**
A rich man with an adventurous appetite summoned five of the finest chefs. Their task would be to personally prepare him a dish of their liking. There was only one rule: bring the ingredients required for the dish. Each one of them would have their personal kitchen to prepare the food.
It was an offer they couldn't refuse, for the client's appetite was matched by his deep pockets. They arrived at the agreed time, and dutifully prepared the most succulent dish of their repertoire. Afterwards they set up the magnificent feast in front of him.
The man observed carefully, and complimented each one of them, taking small bites and deep breaths out of each plate he commented the richness of flavor in some, the creativity in others, and the aromas of other. The chefs were greatly impressed with the client's knowledge of the culinary arts.
Then he sat down to eat.
The chefs observed helplessly how he grabbed food from every plate and placed it in his mouth without swallowing first. His mouth became a blender in which all the dishes lost their flavor to become and indistinct mush. "Horror!" exclaimed one, "Why don't you wait at least until you have swallowed your food?".
"I can't help it" the man replied between mouthfuls, "I'm starving, the food is so good and my appetite is so large that I can't control myself!" he said as he quickly gobbled up all the food on the table. Soon there was nothing left, and their patron was still hungry, remorseful about his lack of self-control.
The rich man asked them to prepare more food. "I don't want to feed this pig!" exclaimed one of the chefs, "look at what he did to my creation". But the man plead with them, and they agreed under the condition to prepare a large quantity of a dish that they prepared among all of them. Looking at what was left from their ingredients, they gathered everything and put it on the table. "I use avocado and coriander in all my plates, so we will have to find a dish that goes well with it" exclaimed one. "Well, I only prepare desserts so we'll have to see how we put a banana split on top of that" replied other half-jokingly. One tried to rally everyone to prepare his visionary dish, but soon this approach yielded much dissension among the chefs. The consensus seemed impossible to reach.
Then, the man being hungry and seeing consensus was nowhere near, grabbed a piece of bread and boredly chewed on it. "Aha!" exclaimed one of the chefs "what we need is a base dish that goes along well with anything that we put on top!". So they put together their skills to prepare well structured bread bread of chewy texture that would not only support but highlight the flavors of the food placed on top.
Each of the chefs prepared a topping that would go along well with the bread and placed bread and dishes on the table, and then instructed him to put a single topping on the tough bread. They were delighted to see their plan work: the robustness of the bread prevented the man from gobbling different foods at the same time. Furthermore, making their dish work as a topping made them focus on complementing the bread instead of trying to outdo each other.
It was a good day for both man and chefs.
I opened my eyes and saw that it was still dark, yet I heard the birds chirping so I knew it would be near dawn. I remembered saying to myself "I am here" and pulled out the laptop to write this work log. But then I thought: "I haven't come into my senses yet, yesterday I could barely write in this state of grogginess, let's try a quick meditation", and so I sat down for five minutes focusing on the breath before beginning to write this.
Yesterday I arrived to the library at 10:20 or so. I was surprised to find it full despite the fact that it was Sunday. I dedicated the first hour and half to a personal-private project that I'm doing: I'm transcribing all my dreams and putting them into a private blog so that I can search and add metadata and such. It's more of an impulse and its utility is marginal (even for me), but the work gets done by itself and requires no effort, so I just allow it to happen.
After this I put two hours of work towards some speculative work I'm doing for the project with the studio I'm working with. This work goes beyond the scope of the project, but I wanted to do it, and getting it done on Sunday seemed like a good way of not eating into their time budget.
I came back home for lunch and had a nap, then I went back to the library, but it was full and I was forced to work from home. After some false starts I found concentration and got a whole lot of work done, but I had to interrupt work because I wanted to check out a yoga class in the park.
The teacher has [a website](http://monoyoga.es), and I saw that he has a book wishlist for his donation based yoga. On Saturday I had gone to the book store to get a book from his list: [On Trails by Robert Moore](https://www.amazon.es/Trails-Exploration-Robert-Moor/dp/1476739218). I eyed the book, I'll probably buy the book for myself at some point in the future.
Yoga was interesting. The teacher seemed to me to be a non-natural yogi but had perhaps a decade of constant practice, so that his demeanor was calm but he still retained a degree of obsessiveness. Lately I've been thinking how holding paradoxical qualities makes people unique, and here I found an embodiment of it.
He taught us some yang yoga sequences with which I was completely unfamiliar, but my body kinda remembered postures from my teens practicing Kung Fu. Not to say that it was any easier to remember, it was simply a feeling of familiarity: "I've been in this position before".
At the end of the class I debated if I should leave the book next to the tip jar or give it to him in person. I'm of the opinion that donations should be done anonymously when possible, but I felt compelled to introduce myself, since it was my first day. The teacher was ecstatic and he gave me a big hug. He said that this was just the second book he was gifted and was feeling compelled to take down the list, since nobody checked his website. I was glad to give the book in hand, as it allowed me to be part of the joy, and I left feeling quite happy.
I came back home for a quick supper, and head to the library at 10:00pm. I worked on the spec work project in deep concentration until closing time at 1:00am.
I woke up less than a minute ago. I opened my eyes and tried to make sense of the time of the day by looking at the windows, but as it's cloudy I couldn't infer it. Then I remembered about yesterday's resolution: "I am here". I pulled my laptop and opened it in bed, I shall try to have my work log written while I recover from this grogginess.
Oh dear, it's so difficult to write while waking up. Clarity of mind is utterly lost. I will write stream of thought, as I used to write my work logs in the beginning.
I woke up late, at around 10am, and saw that I had absolutely no clothes left, so I made the laundry and put on what remained from my clean clothes: shorts and a wife beater. The weather forecast for yesterday was cold, so I would look quite ridiculous and suffer from coldness, but fuck it.
Since I had to wait for the laundry to be done before leaving for work, I slowed myself to a leisurely pace... Wait a minute, this is not a diary! The day begins at work dammit.
I saw that the nearest library wil be open 24 hours because we're in final exams season. It's Saturday and it was supposed to be closed, but I was glad that it was open since I had left my bike at the office. I worked perhaps only three hours, I was deeply concentrated and was able to get a lot done. I only interrupted work because I had some chores to do (buy a book and get groceries) and the places would be closing soon.
Oh dear, thought is confused upon waking up, I can't make head from tails and I'm already five minutes past my allotted time. I'll leave it at this.
Edit: it took me 80 minutes to get out of home from the time I opened my eyes. The purpose is not to leave home as quickly as possible, but to get out within 60 minutes while still writing my work log. It's good progress so I'm satisfied.
I'm either at José de Calasanz or Rosario de Acuña Cultural Center. I'm not sure, because both names are displayed in the front. From a cursory search, José de Calasanz was an exemplar Catholic priest who supported Galileo, while Rosario de Acuña was a proto-feminist writer ahead of her time, asserting her right as a human being to flaunt the strict rules of her society (she was an atheist, had children out of wedlock, had a divorce).
These two aspects of Spanish culture are in eternal conflict: there's exemplary people and deplorable characters on both sides of the spectrum. However, you must choose sides, either everything associated with Catholicism is stale and backwards, or liberal intellectuals are cynic degenerates who want to see all tradition burned.
When one party gets elected, they promptly change the names of everything they can get away with. But, as Spanish politics swings like a pendulum, the opposing party will get back to power soon and restore the replaced names. The rift goes back a long time, and only the most cultured and well-traveled Spaniards are able to see beyond the black and white politics that are played here. The middle way is not gray, paraphrasing Goethe: colour arises at the edges of lightness and darkness, and the spectrum occurs where these coloured edges overlap. To a foreigner it's as clear as water: the fact that José de Calasanz was a great man does not make Rosario de Acuña any less than a great woman. Having both celebrated would bring richness into the intellectual and political landscape.
This is the first time I've been to this study hall. It's small: six large tables with four chairs each. Chairs are standard beaurocratic office fare, the kind you'd find at a government waiting room. The study hall is utterly silent, which is nice, perhaps some 12 people here. However, the windows are open and outside they must be trimming trees, because I can hear sawchains. The sound is regular enough not to be distracting. The windows are large, but the upper half is blocked by the metal shutters as to prevent sunlight from coming in. The view from the third floor is nothing remarkable, but I was looking out the window with pleasure, trying to find what I liked about it, and then it came to me: in my work settings I rarely focus my eyes beyond a dozen meters. Such luxuries must not pass unnoticed.
***
After a couple of hours at José de Calasanz/Rosario de Acuña hunger made its daily interruption, so I bought half a chicken to complement the slice of Spanish omelette I was carrying. Since there was a pool nearby I took lunch there, and then laid in the sun and had a quick swim. I left feeling exceedingly calm, the pool usually has the same effect as a long walk in nature.
As I've been transcribing my dreams, I can't help but notice so many of my dreams take place in pools. Often times I'm carrying an electronic device, either a phone or a laptop, which slips out of my hand and falls into the water. Somebody will often help me rescue it. I never worry that it will stop working.
***
I've come to the office and laid out my towel and bathing suit at the balcony, where it's drying under the sun. There's too many things to describe. I'll go through the senses: two partners of the office are describing a design behind me, they've switched to an event. The event is next to a funeral home, and it may be convenient in case anyone falls into a coma out of boredom. I'll stop eavesdropping, let's switch to touch. I had never noticed the chair where where I sit. It's a tall chair with a mesh backrest. I'm so used to library chairs now that this seems luxurious. Still, the table rests against the window and I miss being able to extend my legs. Smell: unnoticeable, as it should be. Taste: drinking Coke Zero leaves a metallic taste in the mouth, I hadn't noticed before. Sight: too many things to describe. There's a bothersome stain on my screen. I'll clean it and get to work.
***
After watching the sunset close to home I came to the library for a last session of work, taking advantage that it closes at 1:00am these days.
On my table there's three other students, the guy in front must be in his early twenties, I wouldn't have noticed should I not be writing this, but he has very large circular earrings, from one side he has three soda can tabs and on the other side he has a symbol of Venus. Now I'm doubting his ←·····→ her biological sex, but it's not important. I can't make out what is being studied.
Diagonally across me, a young posh lady is working on the thickest PC laptop I've seen. She has taken off her watch and placed it facing down. It has one of those fancy metallic milanese loops. I can't make out what she's studying either.
To my left a tall young lady has left her seat, and I can see her subject matter in plain sight: the geography and government of English speaking countries.
***
It's enough presence for a while. Tomorrow I may change my writing exercises again.
Over the past few days I've felt inclinations to change my style of writing. To write fiction. To write in aphorisms. Whatever, anything but writing about my daily grind. I've bored myself doing this. And that's a good thing, as it tends to move me into new territory. For tonight, I'll just write down observations.
* Yes, the same actions produce the same results, but only when context remains constant.
* If you wish to speak with a stranger, it's best to do it just as you are arriving or just as you are leaving.
* A fruit store is perhaps the best place to grab a snack on the go.
* If you've grown comfortable among acquaintances, sparkling water is just as good as beer, and less taxing the next day.
* When the supermarket is near closing time and you need to grab something, stop writing.
In my first months in Spain I was in therapy with a remote psychologist in Mexico, I expressed some uneasiness of not feeling _this was the place I was supposed to be_, regarding Spain. She recommended _getting myself rooted_ through reading Spanish authors. I accepted the task enthusiastically, but wondered where to start. Spanish literature is something I hadn't cracked open.
After some deliberation I decided I'd take a historical approach on the subject, choosing classics on a chronological sequence. My first reading was _Cantos del Mío Cid_, and it had a powerful effect on the soul. I kept on reading: the _Quijote_, then _Lazarillo de Tormes_. After this the spiritual air of this country stopped smelling strange, _experience begun making sense again_.
As of late I've begun feeling the same uneasiness. There is nothing that keeps me here in the mid-term, except for a desire to enjoy the Spanish summer and autumn, which never fails to yield a great harvest of what is planted in the winter. Having committed to stay here at least until November, but still feeling uneasy, I grabbed a novel by Pío Baroja: "The Road to Perfection".
In it, the main character finds himself in Madrid with his creative projects stalled. He seeks distraction in pleasures, which works for some time, but in the end he packs minimally (which includes a gun, these were different times) and embarks on a long walk nowhere specific.
He walks Plaza de Castilla avenue on a northward direction, and ends up retracing the Camino de Madrid, through Colmenar, Manzanares del Real, Cercedilla, Segovia. It was immensely interesting to read, because it's a way I've walked too, though in his somber mood he perceives everything as decrepit, lacking meaning, tiresome.
After Segovia he gets a ride to Toledo and finds stability for some months, but after a _faux pas_ with a young woman he begins wandering again. At this point he begins noticing that his perception of places may have to do something with his mood, and while visiting Yecla, his home town, despite hating it, he makes an effort to come to peace with it, but no amount of effort brings the desired peace with his environment or with himself.
Again he begins wandering and comes to a small unremarkable town close to Alicante, he rents a small house and he unexplainably finds peace through nature. The peace is short-lived, as his attention naturally gravitates towards self-examination, but from there on Baroja masterfully paints the difference in cognition that a healing event such as this can cause upon the soul. It's outwardly subtle, but inwardly it's a reversal of darkness into lightness. Experience ceases to be random, disconnected events to become a process that naturally emerges from his circumstance. He escapes from his own mind to become involved in the world.
Spiritual people often espouse that you _create your own reality_. Without taking this literally, it still places a burden on the believer, because a perception of negativity in your environment is _your fault_. Yet, a simple experiment can discount this phenomena: remove yourself from the negative environment, and if the dark cloud follows you, the darkness is within and not without. Both are equally probable and perhaps undistinguishable. This phenomena lies at the root of all existential wanderings.
Everyone has bad days once in a while. Things that went bad today:
# I caught a cold.
# My bike broke down beyond repair.
# I tried working in the morning at the library and it didn't flow.
# I tried having a nap to reset, I couldn't sleep.
# I tried going back to the library after lunch, it was full.
# I came back home to work, it didn't flow either.
# I tried meditating, I couldn't focus. After this I went to yoga, it was nice, admittedly.
# I tried working from the library at night. The AC was sweltering hot and I felt heartburn. Didn't flow either.
Meh, tomorrow I'll probably be in a better mood for work.
I love asking questions regarding sci-fi scenarios:
1. If you could travel in time to any year before your birth, or any year after your death, where would you travel?
1a. Assuming you must remain in this very city, would you still choose the past/future?
1b. Assuming you can't come back to the present time, would you still make the same choice?
1c. (assuming going to the past) are you afraid of what the future will bring?
1c. (assuming going to the future) do you think the world is becoming a better place?
2. Say global warming wipes out most of humanity, we are left with 50 "breeding pairs", the bare minimum viable population to restart humanity. Climate has stabilized. Some people argue that the planet is better off without us, others argue that we should go forth and multiply with our hard earned environmental lessons. In which camp are you?
2a. (assuming human lineage lives on) in order prevent inbreeding and genetic defects, the first few generations need to be 'deliberately bred'. You may choose your romantic partner, but only in the happiest of coincidences will the couple both be genetically related to their son. All males must undergo vasectomy, and all fertilization will be done in vitro. Are you still willing to do this in order to save humanity?
2a. (assuming human lineage dies) a minority of the population goes rebel and decides to procreate. The genetic variability is not enough, and the human lineage will still fizzle out, but not without great deformities and suffering down the road. Do you think the rebels should be forced sterilized?
2b. (assuming human lineage lives on) the AI that matches genetic profiles offers two choices: retain phenotypical characteristics of differentiated populations (i.e. race), or simply ignore it. Ignoring it would result in homogenization of physical features. What do you vote?
2b. (assuming human lineage dies). AI discovers a simple procedure to stop aging. Do you take it?
3. Far into the future we haven't found signs of extraterrestial life (intelligent or not). Strangely enough, many planets seem to hold the pre-requisites for life, but there's only water and rocks. We've ensured our survival through colonization. Would you think it's our responsibility to "seed" life into these planets even if we don't inhabit them?
3a. (assuming we seed life) Should we protect life from a force that would surely wipe out all life on that planet? (say, a huge asteroid that will surely collide if we don't intervene).
3a. (assuming we don't seed life) we eventually discover that life is a very fragile process, and these planets have had false starts where life died out because of random circumstances. Should humanity help a planet though its gestation of life? (say, adding an ozone layer so that UV doesn't fry everything, but not interfere in the genetic process).
In many fronts, a sudden influx of things to be grateful about.
A melancholic/contemplative disposition. The time to walk again is nearing.
Discovering new ways of doing old things, and old ways of doing new things.
Finding the vague style of writing useless for anybody but for myself. Still experimenting with work log formats.
---
Aside: I've thought about video logs. The idea almost pains me, there's nothing more embarrassing than capturing myself on video. But it's also the area where I can find most improvement. Perhaps it's the ideal format when walking.
For the first time since stopped journaling privately, I've sorely missed sitting down for a break and registering my stream of consciousness on a notebook. There's nothing exceedingly private going on in my life, so I might as well do it on my work log.
I'm currently cleaning up René's home, as he'll be back from Mexico in three hours and I'm moving in to a new house. I'll be moving in for ten days with a friend whom I met through MeetUp. Should my bike wouldn't have broken down I wouldn't have reached out to her (not having a bicycle makes it a hassle to move from my alternative dwelling). She has a spare bedroom and we both found it uncomfortable discussing money, so I brought up the arrangement I have with René (work for accommodation) and she loved the idea. She has an internet business idea and there's plenty of ways in which we can collaborate.
As the last time I moved, I'm also having inner protests from having to change dwellings. Moving every couple of weeks is difficult, when you begin settling in it's time to move again. The idea of spending a couple of months in Mexico is increasingly attractive, but I want to hold it off until I begin walking. This yearning may be ameliorated by the consistency of the camino. It's easier to become accustomed to sleep in a different place every night rather than every couple of weeks.
A thought is coming up time and time again: there is a need to have consistency between creative work and your personal life. The same principles applied to creative work ought to be applied to life. Changing homes is a bit like changing operating systems, the libraries, supermarkets, placement of things is all different, and it takes time getting used to it.
Today they called from the bike shop, asking why I hadn't picked up my bike. I lied and said that I would go pick it up in the evening, but truth be told I'm bailing on it, at this point I can't pay 30 euros and then have to dispose of it. Listing the ameliorating factors is justifying the decision to myself, I knew I was doing wrong from the moment I lied. It causes a lot of inner friction as this violates a long held _honesty in creative work and in life_ principle.
The temptation to grease the friction with excuses is huge, but I simply notice: the principle is correct, and this is why it causes pain. Should I live in different circumstances, I would uphold the principle. Thus, the correct thing to do is to seek circumstances which allow me to uphold my principles. Upholding principles at any personal cost can be both admirable and foolish. The fact that principles become compromised in situations of scarcity is duly noted.
---
I've moved in to my new home. I went shopping for supplies and put things in their place. I felt agitated. I meditated a long time. Meditating in a state of agitation is difficult, so I laid down. I skated along the edge of sleep and waking states. I heard the voice of the guy from the bike store call me again. I saw myself as a fat lazy slob. I woke up second guessing my call on the bike. 30 euros is nothing compared to upholding principles. Yet there is inner conflict. I will allow some more time to pass to see how I feel. It's too late to pick it up today anyways.
I'm waiting for my roommate to arrive from work, as I haven't seen her yet. I had keys and checked myself in.
---
I had a pleasant dinner with my new roommate. I came to a more calm state through her own calmness. My intention was to work, but by the time we were done with dinner it was time for bed. I'll have to catch up tomorrow.
Yesterday I agonized over a design decision, yet it's late in the process, so it's impossible to question it. Still, the possibility that the alternative was better kept bothering me like a stone in the shoe.
I just had to explore the alternative with a quick mock-up. I saw it was slightly better, but not enough to justify steering the ship through a different course. I kept working. The stone was reduced in size, but it was still bothering me.
I left work throughly beat up, wondering how work is capable of being an unfathomable source of both joy and misery. I slept early and woke up very early, dreading facing the work ahead. I came to work and in quietness committed myself to the chosen path.
With continued work, the alternative faded away. I felt better.
It's 11pm and I'm at the library. I've been working relentlessly from dawn, consoled by sensations of great meaning. The grind does not pass unnoticed, however. I'm tired.
I have absolutely no idea why some days feel more spiritual than others. There is nothing deliberate about it. If I seek it, I get the opposite effect. Perhaps I ought to describe the sensation:
It's quiet inside. It's not as if I ceased thought, thought is definitely there, but it's in the background. Working feels more like playing an instrument than doing actual work. I hear the keystrokes and the mouse clicking in the background: it's not me doing the work. When speaking to people, I listen beyond words and feel as the other person feels. I never think about what I'm going to respond, words come out of my mouth and I'm often surprised at what I say. Sometimes it's insightful.
I'm focusing on the breath, I feel intensely in the nostrils, and the sensation soon spreads to different parts of my head. I stopped typing and I felt my entire nervous system through my body, and the pulse on my hands is quite noticeable. The sensations come in waves and it makes me feel distinctly alive.
My preoccupations of the past few days seem meaningless. I was concerned about violating my principles by bailing on my bike, but at this moment I don't feel any conundrum. It's as if it had been a lesson learned years ago. It's a valid learning experience without the emotional burden.
Walking towards the office early in the morning I had a knot in my stomach, I remember now. I felt dread. I don't remember much about how I got to the office. I came into the state gradually while working. When I went out for lunch, I was grateful about the sun, and I recall the tiniest details about my walk and lunch. When I came back into the office I sat down on the couch to meditate 30 minutes, but this was done because of the spiritual disposition and was not the cause of it.
As I'm writing this I feel tempted to plan something to induce it tomorrow, but intuitively I know there is nothing to be induced. It's always there, in the background. It's about removing, not about adding.
Chapter 19 of the Tao Te Ching comes to mind:
> Forget about knowledge and wisdom,
> and people will be a hundred times better off.
> Throw away charity and righteousness,
> and people will return to brotherly love.
> Throw away profit and greed,
> and there won't be any thieves.
> These three are superficial and aren't enough
> to keep us at the center of the circle, so we must also:
> Embrace simplicity.
> Put others first.
> Desire little.
After my respite of flow I faced two consecutive days of inner resistance to work. On the first day I was equanimous about it. Today, exasperated. At work, I threw my hands in the air and exclaimed out loud "I can't get this right! I want to die!", my co-workers laughed. "Is there anything we can do to help you?" -- "Yes, let me moan about it. If I were at home I wouldn't let frustration build up.". And so I continued working, letting out some groans and puffs. It was helpful.
The contract project I was doing is finished. The final presentation was in Barcelona, and I brought along my backpack to start walking the Catalonian Way. After the presentation I grabbed a train to Montserrat. I arrived in the evening, and I was taken away by the spiritual strength of the place. I might seek to stay here an extra day, but I'll know if the intention is true when I wake up tomorrow.
For a time I'll replace my work logs with _camino logs_, I don't know if there's any difference (yet). Today was still work.
**Walked:** 0 Km
<iframe width="560" height="315" src="https://www.youtube.com/embed/Uglr4Evz-ec" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
I want to write less, yet express more, so today I captured the little moments where I experienced _things_. This is an experiment which I intend to keep on repeating as I understand more about the format (and what/how things can be expressed through sharing the outward experience).
***
I woke up still doubting if I would stay another day at Montserrat. Being accesible early in the morning, I decided to visit Montserrat's _Morenata_, the venerated statue of the virgin Mary with Jesus as an infant on her lap. It caused no impression.
Behind the statue there was a window, I wondered where it lead: just around the corner there was an entrance to a stunning chapel where you could see the back of her head at the main altar. I sat down to meditate. Places with spiritual energy need no preparatory relaxation, deep meditative states are reached immediately.
After the meditation I went back to see her, and I saw a different statue, yet it was her. Her expression more compassionate, and I hadn't noticed she was carrying a globe, and Jesus was carrying a pinecone. I understood the globe as creation, and the pinecone as the principles that allow creation to come into being.
It was before her that Saint Ignatius of Loyola laid down his arms in consecrating his life to God. I read that, at the time of his conversion, he'd dream both of divine things and earthly adventures with the person whom he was in love. The earthly dreams would leave him in a state of dissatisfaction, while the divine one would give him a lasting sense of solace and serenity.
***
I'm experiencing a lot of hesitation. For example, yesterday I mis-read there was a donation dinner with other pilgrims, but I was quite embarrassed to ask about "the free dinner" at the front desk. Plus, I was still dressed in business attire and I didn't have time to change. I'd walk into the dinner and people would think I was a business shark seeking a free meal (at least until I had enough time to explain my situation).
I was willing to forgo the meal, but then thought: all this mental narrative is just ridiculous, I'll go in and ask about the dinner. I said "Excuse me, I read somewhere that there's a pilgrim's dinner...", and the front desk guy took me to the restaurant where he called out the captain to let him know I was a pilgrim.
They sat me down with a charming retired French woman, though we didn't have any language in common. This forced us to get creative to make small talk. I looked through my wallet and showed her a 50 peso bill from Mexico and she pretended to be amazed. I went through the few French words I knew and pointed at them, and she applauded. When time for dessert came, they gave us an apple, while the rest of the tables had delicious looking desserts. We shared the disappointment like mimes. It might have been less fun should we able to communicate though verbal language.
By the way, the dinner wasn't free, it only had a discount. There was no common "pilgrim's table", they asked us if we wanted to sit together since we would have been alone otherwise, and we both said yes. Mental narratives sometimes way off reality.
**Walked:** 29.6km (42.6km total)
<iframe width="560" height="315" src="https://www.youtube.com/embed/GEvCExDRlss" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
Last night I went to bed; and just as I was dozing off, a high pitched alarm woke me up. The lights were flickering and a voice could be heard on the intercom: "It is necessary to evacuate the building immediately. Leave your belongings behind, remain calm and find the nearest emergency exit". My roomate woke up with a scream, we dressed up and exited the room.
When I came out there was a door blocking the hallway, which wasn't there an hour ago. For the second time in my life I've been confused wether I was dreaming or not (while being awake). Things like these only happen in dreams.
We head to the front of the building, and I saw that there were people working in the utility room next to the lobby. They said the smoke detector had been triggered and they had found the culprit (a smoker), and the buidling was just two months old so they didn't know how to disable the alarm and were struggling with it.
When we came back I inspected the new wall: it was a panel with a door. The building had "intelligently" shut off a part of the building so that the smoke would not drift to other areas. On one side (the "smoked" side) the door was obvious, on the "safe" side the door was camouflaged. This way, people from the safe area woudln't accidentally go to the dangerous area.
***
The first time I was confused as to wether I was dreaming or not was during high school. I came back home very tired from school and went to bed. A friend came over and woke me up. It was very early in the morning and I tried to dissuade him: "it's too early", but it was of no use, he dragged me out of bed to show me something around the neighborhood. As time passed, I noticed it getting darker and darker, and I thought "how strange, I must be dreaming!" and I commented on the strange experience. I can't recall what he responded, but it made everything fall into place: after sleeping and being dragged out of bed I had misinterpreted sunset for sunrise. I had asked for the time and he had said "seven", I made it to be 7am and not 7pm. It hit me like a ton of bricks at the time.
***
The walk was wonderful, I enjoy walking in silence, yet accompanied.
***
After arriving to Igualada I went to the swimming pool. It was closed, but at the side of the building I saw a door that was ajar. I pushed through and when through some fronton courts, and got to the pool. I went through the building to find an attendant, but the place was utterly empty. I questioned my dreaming state again.
I decided to have lunch and wait for someone to arrive. Two hours later, with the sun coming out, I decided to dip in. It was wonderful having the pool to myself, and so relaxing after the long walk. After an additional hour of fooling around I decided to leave. As I was showering I heard people arrive. I sneaked out without being noticed.
**Walked:** 18.1km (60.7km total)
<iframe width="560" height="315" src="https://www.youtube.com/embed/gN9msEQBJ34" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
You can get lost both in the physical and spiritual realms. They come from the same source, and manifest in the same way.
¶ You can only get lost if you know where you're going.
¶ How would you get lost if you had no destination?
¶ The step between _knowing where you're going_ and _feeling lost_ is experienced as a leap of intuition: _wait a minute, something is wrong here_.
¶ Can I feel degrees of _lostness_? "I feel a bit lost", "I feel very lost", "I'm utterly lost".
¶ Is the _feeling of lostness_ simply anxiety? Could you feel very lost not because of any objective lostness, but simply because you're very anxious?
¶ When _feeling you could be lost_ you seek confirmation that you are on the right path.
¶ When _knowing that you are lost_ you are happy to get back on any path.
¶ Having been lost makes you constantly second guess yourself. You look at the map more than you look at the path. This seems to ease out as you regain confidence.
¶ Urban and natural environments have different constraints, just like rational and emotional environments.
¶ In natural and in emotional environments, the path to a destination is seldom a straight line.
¶ In urban and rational environments, the ideal path is straight, but you'll probably have to make some turns.
¶ In lightness, the universal signpost is the position of the sun (that which radiates energy). In darkness, it's the pole star (that which is fixed).
¶ Both guidebooks and sacred books exchange spontaneity for certainty.
¶ People who don't have a destination will often follow he or she who seems more certain where they're going.
¶ People will pretend to know where they're going because they enjoy being followed.
¶ If you lead and express doubt about the path, people will try to relay you as the leader.
¶ Under most circumstances, the _anxiety of being lost_ vastly overweighs the _consequences of getting lost_.
¶ People will insist that you don't _get off the path_ because you might get lost. These people have never discovered anything for themselves.
**Walked:** 18.6km (79.3km total)
<iframe width="560" height="315" src="https://www.youtube.com/embed/mQrDHdBwTBI" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
I have found the place where I will stay put a couple of days in order to get some work done. It is an albergue run by nuns. It has private rooms with high speed internet, and costs just 10 euros per night. Cervera is small enough not to be distracting, yet large enough to have all the facilities I could wish for (a library and a pool). I will share more details in time.
Tomorrow, however, we are on a quest to a town off the camino called Tora. Françoise, my walking companion, was born in France, and her mother was from Torá. We will go there to inquire about her genealogy and I will serve as a translator. We will stay there overnight and then say goodbye. She will continue her way and I will come back to Cervera to work.
**Walked:** 0 Km (79.3km total, not pilgrimage walking)
***
To explain this I'll have to backtrack to the day I began walking, four days ago. I left Madrid and went to Barcelona for a design hand-off with my backpack prepared for walking. After the meeting and grabbed the first train to Montserrat, to begin the Catalán Way.
After checking-in to the albergue in Montserrat I went for dinner, still in business clothes, and [was seated with Françoise](https://method.ac/writing/work_journal/2019-06-13_camino_log_montserrat.html), a pilgrim. We struggled to communicate, given that we didn't have any language in common, but it was fun.
We've walked together these last few days, and over time I've been putting together her story from bits and pieces I can understand. She worked as a waitress for most of her life, she lost her husband to cancer some years ago, and she found great relief walking.
She also revealed that she wanted to visit a small town some 30Km off the camino called Torá, where her mother had lived before she emigrated to France because of the Civil War. I offered to come with her and she was delighted, my Spanish would be handy. I would collect the information and then use Google Translate to let her know what we had figured out.
I did not capture any video, my reasoning was that this was a private quest, but in the end I saw Françoise more than willing to tell her story, so I share it here sans imagery.
***
Early in the morning I dressed up in my business clothes, I knew it would make no difference, but I was carrying them so I might as well make good use of them. I had spoken to the nun in charge at the albergue about our plight, and she let me know a fellow well connected to Torá would have breakfast at the albergue, and that we could speak with him to see if we could obtain any useful information. It turned out to be a dead lead, only letting us know the name of the priest in Torá.
The taxi picked us up at 10am, the driver was a fellow of extraordinary cheerfulness and great devotion, taking a detour of Cervera to show us all the important churches from the comfort of his spatious van. He spoke at length about numerous miracles he had experienced first-hand, sometimes as _instrument_ and other as a _witness_. From his stories it was evident he considered his true calling to do good in the name of the lord, so at the end of the ride I asked him to bless us in our quest. I liked his reply: "It's obvious you're already blessed and will be successful, I have nothing to add to your blessings".
When we checked in to the hotel I explained that Françoise's mother was born here, and we were visiting to figure out more about her. The owner of the hotel took interest, and Françoise produced a letter sent by her aunt in which she replied to some inquiries that her mother had made in the year 1966.
In the letter she consoled her about her sickness (cancer, she would pass away shortly after she received the letter), and then went at length about a property they had in Torá. Apparently, in rural Catalonia houses have names, and this particular namesake was Cal Senadó (Senadó House).
The owner told us he had some friends who were very knowledgeable in local history who would know where this was, and he walked us to a park where there were some old folks sitting on a bench. After a lengthy discussion amongst them they came to the conclusion that since she belonged to the Trillá family (her mother's last name was Trillá) that a building in the city center with her namesake (Cal Trillá) belonged to her family.
We went to see the _Cal Trillá_, it was an eclectic building of evidently wealthy means, but I sensed Françoise skepticism. There was no mention of _Cal Trillá_ in the letter, if her mother were indeed related to the building she would have asked about it.
The owner of the hotel then walked us to the City Hall, where he introduced us to the mayor. We went into a small office where a lady produced her mother's birth certificate. We connected some dots and figured out her mother and her siblings had been the first generation living in Torá, going to her grandparents would take us to a different town.
The mayor called an acquaintance who was in charge of the historical heritage of the city. He was an old school geek who knew all the houses and also had a good eye for detail. We showed him the letter and he immediately grasped _Cal Trilla_ was not related in any way. He knew where _Cal Senado_ was. Furthermore, he knew a _Trilla_ who had once rented him a plot of land and was probably related, though he'd have to confirm it in his own personal papers.
The man took us to see the house: it was a humble home at the shore of the river. It made sense: the profession of her grandparents was listed as "payés" (farmer), her grandfather worked at the olive mill. Françoise was glad to see the house standing in very good condition. A man from Barcelona had bought the house and restored well beyond its original state to spend the weekends there. The renovated condition erased information from us, but it was evidently well cared land. Numerous healthy fruit trees made company to the house, and a particularly large and prosperous chestnut tree, likely planted by her ancestors, decorated the front. It had a pleasant vibe and the day was beautiful.
I sensed Françoise had her sense of closure here, and everything else was extra. We had lunch, explored the city, followed some more leads unsuccessfully (locals endearingly enthusiastic if you tell them your plight, but will tell you the most impossible things without a hint of doubt).
We're staying here overnight, and I didn't bring my charger (or my backpack), so I'll leave it here. Tomorrow I'll say goodbye to Françoise, she keeps on walking and I'll remain a couple of days to work in Cervera.
**Walked:** 0 Km (79.3km total, not pilgrimage walking)
***
The day was spent in leisure with Françoise. Idleness after the long walk caused a strange surge in creative restlessness. I'll begin work tomorrow and see if the feeling is smoke or substance.
During lunch I overhead a conversation at the next table. In a town of 1,000 people in rural Spain, three women and a man were discussing if robots would put us out of jobs. Then the topic changed to overpopulation, then to environmental catastrophe, then to greedy rich people keeping us in abject misery, then to tech corporations stealing all our data.
I ground my teeth not because I differed in opinion, but because I could see the game they were playing was "let's try to find out what sucks the most about the world we currently live in". Offering solutions or hope is misreading the rules of the game. It would be walking into a stage and telling the actors that they are not the people they are pretending to be. If they truly believed everything they said, they would either violently revolt against the status quo, or commit suicide. Life as they paint it would not be worth living.
Why people play these games? I truly don't understand. I've asked "well, that's terrible. Something should be done about it, where should we start?", but they wave their hands and blame politicians.
--"Ok, so nothing can be done, so is this like discussing team sports?"<br>
--"Oh, it's not the same, we're dealing with much more important matters"<br>
--"So, if it's important, shouldn't we take matters into our own hands?"<br>
--"We're powerless, and besides, we're already fucked"<br>
--"So, if this were the cold war, it would be like the nuclear warheads were already in the air"<br>
--"Yes, exactly"<br>
--"So what are we doing here chatting about the missiles in the air. Shouldn't we be doing something meaningful with whatever time we have left?"<br>
<iframe width="560" height="315" src="https://www.youtube.com/embed/JrIaNnZTuOY" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
This is the first day I've spent an entire day working in a city while doing the Camino, and I've enjoyed the experience throughly. It feels as if all the times I've moved within Madrid have been lessons in quick adaptation, and the training has been fruitful. In the end, when life fits in a backpack, moving to a different neighborhood is not all that different from moving to a different city.
I had a good productive day, starting with mass in the morning, then work at the library, a picnic at the pool, then back to the library. I was thinking "this is wonderful, I can repeat this routine and remain in Cervera while I'm productive. When I get bored, I'll simply walk until the creative urge strikes again".
Then, as usually happens in moments of certainty, somebody throws a wrench into the gears and makes your platonic ideas fizzle away: a young woman walked up to the bookshelf next to me, and started pulling out travel guides on Mexico. She seemed unsatisfied with whatever she found in the guides.
I must be frank: I was terrified. Should she be anyone with whom I held no romantic interest I wouldn't have hesitated one second, but this was like jumping into a freezing pool. My mind was racing "I'm too nervous, I'll seem creepy, what do I say after 'excuse me'". Finally I cleared my throat "excuse me... are you going to Mexico?"
She turned around and smiled excited "yes! why? are you Mexican?" and conversation just flowed naturally from there...
--"oh you're going to Chiapas! I've been there, I wish I could tell you all about it but this is not a good place, how about getting a coffee?"<br>
--"I'd love to, but I can't now, how about tomorrow?"<br>
--"Yeah, sounds great! How shall we do..."<br>
--"Let me give you my number..."<br>
I was left in a daze. It felt like I hadn't done anything. There was neither pride nor regret. I had just been myself and she had been herself and it was natural that we should meet up afterwards.
I was left (positively) emotionally shaken, and I found no concentration to be able to continue work. So I came back to the monastery to calm my nerves by drawing. The feelings settled into serenity, and I was glad to have broken a two year stall on romantic first-steps.
Later at night, she texted me to change the plans: she had told a Mexican couple about me, and they wanted to meet me, so they proposed dinner at their house. I enthusiastically accepted, of course. My only problem is that the monastery/albergue's doors close at 10pm. And here I am feeling like Cinderella.
<iframe width="560" height="315" src="https://www.youtube.com/embed/PJljgsSp6UA" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Yesterday I had a bit of _oversharing hangover_ and today I understand why: opening a narrative implies a responsibility to give it closure, and the development of real life narratives is often anti-climatic. I had dinner with Marta and her friends last night, really pleasant people, but Marta leaves for the weekend and the narrative ends here.
Last year I befriended a Canadian girl walking the camino. Her feet were in terrible shape, and she had a particularly gnarly blister infection which affected her gait, and over many kilometers this causes pains all over the body. On top of that, she developed a stomach viral infection, and vomited an entire night and then felt like crap for days.
She was particularly stubborn about continuing walking despite all her woes. Her body was telling her, in no uncertain terms, that she had to stop. I couldn't understand why, until she shared her instagram: all smiles and success. "Erm, I'm not seeing any of your misery here", I told her. "Of course it's there, check out this post". And she showed me a picture of herself with puppy eyes curled on a sofa. Her Instagram was 95% amazing and 5% kinda sucks, but reality for her was 5% kinda sucks and 95% misery.
Much has been written about people concealing their misery on social media, but seeing it was striking. It was as if her identity was composed of two different people: herself and her avatar. The avatar was making her walk despite being sick, because it's easier to treat the real self as a slave than it is to downgrade the social standing of the avatar (by admitting you're having a miserable time). The whole situation was leeching off happiness, health and presence from the real self.
I write this because I try to understand how one shares personal narrative online. Matching the experience of the real self and the avatar is paramount of course. But then the real self experiences strong emotional events which don't necessarily lead anywhere, but become difficult to wave away in public.
Hmmm... After long consideration I sense there's nothing wrong in my approach. I am imagining you, the reader, being disappointed at my experience, and I feel like I'm not living up to your expectations. But _you_ are not _the reader_. The reader is a character of my imagination who is judging my experience. Things were written to record experience, not to impress anybody (even myself). There it is: the purpose of daily writing is to register experience.
I shall meditate on this.
_There is no video today. I felt I would be repeating myself because the work day was very similar. But I'm finding myself thinking: _find what is new in routine experience_.
After an afternoon nap I woke up in the most foul mood. The entire body was aching. I threw an inner tantrum "There is nothing here for me anymore, I will leave tomorrow". I went out for dinner and came back to the monastery. I didn't feel like writing my work log in this state. I meditated for a long while. The spoiled child inside me receded and I fell into peaceful sleep. I woke up this morning enthusiastic about my last day here.
It's time to move on indeed, but tantrums are unnecessary. I'll write down the lessons about working while on the camino, so that I can pick up things where I leave them:
1. Bringing your usual structure of work to a different place reduces the surface of experience. Instead of seeking facilities that adapt to your ideal working conditions, seek to adapt to new working conditions.
2. The availability of a kitchen keeps expenses in check and food healthy.
3. The next step after courage is detaching from the results that courage brings.
4. Walking is meditation in itself. When you stop, the mind needs to keep on walking. So sit down to meditate if you're not walking that day.
<iframe width="560" height="315" src="https://www.youtube.com/embed/sot1xduV2HY" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/8tAbyM0nDb0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
In the end I was glad to stay today, and I'm also glad to leave tomorrow. There were local festivities at Cervera. It's reminiscent of the _fiestas_ of certain _pueblos_ of Mexico, but I haven't attended enough fiestas either in Spain or in Mexico to have an informed opinion.
I worked a bit in the morning, then went to the gym and to the pool. In the evening I met up with the Mexican acquaintances I've made here (wonderful people!) to enjoy the fiestas.
**Walked:** 15 Km (94.3Km total)
<iframe width="560" height="315" src="https://www.youtube.com/embed/znM8DIuextY" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
{{Friend complains about referral}}
In a zen state of mind there is nothing to be solved. The world is just as it should be. Taoist _wu wei_ and Hinduist karma yoga teach the same thing: our rational cleverness only puts us into great trouble. Just as our desire for material things can be infinite, our perception is things that need to be fixed and solved is infinite. But from the spiritual perspective, these problems are illusions. Most design problems are illusions.
The designer's job is to deal with attachment. Under the spiritual lens a _User Experience Designer_ would be a _User attachment manager_, and perhaps the solution wouldn't be solving the problem in the product, but solving the problem in the User (through liberation). The user may come and say: I'd be much more efficient if I could see all this data in the screen at the same time. The spiritual designer would respond: "and why do you want to be more efficient? You would just get more work assigned to you if you did. Be satisfied with what you have."
If you solve a problem for a user, the next day he will come with a new problem. Solve this problem too, and he will come again the next day again. Attachment is a thirst that is never satiated, it's only kept in check because there's economic constraints to it (resolving attachment has a cost).
This conundrum has no answer. Jim Carey said "I wish everyone were rich and famous, so that they would know first hand that this doesn't make you happy". In the same way, let us wish that everyone would have well designed and attractive products, so they may notice the problem to be solved is not without, but within.
**Walked:** 37.3Km (131.6Km total)
Some people don't know how to be alone. Others don't know how to be with people. Worse yet, others--and I put myself in this group--just don't know how to be. When in company one desires solitude, and when in solitude, one desires company.
I once had a cat that would meow to be allowed outside. Once outside, not a minute would pass before it would meow to be allowed inside. Of course, once inside it would meow again. I once wondered how long would this indecision last. I didn't have enough patience for the game, it seemed the cat simply wanted to be inside if it was outside, and outside if it was inside. The pattern would repeat for all of eternity.
In order to break the infinite loop a distraction was necessary. Usually a snack would do the trick, then it would forget it wanted to be outside. Human beings rely on alcohol to tolerate company, and some sort of junk information consumption to escape loneliness.
Speaking about ourselves, is there a solution to this conundrum which doesn't involve distraction or numbing of experience? Why would the cat behave like this? Because it was stupid, indeed. But, _unaware of its own motives_ would be more accurate.
The cat wouldn't experience a _desire to be outside_, it would experience an _aversion to being inside_. Once outside the relief would last a couple of seconds, but there was nothing there for it, so it would experience _aversion to being outside_. Without a motive for being either inside or outside, it would simply wish to be where it was not.
Can't stand people. Very well, come into solitude. Can't stand solitude? Come back to people. Can't stand them again! Despair! In spiritual terms, you are acting through aversion and avoidance. The direction of growth is pausing, calming the voice inside which complains all the time, and listening to the more subtle yearning of the heart.
Does the cat want to curl next to his human slave? or does it want to go outside to try catch a lizard? But listen carefully, these yearnings are often mirages. We do things not because we want to do them, we are not seeking the activity in itself, but the validation that comes with it. Should I hunt a bird and bring it to my human, he will think highly of my hunting skills.
The yearnings of the heart come without attachment. They are whispered suggestions, never loud demands. They are experienced as _being on the right path_. They are _things which yearn to manifest through us_, as opposed to _things we yearn to produce_. They require no witness, and don't ask for praise.
<iframe width="560" height="315" src="https://www.youtube.com/embed/UaHDhqH8QMc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
*Walked:* 17.4 Km (149 Km total)
In every long walk there's an inner journey and an outer journey. What is ideal is that they synchronize: what happens on the outer journey supports the inward journey. Once you recognize this for yourself, you may recognize it for others.
I walked three days with a French woman of around my age who spoke perfect Spanish. She was a far left vegetarian of the kind that can become tiresome because of the ideological proselytism. Fortunately, and to her full credit, she wouldn't flinch or protest at my direct requests that "we speak about something else" when topics turned too emotional to hold a constructive dialogue.
At some point we were sitting in a park enjoying an ice cream. Because of Saint John, kids were throwing firecrackers. She said
--"When refugees from the Syrian war came to France, a festivity like this took place. Kids were throwing firecrackers and the poor refugee children suffered so much because of their PSTD. Of course, they could only associate bangs with bombs and threats to their lives".
--"So, are you suggesting that firecrackers should be banned?".
--"I would surely like so".
I narrowed my eyes suspiciously. "you've never thrown a fire cracker!". She coyly confirmed my intuition.
--"Well, then you're like the politician who bans things he doesn't understand. Fortunately we can solve this at this very moment".
A child with a large bag of firecrackers was sitting next to us, and I explained that my friend had never set a firecracker, and asked him for the most simple and innocuous firecracker he had. He kindly produced one of those little bags that you throw to the floor and pop.
She hesitated and ended throwing it with the force of a little girl (for she was a little girl in the matter of fire crackers!), but it popped and I could see the excitement in her eyes. I asked the kid for a real cracker you could light up. He gave it directly to her and explained how to light it up and where to throw it away.
Again she hesitated with the lighter, but finally she found the courage to let the fuse burn and threw it away. It banged. She shrieked with glee and gave me a big hug. She was excited and happy.
The topic of banning fireworks never came up again.
**Walked:** 22 Km (171 Km total)
<iframe width="560" height="315" src="https://www.youtube.com/embed/5tsUmmrexv4" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
In this land, pear and apple trees are guided to grow in two dimensions. Much like grape vines, the tree is trimmed small and encouraged to grow its branches along a single axis in a row. It seems this would yield less fruit per square meter, but it allows the farmer to do most of the work from his tractor.
You seldom see a farmer on foot, they are always operating machinery. The distance between olive trees is just enough so that a tractor can drive through. The width of dirt roads on wheat fields is just enough for a harvester to move on it.
Hand labour is used of course, but mostly for harvesting fruit. From the grasping capacities of robotic arms and object recognition recognition capacities in software, it's easy to infer human labor days in farmland is counted.
Ignorant people talk trash about these farms, but if industrial production of food were to cease to exist, world wide famine would happen overnight, and a large percentage of us would need to become farmers in order to support the dietary requirements of humanity.
Organic is wonderful, permaculture is awesome, but it doesn't supersede industrial farming. If all food were produced like this, a large percentage of the population wouldn't be able to afford eating. Don't diss cheap flavorless supermarket tomato, do celebrate garden hand-reared tomatoes.
**Walked:** 23.5 Km (194.5 Km total)
<iframe width="560" height="315" src="https://www.youtube.com/embed/hAYYOAqLJuQ" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
I woke up in the morning and dreaded walking agricultural fields again. The forecast was a blistering 40°C and there's little shade. I opened up google maps and saw that if I followed the [Aragón and Cataluña irrigation channel](https://es.wikipedia.org/wiki/Canal_de_Arag%C3%B3n_y_Catalu%C3%B1a), I'd have more greenery and there would be more interesting landscape.
An hour walking along the channel, a man in a car stopped by my side.
-- "Good morning, where are you going?"<br>
-- "Hi, I'm headed to Monzón"<br>
-- "Are you a pilgrim?"<br>
-- "Yes I am"<br>
-- "You know you're quite off the way?"<br>
-- "Yes I know, I'm just following the channel becuase the fields are boring"<br>
-- "Well, the channel goes through a tunnel up ahead"<br>
-- "But I can just walk through the road up those hills and rejoin it on the other side"<br>
-- "Well, there's another way, but I'm not sure you'll be able to do it with that backpack", I could see his blue eyes glistening.<br>
-- "Do tell me about it"<br>
-- "The tunnel has a walkway, but it's gated. You can climb around it, but you're quite loaded there."<br>
We exchanged broad smiles of complicity, and then bid farewell. I saw the tunnel entrance up in the distance, there was no obvious way of reaching it. Through trial and error I came to it. It wasn't what I had imagined. I'd have to hang over water, and was carrying my laptop inside. The structure didn't look sturdy, but when I hung from it I felt that it was well soldered. Indeed, the task would have been much easier without my bulky backpack.
But I crossed over uneventfully. The passage was difficult, surely more than walking on the road, but it was worth the adventure. The space was so narrow I had to remove my backpack and carry it like a child, holding it over the handrail and over the water. At some point I was ankle deep in water because the water level was high.
This is not my first tunnel adventure and it always has the same effect: darkness within meets darkness without, and inner alchemy produces an emulsion sensitive to light and sound. Danger and length intensify the sensitivity of the emulsion. When you emerge to the other side, the world becomes much more beautiful and intense than it was when you entered. The mind quiets, and you appreciate once again what you were giving for granted: the color of the sky, a flower, the chirping birds, the scents of nature.
Some days ago, while staying at Balaguer, I saw that there was a cave with prehistoric paintings nearby, which I wanted to visit. It was the perfect place to make a work stop: the albergue was the former house of writer [Teresa Pàmies](https://en.wikipedia.org/wiki/Teresa_P%C3%A0mies) and it would be an inspiring place to stay. The town was also petite and attractive.
Instead of leaving at my usual 7:00am I bummed around until 10:00am so that I could plead my case at the city hall. Pilgrims are supposed to stay one night at most, and this particular albergue was way too attractive for its price. It would be a tough sell.
While having breakfast at a nearby café, the TV blared news about an upcoming heatwave, and it would hit particularly hard in this region of Catalonia. "Perfect", I thought, I'll say I'm concerned about the heatwave and that I wish to remain until it passes.
When the offices opened and I made my case, the lady almost laughed me off. "Oh, they're always saying the same thing, it'll get to 36 degrees tops. I'll tell my superior, but don't expect anything". As it was already beginning to get hot, I pleaded with her to at least allow me an extra night because a late start would put me through grueling heat. "The last person who stayed two nights broke her leg" she responded.
The answer came through a phone call, it was brief: "There's a pilgrim here who wants to stay some additional nights because of the heatwave... no? He's telling me one night... Yeah yeah, I know. Just to confirm with you, bye". I half expected it to happen this way, the heat was a threat in the horizon so it was a tough sell.
Today I repeated more or less the same story in Monzón. It's a building designed for housing athletes, but the city allows pilgrims to stay (if you put through with their bureaucratic hurdles). Its college style dorms with small private rooms and spacious common areas, and a fully equipped kitchen. A luxury by camino standards. Since the heatwave was in full force, reaching 44 degrees today, I decided to try my luck.
This time I got to speak with a higher-up who understood my plight, but his excuse was that, since the city government was changing, there wasn't a councilman available to take that decision. Staying more than one night was not explicitly prohibited in the rules, but it was implicit.
I didn't want to press too hard for my case and let him off the hook, reassuring him that I'd just walk very early in the morning to avoid the worst of the heat. He was clearly uncomfortable turning me down given the hysteria about the heatwave in these lands. But, in the end, he did grant me an extra night so today I didn't walk.
I can persuade people, but need to be in a tight spot to override my tendency to reduce tension through concession. When you see a pattern repeating it means there is inner work to be done. I'll face the need to stay longer than what is usual up in the future, and I won't have a heatwave playing to my advantage, so it's better to begin practicing now.
And synchronicity happened: I saw a Tweet by the great [Naval Ravikant](https://twitter.com/naval) recommending [Influence: The Psychology of Persuasion](https://www.amazon.com/Influence-Psychology-Persuasion-Robert-Cialdini/dp/006124189X), which is exactly the kind of book I'd never read. And the things you tend to avoid are those which you happen to need the most--precisely because you've avoided it your entire life. So I downloaded the ebook and plan to put into practice some concepts along the way.
***
What was done today? I slept for as long as I could. I meditated a lot. I worked a bit on write.now (a tool for creative writing I'm doing along with [René Galindo](http://renegalindo.com/)), and emptied my backpack to send to Madrid whatever wasn't seeing enough use.
I guess writing down the list would be interesting:
1. **Bialetti Moka Pot**: not enough albergues have kitchens, and you must carry coffee. More useful than it sounds, but still not worth carrying.
2. **A camping mat**: I thought during August I might find albergues at full capacity and I didn't want to sleep in the rough. But it's too bulky. By the time it's August I'll be walking along the beach and I can sleep there if needed. Last resort can be a nest of leaves. I enjoy constraints.
3. **Sleeping bag:** I'm carrying a large sarong which I use for an incredible range of things: it's a towel, a sheet, protection from the sun, a table cloth, a curtain on bunk beads and perhaps it still has undiscovered uses. With this heat I'm finding it's all I need to cover myself up at night.
4. **Business clothes:** I was carrying a shirt, pants and a belt from my last meeting at Barcelona. It proved useful on a pair of occasions (getting paperwork done at a city hall, and going to a dinner) and I'm sure I'd find excuses to use them again, but it's not worth carrying.
5. **Assorted metal stuff**: keys, a small knife, bottle opener, utensils for cleaning nails. I already regret sending back the bottle opener, I'll surely need it up ahead. But it's not an expensive item if I need to buy it again.
7. **One set of clothes**: I was carrying four changes. I've walked with just two and I could manage. Three is perhaps ideal.
In total, my backpack weight perhaps 4.5Kg less than yesterday. It's a big win. I was topping 13Kg, way more than the 10% of your weight that is recommended, and it has manifested in blisters. I've never gotten blisters before and the additional weight is sure to blame.
***
There is no video today because it's a work log, not a camino log. I've decided to do it this way so that I can focus more on work while staying put.
**Walked:** 23.2 Km (217.7 total)
<iframe width="560" height="315" src="https://www.youtube.com/embed/AWeNCEALcZQ" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
---
''Essay: Large and Small Egos''
{{Ego}}
I remained in Berbegal to avoid the heatwave and to get some work done. Not much worth mentioning: I had a terrible night because of the heat, so I compensated with two naps during the day. I worked quite a bit, not without resistance. I went to the pool to cool off, twice.
I noticed I could live in a town like this: extremely small (just 300 inhabitants) but with the basics covered: supermarket, pharmacy, bar, church, and pool. Just one of each. This is not _the place_, but it's good to know size doesn't matter.
***
**Persuation work**
_Influence, the psychology of persuasion_ could also be subtitled _tricks of a used car salesman_. I'm sure there's something useful in it, but I find myself unwilling to sift through so much chaff. It's better to practice, observe and iterate.
**Reduced beer price**
Yesterday, upon arriving to Berbegal, I hit the only bar and asked for a beer. The lady served from tap, but the tap was malfunctioning and it was impossible to serve without ⅓ of the glass consisting of foam. I told her not to worry. However, when I drank it, I smelled sulphur. I'm quite indifferent to smell, and it was still drinkable, but I remembered this was spiritual work, so I thought about the best way to get my beer changed.
I approached the lady and said "excuse me, this smells funny, would you take a smell?", she put her nose in and confirmed the smell. I said I suspected it was the glass, so she served a bit of beer on a new glass and found it was the keg (or something in the mechanism). She gave me a bottled beer at the reduced tap price without having to ask for it.
**Free band-aids**
I needed a band-aid for a blister, but I knew the pharmacy would be closed on Saturday afternoon. I was in the pool and I reasoned they must have a first-aid kit. I approached the attendant and asked if she knew if the pharmacy would be open. She said it wouldn't, but that she could call the owner if I had an emergency. "Oh, it's not an emergency, I only need a band-aid because I have a blister from walking", and I showed her. She winced and insisted on calling the owner. "Oh, I wouldn't want to bother, perhaps you might have one in your first aid kit?". "Ah! True! I hadn't thought about it!" she exclaimed and hurriedly went to fetch it.
She gave me two, and though I knew I was stretching her generosity, having one more would get me covered for the full recovery, and I remained there trying to formulate a kind way of asking for another one. I guess she read my face, as she gave me another one without asking.
**Extra night at Berbegal**
A lady received me at the albergue and showed me the ropes. I saw that it was a great place to spend an extra day, with a full kitchen and a bedroom for myself. This time I emphasized the heatwave "It was cool enough in the morning, but now it's just noon and it's already blazing hot! I'm concerned because the next stage is 28.8 Km and it will be impossible to arrive before noon. Would it be possible to stay more than one day to wait out the heatwave?". She said yes, but had to pay day by day and not in advance. It seemed to me this was policy and had nothing to do with my persuasion skills.
**Walked:** 24.7 Km (242.4 Km total)
<iframe width="560" height="315" src="https://www.youtube.com/embed/-l-MM8Br0Jw" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
In my teens, while heading to school in public transport, I saw a blind man board the bus. We went together for quite some time, and I was wondering if he'd ask his location at some point, but he didn't. He just announced _en la esquina por favor_ ("at the corner, please") at a moment which seemed arbitrary to me (there's often no bus stops in Mexico, you can get off the bus at any point).
I was intrigued: how did he know where to get off? Was he counting the turns in the route? Was he estimating the time? The answer came years later, when I told another blind person the story. He smiled and paused a long time before telling me the answer, seemingly relishing in my curiosity.
"It's the texture of the road, he knew where he was because our streets are full of potholes, speed bumps, and differing pavement quality". Ah! It made so much sense!
After a few days of walking alone, you find yourself bored by your own thoughts. You invent games. One of them is walking with your eyes shut. We've all done it as kids (I guess) so we're more or less familiar with the initial sensation: hesitant steps, hands in front to sense if we'll bump into something, irrational feelings that you'll trip or fall into a ditch.
After overcoming the anxiety you begin walking with confidence. As the blind person on a bus, you know if you're on-track by feeling and hearing the surface. A dirt road along a field with a grassy mid-section is perfect for this game, because there's very little chance of getting hurt. Plus, I wanted to answer the question: could a blind person walk the camino?
The results are mixed. Full blindness, contrary to popular belief, is rare. What is more common are degrees of visual impairment. To simulate partial blindness I put the sarong over my head, and I could see a very vague outline of the road. The part that I was walking was quite walkable. However, the yellow arrows are invisible, you'd need to have some sort of navigation assistance to put you on the right turns (perhaps like an Apple Watch).
Then I tried full blindness. This was much more difficult, but after a while I found myself surprisingly confident at feeling the texture of the road with my feet. I did have a couple of unintended run-ins with branches and walked off the road twice.
It made me think: it would be prohibitively costly to make paths accessible, there has to be a technological solution to the problem, we're at the point where both image recognition and haptic feedback could gently pull you back on track. It turns out it already exists but it works with echolocation, it's called [sunnu band](https://www.youtube.com/watch?v=WPw-0oBoNNc).
The experiments made the walk pass quickly, and I was soon staying again in a tiny town in the middle of nowhere. Here there's no store or restaurant, so the lady in charge of the albergue offered me lunch with a menu I couldn't refuse: salad and rice with rabbit and snails. The rabbit was home raised on bread and greens, and the snails collected in her backyard. It was delicious.
**Walked:** 25.8 Km (268.2 Km total)
<iframe width="560" height="315" src="https://www.youtube.com/embed/3l3PDHww7gA" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
###Experiments in handwriting
**Source image**
<img alt="IMG_4279 (1).jpg" src="https://method.ac/writing/uploads/IMG_4279%20%281%29.jpg" style="width: 100%" />
**Results** by [Pen to Print](https://apps.apple.com/us/app/pen-to-print-handwriting-ocr/id1308003011)
> I seem to write differently it I write by hand, when it is imposible to edir talle breath to think and then allow to hand to expred what the mind wished to communicate. I more baroque, but also closer to the heart, I think The reason why I am wnting the camino log on a hot book is to see if it is Feasible to send my computer back home, care I am done with the project lam currently working on. I plan to pal this through sane OCR appou n su ition wile without much editing , Suppote, since I am in the topic of hand writing, I might as well put dawn sone thoughts Ver the topic, Like dancing, when I think about how I am writing the quality diminishes drastically. self-consciousness inevitably gets in the way of all form at pas mat evokuisian, what wman beatiful n uken the water dad be, and he w capable of nmering hmielt of the equation, What N maut interesting alat thi denmera, w that not only the breater orbeas ketu the creater Smelt beamu berit a studied by science: prople who are loving " that w; engrossed in achute, are more attractie o other posere. And I degressed. If I alre ate complete I would have pwbably deleted the evera) paragraph. Back yo the topic at handwrina. • w' hid that there i ne anlaman Caccording to schna) beruken av personality and yar hard writing, rau ',/ dary and if the same aprej to merk aan Does it hapmr to you that parue demu yar hendunting Idriordted, ogles and disfressed? Otter daw Harvey senth big ascendero and descender. Other day Yuan be Omall and timid, Otter daw and assetie. Could hundunting he could like the voiw, in which a utrying degree of emotis cms be detoed? What if I were to begin writing about a topi/ acre emotional abat V/ suppose it deperdu an the person calligrapher and actw both aduur their expression according to the need, and hand wita w such a lout of naunday that a tremenda/ amant of Fows meest bi expended in minag aal hard and fingers n an intelligible way to read ang emotan into the form. V I see that I hue lout some skill with to per Jo the idea of handwriting my camino logu appeals to me, I hope thay the our dow a decent job with this
**Transcription by hand** (minimal editing)
> I seem to write differently if I write by hand. When it is impossible to edit, I take a breath to think, and then allow the hand to express what the mind wishes to communicate. It is more baroque, but also closer to the heart, I think.
> The reason why I am writing this camino log on a notebook is to see if it is feasible to send my computer back home once I am done with the project I am currently working on. I plan to pass this through some OCR apps to see if I can write without much editing.
> I suppose, since I am on the topic of handwriting, I might as well put down some thoughts on the topic. Like dancing, when I think about *how* I am writing, the quality diminishes drastically. Self-consciousness inevitably gets in the way of all forms of personal expression. What is most beautiful is when the creator ceases to be, and he is capable of removing himself from the equation.
> What is most interesting about this phenomena, is that not only the creator produces beauty, the creator himself becomes beautiful. It is studied by science: people who are "flowing", that is, engrossed in activity, are more attractive to other observers. [can't find the study].
> And I digressed. If I were on the computer I would have probably deleted the previous paragraph. Back to the topic of handwriting: It is said that there is no correlation (according to science) between your personality and your handwriting. However I don't know if the same applies to a single person. Does it happen to you, that some days your handwriting is disordered, ugly and distressed? other days it flourishes with big ascenders and descenders. Other days it can be small and timid, other days bold an assertive.
> Could handwriting be considered like the voice, in which a certain degree of emotion can be detected? What if I were to begin writing about a topic I were emotional about? I suppose it depends on the person. Calligraphers and actors both adjust their expression according to the need, and handwriting is such a lost art nowadays that a tremendous amount of focus must be expended in moving one's hand and fingers in an intelligible way as to read any emotion into the forms.
> I see that I have lost some skill with the pen, so the idea of handwriting camino logs appeals to me, I hope that the OCR does a decent job with this.
**Conclusions**
1. Since other people often have trouble deciphering my handwriting, I doubt I will find an app that will do any better than the app I used. Something that attempted lexical interpretation could be better at it.
2. I don't want to change my handwriting so that it's recognized with more accuracy. Changing the way you write shifts all the attention from your train of thought to the printing of letterforms.
3. Only formidable writers are capable of coherence on their first pass. Us mortals have to heavily edit what we write.
4. I'd probably get better at it with time and technique.
**Options**
A. I could post daily pictures of the notebook, and then transcribe when I reach a town with a public library.
B. Or I could buy a lightweight portable keyboard and edit on my phone.
I'll keep on posting videos, it should be trivial with the mobile version of iMovie.
I'll put the decision of the backlog to give it some thought. If you an opinion, drop me a line at [hello@method.ac](mailto:hello@method.ac)
I must be quick. Yesterday it was too late and I was too tired to write my worklog, so I left it for the morning. But the morning came too soon, and I find myself leaving the albergue extremely late, yet unwilling to leave without having written my work log.
Yesterday I pretty much finished the first beta version of write.now, the tool I'm building with René Galindo. It's been taking longer than usual. The reason is because we've made a huge detour to understand what the product is and where it is going.
Most design is not creative, it's iterative. When somebody asks you to design a brochure website, you are not resolving a product design problem, you are resolving a graphic design one, since you are making use of well established patterns. What it creative is the visual solution to the problem (unless you use a template).
In creative product design, there is no such thing as resolving a problem on the first try. I suppose, if you were a mystic designer, you could channel the spirit of a product from the platonic universe, but designers as these have not existed in the history of mankind. It would be an impossible mixture of Johnny Ive with Jackson Pollock.
So, we've been working on this for about a year, and we came back to the same starting point. The route traced a big circle around a valley, we that there were many paths leading outside the valley, some better than others, and we even set our foot on some of them. In the end, we're bringing back the product to its starting point, with some idea about the path we're going to follow up ahead.
The Hospitalero arrived, I must cease writing activity, I'll continue later.
***
I'm at the next albergue, I will resume writing where I left off...
The creative task is difficult, and not everybody can do it. There are ill defined constraints because you don't know exactly what you're building, and you must feel comfortable in the outmost uncertainty. You must be ready to throw away all your work and begin from the ground up time and time again. You must be able to move around blindly, knowing your position by bumping into things.
In this domain no design technique helps. Think of the iPhone before the smartphone era, can you make that leap by doing user stories? usability tests? personas? That will only improve what you currently have, it would only make a better Blackberry, but it would never make the creative leap required to break into new territory.
**Walked**: 25.5 Km
<iframe width="560" height="315" src="https://www.youtube.com/embed/OBoS_pQJUsY" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
Do you ever set down to your daily task and think "oh shit, this is going to be tough today?". You begin trying to find the cause: did I sleep well? Am I well fed? Did someone put rocks in my backpack? You can find ten thousand excuses for feeling inadequate for the task at hand, yet somehow, when the daily task flows you are never over-analyzing. Imagine: "How is it that I'm so productive at this moment? My fingers are moving so fast on the keyboard! Was it the coffee or the new pillow I bought?".
We think that this mental babbling is reason, that we are going into debugging mode so that we can come into a more agreeable state, but there is no such thing: it is the mind which is causing the misery. Yes, I know my feet hurt, yes I know it's hot, yes I know I'm thirsty, do you have to repeat it time and time again?
Nearing my the end of my walk I came upon a particularly steep hill. I wanted to be done with it, so I pressed harder. I heard a voice: "you must know the limits of your body, and take care of it". I paused to catch my breath under a shadow. Then I thought, I've heard this phrase from two different sources: yoga instructors and couch potatoes.
How do you know your limits if your mind complains too much?
**Walked**: 21.1 Km (314.8 Km total)
<iframe width="560" height="315" src="https://www.youtube.com/embed/ogojiD4cH8I" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
Yesterday I was editing the day's movie when the MacBook froze, cursor in place. I held the escape button for two minutes and saw that it wouldn't power off, so I pulled the plug for the battery to drain.
This morning, I saw my drained computer and I immediately knew I had pressed the wrong button: it's the power button which force shuts-off a mac. It might have been the sun or the tiredness, but even then, who is doing all this writing and video editing?
Not me, for sure.
Walked: 26.7 Km (341.5 Km total)
<iframe width="560" height="315" src="https://www.youtube.com/embed/IC7KEFlbqTY" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
I walked without a bottle of water, and drank from the numerous streams that criss-cross these mountains. Some streams tasted fresh and clear, others were sandy and foul. I thanked both, for I wouldn't have been able to complete my walk without the existence of either. I sensed foul water would be a welcome addition to my biome, for what is clean and clear replenishes, what is foul and impure instructs.
Walked: 15.3 Km (380.4 Km total)
<iframe width="560" height="315" src="https://www.youtube.com/embed/uKRjDv1PEp4" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
The most instructive things happen when you meet people who are a mirror of yourself in a certain aspect of life. Today I walked with a German girl and we faced a problem which should be simple enough: should we walk to the nearest town, a measly 15 Km away, or should we walk 10 Km more into the next town. On one hand it was still early, the day was cool, next town was not too far away; and on the other the forecast predicted rain, and the albergue at this town had a very good reputation and the next one not so much.
I tend to defer these kind of close calls to anyone who is more opinionated, because I'm usually indifferent. But my company was exactly of my kind of decision making.
After discussing the problem, we decided to defer the decision until the last minute, so that we could observe the weather. When we got to the crossroads we still didn't know what choice to make, so we left it to luck: we flipped a coin, and the coin said "continue walking". I took a couple of steps and complained that I felt loss, and she said "if you feel loss then we should stay, the coin is just a trick to put your commitment somewhere, and by doing this you will feel the loss of the unrealized choice".
"I never thought about it in that way, but perhaps you're right. Let's check out the albergue and make the decision there". So we came into the town (which required a considerable detour) and visited the albergue. It was great. I was waiting for her to express enthusiasm, but she played my same neutral approach to the problem. I felt neutral towards either option still.
Finally, I framed the problem in a different way: what would I do if I were here alone? Then I noticed: I'd stay for sure. But I was enjoying her company and willing to accommodate to her choice. I was being a "nice guy".
"We're staying here" I declared, then quickly corrected myself: "I mean, I like it here a lot, I'm staying. If you like it too, then stay. Or continue walking if you feel like it. We'd catch up further along for sure".
You've surely blocked a stranger on a sidewalk, you try to step aside for the other to pass, but the stranger performs the mirror movement blocking each other. A step in the opposite direction is repeated, and the same thing happens. It takes an exaggerated movement from one of the participants to break the mirror phenomena, allowing each other to pass (with a laugh, hopefully).
And that's how we both ended up walking such a short distance today.
Arrés → Artieda 17.5 Km (397.9 Km total)
<iframe width="560" height="315" src="https://www.youtube.com/embed/xT8Gea3dbS0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
In the dawn of times, there was only ocean and sky. Sky knew ocean could act as a mirror if he remained still, and she would often plead with ocean to remain still, so that she could look at herself.
"It's not in my control", ocean would reply. Sky would get mad and great waves would ripple on ocean's surface, distorting it's reflection even more. "How you dare to mock me! Not only you refuse to remain still, but you grow more agitated each time I ask you to remain still!". Only sky's exhaustion would stabilize the ocean again.
One night ocean grew tired of sky's demands, and he truly mocked her: "oh vain creature, why would you want to look at yourself? you think you are clean and clear, but your surface is just as turbulent as mine, full of clouds. If you were pure and clean as you think, I might be able to see what lies behind your ugly face!".
The storm that followed lasted weeks, sky gathering heavy clouds which would swirl into hurricanes, dropping all her fury into the ocean. Ocean would swell into massive waves which would collide into each other, sending foam into sky, growing her spite.
Finally, the exhaustion that followed 150 days of fury prevented the sky to have as much as a single breath to disturb the ocean, and the ocean remained as still as a puddle on a windless day. Sky looked at herself in the reflection, but she was uninterested: in stillness she marvelled at the depth of the ocean, he was an inner entire landscape with the appearance of shallow surface.
Ocean looked up to the sky and observed the stars and galaxies for the first time. In reverence he understood that sky's clouds were a mirror of the clouds found within their own galaxy, and that he had mocked something sacred. Not only that, in their fight he had come to understand he was made of the same substance.
Their divinity understood in each other's eyes, stillness was disturbed by a whisper, _you're beautiful_.
Artieda → Sangüesa 32.2 Km (430.1 Km total)
<iframe width="560" height="315" src="https://www.youtube.com/embed/1ocCyDQqcBU" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
Every day on the way offers a new destination which is part of a larger destination, every day in life offers a new task which is part of a larger task. If life is performed in the same manner that the way is walked, the following could be observed:
* It's better to begin the task early.
* If you perform the task as quickly as possible, you're missing the point.
* You should be capable of performing the task alone. Not that company is not welcome, but being unable to perform your task in solitude is a sign of spiritual illness.
* There are better times of the day in which to perform the task. These depend largely on the season.
* Some days the task is thrilling, others it's a drudge. The influence of outer factors (set and setting) count as much as inner ones (mood and energy).
* It's normal that some days the task is a drudge. The larger task, however, should not.
* The task is best completed at a steady pace with few breaks at beautiful places. On occasion, it's also fun to complete the task in quick bursts with frequent recovery breaks.
* While at your task, carry the least baggage possible.
**Walked**: 35.2 Km
<iframe width="560" height="315" src="https://www.youtube.com/embed/oycMY27roEI" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
"I don't know if this is a good thing or a bad thing" she said.
"We'll have to find that out from experience", I replied.
It was a good thing.
Walked: 32.8 Km
<iframe width="560" height="315" src="https://www.youtube.com/embed/N288_4YxF-A" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
I'm writing this two weeks after the date, but I remember thinking at the time: if this bliss is accompanied by its mirror feeling, I'll become miserable. Should I seek not to soar as high in order to not fall so low? But what kind of lukewarm life would I be living?
From the miseries of the future I can write: it was worth it.
**Walked**: 8.4 Km
***
**If you were to be locked up for a year in solitary confinement:**
¶ What color would you paint the walls?
¶ If you were given the choice between one book, or a stack of notebooks and a pen, what would you choose?
¶ Assuming you could recieve only one visit per month, and assuming it always has to be the same person, and assuming there can't be any sexual contact, who would that person be?
¶ Assuming you were given the option of having an unbreakable face mirror installed, but no means to shave or improve your appearance, would you take it?
¶ You can have the option to get a TV stuck on CNN which can't be turned off, or have nothing. The TV can be muted. What do you choose?
¶ You can get one bottle of the booze of your choice per month. Do you think you would have one small drink a day, or would you get wasted once per month?
¶ There is a solitary confinement cell with spiders (which don't bite), the other is clean. Which one do you take?
¶ Your time in solitary confinement is halved by providing a person who will take your place. He or she doesn't have to consent. Would you have a name in mind?
**Walked**: 25.2 Km
<iframe width="560" height="315" src="https://www.youtube.com/embed/6GEXfgfjRVI" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
How is it that there are some friends that, after not seeing them for years, it's as if you'd seen them yesterday? It seems as if this is a quality of long friendships, but on ocassion I've experienced it with people with whom I've had good chemistry (not necessarily romantic).
It was Goethe who proposed that human characters are like chemical elements: some are like oxygen or hydrogen, able to bond with almost anyone. Others are require more compatible profiles in order to form bonds (with anyone other than the 'universal' types).
In the meeting of human souls, sometimes chemical reactions arise. I think the experience of meeting a brief acquaintance for a second time and feeling like you're picking off where you left off is largely a result of the memory of the chemical reaction experienced when you first met.
Walked: 22.5 Km
Today one of my roomates said he would wake up at 5:00 AM. Instead, his alarm went off and snoozed six or seven times, finally waking up at 6:00.
We tend to lie in the direction of our desires. Those who take their word seriously will have already noticed: we say that we always eat healthy, write every day, love our spouses and so on. But it's not because we do it, it's because we _want_ to do it.
It feels as if presenting our desired persona to the world will help us become it. "Even if it's not true today, it will be true tomorrow" we think. But the trick doesn't work. Becoming the person you want to become is a deeply intimate act.
**Walked**: 30.0 Km
<iframe width="560" height="315" src="https://www.youtube.com/embed/jZcGeDRMZmo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
If you were a journalist with no access to information except your direct experience, what would you report this week? Discount anything that your eyes didn't directly see, your ears didn't directly listen, your nose didn't directly smell and so on.
What do you have to report?
What? No tragedies worth mentioning? How strange, but you've said that the world is going to hell! What is news after all? It's things out of the ordinary.
I will volunteer on what is out of the ordinary for this week:
Love still exists.
**Walked**: 19.2 Km
***
People with the slightest bit of experience have learned to be skeptical of all things _anti_. What images do _anti-communist_, _anti-fascist_, _anti-chauvinist_, _anti-feminist_ elicit? It basically means: I fight people who believe something I don't agree with. Even if it were something we could all sympathize with, say _anti-slaverist_, it rings of something flawed.
Yet, most of our stances on controversial issues take place in this flawed conception of reality. We know all too well what we want to destroy, but everything that is destroyed needs to be replaced with a better alternative. People want the nuclear plant to shut down, the fetus saved from abortion, the bull to be saved from the matador, the kid to be spared from vaccine. But all these cause chain reactions which the oppressor doesn't want to deal with.
Buckminster Fuller said: "You never change things by fighting against the existing reality. To change something, build a new model that makes the old model obsolete". The universe favors those who support rather than fight, those who cheer rather than disparage, those who create rather than destroy.
**Walked**: 19.6 Km
***
Today, for the second day in a row, I've seen a skinny lady carrying a huge backpack arrive to the albergue late in the afternoon, only to find it full. On both ocasions, she's been offered a shower and pointed to a good camping spot. She seems glad to have brought her camping gear along. I guess her reasoning is that she'd sleep in the open otherwise.
Though her resilience is admirable in itself, it makes me wonder: does she realise--if she wouldn't be carrying so much weight--she would actually be faster and get to the albergue in time for a bed?
It seems there's a parallel to design: it is possible to create a car that can drive ten thousand kilometers without being refueled, either by increasing the amount of fuel it can carry, or by reducing the amount of fuel it consumes.
The reader is encouraged to ponder on the validity of each solution.
**Walked**: 7.7 Km
***
**Why do we have an inner narrator?**<br />
It seems that, if he weren't useful, he wouldn't be there. But his purpose is largely a mystery. In spiritual circles it is said that he is necessary for development.
**Do we really need a storyline for our life?**<br />
We don't have the patience for a movie without a plot. A lifetime without a plot is known as a vegetative state.
**Why is the inner narrator sometimes inconsistent?**<br />
The narrator is only inconsistent to another narrator looking at us. In schizophrenia, for example, the person is obviously insane yet he feels inwardly consistent.
**Why does he have multiple versions of the same story? Are these many narrators?**<br />
There is only one narrator, but it may fragment if part of it is disavowed. The disavowed part is known as the shadow.
**What would happen if we tried to kill the narrator?**<br />
It will only make matters worse. The narrator is not killed, it is integrated and transcended. But, if you tried, he would first hide and make you think he's dead. To the rest of the world it would be obvious he's still there. This is the deluded person who thinks he's reached enlightment, and sits complacent with a stupid smile on his face.
Poke him with a stick while making fun of him, as to make him notice the narrator is very much alive.
**Walked**: 22.4 Km
<iframe width="560" height="315" src="https://www.youtube.com/embed/RTsaarz9nZY" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
A French woman arrived late to the albergue with her twelve-year old daughter. This albergue is very small and based on donations, so it fills up very quickly. The hospitalero used me as a translator, as his English was very basic. He wanted me to tell them there were a couple of private options in town which could provide a bed for a reasonable price.
The woman angrily claimed it was impossible for them to pay that price, so the _hospitalero_ offered a mattress inside the church next door. The woman seemed to cheer up, but some minutes later she returned looking angry again. Whatever arrangement she was shown inside the church had not been to her satisfaction. She claimed that her daughter could not sleep in those conditions.
The _hospitalero_ then showed them a 90cm mattress which they could use to sleep on the floor of the dining room. Again, the woman seemed unsatisfied and yet again appealed to the comfort of her daughter.
I pondered the situation: it's the parent's responsibility to provide comfort for their children. She is being foolish by bringing her child on a low budget backpacking trip. But, if it is to be done, then she should follow the rules and show up at an appropriate time rather than to use her daughter to buy her way in through guilt.
Then, on the other hand, it is impossible for a 12 year old to make an informed decision to walk the camino. Even if she were enthusiastic about it, it was her mother's decision. She would have to suffer her mother's foolishness. I looked at her, her look was absent minded. I knew all too well the feeling: mom is often too willing to get into conflict to get what she wants, and the child is her ammo. The child looked at me, and we smiled at each other.
"They can have my bed, they'll be more comfortable there", I said in Spanish, so they could not understand before the hospitalero consented. He expressed great relief and shook my hand. Then I let them know and the mother expressed some flimsy _oh no, that's ok we will sleep on the floor_, which I waved away.
There is no pleasure and or karmic implications in a gesture of this kind. If you enable the manipulator, you prevent suffering to the child. Give the manipulator a lesson, and the innocent child suffers. What is one to do? When in doubt, reduce suffering.
**Walked:** 24.2 Km
***
Every major profession has a god archetype: God as the Justice Maker (lawyers, judges, police officers, etc); God as the Creator (artists, writers, sculptors, etc); God as the Source of all Life (doctors, biologists, healers, etc). What we're concerned in this house is God as the Architect (engineers, designers, architects).
These representations of God are platonic ideals of behavior for each profession. But, do they come from man's vanity? or they come from divine inspiration?
Would man's ideal of God-as-an-architect create things by trial and error? No, his technique allows no mistake. In his omniscience he is capable of sensing all implications for every design decision he makes, thus he always arrives to the best solution without stumbling along the way.
Would man's ideal of God-as-an-architect create things by accepting constraints? He only seems to accept the constraints of the universe because he created it in perfection. Modifying the constraints to accommodate a new creation would surely be a mistake. Thus, he works within his own constraints because he knows they are perfect.
Would man's ideal of God-as-an-architect improve things by iterations? What a ridiculous idea. God-as-an-architect gets everything right on his first try.
Under scrutiny, god-as-an-architect seems to be a creation of the frustrated designer, who in his toil and attachment to results, yearns for an intelligence that allows him to avoid the pains of creativity.
Natural selection is endless trial and error. Environmental constraints create the most exotic and creative biological designs. What are us, humans, but apes iterated a couple of times in a different direction than our chimpanzee cousins?
**Walked:** 19.0 Km
<iframe width="560" height="315" src="https://www.youtube.com/embed/sh0IcwORm1U" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
In my young years I wanted to meet a romantic partner who would hate the same things as I did. What a strange thought, to try to find love through hate! Nothing good could come out of this approach, for love always has thorns and hate will soon be directed at each other.
Then I tried the opposite approach: let us find someone who loves the same things that I do. Though it is a healthier approach, it is also folly. The things that you love are jealous of your beloved, and you will bicker with each other because of the pettiest of differences in your affection towards the things you love.
Then I tried finding someone who would complement my love-things. If I loved bread, then I would want to find someone who loved ham, so that we could make a great sandwhich together. Though it seems to work for many people, in personal experience the ham lover can complain that the bread needs less salt to offset the saltiness of the ham, but the bread maker may think it's the ham which needs to be less salty.
I've come to a simple conclusion which I hope to put into practice: love people, not things.
**Walked**: 14.6 Km
<iframe width="560" height="315" src="https://www.youtube.com/embed/w3m0eP8WCTY" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
As usual, my walk today was done without any water. It would be 13 Km between water fountains, which is reasonable given what I've observed. However, the heat and the unevenness of the terrain was more intense than I expected. Soon I began sweating profusely, and I doubted the wisdom of this self-imposed constraint.
The walk was beautiful, along a coast with [Flysch formations](https://en.wikipedia.org/wiki/Flysch) punctuated by shade provided by thick vegetation. I came down a gully and suddenly I found myself just a few meters from a naked man with an erection.
We were both surprised to find each other at such a close distance, I said "don't mind me, I'm just going through, I sure wish I could go commando myself". Up ahead I saw he was accompanied by a woman dressed as Eve. We laughed and he offered a beer which I declined, perhaps too hastily because a few meters ahead I was soon reminded of my thirst and regretted my response, but by then it would have been too awkward to go back and take him up on his offer.
As I continued, I came across a murky stream. Two days ago I drank from a stream like this, and got slightly sick. Though evidently these streams are born not far away, they go through cow pastures and surely become contaminated. The "sickness" was only a pair of urgent needs for a toilet, but this time I felt my body make the choice of forgoing murky water and put through with the thirst.
The walk would have been fascinating without the imperious need for water, but attention becomes attuned to the most immediate need, and my ears were twitching to hear running water, and instead of looking out in the scenery I was inspecting low lying vegetation for silent streams of water that sometimes run down between them.
Finally I saw a city, but the path didn't follow the most direct route. It wanted to take me through a small detour. I paused for a moment, licked my dry lips, and thought the path went through the detour for a reason. Some 30 meters ahead I came upon a water fountain, and my heart leaped with joy. I gulped water until my stomach couldn't handle any more and made my way into the city.
By now I've been dehydrated by my foolishness five times perhaps. The body has a strange way of dealing with it: unquenchable thirst, and then refusing to release the water. The legs become swollen with the extra liquids, and if you press a finger into your calf, the hole remains for a couple of seconds, as if your legs were made of play-dough. It takes an entire day for your body to regain homeostasis.
It's hard to believe that primitive man would have constant access to water sources, or any practical way of transporting large quantities of clean water. I suspect it's a matter of training, for I've seen my own capacity for going without water increase with these experiments. There is no practical value in being able to do so, but then again, in spiritual terms the limits of the body are a source of self-knowledge.
**Walked:** 24.7 Km
<iframe width="560" height="315" src="https://www.youtube.com/embed/a54wcyc9LQE" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
How does one dispose of things which are either considered sacred, or hold too much sentimental value so that throwing it in the rubbish bin feels wrong?
Are there any objects which may be considered sacred anymore? It would seem that, in our mass production era, objects rarely hold sacred value by virtue of their existance. The sacredness is given by their owner, through their continued use in ritual, or by the significance of the person who gave it to us.
Since we lack spiritual training, these things tend to accumulate, and the bearer is soon overburdened, not knowing how or where to give them their appropriate place.
It is said that the proper way of disposing of the Quoran is either burning it in a ceremonial way, or burying it covered in cloth on sacred ground. It would seem a sensible way of aleviating the burden when one ought to remain lightweight.
**Walked**: 20.1 Km
<iframe width="560" height="315" src="https://www.youtube.com/embed/nbjH4RO4OHc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
I can smell my shirt. It smells like feet. I opened the door of the dryer and the smell of damp feet hit me like a ton of bricks. An older gentleman came from behind me, looking for his shoe insoles, seemingly oblivious to the smell it would leave on the rest of the clothes.
"That was a terrible thing to do, now everything smells like feet", I told him. He didn't seem to understand, and was more concerned about finding the fourth insole which was still missing. "Don't ever do that again, it stinks all the clothes", I insisted, but he didn't say anything about it.
I had talked to him earlier, his name was José, he came from Colombia, though he had lived in the Basque Country for the last 20 years. His accent was completely unchanged and he expressed pride in not having learned a word of Basque, except for a couple of words which most pilgrims pick up walking through this region.
He said that he had been an ambulant merchant back in Colombia. These are people who carry trinkets to sell on the streets. Here in Spain, he worked as a maintenance worker for the city council in the town he lived, sweeping floors and picking up trash. He had two daughters which came from Colombia as teenagers, and now he had four grand children born in Spain.
I liked him a lot. He had a good heart, and would not speak ill of anything except the insecurity he lived in his country. But now he perfumed everybody's clothes with Eau de José. As the hospitalera had asked us to put the clothes on a rack so that they would finish drying in the air, I came down with him to the racks.
He wanted to hang all his clothes together, but he couldn't make out his underwear from other people's underwear. Then, after a third pass closely inspecting underpants, he proudly held a pair of boxers and declared he had found them. I told him those were mine. He insisted, by his method of discarding the other ones, he had come to the pair that was most likely to be his.
"It's not these ones, not these ones either, or these ones, so it has to be these". It was a logically valid argument: in a universe composed of A, B, and C, if it's not A and B then it's C. But a second observer happens to break that logic: "Look, it says medium here, are you size medium?", he looked at his oversized waistline and replied that he didn't know.
I realized his concern was more logistical than one of property. I always carry an extra pair of underwear, so I told him "well, if they fit you, then they are probably yours, try them on and let me know".
He came out of the bathroom a couple of minutes later, smiling. "Yes, they are mine!". And now I not only stink of feet, but I'm living on the edge regarding underwear.
**Walked:** 18.0 Km
_I walked with my phone battery depleted, so the number is an estimate and there's no video for today_.
***
For the last few days I've been dragging my feet while walking. Dark clouds swell in the sky, and then it drizzles all day long. Grieving having parted ways with a romantic friend. The mood has been matching the weather. Not feeling connection with anyone I meet, despite meeting a lot of people.
Then, arising from the boredom of gloom, I begun thinking about work. It came as a flash of insight: _ah, yes! how I hadn't seen that before!_, a reputable company had been interested in my services, but what they needed was so trivial yet so costly in terms of work hours that I couldn't make it work out.
This insight made several more other pieces fall into place. In the thousands of kilometers walked, never had I experienced something like this. My backpack became light again, my feet swift, my mood cheerful, my connections meaningful, the sky lighted up; all arising from a single insight.
A great desire to put myself to work immediately took ahold. I must allow for a few days to simmer and understand how the pieces fit together. But I was pleased to see thinking about work can also make the skies clear.
***
My mother called, she said "I call because I dreamed of you. You came back to Mexico, and I had set up a banner that said 'Freedom is called Mark'. Then I understood why you were walking: to make space to perceive all the sensations of connecting with something greater than us. You sought that inner freedom". My heart leaped with joy, I couldn't have explained it better myself.
**Walked:** 17.6 Km
***
At the donation albuergue I told the _hospitalera_ that I was running low on cash, and that--if she preferred--I could help her out cleaning in the morning. She said she had her cleaning routine set up, but I could help by taking out the garbage out to the containers.
I understood what she meant, oftentimes unskilled help causes more work because you must give out instructions, supervise that it was done correctly and so on, so I didn't press back, knowing that unobtrusive opportunities would come up to give back a bit more than what she was proposing.
When I woke up in the morning my awareness was attuned to being helpful, and I observed that we are utterly ignorant on the effects we cause in the pursuit of leaving early. We forget to pick up after ourselves, to wash our dishes, to put things in their proper place. A resentment arose: who do these people think they are? Can't they see that their slack has to be picked up by us? They surely do it because they're spoiled kids, and so on.
Of course, these thought were not entertained seriously, I simply observed them arise with a certain degree of amusement. Up until now, I had been that spoiled kid whose priority was leaving as soon as possible, never giving a second thought that there was a an unpaid volunteer picking up after me. _One has to be a saint to be a good hospitalero_, I thought, for resentment festers unless you possess the simplicity of unattached action.
Can these things be observed without putting yourself into the shoes of the other? One can surely imagine what it is like to be a _hospitalero_ and foresee the consequences of slacking in personal responsibility. You may be more careful in picking up after yourself. But, by _experiencing_ it instead of imagining it, you are able to see that the collective slack falls into the hands of the _hospitalero_, so your responsibility extends beyond your own mess. You may fold that forgotten blanket, pick up that stray wrapper, or wash the bowl left behind.
The spiritual lesson is to perform it without any trace of resentment. It's more difficult that it seems.
**Walked:** 29.7 Km
***
Krishnamurti insists there's no gain in giving or dedicating your life to a cause, to a religion, or to an ideology. You seek to escape from yourself, so you sumbmit your goals and your will to a group, a part of The Whole. By submission to anything other than The Whole you support fragmentation. This implies that there are things in the world which you _not are_, and you enter into conflict, which in its mild expression is experienced as a grudge, and its most gruesome expression is a large scale war.
I am this, and I am not that. I am not that, because being that is wrong. If that is wrong, it ought to be eradicated. _That_ is a mirror of _this_, and thinks the same thing about _me_.
What is the solution? A kind of transcendence of the identification with _this_. That I am _this_ does not mean I cannot be _that_ too. The inner feeling is that of an expansion of the soul to incorporate all perspectives. To be _apollonian_ does not mean one cannot be _dyonisian_, to be _yin_ does not mean one can be _yang_, and so on.
The image experienced is that of zooming out from a fractal. As soon as the polarities are transcended, new polarities appear, each one more relevant than the stage transcended before. It seems to never end, but the direction of experiencing The Whole is what indicates the way.
Walked: 17.1 Km
***
I met a woman whose manners seemed excessively rude, at least by easygoing camino standards. Then we had the chance to chat while walking, and the conversation turned towards spiritual matters. It turned out that her rudeness had to do with her spiritual path.
"How do you know it's not the ego who assigned you this spiritual task?", I asked.
She was at first offended that I would question the validity of her task, but after a moment of silence volunteered to say that the validity of these tasks are felt clearly.
"I don't mean to question your tasks, it's just that the same thing was whispered to me, and the outcome was very negative. When I look objectively at the time I practiced it, there's an obvious decline in the quality of my life. My theory is that the ego is the one who whispers these kind of things because it is hungry of power.
She seemed worried.
''Walked:'' 28.3 Km
---
{{Grand Theft Auto}}
Some things that are perceived in dreams are too much of a leap to explain rationally, but it felt clearly: In the last week I've been treating almost everyone I meet as an non-playing character, not making an effort to connect, going through the motions of introductions but knowing that I will leave the camino soon, and that every bond built will be a bond broken in the near future.
I do not yet understand what is the challenge, but it is breakfast time and everyone is sitting for breakfast, and I'm in a corner writing. It feels like the challenge is not being addressed.
Walked: 16.0 Km
_Approximation, phone battery was drained_
***
I looked down a cliff next to the sea. I saw some natural pools formed by the shape of the rocks. My phone was dead and I had no idea if it was safe to go down. I would later find out they are called [Pozas de Langre](https://www.google.com/search?biw=1280&bih=909&ei=DARHXaGTNMzXgQagqpzgCg&q=piscinas%20de%20langre&oq=piscinas+de+langre&gs_l=psy-ab.3..0i203j0i7i30j0i203j0i5i30j0i8i30l4.336071.337276..337568...0.0..0.126.951.0j8......0....1..gws-wiz.......0i7i10i30j0i7i5i30j0i8i7i30j0i7i5i10i30.kexZVHm24Wo&ved=2ahUKEwja7eiVz-njAhXHilwKHXj6BCEQvS4wAHoECAoQJg&uact=5&npsic=0&rflfq=1&rlha=0&rllag=43467869,-3716383,1364&tbm=lcl&rldimm=3737458222777842277&rldoc=1&tbs=lrf:!2m1!1e2!2m1!1e3!2m1!1e16!3sIAE,lf:1,lf_ui:2#plsm=1&rldoc=1&rlfi=hd:;si:3737458222777842277;mv:!1m2!1d43.4795791!2d-3.696129!2m2!1d43.4561601!2d-3.7269101!3m12!1m3!1d11341.30190215117!2d-3.7115195500000002!3d43.4678696!2m3!1f0!2f0!3f0!3m2!1i359!2i376!4f13.1;tbs:lrf:!2m1!1e2!2m1!1e3!2m1!1e16!3sIAE,lf:1,lf_ui:2) The tide could come up and get me into trouble. I decided it was worth the risk, and found a narrow path that zig-zagged down the side of the cliff.
I stripped myself from my clothes and swam. It was the most amazing feeling. I went underwater and opened my eyes. Everything was alive, the rocks covered in moss and molusks, hermit crabs scrambling, tiny fish swimming. These raptures with nature have a healing effect on the soul.
But natural places of this beauty seldom belong to one lover, and as I floated on my back I saw two pilgrims peeking from the top of the cliff, and soon enough they were making their way down. One was either too coward or too sane to make her way down the path, the other pressed forward until she reached the bottom.
I decided that my 45 minutes of solitude were enough to refresh my soul, and that I ought to leave the place for the next pilgrim to experience the same intimate rapture with nature. I climbed up the cliff and said hello to the coward/sane friend, who was puffing impatiently for her friend to end her swimming. I looked down and saw she was experiencing the same thing as I had. "It's better to not wait for her, she'll take a while".
Walked: 20.5 Km
***
I met an old woman who warned me not to drink from the water fountain, which had two signs indicating unsuitability for human consumption. I shrugged and told her my Mexican stomach could surely handle it, and then gulped on the water.
Conversation turned towards health matters: she told me she lost her appetite some months ago, and her husband looked at it with suspicion saying "something is wrong, let's go to the doctor". They ran some tests on her and found a misbehaving thyroid gland.
She wasn't recovering her appetite and she refused to eat, so the doctor fed her, and told her she'd be back to feed her for dinner if she didn't do it herself. She resumed eating to please the doctor. She was put into an MRI scanner and the technician told her to be very still. When she came out, the technician was amazed and said that he had never seen somebody remain so still.
I smiled: the health workers were doing their job. A doctor should not only provide proper treatment, but also give compassion and compliment the courage and willingness of the patient to put through discomfort. With all the talk about objectification we seem to miss that one rarely feels like a human being when stepping into a hospital.
We bid farewell. The next day I experienced a bad case of The Shits.
**Walked**: 14.8 Km.
***
Today I visited the reproduction of the cave of Altamira. After finishing, the guide asked if we had any questions. Things that raced through my mind:
1. Being that there are so many [inhabited caves along Spain's northern mountain range](https://drive.google.com/open?id=1BJN-3KPsL9ZOQhhsNVHvzAwTMxg&usp=sharing), how is it that Altamira's art is stunningly elaborate? Is it simply conserved better?
2. Would certain caves belong to certain tribes? Was this a tribe where artists were particularly skillful?
3. If tribes migrate to the coast during the winter and inland during the summer, would't the coastal cave have paintings of similar quality?
4. If the paintings represent animals which they didn't particularly consume (i.e. there were many goat bones in the cave, not nearly as many bison or horses), can it be inferred that they were aesthetically attracted to these animals?
5. Why is it that the entrances to the caves are never painted?
6. How is it theorized that these artists practiced their art? Since there are not many/any unskilled drawings on the wall, how would they accomplish the skill necessary to paint the cave?
I asked none of this, of course.
Walked: 27.3 Km
---
_Too much navel gazing, but it is necessary to process it. I hope writing this will simply get it out of the way._
About two weeks ago I perceived I wanted to work, but this camino is too crowded to find the solitude necessary for it. I arranged things so that I could go back to Madrid mid-August. I had a bit of bad taste leaving the camino without arriving to Santiago, and I was seeking confirmation from the inner and outer world that this was the right decision. From the outer world, at Güemes Father Ernesto clearly pointed out that the true arrows don't always point to Santiago, and from the inner world the confirmation came yesterday in a dream:
{{Everything is resolved}}
This dream is quite similar in meaning to [another dream I had before](https://medium.com/@duopixel/an-exploration-into-dreams-5b8e9547f54). The subconscious creates a "judge" to which you reveal yourself, and then the judge accepts it. During my walk I found myself in a different, more confident state.
I encountered three women carrying surfboards on their heads, I guess they thought I didn't speak English because, as we were negotiating our way in the narrow sidewalk, one of them said:
"I still don't understand why they do this".<br />
"Do what?", another asked.<br />
"Walk", she replied.<br />
"Ah, walking the camino, well..."
Their voices trailed off before I could hear the answer, but it felt as a placeholder for me to complete: why do I walk? I've told different people different things:
# There is nothing to walk about anymore, it's about the pleasure.
# To find the inspiration necessary for creative work.
# To say goodbye to Spain, because I'll be leaving for Mexico soon and I don't know if I'll be able to come back.
But in the end I walk because I thirst for it. I may justify the thirst with a reason, but its basis is not rational. The thirst is sated at a certain point, last year I perceived satiation at around kilometer one thousand, and I haven't been counting but I think I'm around the same amount again.
There is nothing special when this happens, it's a Forest Gump moment: "I feel pretty tired now, I want to go home". I'm not going directly back home, but changing the route for a camino called "Camino Lebaniego", and coming back to Madrid in five days.
I'll cease writing until then.
<iframe width="560" height="315" src="https://www.youtube.com/embed/v3153N2VIBM" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
***
After two months of walking, without arriving to Santiago, or having any particular epiphany, I felt an urge to put myself down to work. I came back to Madrid and threw away my hiking shoes. They were utterly destroyed.
The only conclusion drawn from this walk is that there is no difference between a _camino log_ and a _work log_, they are the same: inner work and outer work. The arrows point the way through seamless paths between personal and professional work, between inward and outward landscapes, between physical and psychological destinations, unveiling spiritual and rational truths.
But rather than waxing out cheap prose, I'd rather put these feelings into action.
While walking, you will sometimes feel a stone in your shoe which is so small you're able to walk on it. It might be bothersome, but it's innocuous. When is the right time to remove it, as soon as it bothers, or at your next stop?
Removing it involves pausing at a suitable location where you can sit (which usually involves taking off your backpack), untie your shoe, shake the stone out, and put your shoe back on. Seems simple enough, but momentum is difficult to regain, in walking as in all disciplines.
The parallel with work is that we often have small things that don't completely impede activity, but are a drag which makes work less pleasant. I'll volunteer my own problem: I came back with my clothes of the camino, and my wardrobe is extremely limited. I could go to where my things are stored, but then I'd lose half a day in this task. My work momentum is good and I don't want to lose it. Should I resolve this issue when I need a break from work, or should I address it immediately?
The wise person would answer "it depends", and may consider having a limited wardrobe to be a vain impediment to work. Let the wise person know that my entire wardrobe consists of exactly one shirt, one underwear, three pairs of socks, one pair of pants, and two bathing suits (it's a long story). This partially binds me home instead of being able to work at the library, where I accomplish better concentration.
The wise person would also question the validity of some assumptions: do you really need to take your backpack to take off your shoe? do you really lose momentum or you're just prone to procrastination and can't help but loiter once you sit down? Do you really have to untie your shoe or can you pull it out and slip it back on?
And the wise person would whisper to your ear: you're overthinking this. Just get down to work, and when you need a break, go fetch your clothes. Godspeed.
Some weeks ago, a person made me notice my words were not being consistent with my actions. I don't expect any person to be 100% consistent between what they say and do, but one can definitely see a pattern of virtue in those who do. It made me think: who are the people who I know to be consistent?
They don't seem to be stubborn or rigid. If anything, stubborn people seem to be incapable of noticing they changed their minds, they prefer to twist what they said so that it fits their actions better. They think they are consistent because any evidence of the contrary is promptly squashed.
Some (not all of them) have an ideological framework which seems to account for some of the consistency. They might be fervent Christians or Muslims, staunch hippies or libertarians, zealots of a particular philosophy or way of life. The consistency arises from aligning to a comprehensive way of thinking and acting. Still, within these groups one finds innumerable hypocrites among a small cadre of consistent individuals.
If they do not possess an ideological framework, they sure possess a great deal of self-knowledge. The problem is not trivial: the person who speaks today is not the same person who acts tomorrow. If you invite somebody to go on vacations with you next summer, when the time comes you may think it's not a good idea.
The consistent person isn't the one who sticks to his word despite all consequences. It's the person who was wise enough not to give his word unless he was certain about it. These people sign contracts with their words, so they don't go around making empty statements.
A part of it seems to be culturally conditioned. "I will send it tomorrow" and then asking for time extensions is the norm in Mexico, while in most of Europe and North America this would be a _faux pas_. If we agree that some cultural practices are sexist and thus should be addressed, then we can also agree that not all cultural practices are desirable and we need to address these too.
In the end I was glad this was pointed out to me. It made me appreciate people whom I consider true to their word. They are like finding fixed rocks while climbing a crumbling wall. The consistency seems to be part of a larger development of personality which still eludes me.
I would like to become a fixed rock too.
I blazed through [A Monk's Guide to a Clean House and Mind](https://www.theguardian.com/commentisfree/2018/jan/05/buddhist-monk-cleaning-good-for-you) which I stumbled upon at René's house. It was a pleasant read for which I have little to add, perhaps just warn the reader that the book is not meant to be a template for a cleaning routine (this would require you to become a monk), the main takeaway is the fact that it is possible to perform inner work by means of outer work.
The book repeatedly draws analogies between real world objects and their spiritual counterparts: windows ought to be spotless and completely transparent like our spiritual vision; light fixtures ought to be completely free from dust, for that which emanates light should not be obstructed; in dark and humid corners mold will grow, and the same will happen to our mind if we don't find time to meditate, and so forth.
For the person walking the spiritual path, these analogies arise naturally from all activity. The spiritual shepherd will show his flock the way by walking it, the weightlifter will inhale and exhale upon each repetition like a yogi, the spiritual scientist will (https://www.youtube.com/watch?v=lb13ynu3Iac)[see himself as a karmic agent of the world], the spiritual architect will predict [his buildings appearing in molecules](https://en.wikipedia.org/wiki/Buckminsterfullerene), and so on.
For the person performing activity out of spiritual motivation, there is no such thing as success or failure. That would be attachment. The purpose of outward activity is inward transformation. The things that dwell within the soul cannot be perceived by our worldly senses: they cannot be seen, heard or manipulated in any way. But the material world provides a metaphor to work with it.
While removing the dust of your surfaces and possessions, you are at the same time removing the dust from your memories and from memory itself. Is this a falsifiable statement? No, it is not, and thus is is not science. The great misunderstanding of our age is that anything that is not science is not real. For, as much as a great tool science is, it is impossible for it to experience the first person perspective, so people often ask: what does science have to say about love? about art? about the meaning of life? and the answers that come up are dry, vacuous or meaningless. These questions are not meant to be answered by science, they are answered by each one of us, within our hearts.
I checked out out a book from the library which seemed immensely interesting at first sight: [82 objetos que cuentan un país: una historia de España](https://es.wikipedia.org/wiki/82_objetos_que_cuentan_un_país:_una_historia_de_España). (_82 objects that tell the story of a country: a history of Spain_). However, upon closer inspection, I was disappointed by the approach of the book. The object is simply an excuse to speak about a location, a discoverer, a maker, an event or a cultural phenomena. The object itself (the _product_) is only discussed superficially.
Many of the _products_ are objects of technology. The vernacular definition of technology is _anything that is shiny and new_, but a more accurate definition would be _anything that extends the innate capabilities of human beings_. I would define a _product_ as a subset of _objects that were created by human beings with a deliberate purpose_. An apple is an object but not a product. Some works of art are products. A natural rock which serves as a stool is not a product, a rock shaped to be a stool is.
The first product that the book presents is the Excalibur biface, a stone axe found in the archeological site Atapuerca:
<img alt="DUTqqotXkAIzS9j.jpg" src="https://method.ac/writing/uploads/DUTqqotXkAIzS9j.jpg" class="mt-image-none" style="width: 100%;" />
Atapuerca is located in a prehistoric migration corridor used by grazing animals. Neanderthal ancestors (it is discussed if these were _homo heidelbergensis_ or a new species named _homo antecessor_) would use a natural trap there: a cave which had a chute and a side entrance. Early Neanderthals would lure or chase animals to the top chute where they would fall down to their death, and then use the side entrance to get to their meal. This feature made it a popular spot in prehistory, but Atapuerca consists of other cave systems which also yield archeological bounties.
The place where the Excalibur biface was found was a 13 meter long chute with many hominid and cave bear fossils were found at the bottom. It seems that these hominids (which are Neanderthal, not Sapiens ancestors) would use this chute to dispose of their dead, as in a cemetery, but archeologists often bicker among themselves and some argue that they might have been washed to the site from other places.
Some archeologists state that Excalibur was a ceremonial offering for their dead, the first one in recorded history. The facts that seem to support their hypothesis are the fact that this hand axe doesn't seem to have been used, that it was quarried from a location far away, that it is larger than usual and that it has an aesthetic symmetry.
Others argue that this is highly speculative. The earliest evidence of ceremonial burial is 100,000 years (by Neanderthals), excalibur is half a million years old. There is simply not enough evidence to know if its placement was intentional.
Excalibur is an example of Achulean technology, a term archeologists use to distinguish techniques for fabricating stone tools. Hand axes of the Achulean industry are perhaps the first examples of product design, its fabrication required the hand-eye coordination modern designers are familiar with, along with an overall plan on how to execute the piece. Here is a video on its fabrication:
<iframe width="560" height="315" src="https://www.youtube.com/embed/kyiH1xtmN_w" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
So, was the purpose of Excalibur ceremonial or utilitarian? In my imagination, a master tool maker loses his life and is dropped down the pit. A tribe member, filled with grief, throws the last product of his fabrication after him. His fellows had never seen anything like it, yet they all feel in their heart it is right.
<center>
<img alt="painting.jpg" src="https://method.ac/writing/uploads/painting.jpg" width="519" height="793" class="mt-image-none" />
</center>
Sometimes you wish to express about things which can be felt through intuition, but either your capacity for expression falls short, or language itself isn't enough to express what you feel. When I'm trying to explain something which I feel is very true but very difficult to explain I begin mumbling, then I pause and I say: _you know what, these things cannot be explained_. If there is a moment of silence, I usually experience the sensation accompanied with imagery, and the idea finds it's verbal counterpoint by the way of metaphor and I can express it clearly. Often I'm amazed at the eloquence with which my mouth speaks. It doesn't seem to be me who is speaking.
When I've felt the incapacity to express the idea, instead of mumbling I've asked for a couple of seconds to think it out, but this doesn't work, I can hear in my mind saying _think of something, think of something, think of something_, and the resulting moment is quite awkward. The _sensation accompanied by imagery_ occurs in a moment of inner and outer silence, it's living the intuition again in a way that is easier to share.
It seems, if our mind is constantly chattering, it is unable to notice the movements of the soul. This is a modern disease: if you ask someone _how do you feel?_ they will reflectively respond _good_. Then ask _no, how do you really feel?_, and they will either mutter what their mind is saying _yeah I'm really fine, I did this and this and I'm good_. A truly sincere answer would require a moment of inner and outer silence for self observation, it is similar to the observation that happens during a body scan.
Us humans have imaginary dog tails, and if we could see them, many of us would walk around with our tail between our legs. For some of of us it's impossible to know that wether we are anxious because having our tail between our legs is our normal way of being. This is why some many meditative disciplines put emphasis on the root chakra, this is where our imaginary dog tail curls up. This is experienced as a tightness of the sphincter. It is possible that we may not notice it is tight because we go about life with our tail between our legs, and that requires a special kind of work, but for the time being let us simply notice if we're being _uptight_ or _anal_ about things. Anxiety seeks security.
We can move on to the gut, below the navel, sometimes just noticing it gives us a sensation of nausea. That's disgust. How it translates to human emotion is a bit different, you may experience disgust if you are informed that your pet died, for example. Emotions are seldom experienced in their pure form, so the death may combine sadness (experienced in the heart) and disgust (experienced in the gut) which would combine to grief.
Butterflies felt in the gut with a relaxed tail and a happy heart can be experienced as romantic excitement, but butterflies with an anxious tail can spell and impeding sense of doom.
The heart is, I think, one of the most challenging organs to attune to. Sadness and happiness are not a single spectrum, they can be experienced simultaneously (in the form of nostalgia). Experienced independently, the heart tends to _leap out_ or to _sink_ depending on the emotion.
Then the face is the mirror of all the emotions, but almost impossible to observe without a mirror. Only through prolonged meditation you have access to information in the face. I personally experience anger in my eyes and my nose, but I suspect this may be idiosyncratic.
This is not meant to be a detailed map of the emotions one can find during meditation. If anything, it is a sketch of the things I have personally observed and they should be verified by the reader. The Dalai Lama commissioned an [interactive website on emotions](https://www.nytimes.com/2016/05/07/world/dalai-lama-website-atlas-of-emotions.html) if you'd like to [check it out](http://atlasofemotions.org/). This map is a bit more detailed, but it must still be accompanied by inner work.
My laptop charger has been causing strange hissing sounds on the MacBook, I googled it and it said it was innocuous and caused by the lack of grounding. It did not happen before, so I was slightly concerned, but today the charger gave out and I ordered a new one from Amazon.
I found a portable keyboard at Rene's, so I paired it with my phone to get a feel of how it it works. I intended to try this on the camino, but it didn't get get chance. So far the layout is quite uncomfortable, I seem to always miss modifier and arrow keys, but it is better than typing on the screen.
Additionally, I have whatsapp notifications popping up, diverting my attention from writing. I activated airplane mode to deactivate notifications, but then the bluetooth keyboard unpaired (of course) so the best I can do is put on sleep mode. I'll still see the notifications at the top of the screen, but anyways...
As I begun writing stream of thought, I ought to continue writing like this. It is a style I abandoned because I was utterly fed up with it. I bored myself describing my daily grind. The upside is that it rarely took me more than 30 minutes to write my work logs, nowadays I find myself taking between 1 and 1.5 hours. Is there a way in which this amount can be reduced?
In the last days I've been putting time into a shared endeavor with Rene, called write.now.
I have switched to write.now in order to continue writing this work log. The landing screen was unusable on mobile, but the app itself seems to work ok. The experience is much more pleasant than notes, though five words per line is perhaps too low.
But it's good! That's surprising, low hanging fruit indeed. We've been working on this product during more than a year, with a very careful dogfooding process. All my work logs have been written on it. It's a great tool but the simplicity will fool many people.
What if you had a place on the web where to write, which required no registration, no bullshit, and if you closed the window or restarted your computer you'd come right back to it? It's almost as simple as a customized textarea, but that's part of the charm.
We will release this product in the near future, and I will make sure it works on mobile too. I want to write my inner/outer work logs on the go.
It turned out that what was broken was not my charger, it was my MacBook. The non-apple charger I was using fried some internals which might turn out to be an expensive repair. I will get a quote on Monday. I had an old MacBook Air lying around, a machine from 2011 which still works surprisingly well, and I'm using that to write at this moment.
In the last few days I've been preparing a short trip to Germany, and then my final flight back to Mexico. I feel a bit overwhelmed: there's many things I must complete before making this final move. I feel compelled to write about problems of the present rather than insights about life, as a way of dealing with them, I guess.
But I'll begin tomorrow. For today, I will share a forgotten dream I found on this old computer, written down on spring of 2017:
{{Write again}}
Today I sent documentation to an online advertising agency that wanted me to point a subdomain of method.ac to a server where they will serve skinny content with tons of ads. They pay a generous amount ($2,500 USD/mo) and it will not be associated with my brand. They promote this spammy content on social media, and since my domain's reputation is pristine I suppose it helps them bypass spam filters.
It feels like selling out. I've never wanted to monetize in vulgar ways, and this is as vulgar as it gets, but it allows me to completely separate creation from monetization. The ads are not inside my games, interfering with the user experience, there's just a shady business going on at my backdoor, where most people can't see it.
I feel equanimous about it. I made a big effort trying to monetize in tasteful and honest ways. It didn't work out. I was about to place inter-stage ads (<a href="http://carbonads.net">by carbon</a>) but this required less effort to implement, less annoyance to the user, and provides more revenue.
But it does make me a bit sad: why is it so difficult to do things in an honest way? How is it that a company can write mind-numbingly stupid articles (i.e. 20 reasons why Kanye West is crazy), divide it into 20 screens, plaster it with ads, and make enough money from it to pay its contractors and providers and still make a profit?
An acquaintance once remarked that he'd love to create a horoscope app.
"Why is that? You don't believe in horoscopes", I asked.
"Well, people who read horoscopes are stupid enough to pay for in-app purchases if they want to dig deeper into it", he replied.
"Nothing good can come from thinking that your users are stupid", I countered.
"I disagree. Many modest and not so modest fortunes have been made from exploiting stupid users", he replied.
"Can you name one?", I asked.
"Yes, Phillip Morris".
I put out my cigarette and conceded my loss.
Today I lied to a police officer. I said that I had lost my Mexican passport when I forgot my backpack in a subway car. I needed a police report of the event in order to get out of the European Union without the risk of getting fined or banned, because my last entrance stamp is from a year and a half ago.
When the policeman completed the report he handed it to me and asked me to make sure all my personal information was correct, pointing to the relevant paragraphs. I proofread the entire thing and found a paragraph which said that I was informed that there would be possible legal consequences if I gave false testimony. I didn't call him out on it, of course. It was better to feign ignorance.
Is it foolish to admit this publicly? I don't care. In my heart I'm not guilty of a crime. I love Spain way too much. If I were able to get honest with the policeman, I would have told him Spaniards have a wonderful, secure, tolerant and beautiful country, and that it is very difficult to leave. For a time it made me feel guilty about _cheating_ on my native country, until I made a sentimental model which allowed space for both of them: Mexico is my mother and Spain is my girlfriend.
Many people who knew about my situation suggested that I may apply to gain refugee status, perhaps with the violence situation in Mexico it wouldn't be too difficult. This felt like treason, nothing remotely bad has happened to me in Mexico as to consider leaving, and then the sheer amount of lies I'd have to support would mean living a double life (one to the Spanish state and the other to the Spanish society). It was never an option. In the end it was the right choice, as a tourist I can slip in and out the borders without being noticed, a refugee cannot do that.
There was a time when I was in the subway, and a drunk spaniard was screaming at another passenger. The other man, a latino, was ignoring him. "Excuse me", I asked, "what is the problem?". He proffered some insults to me too, but I persisted "I really want to understand what is the problem with the man".
--"They are taking away our place", he said.<br>
--"Well, if you were here before, then he doesn't have the right to take your place", I answered, thinking that he was speaking of the seats in the subway car.<br>
--"Ain't that true? We were here before, but now then come and they take away our jobs!". Then it clicked. He was screaming at an immigrant because he was blaming him of his problems.<br>
--"Did you lose your job?", I asked.
He ranted for some time about his situation. I listened with empathy. I then said I was from Mexico, that I had walked more than 3,000Km of his wonderful country, and that I probably knew his hometown. I didn't, but I knew the whereabouts. It was a nice valley which I fortunately remembered. I commended the prosperity of the soil and the clean rivers which came down the nearby mountains. _The water from the streams tastes very good there_ I told him. He gleamed with pride.
Soon it was time for him to leave the train, he stood up and shook my hand and said some words of appreciation. It had never been my intention to dissipate racial tension, but somehow it all came naturally. As he left the car it came to me in a flash: _it is not possible to hate somebody who has an honest love for your mother_.
I've observed that my writing style has become more verbose.
I've seen that my writing has become verbose.
My writing has become verbose.
***
I see that if I edit heavily, I can reduce the amount of words needed to express my thoughts.
If I edit what I write, I can express my thoughts more efficiently.
If I edit what I write, I can make words count.
***
It seems to be time, writer's block is way behind me and it's time to polish other facets of writing.
It's time, writer's block has been cleared and it's time to polish my writing.
It's time to polish my writing.
***
My writing has become verbose. If I edit what I write, I can make words count. It's time to polish my writing.
Do you feel more comfortable sharing your lightness or your darkness?
Both are difficult to speak about. Lightness because it's pretentious... _Today I saw a gentleman drop a 50 euro bill and I handed it back to him_. Congrats, but what's the purpose of telling other people? So that they think highly of you? The light of your action casts a shadow, you wish to convert the virtuous action into social status
Darkness is equally difficult to speak about. _I once saw a gentleman drop a 50 euro bill. I picked it up and I didn't tell him_. What feeling arises in the hearer? He might clutch his wallet while expecting expressions of remorse, but guilt is for hypocrites who don't want to rectify the situation. Guilt would disappear if they were to put that money anonymously towards a higher purpose. But then, if you say "I picked up a 50 Euro bill that a gentleman dropped, then I gave it to a beggar in the corner", again you are falling into the trap of converting darkness into lightness and back into darkness.
Today I was watching an interview with [Pablo D'Ors](https://es.wikipedia.org/wiki/Pablo_d%27Ors) in which he is asked to speak about the meaning of life:
<iframe width="560" height="315" src="https://www.youtube.com/embed/pW0fKZviGjQ" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
A summarized transcription of what I found interesting:
> "What is [the meaning of my life]? I'd say the meaning is fundamentally redeeming the shadows and discovering the light. In this world there's lights and shadows. Shadows are not there to be denied or pushed aside, but to be passed through and redeemed, and to discover that in their heart there's a light, and that light is what truly _is_. So, if I had to summarize the meaning of life in a couple of words, it would be 'discover who you are', because when you discover it, the answer will necessarily be a life in favor of others".
From a completely different line of thought, Carl Jung writes:
> Unfortunately there can be no doubt that man is, on the whole, less good than he imagines himself or wants to be. Everyone carries a shadow, and the less it is embodied in the individual's conscious life, the blacker and denser it is. If an inferiority is conscious, one always has a chance to correct it.
The opposite movement is clearly called out in the Bible, but is a teaching of all religions:
> "Beware of practicing your righteousness before other people in order to be seen by them, for then you will have no reward from your Father who is in heaven. "Thus, when you give to the needy, sound no trumpet before you, as the hypocrites do in the synagogues and in the streets, that they may be praised by others. Truly, I say to you, they have received their reward. But when you give to the needy, do not let your left hand know what your right hand is doing, so that your giving may be in secret. And your Father who sees in secret will reward you.
And thus, the spiritual path requires you to conceal the light and expose the shadow. It requires you to do "good" things in secret, and be public about the "naughty" things. But these things ought to be verified in person. Try doing something good, and keep it a secret. Note how it matures.
Ayer me reuní con Javier Cañada y tocamos el tema de procurar no introducir léxico foráneo al castellano. Javier tiene el tema bastante desarrollado, y espero que algún día se anime a ponerlo por escrito. A mí, en lo personal, me parece una <del>constraint</del> limitante que hace la práctica del lenguaje más interesante. Si alguien escribiese durante toda su vida exclusivamente en castellano, le animaría a aderezar sus escritos con alguna palabra foránea. Aunque, a decir verdad, cuando me topo con alguien introduciendo francés o latín, pienso _pinche mamador_.
El inglés, sin embargo, lo tengo tan interiorizado que en el transcurso de nuestra charla me costaba trabajo no salpicar mis frases con algún anglicismo. Nuestra conversación no era lo suficientemente técnica como para justificar el uso de palabras en inglés, y sin embargo me sorprendía tropezándome en cada tercer enunciado. La limitante me obligó a notar cuánto usaba el inglés en mi habla cotidiana.
"Quizás experimente con escribir mis logs en español", le dije a Javier, "puede ser un ejercicio interesante". Y sí, lo es. Es como otra voz que se me había olvidado que tenía. Aún no decido que hacer con ello, pero quizás lo ejercite un poco más en el futuro.
I'm currently on a flight to Berlin. What begun as a romance on the camino prospered into _something_ which doesn't have a name yet, and I could just not leave Europe without honoring the heart. It's strange to write about it so openly, but I guess that into my future logs I'd like to feel comfortable expressing my geographical and sentimental situation and it's better to be upfront.
Before leaving I was able to get my MacBook Pro repaired, or I should say _replaced_, because the technician transplanted the screen and the hard drive to a used MacBook of the same model. Or so he said, because the "about this mac" dialog informed me it was a 2013 model, while mine was a 2015. Apparently, in this period Moore's law froze, because the specs were very similar. He made me a discount and now I have the deceased body of my 2015 MacBook and the 2013 replacement.
To this trip I brought my 2011 MacBook Air, which is a much better travel computer, and I wouldn't mind if anything happens to it. I've been having a string of bad luck with _things that I touch_, it feels like being an anti-midas. _Stomach hands_, we say in Mexico. Everything you touch turns into shit. I borrowed a bike, the bike's pedals went awry. I took it to the repair shop, then a pedal fell off.
It's interesting to note what happens when a string of events starts going wrong. The spiritual feeling is that one is _cursed_, and if the nature of the events are related, the rational mind will say it's a random event where the mind is seeing a pattern, but it's worth deeper consideration.
Do you know somebody who is accident prone? Would you say it's purely bad luck, or there is something in their character of way of moving that would make them more likely to get into an accident? Some people acknowledge their clumsiness, but others completely fail to see they put themselves in the way of danger.
Other people seem to fall victim of unhealthy psychological patterns: all their romantic partners have cheat on them, or they have the same kind of conflict in every workplace they've been, or they get into abusive relationships. Often times it's obvious to the outside observer, but when suggested the _cursed_ person will vehemently deny any wrongdoing. And to make matters even more difficult, upon certain type of events it's taboo to suggest that the victim may change something in his or her behavior so that they are better able to deal with a shitty world.
As I come back to my own unhealthy pattern, a sudden _stomach hands_ syndrome, I notice that due to my economic constraints I've been ignoring problems. My MacBook Pro was exhibiting strange behaviors while connected to the charger (static noise and vibrations if you passed your fingers though the surface) but I chose to ignore it in the same way a driver ignores a noise in the car because they can't afford to take it to the mechanic. In the case of the bike pedals, they felt strange to my feet but I didn't have the tools to adjust them, and I used it until it ate the thread, resulting in a more expensive repair. The rest of things seem to unrelated, the pedal fell off because the people at the shop hadn't adjusted it correctly, but then the mind thinks "Oh, it's that everything I touch turns into shit". The spirit becomes sick and soon enough it seems that you are at fault if the plane has an accident while landing.
We're about to arrive to Berlin. If I get to publish this, I will declare myself cured from _stomach hands_ syndrome.
For the past few days I've been furiously scribbling into a makeshift journal, not feeling the slightest inclination to share the experiences of the heart in this log. Before I left Madrid, a friend asked me: will you still publish your log while you're in Berlin? I don't know, I'll feel it when I'm there, I answered.
This is what I feel: my log is for inner and outer work. Love is not work. However, one can work with love:
> And what is it to work with love?<br>
It is to weave the cloth with threads drawn from your heart,<br>
even as if your beloved were to wear that cloth.<br>
It is to build a house with affection, <br>
even as if your beloved were to dwell in that house.<br>
It is to sow seeds with tenderness and reap the harvest with joy,<br>
even as if your beloved were to eat the fruit.<br>
It is to charge all things you fashion with a breath of your own spirit,<br>
And to know that all the blessed dead<br>
are standing about you and watching.
--Khalil Gibran, On Work
In the spiritual path you'll surely experience the most paradoxical of sensations: intolerance of intolerance to tolerance. Let us unpack this in a practical example; suppose a neighbor rings your bell to request you to sign a petition to kick out a Korean neighbor because he occasionally procures dog meat, then cooks it and eats it at home. You personally find the concept disgusting, but you wouldn't prevent anybody from doing it, so you refuse to sign the petition.
The neighbor turns his ire towards you, if you are not with him you are against him. "So you support people eating dog meat!". _No_, you might explain, _I don't like that people eat dogs, but I don't think people ought to be banished because I dislike what they do_. And here often people will become confused, because even though you express agreement in principle you express consequential disagreement. So in the black and white thinking they place you on the opposing side, marking you as an enemy.
And there lies the ultimate trap: if you only tolerate your dog-eating neighbor and not your crusader neighbor, he pushes you into the duality of a war which is not yours. He will make you pick sides, and you will be fighting for tolerance though everybody will perceive you as defending dog-eaters.
If tolerance ought to be a universal principle, it should be respected even when it comes to intolerant people. "I appreciate neighbors who eat dogs as much as neighbors who knock my door to banish neighbors who eat dogs", you might say. Refuse to take part in conflict.
One must keep in mind, however, that deep intuition overrides all principles, and if the world calls you into action you ought to take heed of the call. When you are in touch with your deeper self, the call is unmistakable.
> Weapons are instruments of fear;<br>
they are not a wise person's tools.<br>
They use them only when they have no choice. <br>
Peace and quiet are dear to their heart, <br>
And victory no cause for rejoicing. <br>
If you rejoice in victory, then you delight in killing; <br>
If you delight in killing, you cannot fulfill yourself.
--Chapter 31 of the Tao Te Ching
So many impressions! What to write about when the heart and mind are clogged with emotions? Should you attempt to untangle the knots you caused unto yourself? In meditation one does not attempt this, it is folly. It is enough to perceive the simplicity and follow it with the breath.
A moment of presence: I am overflying Germany with Madrid as my next destination. I'm on the very last row in the window seat of an Airbus plane. Through the window I see an almost completely dark sky, with a color spectrum gradient at the horizon, and an endless sea of illuminated cities beneath me. They remind me of photographs of neurons, irregular cells connected by synapses.
I close my eyes and I follow my breath with the express intention of allowing the first thought to emerge after my attention drifts. It came to me: how is it that I've allowed for ideology to divide and distance myself from the people I love? I claim to have no ideology, but a character that is repelled by ideology is ideology in itself. The ideology of non-ideology is revealed. Being non-ideological falls into the [anti-anything fallacy](https://method.ac/writing/work_journal/2019-07-17_camino_log_urdax_sare.html) I've written about before. What is the positive form of non-ideology then?
Socratic ignorance. Not knowing. Embracing the fact that one knows nothing. Inner silence. Curiosity in the opinion of the other. Fact checking. Attention. Verifying premises. Following logical conclusions. Listening. Helping the other think and form arguments that can be then accepted or refuted. Indifference to victory in argument, but joy in revealing truth.
> Empty yourself of everything.
> Let the mind rest at peace.
> The ten thousand things rise and fall while the Self watches their return.<br>
> They grow and flourish and then return to the source.<br>
> Returning to the source is stillness, which is the way of nature.<br>
> The way of nature is unchanging.<br>
> Knowing constancy is insight.<br>
> Not knowing constancy leads to disaster.<br>
> Knowing constancy, the mind is open.<br>
> With an open mind, you will be openhearted.<br>
> Being openhearted, you will act royally.<br>
> Being royal, you will attain the divine.<br>
> Being divine, you will be at one with the Tao.<br>
> Being at one with the Tao is eternal.<br>
> And though the body dies, the Tao will never pass away.<br>
--Chapter 16 of the Tao Te Ching
<img alt="IMG_5094.jpg" src="https://method.ac/writing/uploads/IMG_5094.jpg" style="width: 100%" /><br />
_Self-portrait circa 2015_
I am sitting on the plane with an 11 hour flight ahead of me. Though I was well prepared for interrogation by immigration agents, my Canadian passport was stamped without a single question asked. I was relieved.
Honestly, my soul is grieving about leaving Spain. I will surely be inspired to put down my thoughts about this land in future logs. It was painful to part ways with old and recent friends I met yesterday at a farewell picnic at Retiro. Every time I move from a country, I feel my roots tear from the ground, and as I spent my last weeks in Germany the tearing was all the more sudden and harsh.
Parting ways with possessions that have sentimental value was also hard, but necessary. I had amassed a collection of "sacred objects" which required ceremonial disposal, but through my own folly I let time pass and was faced with the harsh reality that I would have to throw them into the garbage bin. Sacred objects cannot be left behind or given away, their significance would become corrupted.
So, this morning I stared at my sacred objects wondering how I could get myself to perform this emotionally difficult operation. Then it hit me: by documenting the object publicly, you are spreading its meaning to the [noosphere](https://en.wikipedia.org/wiki/Noosphere). If one stores the soul of an object, the material part of it becomes insignificant! After committing to this I no longer felt attachment to them.
The reader might find some of the stories behind the objects strange, to say the least. When you lose your soul and go on a quest to recover it, you are faced with the most absurd trials, and for sure you question your own sanity. The soul is never recovered, it is formed anew by passing through the same stages that civilization itself has gone through, and these objects belong to the archaic, magical and mythical period of my personal quest.
These stages have been transcended, and I no longer seek shamanic or mythical training exercises (though I engage in them if they find me). The stages that follow (the theistic, the rational and the post-rational) are much more familiar to modern society, and the sacred objects one collects from them quite conspicuous. I would consider, for example, The Boolean Game to be a 'sacred object' because it came from a place of inner work. Fortunately digital sacred objects are easier to store and transfer than physical ones.
Since the stories are long, I will not have enough time in this flight to document all of it, I will complete my task as time allows. These objects I have already thrown away, and their soul is currently in the purgatory. It is by documenting them that they reach the heavens. Do souls in the purgatory ever reach hell? Only if they are disowned by their creator.
1. [Zangarrón mask](https://method.ac/writing/sacred_objects/zangarron_mask.html)
2. [Singing bowl](https://method.ac/writing/sacred_objects/singing_bowl.html)
3. [Pinecone](https://method.ac/writing/sacred_objects/pinecone.html)
4. [Chinese box](https://method.ac/writing/sacred_objects/chinese_box.html)
5. [Artist box](https://method.ac/writing/sacred_objects/artist_box.html)
6. Kalimba (upload pending)
7. Rattle (upload pending)
8. Horn (upload pending)
9. Quran (upload pending)
As I write this I'm on a flight from Cancún to Puebla. I have a window seat and when I look out the land looks sparsely populated, long straight lines connecting villages in a grid layout, a big change from what I saw on my flight from Berlin to Madrid.
My time in Mexico so far has been interesting. I always find it strange to experience an old country anew. When I went out of the airport and felt the humid heat and the smell of sea a thousand memories came back to me, because I've lived here before. Then it was catching up with the people, the food and the most urgent administrative tasks I needed done.
The people here are extremely kind in contrast to Europe. It is not only a matter of manners, there's a disposition to please the neighbor and make way for the other. There are a few rotten apples, of course, and when they are rotten they tend to be more toxic than the average grumpy Spaniard, for example.
I have little enthusiasm about being here, and when I face things which I don't want to experience the heart tends to stiffen. The good news, though, is that I escape through work and that will be welcoming an old friend who never fails to cheer me up.
The sensation is that of having lost my home. My possessions have been reduced to 35Kg divided in two suitcases. The weariness of spending some weeks back at my parents. The uncertainty about the future.
And still, on the positive side: a freelance project from a former boss whom I greatly admire, seeing people I love, the freedom that uncertainty brings.
I understand the somber mood as a grieving process. This too, will come to pass.
<video width="100%" controls>
<source src="https://method.ac/blog-images/IMG_5302.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
Places and people which which you spent a significant amount of time tend to gravitate you towards the level of development at which you last met.
Friends with which you used to drink will gravitate you towards drinking. Even if they don't drink anymore, the fact that you are there is a trigger to drink.
When coming to live with your family again, you will find yourself acting as the last time you lived together. Our parents and siblings have a way of making us fall back into patterns that had long been forgotten.
Old places trigger memories. I'm now sitting at which had been my bedroom the last few years I lived in Puebla. It no longer looks anything like it used to, yet a strong desire to smoke and put myself to work seems to arise here.
This house is now empty. It is possible that I may live here for a couple of months. I feel echoes of sensations and moods which I hadn't felt in many years.
What is one to do?
Accept the invitation to regress, then walk from there from a mature perspective. If your buddies invite you to drink, drink with them. Later on you can invite them to an activity that interests you nowadays. If a house brings revives emotions, accept them, and then meditate the house as to associate it with more developed psychological patterns.
In the spiritual path nothing is rejected, all is included and then transcended. Coming back to old paths will place you exactly where you last left them. "Oh no!", you might think, "I just lost 25 years of life because I'm back at the same spot!". But that is considering the contents of experience useless. These branches are thirsting for the sap and yearning for the sun that young branches are getting.
<img alt="IMG_4945l.jpg" src="https://method.ac/writing/uploads/IMG_4945l.jpg" class="mt-image-none" style="display: block; width: 80%; margin: 0 auto;" />
I feel an impulse to divide my log into work log and spirit log. Professional and soul activity are on separate tracks now, both active yet completely unrelated. The mixture proves to be water and oil, and I end up writing mainly about one side and making a puny reference to the other.
I will continue having a work log, but then I will put down the spiritual insights in pieces of a different kind: essays, aphorisms, stories, poems, etc. This is to warn the habitual reader: for a time, my work logs will lose their spiritual moisture.
I expect the double-vision to merge into a single image when I tackle personal projects again.
***
I came to inhabit the home of a cousin during a week, while he's on a trip to Argentina. It's a spacious, modern and uncluttered home. I might as well snap a picture of it:
<img alt="IMG_5312.jpg" src="https://method.ac/writing/uploads/IMG_5312.jpg" class="mt-image-none" style="width: 100%;" />
It has, however, two affectionate cats and I found it impossible to work with them twirling around my legs, so I searched for the nearest public library, which was too far for my disposition. I was a bit saddened by this discovery: this home is well located and the city has the same population as Madrid, but its public infrastructure could be compared with a town of perhaps 100,000 in Europe.
So, instead of heading to the library, I went to the nearest Starbucks (sigh) which was in a mall. But instead of Starbucks I found a café in a grocery store called City Market, which appeals to those with European tastes (sigh), and put myself to work.
Work did not come easy: those moments when you are first getting familiar with a development stack are frustratingly unproductive. It seems ease of use is squeezed around like a balloon: setup is a breeze, but then including a customized icon can be a headache. Then waiting three seconds for everything to recompile is frustrating for a person who designs with code.
The modularity of modern web development has squandered the talent of many web artisans. A similar thing happened in the Arts and Crafts era, when objects begun being mass produced there was a big sacrifice in love, personalization and aesthetics. The upside, however, was quality of life for all of humanity. In the same way, this modular way of building applications makes it possible to solve problems which are not necessarily financially rewarding (applications for NGOs and long-tail problems).
Before leaving for home I shopped for groceries at City Market. Out of my frugal habits I grabbed a jar of lentils and a jar of chickpeas. Then I did a double take and checked the price: the equivalent of 2,50€ each. Oh yes, I'm in Mexico. I grabbed two cans of beans for one third of the price.
Yesterday I attended the wedding of a dear friend. The conversation with the person sitting next to me turned on the spiritual, I will paraphrase his point:
> The first time I noticed the startling difference in the spiritual perspective was when my mother died. My sister, whose worldview is scientific, had a very difficult time dealing with the loss. As her death was sudden, she couldn't say goodbye. She left with many things unsaid. She would never see her again. My mother was torn away from my sister as an unfair act of an uncaring universe.
> On the other hand, I dealt with the loss much better. In my understanding of things she is in a better place, I cannot speak with her directly, but in my wordless dialogue with God I ask Him to reflect the love that I feel for her, and I found peace in the fact that her spirit needed to be reclaimed suddenly without us being prepared for it. I won't say it wasn't hard, but the difference in our spiritual understanding made a world of difference in our grieving process.
His example brought memories of a conundrum very difficult to transcend in the transition from the scientific to the spiritual worldview. The transition does not represent an abandonment of scientific values, that would be regressing into a magical worldview. It threads both worldviews into a single stream in which both perspectives are valid.
The integration is not meant to be understood intellectually. In Plato's writing one encounters the word _reason_ to refer to this concept, but it is not the discursive rational reason we refer to nowadays. The ancient greek concept is [logos spermatikos](https://en.wikipedia.org/wiki/Logos#Stoics) (seminal reason), which is found in silence and not in discursive thought.
But--with reason--the rational person finds it impossible to compromise truth for emotional convenience. You may think "I am incredibly lonely and isolated. I wish I could have a friend and confidant like some people find in Jesus, but I won't believe in Jesus just because he makes a convenient imaginary friend". But, if pain pushes you a bit further, you may experiment:
"If I create a sandbox where Christ is real, and I have conversations with him, at least I can sense from experience how this feels", and so you may meditate for an hour or so, having a conversation with an all-loving, all-compassionate being who would love you despite all your flaws. "Ah, the things that this 'imaginary person' says to me is way more truthful than the horrible things which I say to myself. How is that?".
And so if a truth is recognized, the sandbox would grow a little bit each time you'd do this exercise. Soon you'll find vast expanses of sand and undefined borders in your sandbox. It may be that the ratio becomes inverted: you are mostly a spiritual person with moments of rational skepticism. The wise thing is become aware when each kind of cognition is necessary.
The cats seem to have lost interest in me, with the novelty worn off they no longer climb on my lap or twirl around my legs while sitting at the computer, so I stayed home to work.
I alternated client work with writing and administrative things. I enjoyed the focused day, but at the end my back was aching and my body was yearning for a workout. I searched for a gym near what is going to be my next home base.
I found two good options:
A. Modern, low budget gym inside a posh open-air mall. Close to all kinds of amenities. 30 min walk from home.
B. Cheap, basement kind of gym for pumping iron. Close to the fresh-produce market. 10 min walk from home.
Option (B) would have been my default choice: no-frills, isolated, focused, healthy. I was surprised I would even consider option (A), the pretentiousness of the mall is nauseating, but with fresh eyes it's simply the way things roll in this town.
I often reach this dichotomy: be authentic yet isolated, or be connected but compromising. I always take the path of isolation, it's perhaps time that I explore what lies on the other side.
A brief work log because I don't have time:
I signed up for the gym after four months of absence. It was wonderful.
I worked at the café in City Market. It was wonderful too.
Pedestrians in Puebla are the lowest caste in this society. Women carrying babies in their arms are blatantly ignored. Sidewalks are a shame. Bridges where not more than one person can pass at a time. Dwellings blatantly eating into the sidewalk. Zebra stripes are for pavement decoration. I spoke to my sister about this, she said she completely understood because she's occasionally a pedestrian too, but when she's in a car pedestrians become invisible.
That's indeed how it feels. First of all there's no pedestrian traffic lights, and you may try to cross a street where nearly everyone turns, and as people run the yellow light, by the time you try to cross the cars from the other side are already over you. You often have to cross running. People have become used to this, but it is insane!
What is most jarring is that mostly people who can't afford a car walk. Outside posh areas sidewalks are in such a bad shape, the streets so loud, and the urban environment so hostile that you would never go for a leisure walk. You walk because you need to get to the bus stop, to the store, to whatever, and it's never a pleasant experience.
I am tempted to begin documenting the most offensive things. You are on a sidewalk and think "oh my, this is impossible": a balcony that comes out to the sidewalk at eye level. A person who decided to make of the sidewalk his garden. And so on.
Anyways, I said I would be short, but I got carried away. There are also many beautiful things in Puebla. I'll make a point to write about them too.
I sat down to write my work log and described my day. It was the most boring thing to write, and to read too. "I used to do better than this", I thought, and I referred back to my writing on the camino. I couldn't help but keep on reading all the way through. The strangest of thoughts arose: "who is this person who is so inspired? How can he find insights to write every day? I wish I was more like him!".
And then I realised: I accidentally focused on the pettiness of every day life. It's listening to the background noise instead of the great concert of life. It's looking at the seams instead of appreciating the self-knitting fabric of existence. It's knowing you won't laugh at a joke before the punch line.
Oh how dramatic have I become! I'll indulge, just for today. That which the heart does not express is acted out. Why this mood? Is it melancholy for things left behind? Indeed, it is.
I had written this after the camino.
> The only conclusion drawn from this walk is that there is no difference between a camino log and a work log, they are the same: inner work and outer work. The arrows point the way through seamless paths between personal and professional work, between inward and outward landscapes, between physical and psychological destinations, unveiling spiritual and rational truths.
How could I forget! Let us go to bed, praying for inspiration.
<img alt="IMG_4953.jpg" src="https://method.ac/writing/uploads/IMG_4953.jpg" class="mt-image-none" style="display: block; margin: 0 auto; width: 75%" />
I laid in savasana after yoga class. Intruding thoughts came about the teacher: she's clearly an impostor. I'm not that experienced in yoga, but she made us warm up as you do in a physical education class, these asanas clearly don't belong to any tradition, and sequence progression jumped all over the place.
Again, looking at the seams rather than marveling at the self-knitting pattern. What does this mean?
To the rational mind, I signed up for a low-budget gym that pretends to offer yoga classes, and I'm frustrated at it. The train of thought takes me through a detour: I've seen first hand the anxiety, the bitterness, the resentment that this so called rational mind causes. It would be more accurate to call it the irrational mind. How rational is is it that you feel resentment rather than relaxation in savasana?
Say you see a dog resting after a walk. He's there, chilling out. Seemingly out of nowhere, it frowns and bares its teeth. It growls slowly. The dog is not dreaming, it is awake. It is not directing its hostility at anyone or anything. You figure out that it has summoned an enemy in its imagination.
"Crazy dog!", you would think "you are causing yourself distress!". And yet we constantly do this by bickering in our own mind. In the worst cases, we take our enemies home and we unsuccessfully try to sleep with them! What foolishness!
The Stoics came up with a great way of dealing with problems: they are either in your control, or they are not. If they are not in your control, why be concerned about them? Accept them as part of your condition. I don't like that this city is unwalkable, but there's nothing I can do about it (without dedicating my entire life to it) so let it be. Indignation without action is poison.
As I lay in savasana, I breathe in and breathe out, focused in relaxation. The spiritual heart yearns for a deeper yoga practice. This teacher is not an impostor, she is simply pointing at the fact that I will not find what I'm seeking for in a gym. The practice must be deepened, either on my own, or with the help of a good teacher.
Yesterday I moved back into my childhood home. It's been empty some time. I thought: what a good thing to find it in such a blank state. But the amount of work ahead... it's an entire camino of a different kind.
Only pictures of the front and the back for now:
<img alt="IMG_5314 2.jpg" src="https://method.ac/writing/uploads/IMG_5314%202.jpg" style="width: 100%" />
<img alt="back.jpg" src="https://method.ac/writing/uploads/back.jpg" style="width: 100%" />
I asked my sister if I could bring home some books which are family property. I perused the shelves, keeping anything that caught my eye. When I got home I divided them in piles according to how they _felt_:
<img alt="IMG_5368.jpg" src="https://method.ac/writing/uploads/IMG_5368.jpg" style="width: 100%" />
My intuitive categorization resulted in seven piles, which I named:
***
**Rooting in Mexico**<br>
_Reconnecting with my country_
[Pecar como dios manda](https://www.amazon.com/Pecar-como-Dios-manda-Spanish/dp/6070704266), historia sexual de los mexicanos<br>
Eugenio Aguirre
[Visión de los vencidos](https://en.wikipedia.org/wiki/The_Broken_Spears), relaciones indígenas de la conquista<br>
Miguel León Portilla
[Popol Vuh](https://en.wikipedia.org/wiki/Popol_Vuh), las antiguas historias del quiche<br>
Heritage literature
[Historia general de las cosas de la Nueva España](https://es.wikipedia.org/wiki/Historia_general_de_las_cosas_de_Nueva_Espa%C3%B1a)<br>
Fray Bernardino Sahagún
[The Daily Life of the Aztecs](https://www.amazon.com/Daily-Life-Aztecs-Native-American/dp/0486424855) on the eve of the Spanish Conquest<br>
Jaques Soustelle
[El reverso de la conquista](https://www.amazon.com/reverso-conquista-Spanish-Miguel-Portilla/dp/9682710510)<br>
Miguel León Portilla
[The conquest of Mexico, the conquest of Peru, and Other selections](https://www.amazon.com/conquest-Mexico-Peru-other-selections/dp/B0007H8XDM)<br>
William H. Prescott
[La logica de las hogueras](https://elfondoenlinea.com/Detalle.aspx?ctit=003704R)<br>
Nathan Wachtell
[Los nahuas después de la conquista](https://elfondoenlinea.com/Detalle.aspx?ctit=003437R), historia social y cultural de los indios del México central, del siglo XVI al XVIII<br>
James Lockhart
[Cartas de Relación](https://www.amazon.com.mx/Cartas-Relacion-portada-puede-variar/dp/9700758303)<br>
Hernán Cortés
***
**Classics**<br>
Books to be read in one's lifetime
<a href="https://en.wikipedia.org/wiki/Gulliver%27s_Travels">Gulliver's Travels</a><br>
Jonathan Swift
<a href="https://en.wikipedia.org/wiki/The_Queen_of_Spades_(story)">The Queen of Spades</a><br>
Alexander Pushkin
<a href="https://en.wikipedia.org/wiki/The_Double_(Dostoevsky_novel)">The Double</a><br>
Fyodor Dostoevsky
<a href="https://en.wikipedia.org/wiki/Emma_(novel)">Emma</a><br>
Jane Austen
[Narciso y Goldmundo](https://en.wikipedia.org/wiki/Narcissus_and_Goldmund)<br>
Herman Hesse
[Things Fall Apart](https://en.wikipedia.org/wiki/Things_Fall_Apart)<br>
Chinua Achebe
[Madame Bovary](https://en.wikipedia.org/wiki/Madame_Bovary)<br>
Gustav Flaubert
[The Decameron](https://en.wikipedia.org/wiki/The_Decameron)<br>
Giovanni Boccaccio
[El coronel no tiene quien le escriba](https://en.wikipedia.org/wiki/No_One_Writes_to_the_Colonel)<br>
Gabriel Garcia Marquez
[The Man who died](https://en.wikipedia.org/wiki/The_Escaped_Cock) (or The Escaped Cock)<br>
DH Lawrence
***
**Bathroom reading**<br>
_Things that I can read in short breaks_
[The pump house gang](https://en.wikipedia.org/wiki/The_Pump_House_Gang)<br>
Tom Wolfe
[Dostoevsky, Notes from the underground, White nights, The dream of a ridiculous man, and selections of The house of the Dead.](https://www.amazon.com/Notes-Underground-White-Nights-Ridiculous/dp/0451523768)<br>
Fyodor Dostoevsky
[Cuentos completos](https://www.casadellibro.com/libro-cuentos-completos/9788483466551/1188544)<br>
Augusto Roa Bastos
[Las entrañas de la materia](http://www.elem.mx/obra/datos/174656), Antología de relatos científicos<br>
Various authors
[Understanding Media](https://en.wikipedia.org/wiki/Understanding_Media)<br>
Marshall McLuhan
[Edge of Awareness](https://www.amazon.com/Edge-Awareness-Richard-Peck/dp/0440922186)<br>
Various authors
Cinco cuentistas mexicanos del siglo XIX (no good link)<br>
various authors
[365 tuits de amor](http://www.siruela.com/archivos/fragmentos/365_tuitsAmor.pdf)<br>
Alejandro Jodorowsky
[El principito](https://en.wikipedia.org/wiki/The_Little_Prince)<br>
Antoine de Saint-Expury
[Conference of the Birds](https://en.wikipedia.org/wiki/The_Conference_of_the_Birds)<br>
Farid ud-Din Attar
[Gandhi](https://en.wikipedia.org/wiki/Louis_Fischer)<br>
Louis Fisher
[La mente y el tiempo](http://bibliotecadigital.ilce.edu.mx/sites/ciencia/volumen1/ciencia2/52/html/sec_8.html)<br>
Varios autores
***
**Latin American Literature/Studies**<br>
Because I've neglected it
[El Periquillo Sarniento](https://en.wikipedia.org/wiki/The_Mangy_Parrot)<br>
José Joaquín Fernández de Lizardi
[La iniciativa popular en Tlaxcala, acciones colectivas para el combate a la trata de mujeres](http://www.bib.uia.mx/tesis/pdf/014959/014959_00.pdf)<br>
Oscar Arturo Castro Soto
[Rousseau en México](http://editorialitaca.com.mx/portfolio-item/rousseau-en-mexico/)<br>
Adolfo Sánchez Vázquez
[Las batallas en el desierto](https://en.wikipedia.org/wiki/Battles_in_the_Desert)<br>
José Emilio Pacheco
[Don Juan Tenorio, El puñal del godo](https://en.wikipedia.org/wiki/Don_Juan_Tenorio)<br>
José Zorrilla
[El Diván del Diablo](https://www.amazon.com.mx/Divan-Diablo-Pedro-Angel-Palou/dp/9707102144)<br>
Pedro Ángel Palou
[El Mundo de Sofía](https://es.wikipedia.org/wiki/El_mundo_de_Sofía)<br>
Jostein Gaarder
***
**Inner work**<br>
Because it's always time for work
[La Angustia, Seminario 10](http://www.bibliopsi.org/docs/lacan/Seminario-10-La-Angustia-Paidos-BN.pdf)<br>
Jaques Lacan
[La personalidad saludable](https://www.amazon.com/Personalidad-Saludable-Punto-Psicologia-Humanistica/dp/9682421640). El punto de vista de la psicología humanística<br>
Sidney M. Jourar y Ted Landsman
[Love's Body](https://en.wikipedia.org/wiki/Love%27s_Body)<br>
Norman O.Brown
[Vida sexual de los grandes artistas](https://www.amazon.com/Lives-Great-Artists-Nigel-Cawthorne/dp/1853755443)<br>
Nigel Cawthorne
[Entre meditación y psicoterapia](https://www.amazon.es/Entre-meditación-psicoterapia-Psicologia-Llave/dp/8495496879)<br>
Claudio Naranjo
[La vieja y novísima Gestalt, Actitud y práctica](https://www.casadellibro.com/libro-la-vieja-y-novisima-gestalt-actitud-y-practica-de-un-experiencia-lismo-ateorico-8aa-ed/9788489333321/175361)<br>
Claudio Naranjo
[Del miedo al Amor](https://www.gandhi.com.mx/del-miedo-al-amor-el-metodo-pathwork-para-transformar-la-relacio-n-de-pareja)<br>
Eva Pierrakos
[El Héroe de las mil caras](https://en.wikipedia.org/wiki/The_Hero_with_a_Thousand_Faces). Piscoanálisis del mito<br>
Joseph Campbell
[El Miedo a la Libertad](https://en.wikipedia.org/wiki/Escape_from_Freedom)<br>
Erich Fromm
[Conceptos fundamentales de la psicoterapia](https://www.amazon.com/gp/product/1568212674/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i0)<br>
Erwin Singer
[The Sevenfold Journey. Reclaiming Mind, Body and Spirit Through the Chakras](https://www.amazon.com/Sevenfold-Journey-Reclaiming-Through-Chakras/dp/0895945746)<br>
Nodea Judith and Selene Vega
[Maravillosamente imperfecto, escandalosamente feliz](https://www.gandhi.com.mx/maravillosamente-imperfecto-escandalosamente-feliz-9786077357056)<br>
Walter Riso
[Meditación activa](https://www.amazon.com/Meditacion-activa-Active-Meditation-Spanish/dp/968403492X), cómo aprovechar al máximo los beneficios de la meditación<br>
John Volkman
[Adaptación vital y psicología de la inteligencia](https://www.gandhi.com.mx/adaptacion-vital-y-psicologia-de-la-inteligencia)<br>
Jean Piaget
[Love Poems From God](https://www.amazon.com/Love-Poems-God-Twelve-Compass/dp/0142196126)<br>
Daniel Ladinsky
***
**Intellectual curiosity**<br>
Because I'm curious
[Oppenheimer: The Story of a Friendship](https://www.amazon.com/Oppenheimer-story-friendship-Haakon-Chevalier/dp/B00005WIQZ)<br>
Haakon Chevalier
[El Jardín Imperfecto](https://www.gandhi.com.mx/el-jardin-imperfecto-luces-y-sombras-del-pensamiento-humanista)<br>
Tzetan Todorov
[Iniciación a la lógica simbólica](https://www.elsotano.com/libro/iniciacion-a-la-logica-simbolica_10002407)<br>
José Antonio Arnaz
[Materia Y Movimiento](http://strangebeautiful.com/other-texts/maxwell-matter-motion-1925.pdf)<br>
James Clerk Maxwell
[Código Ético del Psicólogo](http://www.psicologia.unam.mx/documentos/pdf/comite_etica/CODIGO_ETICO_SMP.pdf)<br>
Sociedad Mexicana de Piscología
[El Mono Desnudo](https://en.wikipedia.org/wiki/The_Naked_Ape)<br>
Desmond Morris
[El Origen de las Especies](https://en.wikipedia.org/wiki/On_the_Origin_of_Species)<br>
Charles Darwin
[De Vinculis in Genere](http://www.esotericarchives.com/bruno/vinculis.htm)<br>
Giordano Bruno
[Díalogos](https://en.wikipedia.org/wiki/Socratic_dialogue#Platonic_dialogues)<br>
Platón
[Manual de Etimologías grecolatinas](https://www.gandhi.com.mx/manual-de-etimologias-grecolatinas)<br>
Camacho, Comparán, Castillo
[Gene Keys](https://genekeys.com/)<br>
Unlocking the Higher purpose hidden in your DNA
[The Biology of Belief](https://www.amazon.com/Biology-Belief-10th-Anniversary-Consciousness/dp/140195247X). Unleashing the power of consciousness, matter and miracles<br>
Bruce H. Lipton
[Ensayos escogidos](https://en.wikipedia.org/wiki/Michel_de_Montaigne)<br>
Michel de Montaigne
***
**Probably will not read**<br>
Books that I won't read, but I'll keep around anyways
[Avances y Premisas](http://www.elaleph.com/libro-usado/Avances-y-premisas-de-Alvin-Toffler/531488/)<br>
Alvin Toffler
[The Prince](https://en.wikipedia.org/wiki/The_Prince)<br>
Niccolò Machiavelli
[La deshumanización del arte | Velázquez. Goya](https://porrua.mx/libro/GEN:9789700765907/la-deshumanizacion-del-arte-velazquez-goya/ortega-y-gasset-jose/9789700765907)<br>
José Ortega Y Gasset
[Voces de Oriente](https://www.elsotano.com/libro/-27-voces-de-oriente_10030613), antología de textos literarios del cercano oriente<br>
Editado por Angel Ma. Garibay K.
[Gravity's Rainbow](https://en.wikipedia.org/wiki/Gravity%27s_Rainbow)<br>
Thomas Pynchon.
***
And here is where they ended up:
<img alt="IMG_5369.jpg" src="https://method.ac/writing/uploads/IMG_5369.jpg" style="display: block; width: 75%; margin: 0 auto;" />
Before coming to Puebla my outlook was grim: I remembered a dilapidated house next to a polluted river in a city where it's difficult to move without a car. "There is nothing for me there, I shall move out as quickly as I can", I thought.
But as I allow the experience to sink in, I sense the highest spiritual work lies in front of me. Spelling it out would be vulgar, so the exercise is for the reader: what does it mean to come back to your childhood home to fix it?
[People and places put you in the same psychological place where you last met](https://method.ac/writing/work_journal/old-firends-old-places.html). I left this house as a young adult. At the time I'd describe myself as unemotional, critical, disembodied. I feel some of it already, but it is good: regression is following back your footsteps in a maze. Instead of continuing through the same path (which you know is a dead end), regression allows you change the direction and ultimately the course of the rest of your life.
I'm in the library of the state university (BUAP). It's euclidaneally close home, but having a river in-between uncoils the route to a 45 minute walk. It is a good place to work, I'll surely repeat here and write a proper review.
As I covered the distance walking, I could not help but see everything in Mexico with fresh eyes. "I must write about it before it fades into habitual perception" I thought. But as I sit down in this humble library, I notice a more commanding task: let the harvester get drunk on his own wine, but what is indulged is paid at the moment of harvest.
TL;DR; Play waits for work to be completed. Let's get to work.
<img alt="IMG_5371.jpg" src="https://method.ac/writing/uploads/IMG_5371.jpg" style="width: 100%;" />
Cleaning the house, I came across a booklet property my brother: _How to Make a Good Mission Great_.
<img alt="IMG_5367 (1).jpg" src="https://method.ac/writing/uploads/IMG_5367%20%281%29.jpg" style="width: 50%; display: block; margin: 0 auto" />
The booklet is a guide for Mormon missionaries, reminding them of the true purpose of the mission, offering advice in dealing with difficult people, and especially giving guidance in effective communication.
The guide is a treasure house of advice and psychological insight for anyone undertaking a spiritual endeavor, not just Mormon missionaries. I found the child order insights particularly interesting:
**The Eldest Child**
An asset of the eldest child is that it is often easy for him to be obedient to the rules and authority of the mission. He also tends to show genuine concern for others and to be responsible and dependable in his work. He may show a healthy evaluative attitude towards new ways of doing missionary work. He is often intelligent, articulate, a high achiever.
By contrast, an eldest child may use res and authority to dominate others, and his missionary efforts may suffer as he tries to boss, smother, or act superior to his companions and others. He may use anger or a powerful tone of voice to try to get his own way. Perhaps he is overly critical of others. He may also tend to be too responsible for and too protective of his companions and investigators, to move in and do for them those things they should be doing for themselves, thus robbing them of their self-reliance. When things go wrong, he may feel that it is his fault and that he will be blamed for the irresponsible actions of others. (Parent contribute to the development of these faulty attitudes and behaviors when they leave the eldest child in charge of younger brothers and sisters and then blame him for their misbehaviour). He may also be too rigid and cautious and therefore afraid to follow spontaneously the promptings of the Spirit.
The eldest child also tends to be intolerant and critical of himself and others, and to set such high expectations that he is easily discouraged. A firstborn tends to be achievement-oriented if he is the focus of his parents' aspirations. He may equate his worth with his achievement to an extreme degree, so that when he experiences the slightest difficulty, he feels worthless and unloved. It is all or nothing for him. Such a discouraged individual may completely withdraw.
What we are suggesting is that the eldest child may deceive himself with the faulty ideas that he can be worthwhile and important only by bossing, dominating, and acting superior to others. The eldest child who is in tune with his Heavenly Father, however, tends to strive to achieve worthwhile and significant goals in the mission field through the wise and sensitive use of his special qualities of responsibility, dependability, respect.
**The Second Child**
A strength of the second child who is close to his Heavenly Father is that he may strive to feel worthwhile and important by doing things differently. He tends to search for new, different, more effective and more efficient ways of accomplishing the objectives of missionary work. For example, he may, with his leaders' permission, develop better methods for introducing the gospel to others. He tends to be creative, active and to work for progress through effective change.
The second child may have, as a liability, a rebellious attitude, which is demonstrated by the attempts to undermine the rules and authority of the mission. (This faulty behavior stems from resentment at being dominated by an eldest child and then generalizing this resentment to anyone in authority). He may deceive himself into thinking that the way to be important is to be against everything, to rebel, to get people to pay attention to him. He may also play the role of a martyr in blaming others, especially those in authority, and criticizing the rules as being unfair to him, as he manipulates, often subtly, for sympathy.
**The Youngest Child**
The Youngest child in a family is often charming, warm, and friendly. He tends to be easygoing, for he is not afraid of making mistakes, having observed his older brothers and sisters making many mistakes. He is usually tolerant of himself and others. Investigators enjoy being with him because the feel secure with him.
A liability of the youngest child is that he may deceive himself into believing he can be important by manipulating others to do things for him that he should do for himself. He accomplishes this through his efforts to appear helpless, irresponsible, and undependable. He may, for example, manipulate his companions to get him up in the morning, make his bed, and cook his meals. The youngest child in a family is often pampered and spoiled, and he may attempt to get his own way by throwing temper tantrums, yelling, screaming, crying, and whining.
While he may appear helpless, there are often times when the youngest child is actually very powerful, such as when his resentment at being treated as the smallest and youngest causes him to fight against others to diminish his feelings of inferiority. When he takes this behaviour into his mission, he may do such things as belittle the accomplishments of other missionaries, parade his own accomplishments, and create artificial crises for which he presents his own ready-made solutions. He may be especially destructive when he uses his charm to keep others from confronting him with his irresponsible actions. He may also be adept at making others feel guilty and wrong, again avoiding confrontations, and getting his own way.
Yesterday I finished cleaning the kitchen.
<img alt="IMG_5379.jpg" src="https://method.ac/writing/uploads/IMG_5379.jpg" style="width: 100%;" />
At first sight it doesn't seem like much. Here is where I started:
<img alt="IMG_5320.jpg" src="https://method.ac/writing/uploads/IMG_5320.jpg" style="width: 100%;" />
Yet, this is what I threw away:
<img alt="IMG_5376.jpg" src="https://method.ac/writing/uploads/IMG_5376.jpg" style="width: 100%;" />
Most transformation work is invisible.<br>
Most transformation work is letting go.<br>
Most transformation work is unglamorous.<br>
Most transformation work has depth.<br>
In Mexico we have _zotehuelas_, which is a dirty patio where you're allowed to have a mess. It's the Mexican equivalent of the garage, but outdoors. Well, I cleaned my _zotehuela_.
<img alt="IMG-5392.JPG" src="https://method.ac/writing/uploads/IMG-5392.JPG" style="width: 100%" />
This is where we started:
<img alt="IMG-5325.JPG" src="https://method.ac/writing/uploads/IMG-5325.JPG" style="width: 100%" />
Magical moment: in a cluster of forgotten things lied another [chinese box](https://method.ac/writing/sacred_objects/chinese_box.html)!
<img alt="IMG-5385.JPG" src="https://method.ac/writing/uploads/4766c4680ac72fb61ba39b88c22882b2d175cc95.JPG" style="width: 100%" />
The rational mind says:
> What a nice coincidence. I wonder's whose is this?
The magical mind says:
> It has found you! It is time to consult with the I Ching again! Keep an eye open for the book, it will find you.
You only have one life. To whom do you listen?
<img alt="IMG-5386.JPG" src="https://method.ac/writing/uploads/IMG-5386.JPG" style="width: 100%;" />
I come home to find my home without electricity, in complete darkness. Fortunately I find some candles.
I took a picture of my current setting, but it looks miserable. A picture would make no justice anyways. It's simply a forced moment of relaxation.
What can I do to relax myself? I now have two candles, one on each side of the bed. It could be improved with:
1. Music
2. Tea
3. Incense
For 1, crickets are singing rythmically:
For 2, I would really like to begin writing, I'll give it to myself when I need a break.
For 3, let me get up and put some incense.
It is done.
The purpose of this session is to accomplish relaxation while doing creative writing. If you are following along, lay in bed with numerous pillows, and find a posture which would allow you to both relax and remain alert. Our physionomies are very varied but in general terms: find a position in which you would be able to remain for a long time, and then settle down into it.
Let us gently come into a state of rest, and then begin dumping consciousness as it comes. I will begin in ten minutes.
***
The mind warned: do not write work logs in an altered states of mind! For in the quest for relaxation some weed was smoked.
But aren't rules made to be broken? It's early and if it's not writing this experience then it will tossing in bed.
So today is an exception to the rule, but it is pleasure consciousness dumping.
***
Is it pleasant to be alive? I mean, feel yourself. Is there more pleasure or there's more suffering? It is often the case that there's suffering without a biological cause. You suffer, yet you are healthy. It's like the background noise of existence caused stress, alienation, defensiveness, bubbling up.
The deeper you go into meditation, the more you realise that the suffering is self-inflicted. Once known from personal experience, the correct answer is silence.
Can we become more silent?
By giving that chattering mind a seat, sit down, relax, there's nothing to defend at this time. Nothing has been stated.
Think "I'm not in my skull, I'm in my entire being". and feel the entire body. Oh, there's pain, but there's nobody to relieve us from it! Should we try by the power of attention?
I observe energy running through my body, it feels kinda cool, the entire body is alive. What a nice place to be: in bed, without electricty, writing down my thoughts and yada yada, let us come back to experience.
Is there still pain? Nah, not now, but there used to be pain! It is horrible, that existential pain, just being alive hurts. I used to look out the window of every flight and think "Oh god if you want to take me out right now, I wouldn't mind". Not suicidial but let's say "not attached to life".
How does one heal from a damaged existential wound? It is the most difficult thing to do, but the healing process, if done correctly, will take you down the mother of all rabbit holes, and inside the rabbit hole imagine thousands of rabbit holes, jump into a couple of them as your curiosity finds them.
Coming back to relaxation. I'm now debating the wisdom of smoking another joint, it's 10:10 exactly, surely means "yes" in binary or something. I'll be back. Oh, the tea, now is the moment!
***
The tea pot was occupied by the coffee of the morning and I didn't venture to wash in darkness. It'll be fine without tea.
***
I come to write on my side. I will try a different kind of writing. Let us make up a story. A story about what? About something that happened today.
Come back to today, what is the most salient fact? I found the perfect place to work, it's a... I will share it in time. What I liked most about it was that it's next's to an arts center where I could study at my own leisure.
This is the ego talking, existence happens through action. What did I do today? Oh yes, I shall describe:
As I've been exploring the areas surrounding the house I think it's absolutely the best place to make a halloween party. My friends used to nickname this house _The Blair Witch_ house, because it's always been overgrown and quite unkempt. But it has it's charm. So I thought a good idea would be to make a Día de Muertos party, but to make it truly special I would need help from some people.
True, this task I shall do right now: plead help from my cousins.
> Queridos primos, les escribo porque voy a organizar una fiesta para niños en la Casa del Río con ocasión de día de los muertos. Mi mamá reunió muchos huevos rellenos de harina y los quería aprovechar, una cosa llevó a otra y se nos fue de las manos. Pero creo que hay mucho potencial y podemos hacer cosas muy padres si apuntan a participar.
> La idea es tener un recorrido por el bosque de atrás, ya lo he explorado y lo pueden hacer niños y adultos sin problemas. Está lleno de árboles y maleza pero limpiaré bastante. Aquí se pueden hacer muchísimas cosas, dependiendo de la cantidad de gente dispuesta a participar.
> Versión sencilla y fácil: una batalla campal de huevos de harina y luego comida.
> Versión con tu ayuda: lo anterior + concurso de disfraces, piñata, premios, fogata, taller de arte, lounge de adultos, etc. lo que se te ocurra. Puedes ser un hombre lobo suelto en el bosque de atrás, escucho cualquier idea y sugerencia de participación.
> La cita sería el sábado 26 de octubre.
> Dime si te late participar, y cómo te gustaría hacerlo.
> Abrazo!
Finished 12:11, time to blow out the candles.
Yesterday I worked on an app to keep track of my gym progress. I've done it for a couple of years in my notebook, developing a personal syntax along the way.
<img alt="IMG_5246.jpg" src="https://method.ac/writing/uploads/IMG_5246.jpg" style="margin: 0 auto; width: 50%; display: block" /><br />
The first logs are mostly digits + text
<img alt="IMG_5160.jpg" src="https://method.ac/writing/uploads/IMG_5160.jpg" style="margin: 0 auto; width: 75%; display: block" />
Pretty soon progress slopes begin appearing, but these are for stoking the ego. They don't register well the progression, you need to register both repetitions and total weight carried.
<img alt="IMG_5261.jpg" src="https://method.ac/writing/uploads/IMG_5261.jpg" style="margin: 0 auto; width: 75%; display: block" /><br />
More slopes
The gym is about progressive resistance training. When you start going to the gym you will gain muscle, no matter what diet and what training method you use. This is because your body has an _introductory genetic potential_, to call it someway, and our current life is so sedentary that any minimum amount of strength training will yield good results.
But, after the _beginner gains_ comes a tough slope which is _training your body to become stronger_, and this is done through progressive increasing of weight/resistance in your workouts.
<img alt="IMG_5210.jpg" src="https://method.ac/writing/uploads/IMG_5210.jpg" style="margin: 0 auto; width: 75%; display: block" /><br />
<img alt="IMG_5100.jpg" src="https://method.ac/writing/uploads/IMG_5100.jpg" style="margin: 0 auto; width: 50%; display: block" />
<img alt="IMG_5045.jpg" src="https://method.ac/writing/uploads/IMG_5045.jpg" style="margin: 0 auto; width: 50%; display: block" />
Gym trackers focus on pampering the ego. The most important task is: how much should I lift in the following exercise, and how do register it in the most simple way possible.
Say you want to register you lifted a 120 pound bar for 12 repetitions. A well designed app will be able to register that in seven taps: "1•2•0•↵1•2↵". I'd like to resolve that in a single press + drag + release. I had already [programmed a widget for this](https://method.ac/writing/work_journal/work_log_day_730.html).
For the day I was happy to view my progress in my homegrown syntax, but in pixels:
<img alt="gymnasium.png" src="https://method.ac/writing/uploads/814c13037d7473ca8476dbad273ddb4abf148a4c.png" style="margin: 0 auto; width: 50%; display: block" />
I shall improve it in the upcoming weeks.
I've been ignoring a problem because I have important things to attend at this moment, but I would like to _think it out loud_. It is an important decision of how to dispose of a living thing.
<video width="100%" controls>
<source src="https://method.ac/writing/uploads/pollos%20%282%29.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
I live with two roosters.
It's surprisingly not bad. My mother put a flock in the inner patio, and natural selection narrowed to these two gentlemen. I don't want to repeat the drama I was told about how it happened. Suffice to say: I've been feeding them but they live in an undignified state.
Their feet are infested with mite.
<img alt="pollito.jpg" src="https://method.ac/writing/uploads/4b31bd4c4726a35535a2da5a7f58909751b854db.jpg" style="width: 100%;" />
I ponder: these two are impossible to give away. The compassionate thing to do goes in two extremes: either you cure and heal, or you ceremonially sacrifice them (with the help of a veterinary/shaman, hopefully).
Either one is equally instructive. Why should not this apprentice of life learn not only to cure but to kill? Let us see, from experience, what impressions these things cause upon the soul?
I sat down and observed the roosters: one is reddish and has many bald spots. He is the beta and is obviously under a lot of stress.
The alpha one is one majestic black rooster. I was reminded of DH Lawrence's The Man Who Died. Resurrected Jesus stumbles upon a beautiful rooster.
They both have terrible mite infestations. They peck at their own feet and have lots of dead skin, causing those oversized feet.
What should I do?
What would curing involve?
I searched a bit and doctor internet has two options.
1. the natural: put an ointment on their feet every day.
2. the artificial: put pills into their feed for a couple of days.
Unfortunately, I think removal of dead skin must be manual if one wants full healing. Ivermectin is not used in poultry meant for human consumption, so giving them this bars anybody from eating them. Deal.
What should I do?
1. In the interest of practicality: sacrifice both.
2. In the interest of learning: sacrifice one, cure one.
3. In the interest of compassion: cure both.
4. In the interest of spirituality: cure both, sacrifice one
The higher the number, the more you learn. The astute reader will think: why cure both and then sacrifice one? Indeed, there lies a koan worth months of meditation.
Can I dedicate myself to such a foolish enterprise? If it ain't now, it'll be never.
I will cure both and then decide.
Thank you for reasoning with me.
I am sitting at the library of my former university. I came to collect all the required documentation for my degree. Not once I was asked for my degree except at my last job. I couldn't get a working visa in Spain because I hadn't done this before.
My Sufi psychologist said that when these sort of "accidents" happen (missing the last little requirement for graduation) we are in conflict with our feelings regarding our parents. On the one side we want to please them with a degree, and at the same time we want to get back at them: _look, it wasn't even necessary_. The contradiction plays out in real life, and you "virtually" complete the task, but never undertake the very last effort of seeing it through.
Be it psychological bullshit or not, the task feels monumental, even though it's simply a matter of gathering documentation and paying the fee. Should I mention all the bureaucratic hoops I must jump? Yeah, I think it's unnecessary too.
I walked around the campus. I saw it was beautiful. Posters announced various workshops and events I was interested in. I went to the sports area. The gym is massive and has everything I need. The pool looks amazing and has a nice green area where I could have lunch. But this time I had lunch at the cafeteria, it wasn't all that great but it was cheap. The library is filled with books, and I greatly miss diving into journals. There's even a bike path to get here, 11.5Km from home.
This campus will become the ideal workplace, in time. Just jump through the hoops for the time being.
<img alt="IMG-5426.JPG" src="https://method.ac/writing/uploads/IMG-5426.JPG" style="width: 100%" />
I have a group of friends from Madrid who decided to take on reading [Get Out of Your Mind and Into Your Life: The New Acceptance and Commitment Therapy](https://www.amazon.com/Get-Your-Mind-Into-Life/dp/1572244259). Being so much into meditation/psychology/wellbeing I was sad I would be missing out. Fortunately, Ángel (the organizer) posted some of the questions that would be discussed, and I couldn't help but answer from my experience, since I haven't bought the book yet (working on a tight budget at this time!). Here's the Q&A:
**One goal of mindfulness is to be aware of our thoughts, emotions and urges. What is the advantage of this?**
I have a friend who gets in a horrible mood when she gets hungry. The problem is, she doesn't know when she is hungry (not a very mindful person). To her boyfriend, it's obvious what is going on because he sees everything from the outside (say, they had breakfast a long time ago and this is not normal behavior) so he hurries to get her something to eat.
This friend has already burned bridges because she gets into conflict with her coworkers (her boyfriend doesn't work with her, unfortunately). Should she be more mindful, she'd notice her her hunger, her cranky state, and realize that her perception of the conflict is influenced by her state.
This is just an anecdote that comes to mind when I think about someone who is particularly unaware of their inner state.
**Another important ingredient of ACT - acceptance and commitment therapy, the approach described in the book - is the recommendation that we accept our thoughts, feelings and urges (behavioural predispositions). What would the advantage of this be?**
Acceptance is a crucial component of religions, spiritual paths, and psychological (inner) work.
I was searching for a quote of a nun (Mother Theresa, perhaps?) which said something along the lines of "If God accepts me, why should I accept myself?", instead I came across this quote from an anonymous minister which I think illustrates the case quite well:
> I spent I good part of my life responding to the devastating demands to myself... My whole life was spent trying to do enough and to achieve enough to convince others that I was worthy of their love and acceptance. Then it came, through much searching and struggling: I am a child of God. This is the pivotal point of awareness and growth. God loves me unconditionally. The more I yield myself to God, the more I experience his love. And the more we experience his love, the more we accept ourselves and accept others as they are. And, the more we love others, the more they love us. It becomes an endless cycle of acceptance, which makes for growth and fulfillment.
Carl Rogers, well known humanistic psychologist, in his book [On Becoming a Person](https://faculty.sfcc.spokane.edu/InetShare/AutoWebs/kimt/rogers%20this%20is%20me.pdf):
> The curious paradox is that when I accept myself as I am, then I change. I have learned this from my clients as well as within my own experience--we cannot change, we cannot move away from what we are, until we thoroughly accept what we are. Then change seems to come almost unnoticed.
I personally think it's idle to theorize why acceptance has such a profound effect. To understand it, it must be put into practice. But a pre-requisite for acceptance is mindfulness, you are not able to catch yourself in inner conflict (non-acceptance) if you are not aware of your thoughts.
**What is the ultimate goal of controlling your behavior?**
When I was a kid my sister used to taunt me so that I would hit her, then she would go crying with dad, and dad would console her and then come over to scold me. That was always her plan!
If you do not control yourself, then other people will control you!
**Are we less ourselves if we control our tendencies, and distance ourselves from our thoughts and emotions? **
I feel a lot of spiritual people fall into this trap: since (they've been told) the highest emotion is the lack of emotion (serenity), they want to remain calm all the time. So you try to joke with them and they smile politely, you tease them and they smile politely, you poke their eyes and they smile politely...
I once read an anecdote about Ramana Maharshi, an Indian _saint_ (I call him saint because of the equivocal connotations of _guru_), where some hecklers entered the meditation hall. Ramana Maharshi's way was quite silent and serene, so his disciples were amazed to see him turn into a lion and scream at them (the hecklers hurriedly left), and then they saw him fall immediately into a state of serenity.
You can see the same effect in animals: a dog might get into a big fight with another dog, and (if unhurt) five minutes later it's playing and the incident is utterly forgotten. The aggression might have had a reason at the time (say, establishing hierarchy), and it does not arise aggression or anger in it afterwards.
Emotions exist because they are useful [insert made up evolutionary theory here], but their window of usefulness is limited. What would you think if you had a dog who'd just be sitting there, and suddenly starting growling because he's reviving that fight he had a week ago? Damn crazy dog!
**What is the big mind?**
Awareness of thought
**How much should we buy into our thoughts or judge our thoughts, ourselves, other people?**
How much should we buy into our thoughts? Most thought is crazy chatter, but sometimes reason shines through. Reason, I think, is experienced differently, like a path where you are making progress and eventually you reach a destination. We should not buy into idle thought, but we should buy into reason.
How much should we judge our thoughts? We shouldn't. One day I looked at a black guy in Lavapies and I thought "Oh this nigger is gonna sell me some trinkets" and I thought to myself "Oh don't think nigger, that's racist" and then my mind goes "nigger nigger nigger". He approaches me and I don't want to look at him in the eye because I'm such a racist person. Well, mission accomplished, I didn't give the guy my attention or my presence simply because he was black. Being _aware_ of the thought, on the other hand, is an entirely different matter. Should I have thought "heh, I thought nigger, now let's be nice cause I'm not racist", the result would have been entirely different.
How much should we judge other people's thoughts? Well, if you can't trust your own mental blabbering, why should you trust others? Yet I can't help but notice that, in the case of others, I tend to confuse reason for mental blabbering. Should a friend say "Oh that nigger is gonna sell us some trinkets" I'd surely consider it a sign of racism.
The bible offers guidance: "Ye shall know them by their fruits. Do men gather grapes of thorns, or figs of thistles?". That is: don't listen to what people _say_, look at what they _do_, and what has resulted in their life from their actions.
Throughout the years monitoring my... I would call it spirit--I haven't found a more reliable indicator of spiritual health as a sense of confidence in the future. It's not certainty, not hope, not expectations, just a general sense that good things are coming up and everything will work out fine.
The opposite of this, which often shows up during depression is an _impeding sense of doom_. You don't know exactly how or why, but you know things will turn out catastrophically bad.
These two generally bear little relation to reality. Should you be a prehistoric hunter, you'd either feel your next hunt would end up in a severe injury or death, or you'd have the confidence that you will hunt successfully and with ease, without being able to pinpoint at a specific reason (e.g. I have a broken leg).
Do these attitudes have a stake in the outcome? It would seem so, the marksman who is thinking "I will fail, I will fail, I will fail" is placing his attention on failure. If he is able to shoot his crossbow, it's only because his body has mechanical memory.
What does the optimist marksman think then? Surely not "I will hit, I will hit, I will hit". The optimist marksman _becomes_ the crossbow and forgets about himself. There is no attachment to outcome, work is done and then it is forgotten.
There is nothing more instructive in this matter than watching elite sportsmen and women during the olympics. Before executing a difficult athletic feat they pause, eyes staring into nothingness, deeply focused. Are they thinking about how they're going to execute? Or are they quieting the mind so that the feat can execute itself?
Yesterday I spent a long time tidying up the garden with my cousin. Many things were observed:
1. Plants struggle amongst them to get sunlight. The struggle doesn't work on a human timeframe, it takes decades. Human reason must decide the outcome.
2. The garden is full of mosquitos. It's often impossible to be outside. I will try different things according to my budget (starting from buying citronella bushes).
3. Nature has it's way of gardening. An abandoned garden is beautiful in itself, but not very comfortable for humans. If you state your needs to the garden it will yield to you. With a small amount of work you can bring beauty to it.
4. I believe bushes with thorns are useful as a natural barrier, but they have no place in a backyard garden. It will be a lot of work taking down that huge bouganville.
5. A palm tree is what got Goethe going on his metamorphosis of plants. I understood: a proto-leaf emerges from the very center which pushes the maturing leaves outside. The leaf stumps end up forming the trunk. The building unit is a leaf.
I must procure Goethe's _Metamorphosis of Plants_.
I lay in bed, for the third night in a row without electricity. Two candles by my side, and again, I'm high. The prospect of spending another night of sober boredom did not fancy me, so I went to score some pot.
I shall describe how I found the place: along Pope John II Circuit (one of the main streets in Puebla) there's a place which sells smoking paraphernalia out of what seems to be a house converted into a business. A young guy attended me. I said, translating the best I can from Spanish (though it will surely sound differently:
(after asking for some cigarette papers)
--"Pardon the indiscretion, but I just came back to Puebla after a long time. Do you happen to know anybody who could provide me some weed? Or do you happen to sell?", and he said yes of course, we sell. To the reader this may seem the most normal interaction, but unfortunately things don't usually go smoothly for me when trying to score.
He went "downstairs" as Moe in Simpsons and came back with a black bag, a large amount of MJ for the ridiculous price of $20 pesos, around $1 USD. He said he had "Kush" which was $80 per gram to which I answered "some other day I'll try it, this is perfect for now". Extremely high potency weed knocks you to another planet, you still need a bit of lucidity to do the kind of writing I'm doing now.
So, I put the black bag in my backpack and begun walking home. The sun was coming down and I thought it would be perfect to light up during the walk. I saw a beautiful sunset but it was obstructed by buildings. I looked up: there was an almost complete building which would be perfect to see it from the top floors, and it had a big banner announcing the phone number.
Instead of calling, I decided to walk around the block to find the entrance, but alas! There was none to be found! I found a good man and told him:
--"Excuse me, do you work here?"
--"Yes I do"
--"Oh do you see over there, the view is obstructing us at this time, but there's a building behind it right?
--"Yes, a residential building on sale"
--"Well, I've walked around the block trying to find the entrance and there is none!", He seemed amused that anybody would try that.
--"Just call the number, it's on the building!"
--"Yeah yeah I got the number! But I wanted to take a closer look now that I'm here"
--"Well, there's a guard but he's not authorized to let you in. During the day there's construction going on, then you could ask to have a look".
My first thought was to ask my way in. But I thought: before resorting to these things I better pretend to be interested in buying, you could probably carry the rouse quite far, but for now getting a great view of the sunset was enough. So I called.
Hello, I'm interested in the building you have right next to Angelópolis, I'm looking to buy and yadda yadda. Please set me up for an appointment at sunset. We don't have access to the building yet, but I can show you a similar development and yadda yadda. I can't spend $250,000 USD on a property without even looking at it. And so we went back and forth and I saw I would get nowhere, so I asked her to give me a call when the building is open for visits. She said that it would be within a month, but that the top floors might as well sell out by then. I do not buy without seeing I said, that is not negotiable. I guess I was enjoying my part in the play.
And so only time will tell if I wait until the Real Estate agent calls me back or if I try to bribe my way in. If it comes to this, I'd have to justify my actions. But until then, I remain silent.
Oh dear, it is time to attend urgent matters (the candle is melting over the table), well, if I hadn't noticed in the last fifteen minutes it won't make any difference by now. But the sense or urgency does not abandon. It is time to go, farewell!
When I first heard we are terrible at predicting what will bring us happiness I sneered: only people who don't know themselves are incapable of knowing what will make them happy. But I can't help but notice I was dreading coming back to the city and the house where I grew up, but now that I'm here I admit my premonitions were off-target.
What did I imagine?
My mother being all over me, treating me like a child.<br />
A dilapidated house which I would want to escape as soon as possible.<br />
No good professional outcomes, or paid work.<br />
Running into undesired acquaintances.<br />
The feeling of insecurity in Mexico.<br />
Inverse cultural shock (when you go back to your country after years abroad).<br />
What actually happened?
My mother is an angel.<br />
The house is dilapidated but I want to fix it as soon as possible.<br />
Interesting freelance work and new ventures are showing up.<br />
Running into undesired acquaintances has turned out pleasant.<br />
I don't feel insecure in Mexico.<br />
I'm actually enjoying what's different from Spain.
What seemed to be an interlude in Mexico might turn out to be an act in its own right.
The day the great flood I was speaking on the phone, right where I'm writing this at this moment. I saw a friend through the window, he waved and screamed at me. I hung up and asked him was all that fuss was about, he said "come outside".
It was night and it was raining. I stuck my head outside. "Come, come and see" he insisted. I stepped outside. There was a big puddle that almost exceeded the height of the sidewalk, seemingly still. "Well, that's just a big puddle and it's almost stopped raining now, that's nothing", I said condescendingly. "Mira _pendejo_, look further away".
I was humbled when I saw that the puddle was connected to the river, that they were the same thing. We walked towards his house to see other part of the river, and then went into his house. His mother was mortified that her son was outside with this danger, so she ordered us to view the event through the window:
The waters begun raising and came calmly to the street. I thought "if it's not violent, then the waters will come down soon", but my estimate was inaccurate, within an hour a river formed outside the window, it was carrying logs and debris.
I felt pangs for my family: I left them at home! My mom, My sister, my aunt, my dogs, my cousins, my grandma. And my iMac! I told my friend my afflictions and he bid me farewell, not without warning me that his mother wouldn't let me go, and he gave me instructions of how to through the window into the river, and to go with the flow because the current was going homeward.
At first I tried to remain standing. Then I hesitated some steps. It was just below waist level and a log came from behind to knock me down. I was all wet now. I decided to float with the logs to my home. On a ramp towards a private gate I saw a dog shivering, his feet were already ankle deep. He allowed me to carry him. I crossed the newly formed river and put it on the other side, where there was higher land.
When I finally made it home, I found my sister carrying my iMac while standing on two chairs, as to not get her feet into the knee deep water. To her defense, we were taught (with good reason) that the polluted river's waters are untouchable. But seeing me drenched in it convinced her to get down chair after I picked up the iMac from her.
This house only has one small room on the second floor. We were seven people and two dogs, not much margin for material things in our refugee. But it is a night that all of us keep with affection in our memory, because we shared a great adventure together.
Everything material was lost. What was left, you would have been glad to have enough money to replace it, it reeked of river. The polluted river water caused unimaginable corrosion to everything it touched. Every car in the neighborhood was totalled.
It was blank state. Everything you own is gone. You don't have any clothes, or anything material (the iMac was in pre-cloud era, it was about the data!). I went to live with a friend and borrowed his clothes. I came back only when the mess was cleared up.
After the flood these two should have disappeared. I will offer them without further commentary.
<img alt="seven.jpg" src="https://method.ac/writing/uploads/seven.jpg" style="width: 100%;" />
<img alt="nine.jpg" src="https://method.ac/writing/uploads/nine.jpg" style="width: 50%; margin: 0 auto; display: block;" />
It's ten in the night. I can barely type, or even sustain my attention for long, but I'd rather register experience than to go to bed despite exhaustion.
I dismembered the huge bougainvillea and carried it outside. It was a job that took me infinite patience, because bougainvilleas are full of thorns and I don't have proper equipment.
I used gloves, but they were in such a sad state that some of my bare fingers stuck out, and now I can perfectly feel which ones were exposed. My fingertips are all pulsing from overwork, if I keep on this pace I might gain the privilege of forging hands of a person who works the land.
I worked myself raw. The war I waged was tremendous. I am exhausted but happy. Nothing else needs to be recorded.
As per personal policy, I must state when I'm in an altered state of consciousness, and even though I'm still not quite there, I just lit up a joint and I'm progressing towards that end.
Again, I am without electricity.
Oh dear, I had forgot I was writing my work log, I went into a rabbit hole, but I'm back and willing to write about what's up.
I got distracted again. I will explain, I received a response from the state electricity company via Twitter, and I wished to share the screenshot in this log. But then I thought: to put it through Pixelmator, format crop, save, upload to server, format the html code, oh dear how can you even write if you have to do all that shit!
What if I could paste and resize the image in write.now? But then I would get HTML, oh that's wonderful, except write now at this time is simply a textfield, and to make that jump we would to build into another level of complexity that I would not want to tackle at this time.
And thought is all over the place, Let us get back on track.
<img alt="chat.png" src="https://method.ac/writing/uploads/chat.png" style="width: 100%;" />
I write this on a sheet of paper becuase now I'm on my fourth day without electricity. More than ever, my life seems to take part in a monastery, it has been more than two weeks here, and I'm enjoying it tremendously. There are many lessons coming at once but without electricity it is impossible to register everything unless I use paper.
§§§
I cleared out a path in the land behind the house where I sometimes do walking meditations. It is beautiful, but there's still some trash, and some glass, and some nasty things. Yesterday my nephew, who is 5 years old, came and I showed him the mechanics of the party: collect trash from the path and gain home printed currency. This currency is _monopoly money_, and will be good to buy trinkets at a "store". Kinda like Chuck e'Cheese but the prizes are trinkets that I found in my house that may be of interest to kids but otherwise I would have thrown away.
§§§
All plants, even shade plants, strive for sunlight. They sometimes enter conflict because of it. Fast growing plants such as vines crawl and creep until they smother a tree, and the same scenario plays out all over the plant world. There is not one plant, not even the carnivorous ones, that would turn its face away from the sun. And becuase of their desire to look at their celestial father they enter conflict with each other. They cause considerable damage to each other, but this is nature and should not be compared to human experience, but as we possess no other experience I shall go on.
The role of the gardener is that of arbitration of conflict for these mad sun driven beings. A taro plant was struggling with another to get sunlight. Since it was abvious that the _taro_ would win the math, the other plant was never going to die, it was to live a miserable life under the shade of a giant. These conflicts are to be resolved by human intervention.
§§§
In today's strange cultural environment, I have seen that many people find it immoral to remove and kill plants. Immoral is the wrong word, it is aversion experienced as the immoral act of killing a living thing out of a capricious will. This is misdirected compassion, like the lover of dogs who hates people, there is too much identification with the [material part of life], rendering the gardener incapable of performing his or her task.
§§§
My mother sat down and had half a coffee with me. She said she would only have half, because an entire coffee makes her nervous. She stayed over for the night, she usually sleeps at my sister's. Now she's left for the electricity company, to try to get the lights running again. Electricity drives the water pump, so we're without water too.
§§§
Writing like this is much more pleasant to the author, but it's a hassle to the reader. Thought is all over the place, but it's effortless to write down. This is giving the reader the task of digesting unprocessed thought.
<img alt="IMG_5493.jpg" src="https://method.ac/writing/uploads/IMG_5493.jpg" style="width: 100%;" />
First time in ages that I have set write.now's time and word goal. My battery is at 8% and I needed to constrain my writing, otherwise I might not hit the work log today.
I admit I don't like clocks, and I don't like feeling rushed. My mother barged in and told me the pumpkin seeds would go bad if we didn't plant them soon. I had to tell her to wait, that I was in the middle of something important.
But, isn't is magnanimous people who are never in a rush? They don't chase, that's why they are never in a rush. What would I chase so that I don't have time? It's attachment to writing, I thought: I should share my progress with the rocks, but I won't have enough battery to upload the photos and do a full blown post, so I will sit down and write down experience.
What happened today?
I decided to fix up the front yard. It's still in terrible shape. I was being distracted by the backyard, I very much prefer to work on the back rather than on the front for some reason I can't fathom. I found two huge tires in the backyard and, since they were filled with dirt, I bounced them around as if I was in a crossfit class. "This would be a good replacement for the gym" I thought. But I'm still skeptical about it.
Meanwhile, the tires will make great props for the halloween party.
I cleaned not only the front yard, but the plants in front of the house. They were in a sad state. I took out all the gladiolas. The wet season is overdue and when they dry out they look terrible and are difficult to cut up into pieces.
Then there's a tall cypress that had some cactuses at it's base. Cypresses populate cemeteries because they are a symbol of spiritual yearning (straight to the skies). Under the cypress there were some cactuses, which I thought looked horrible. But when the time came to chop em off, I noticed the spears were all soft and plump, it was Aloe Vera! I opened up one and rubbed the contents on my hands. They were sore.
Time to leave now, battery is at 3%.
I'm beggining to like the routine of sitting down in the morning to write by hand. And I am enjoying the lack of electricity too.
I go to bed between 8:00 and 9:00pm because it starts getting dark. I wake up just before sunrise, at 5:30. Nine hours of sleep is perfect for me, otherwise I feel the need for an afternoon siesta.
After waking up, usually the first thing I do is prepare coffee. I don't have a coffee machine yet, so I boil some water, allow for the ground beans sit a while while cooling down. I then pass it through a sieve, and it's good. Any other option is just marginally more tasty or more convenient, and since at this time I literally have $5 dollars to my name I am in no rush to change my coffee maker.
I am no stranger to financial constraint and I feel the same when there's nothing or a lot in my bank account. That is not true, I spent around two months of financial difficulties and when the money of a project came through I felt a noticeable improvement in all psychological aspects: anxiety, hope for the future, mood, etc. One cannot completely escape Maslow's pyramid, only lower the requirements. I also have a modest amount due to be paid and I guess that's why I'm boasting I don't fret about money, when in reality my financial situation is already resolved.
There seems to be a change in the perception of wealth, no? It used to be that confession that one had no money to his name was a sign of disgrace, yet nowadays, and I catch myself boasting about it at this very moment, that money plays no role in life except as to cover one's needs.
But this is a trick, because we used to equate money with virtue: he who has more money is more clever, smart, hard-working, etc. As people are able to produce massive amounts of wealth through leveraging algorithms (or selling drugs) wealth has become a poor proxy for virtue. Most left-leaning friends will argue it never was an indication of virtue, but this is confused thinking. Unless you are a drug lord or have money pouring in, managing wealth requires temperance, prudence, self-restraint, delayed gratification and so on.
***
I took a break from writing and thinking flowed towards the writing course I'm creating. The working title is "Writing as therapy", and we (René and me) are still working out what will be taught and how it will work.
Is introspection teachable? No, let us step back: Is introspection important? I see different skills that may be confused: awareness and introspection. All extraverted characters I've met have said things like "I don't like being alone, my mind gravitates towards dark places and I don't like it". The self is like a closet filled to the brim. In solitude it bulges as if it were alive, threatening to burst open and drown us in an avalanche of unresolved issues.
I'd say the willingness to peek inside the closet, to allow things to spill out and then put them back into place is what introspection is ultimately about.
We have defined introspection, allow us then to define awareness.
Awareness is dwelling at a place which allows you to take into account all the elements of human experience. It is being able to feel, think and act at the same time as you perceive it. You may know someone who "thinks too much" and then their body _disconnects_ and they become purely mental beings, or a purely emotional person with whom you can't reason because emotion overrides anything else (with some people it would be impossible to discuss if it's ok to put down stray dogs, for example).
Awareness is being able to notice everything that goes on outside and inside while immersed in activity, without judging it. As you speak you feel your emotions, you hear your thoughts, you sense your body. If something makes you angry you notice the anger before reacting.
Awareness (or non-judgemental observation) and introspection go hand in hand. If you instrospect and judge you are setting yourself a trap. So the student has two tasks: to look inside and to stop judging. But how?
Only meditation allows this kind of feat. Hmmm...
1. You begin with awareness
2. Awareness can be about either inner phenomena and outer phenomena (can they happen at the same time? I must try).
3. The awareness results in experience which is captured in writing.
The model is more complicated than this. Let us begin by making a long list of introspection and awareness exercises and find the model that. What is imagination? What is creativity? What is reason?
<table>
<tr><td></td><td>Introspection</td><td></td></tr>
<tr><td>Awareness</td><td>✥</td><td>Creation</td></tr>
<tr><td></td><td>Extraspection</td><td></td></tr>
</table>
<img alt="tao.jpg" src="https://method.ac/writing/uploads/tao.jpg" style="width: 100%" />
I am laying in bed, with the laptop laying on my knees. There's electricity now. I do prefer handwriting, but typing it out later is tedious, and today I am in a rush.
Why? I organized a kid's party and it is today. Why? My mother saved egg shells and filled them with flour so that I could play with my nephew when I came back to Mexico, but it took me so long that my mother ended up saving hundreds of eggs.
I looked at the tower of cartons and thought: this would be so much fun as a massive war in the land behind the house. So I carved out a path and I've been cleaning the last two weeks. Today the house is finally clean and the land behind the house has a really cool path carved into it.
It's themed as a halloween party, but it feels like I'm celebrating my decision to stay in Puebla at least a year. While working the garden I thought: _I ought to experience all seasons here again_. I lived here some 15 years ago, yet everything seems new. Is it a different place, or a different person whom is experiencing this? The latter, for sure.
Yesterday I had the strangest ravendous cleaning the house with the lady who helps out my sister. She was washing dishes and I was drying them and placing them in the cupboards. She was sweeping and I was clearing things out of her way. She was wiping dust from the surfaces and I was shifting objects from the dusty areas to the clean ones. We didn't have to talk to coordinate: I knew what she was doing and how to make her job easier. In the end we congratulated ourselves: in three hours of work we cleaned the entire house, which was considerably messy after the party.
I wondered: why is it that I've never experienced this kind of flowing collaboration while designing? Is it because I haven't tried hard enough? Or is it because the digital medium doesn't allow us to see the other person's intentions? Collaboration usually happens in separate _rooms_, let's say. If the task is to clean the house, in the digital realm we would claimed responsibility for different areas. She would have washed the dishes and put them on the cupboards, and I would have swept the floors and moved the furniture. This way our activities don't conflict with each other.
But that's not true collaboration, that's division of responsibilities. What is true collaboration then? If any of us would have attempted to clean the house on our own, it would have taken 8 hours perhaps, but through collaboration it took us 3 hours each, 6 in total.
The [Mythical Man Month](https://en.wikipedia.org/wiki/The_Mythical_Man-Month) warns against the pitfall of throwing more engineers into a late development project. Getting up to speed, set-ups and collaboration will nulify the added firepower. It's as if you added turbines to a plane, but the additional turbines are only able to carry their own weight. A plane with a thousand turbines will arrive at the same time as one with only two.
Is this phenomena unique to software development? Or would it also happen in design work? Would it happen in construction work? I'm intrigued. I've always enjoyed working alone, but now that I've seen it can work out (in pairs, and in cleaning) I want to experiment more with joint work.
The party turned out as it should: kids had fun, adults mingled, no accidents happened, and cousins proposed organizing another party for Christmas at my house. This has more meaning than what appears at first sight: my home used to be the default place for my family get-togethers, but it fizzled away after the divorce of my parents since my mother wasn't in the emotional place to host large gatherings. It took several failed attempts for the family to understand my home wasn't a viable option any more.
I had planned several activites for the kids, but I didn't have the heart to interrupt their play. But there was one activity which I couldn't let go: I had painstalkingly "printed" home currency and gathered trinkets for a garage sale. The activy through which they would "earn" the currency was by picking up trash in the land behind the house.
Finally I cleared my throat and told the kids I had an activity for them. Much to my surprise they all came running and were intrigued. As I was explaining to them the activity I heard my skeptical thought: _this ruse to clean the land will never work_ but much to my surprise they enthusiastically picked up a huge amount of trash for my home currency, and then they used it to buy more trash in my garage sale. I got rid of the trash of the land and of my own house, success!
We closed the event with a bonfire in the backyard, burning old things along with sticks from the bouganvile I had cleared a week earlier. To most of the kids it was their first bonfire, and they were enthralled burning marshmellows. To me it was a private moment of purification, burning old things to make space for what is new.
Today I woke up with a clear directive: _you are settled here now, it is time to move forward_. Where is forward? I don't know where it leads, but I do know my next checkpoint: get my university degree. The deadline to graduate this semester closes this week.
Sometimes I sit down and write the first paragraph of my work log, then I don't like what comes out, I delete it and take another route, I don't like it and repeat the process again. When I do this, I usually switch to a straightforward account of the day, and that's what I will do today.
***
I woke up before sunrise and I did my morning routine. It now includes drawing a particular window where I sit down to drink my coffee, and then paint it in watercolors. It takes me around 45 minutes. In drawing you are trying to master proportions and in painting you're mastering color and technique, drawing the same thing everyday isn't the most thrilling of activities, but it sure helps you iterate and improve. The view from the window is quite simple and uninteresting. It's skill, not beauty, what I'm pursuing at this time. I will share progress when progress is made.
***
My university degree requires me to get a picture of myself wearing a suit. I don't have a suit, so I borrowed one from a cousin. This is the second time in a month that I need a suit, and it highlights my lack of formal attire.
In almost everything I purchase I go to extremes: I either buy the cheapest and most disposable thing, or I buy the highest quality and durable option. The reasoning is that I move a lot, so I throw away everything that is low quality and transport the high quality stuff.
In the case of a suit I'm torn. A well stored suit may last twenty years, but its fashion will not. Is there a timeless suit which transcends fashion? If I can answer this question affirmatively, I may just hire a tailor to get it designed and built. This, however, is in the longer term horizon.
***
I went to the photo studio to get my portrait photos done. I looked myself in the mirror: my face had scratches and irritations from working the land behind my house. The photographer told me not to worry, he'd remove them digitally. When he handed me the pictures I saw the dreaded _digitally smoothed skin_ phenomena. I would very much prefer my scratches.
***
I then worked a couple of hours. For client work I discovered [variable fonts are supported in SVG](https://method.ac/font-tester/), and I might update Method Draw to support them.
***
I came back home to work on the land behind the house. I decided to clear the land by hand, not using the machete. It seems this is the proper way of clearing land if you don't want to start from scratch. Nature creates the most beautiful gardens, but since there are no animals to upkeep the garden, land turns unsightly.
I ended climbing up a tree clearing numerous dead branches. I thought: I'm doing the job of a possum. I pulled out weed from the ground, I'm doing the job of a goat. I cleared creeping vines, I'm doing the job of a... human gardener I guess.
***
My sister and my favorite cousin came over for dinner. They said the house had a different energy, it no longer felt like an abandoned house. I admit it made me proud.
What is peace at home?
The past few days have been of frenzy.
Beurocratic paperwork at the university.
An online course cooking up.
Interesting and well paid contract work.
Beautiful garden which needs tending.
Large glass windows that need washing.
Logs that need to be written.
**Place yourself outside the center of the universe. What happens?**
My degree calls me back to university.
A project claims its necessary attention for realization: to teach how to write as therapy.
Variable Fonts are a really awesome technology, I ought to support it on Method Draw before customizing the editor for my client.
Nature that wants to be tamed, and an all too willing lover.
A house that claims its right to be inhabited.
A log that yearns to be written.
Where am I, right now?
I'm sitting on a bus, which is sitting in traffic, on my way to Mexico City. My best friend's first child was just born, and I'm visiting the recently extended family.
The seat is reclined and my tailbone way past what mothers consider decent seating. I shall adjust. There we go, my mother would be so proud, but there must be maternal wisdom in the advice to seat properly, for it is more comfortable and easier to focus.
Let us see what the senses perceive, separately. My left eardrum is thumping with my heartbeat, and I just lost ten minutes googling it. It can be high blood pressure or ear infection, and given my medical history, it is likely the latter. Baseline doctors here are $2 USD so it's plenty affordable to visit them. I shall...
I sidetracked. This is normal, one comes back to the exercise, and perceives: besides the _thump, thump, thump_ what do I hear?
The wheezing of the motor of the bus, it sounds more electric than mechanic. I had never noticed how different bus motors sound from car motors, it is only when they move from a stop that you hear (and feel) the familiar mechanical rumbling.
There is also an indisctint movie playing in the background. It seems to have a lot of gun action, but I haven't even looked at the screen nor I have plans of doing so. Most of the sounds of the city are lost on the bus.
Let us switch senses: do I smell anything? There's a faint smell of deodorant, though not the kind that is used on armpits. It must be deodorant they use between trips, probably a spray. But like lounge music, it is easily ignored and provides a pleasant ambiance.
I wish to continue, but the bus has arrived to the station. I expected to have more time. Good bye for now.
Next to me are two sheets of paper which I use to ease the monkey mind while in activity. I thought: I ought to take this kind of reflection into my logs. I'm gravitating towards private handwritten journaling again, which is a direction I've already explored throughly.
So I begun writing on the computer, but then my hands refused typing. There seems to be a difference of opinion between reason and soul, and spirit always sides with soul, so when you try to perform a perfectly reasonable act your body seems to refuse to do it.
So I expect to come back in a couple of days, which has been happening anyways, but by announcing it I don't feel guilty about not writing online for some days.
Peace.
_Tenía que entregar una reflexión acerca de mi servicio social con la universidad. Lo publico aquí para entretenimiento del lector_.
La última vez que estudié fue en 2008, y tengo casi cuarenta años. No soy ignorante de las actividades de labor social, participo en ellas de forma individual y de forma comunitaria conforme el tiempo y el apetito me lo permiten. La labor social me ha permitido cosechar frutos inesperados. Uno piensa que en la labor social uno siembra y otros cosechan, pero sucede que uno también cosecha, pero no es lo que uno siembra.
La labor social en el marco institucional me ha dejado con un amargo sabor de boca, desafortunadamente. Lo guardaría en secreto, pero me han pedido que comparta mi experiencia en esta reflexión.
En este preciso momento me encuentro sentado en la mesa sucia de plástico que tienen afuera de sus oficinas, sentado en una de sus sillas plegables. Es el último día que tengo para entregar la documentación necesaria para mi titulación, y un problema con mi estatus como estudiante tiene el proceso atorado. En servicios estudiantiles están viendo el caso y llamarán cuando se enteren de cual es el problema, pues a pesar de haber hecho todo el proceso de reingreso exitosamente, la encargada de Artes y Humanidades no puede hacer ningún movimiento porque le salgo como inactivo.
"¿por qué no has hecho los trámites con antelación?" escucho. Los comencé hace dos semanas. Entregué lo que pensé eran todos los requisitos para mi titulación. Sorpresa, la carta de terminación de servicio social no era lo que tenía que entregar! "Necesitas un papelito así cortito, con un sello". Me sentí irritado porque tendría que ir a servicio social a cambiar una carta por un sello.
"Vienes diez años tarde! Terminaste en 2008!", mi primer servicio social lo hice con Paul Rich, y en su apresurada salida mis horas quedaron sin firmar. Terminé mis estudios, inclusive presenté mi tesis, pero el tema del servicio social se quedó atorado.
Como diseñador, nunca eche mi título de menos, pues la muestra de tu capacidad no está en el título, está en el portafolio. Pero los caprichos de la trayectoria profesional me llevaron a España, en donde el gobierno no acepta portafolios con motivos de migración. Intenté resolver el problema desde España con la ayuda de mi hermana, pero resultó ser imposible para ella navegar la burocracia de la UDLA, ¿cómo explicarle todo desde dónde está el edificio de servicio social?
Renuncié a mi trabajo en España y volví a México para, entre otras cosas, obtener el título que me permitiría moverme con mayor libertad profesional. Vine a la UDLA y... efectivamente, me informaron que tendría que repetir mi servicio social. No sólo eso, como tiene mucho tiempo que no estudio, el proceso de reingreso no sólo es entregar el comprobante de no-adeudo de Sorteo, la firma del director de carrera y saldo positivo, no, hay que enviar una solicitud al Decanato de Artes y Humanidades para hacer una excepción, y estas solicitudes se aceptan en las juntas de escuela, las cuales son semanales.
Esperé a la respuesta y por fin era estudiante de nuevo! Elegí el proyecto de la Luz de la Nevera por la labor artística. De Joaquín Conde y de Carlos Arroyo y todos los compañeros de la Luz de la Nevera sólo tengo cosas positivas qué decir. Indudablemente su labor es muy importante en la comunidad de la UDLAP. Sólo me gustaría que la difusión fuera más allá de las puertas de nuestra institución.
Completadas mis horas con la Luz de la Nevera, volví a España sabiendo que pronto podría titularme. Consideré que teniendo todos los requisitos sería cosas de entregar documentos, para venir de España dos semanas sería suficiente no? Pues parece que no, porque en la burocracia de Servicio Social, tengo que subir esta reflexión a una cosa que se llama Blackboard, y que soy un estudiante tan antiguo que ni siquiera lo he usado.
Y como no estaba activo, pues tuve que hacer el mismo proceso de reingreso que hice cuando inicié mi servicio social: entregar todos los documentos de reingreso, luego esperar la junta semanal del decanato con la luz verde, y etc etc etc. Por fin ayer me enviaron un correo diciendo que estaba activo!
Vine por la tarde para encontrar una mesa afuera, y las puertas de Vinculación cerradas. Se me acercó una chica en la mesa y me preguntó qué buscaba, "servicio social" le dije, "Ahhh, es que hoy hay un evento que se llama cortomeatro", miré al cielo y grité "porqué me odias Dios mío", luego caí de rodillas y lloré, sintiéndome el hombre más desdichado del mundo.
La gente de la mesa me miraba y decía "qué trágico este pelón que se tira a llorar porque está cerrado servicio social" pero ellos no entendieron mi suplicio, y también dudo que ustedes que leen esto lo comprendan. Parece que para obtener mi título tengo que matar a un dragón, y ese dragón es el dragón del orgullo. Por que luego de sentarme, explicarle todo esto a la maravillosa chica que debería saberme su nombre y que atiende a Artes y Humanidades, me dice "es que tienes que subir tu carta de reflexión de servicio social" en un tono muy dulce pero que a mi me sabe a la bebida más amarga y desagradable del mundo.
Pero me lo tengo que tragar, porque no pueden tratar a los estudiantes de forma humana y compasiva, porque los ordenadores los han vuelto robots, y no pueden ver como llevan a un pobre hombre a caer de rodillas y llorar en público por su afán de procedimiento, de sólo entender su parte, de no velar por el bienestar del estudiante sino de su propio puesto de trabajo, porque sería la cosa más fácil del mundo sacar el sello y pum, caso resuelto. No, hay que mandar al estudiante a dar de vueltas como mayate, como si no tuviera mejor uso de su tiempo que andar completando su rally burocrático.
Y luego, encima de todo, me piden que escriba dos cuartillas. Los académicos y sus medidas mafufas, ¿cuánto es una cuartilla? Depende de la fuente tipográfica, del espaciado entre líneas, entre letras y entre palabras. Hay mil formas de hacer trampa.
Sigo sentado aquí en la mesa sucia de sus oficinas, y servicios escolares parece que no ha dado respuesta. Terminará esta pesadilla burocrática? Voy a asomarme a la oficina a ver...
María no estaba, se ha ido a comer. Paola me ha dicho que _ya me están activando en servicios de cómputo_. En lugar de seguir correteando trámites burocráticos, mejor esperarlos, así que vine a comer también. He terminado y ahora faltan quince minutos para que María vuelva y me informe si se ha podido completar la activación.
Me gustaría contrastar mis experiencias de vinculación social personales, y contrastarlas con las institucionales. Cuando quiero hacer labor social de forma personal, no se me da una lista de cosas qué hacer: yo veo lo que hace falta en todos los anillos sociales que me rodean: mi familia, mis vecinos, mi colonia, mi ciudad, mi país, mi mundo. Todo es vinculación social.
Nadie me pide una carta de inicio, de terminación, ni un número específico de horas. Me asocio con personas de manera libre, sin contratos, hay un plan pero el aceptar estar en un equipo implica que estoy de acuerdo con el plan. Si en algún momento quiero enfocar mis esfuerzos de otra forma, puedo hablar con mi equipo y encontrar un reemplazo para que todo funcione bien.
En el marco institucional todo esto está velado por una cantidad tremenda de burocracia. Porqué he de "iniciar" mi vinculación social y luego "terminarla"? Lo único que se logra es tener un mal sabor de boca de toda la experiencia.
Ya casi han pasado los quince minutos que faltaban para que María volviera de comer, voy a asomar la cabeza a la oficina. Y si ya estoy en el sistema correctamente, dejaré este relato aquí. Desafortunadamente, lo más probable es que aquí no termina el relato.
Efectivamente. Entré con María y me dijo que no le habían hablado aún. Me dijo que para casos como el mío tienen prórrogas con graduación para apoyar a los estudiantes, lo cual no me proporcionó alivio porque claramente el problema es de la UDLA y así tuviera un año de retraso, sería debido al sistema.
Sin embargo, amablemente me pidió mi teléfono y me dijo que me llamaría cuando le informaran del asunto. Yo le dije que permanecería en el campus en caso de que se pudiera resolver hoy mismo, pues el prospecto de venir de nuevo no me atrae mucho.
Le dije que me pondría a trabajar, pues traje la laptop, pero al salir de la oficina de vinculación social sentí la misma intuición que sentí cuando entregué mis documentos de reingreso: algo va a salir mal con esto si no pongo de mi parte.
Y así vine a la oficina de TI. Después de pedir mi turno esperé a que llegara una persona a ayudarme con blackboard. Le expliqué que nunca lo he usado y que necesitaba activarlo para hacer un trámite de servicio social. Entramos al sign-in de la plataforma y efectivamente, no funcionan mis credenciales.
Al explicarle que la solicitud había sido hecha hoy me dijo que tal vez era por eso, "a veces tarda". "Pero hoy es el último día para entregar los papeles para la titulación, y esto me tiene bloqueado". Apresuradamente volvió por la puerta por la que entró, y minutos después salió a hablar con alguien en los cubículos de la zona común. "Estamos viendo tu caso" me dijo, y así llegamos hasta el presente.
¿Cuantas horas de cuántos estudiantes no habrán perdido en sus trámites burocráticos? ¿Cómo se pueden aplicar los conocimientos adquiridos durante la carrera, cuando nos tienen encerrados en oficinas yendo de un lado a otro? "Para titularte en la UDLA necesitas primero titularte en burocracia UDLA" bromeé con María. Las sonrisas revelaron lo acertado de la broma.
Y el chico que me estaba ayudando con Blackboard ha desaparecido ya durante bastante tiempo, a veces me pregunto: se habrán olvidado de mí? pero salvo circunstancias excepcionales, rara vez es el caso. Como invocado, el chico acaba de venir: "ya hemos visto que no hay un bloqueo administrativo, es puramente de sistemas, pero tardará un rato en liberarse, unos veinte minutos". Entiendo de tecnología lo suficiente como para saber que no estarán ahí hackeando el sistema para subirme a blackboard, sino más bien es un tema burocrático en el que la persona encargada de dar de alta salió a comer. Son las 2:40pm, sí, es lo más probable.
Seguiré escribiendo. Lo que me parece más peculiar de todo el caso es que toda la gente con la que he tratado ha sido increíblemente amable. Algunos con desconocimiento absoluto de cómo funciona el sistema. Pocas veces te encuentras con alguien que te dice a ciencia cierta qué hacer. Inclusive María, cuando vio que mi estatus aún estaba inactivo, no sabía por dónde seguir, y sólo después de ensayar los procedimientos administrativos en su cabeza se dio cuenta que había que preguntar en asuntos escolares.
Mil novecientas palabras escritas casi exclusivamente para quejarme de los trámites administrativos de la UDLA, ocasionados por el hecho de que se tiene que subir una reflexión a blackboard. Sin esto, sellarían la tira de papel y ya está. Ayer recibí una carta de Admisiones. Como los requisitos de ingreso cambiaron desde que yo estudiaba, tengo que proporcionar lo siguiente:
* Acta de nacimiento original actualizada (con una antigüedad no mayor a dos años).
* 1 copia notarial de acta de nacimiento (en caso de ser digital no aplica).
* Legalizar certificado de bachillerato (Deberá recoger en Servicios Escolares).
* Copia notarial de certificado de bachillerato (en tamaño carta).
* Comprobante de domicilio (con una antigüedad no mayor a 3 meses).
Y como nací en Canadá, ahora me van a meter en un lío porque mi acta de nacimiento puede requerir un viaje a la Ciudad de México.
***
Ahora estoy sentado en servicios estudiantiles, esperando a mi turno de entregar el dichoso papel sellado. El chico de TI me informó que estaba desbloqueado, fui a buscar a María, pero no estaba en ese momento. Esperé y cuando llegó me selló el papel: el problema de blackboard no estaba resuelto, pero había luz verde desde TI para hacer el procedimiento. Un problema de sistema impedía hacerlo de la manera "oficial" y por eso nos saltábamos el paso. Quedé con María de enviar esta reflexión por la tarde, y ahora nuevamente estoy esperando a entregar el papel en el cubículo de graduación de la oficina de servicios escolares.
No sé cuánto me harán esperar, pues parece haber mucha gente. Y ahora no encuentro mi turno. Nunca respetan turnos en servicios escolares de todas formas. Aquí esta: 903. El último turno fue 900, pero parece no ser secuencial. No puedo celebrar el fin de la pesadilla hasta que me hayan confirmado que es todo lo que necesito entregar.
901 anunciaron en voz alta. No va en secuencia, pero la gente que viene a entregar documentos de graduación va en los 900s. Dos turnos y me toca a mi.
En mi experiencia como estudiante, sin duda, la mayor parte de los estudiantes vivíamos en una burbuja y el servicio social definitivamente era una oportunidad de salir de esta burbuja. Veo la utilidad de exponer a los estudiantes a gente distinta a la que están acostumbrados a tratar, a maneras distintas de pensar, a ensanchar la mente y el alma, por ponerlo de alguna manera. Pero envolverlo en tanta burocracia hace perder el apetito por querer aplicar tus talentos al servicio de la sociedad.
Hay un poema que me gusta mucho, de Jalil Gibrán, que habla del tema:
> Entonces, un hombre rico dijo: Háblanos del dar.
> Y él contestó:
> "Dais muy poca cosa cuando dais de lo que poseéis.
> "Cuando dais algo de vosotros mismos es cuando realmente dais.
> "¿Qué son vuestras posesiones sino cosas que atesoráis por miedo a necesitarlas mañana?
> "Y mañana, ¿qué traerá el mañana al perro que, demasiado previsor, entierra huesos en la arena sin huellas mientras sigue a los peregrinos hacia la ciudad santa? ¿Y qué es el miedo a la necesidad sino la necesidad misma?
> "¿No es, en realidad, el miedo a la sed, cuando el manantial está lleno, la sed inextinguible?
> "Hay quienes dan poco de lo mucho que tienen y lo dan buscando el reconocimiento y su deseo oculto malogra sus regalos.
> "Y hay quienes tienen poco y lo dan todo.
> "Son éstos los creyentes en la vida y en la magnificencia de la vida y su cofre nunca está vacío.
> "Hay quienes dan con alegría y esa alegría es su premio.
> "Y hay quiénes dan con dolor y ese dolor es su bautismo.
> "Y hay quienes dan y no saben del dolor de dar, ni buscan la alegría de dar, ni son conscientes de la virtud de dar.
> "Dan como, en el hondo valle, da el mirto su fragancia al espacio.
> "A través de las manos de los que como esos son, Dios habla y, desde el fondo de sus ojos, Él sonríe sobre la tierra.
> "Es bueno dar algo cuando ha sido pedido, pero es mejor dar sin demanda, comprendiendo.
> "Y, para la mano abierta, la búsqueda de aquel que recibirá es mayor goce que el dar mismo.
> "¿Y hay algo, acaso, que podáis guardar? Todo lo que tenéis será dado algún día.
> "Dad, pues, ahora que la estación de dar es vuestra y no de vuestros herederos.
> "Decís a menudo: "Daría, pero sólo al que lo mereciera." Los árboles en vuestro huerto no dicen así, ni lo dicen los rebaños en vuestra pradera.
> "Ellos dan para vivir, ya que guardar es perecer.
> "Todo aquel que merece recibir sus días y sus noches, merece, seguramente, de vosotros todo lo demás.
> "Y aquel que mereció beber el océano de la vida, merece llenar su copa en vuestro pequeño arroyo.
> "¿Y cuál será mérito mayor que el de aquel que da el valor y la confianza -no la caridad- del recibir?
> "¿Y quiénes sois vosotros para que los hombres os muestren su seno y os descubran su orgullo para que así veáis sus merecimientos desnudos y su orgullo sin confusión?
> "Mirad primero si vosotros mismos merecéis dar y ser un instrumento del dar.
> "Porque, a la verdad, es la vida la que da a la vida, mientras que vosotros, que os creéis dadores, no sois sino testigos.
> "Y vosotros, los que recibís -y todos vosotros sois de ellos- no asumáis el peso de la gratitud, si no queréis colocar un yugo sobre vosotros y sobre quien os da.
> "Eleváos, más bien, con el dador en su dar como en unas alas.
> "Porque exagerar vuestra deuda es dudar de su generosidad, que tiene el libre corazón de la tierra como madre y a Dios como padre."
***
Ya me han llamado. Entregué el documento sellado. La chica me reconoció. "Sólo te faltaba esto verdad?"--"No tienes idea de la pesadilla que ha sido". Se rio. Le pregunté qué habría de esperar, un correo, algo. "Checa la aplicación donde subiste tus cosas, ahí debe de aparecer que todo OK".
Quién sabe, puede que no sea el final de la pesadilla aún.
Some weeks ago René proposed that I create a course for his online writing school that we codenamed _writing as therapy_. I didn't hesitate in accepting his proposal, I knew it was the time to do it. This morning I unpacked my modest trail of journals which begins in 2013 and eases off in 2017, when I begun journaling online instead of journaling privately.
<img alt="IMG_5577.jpg" src="https://method.ac/writing/uploads/IMG_5577.jpg" style="width: 100%" />
_Why there's a casket in my dining room is a matter of another log_
I begun work today. The work consists in finding ways in which I prod and question myself in writing to reveal things which I do not know the answer. I've begun in chronological order, starting from the oldest journal from November 2013 (exactly five years of journaling). I'll write a brief impression of each journal and then the writing prompts that can assist with self-knowledge that arose from each journal
**Journal I**<br>
November 2013 - February 2015
In this journal I reassert an ego that's already being ripped apart because--like an insect that sheds its skin--the soul needed more space to grow. I try to give myself answers rather than to understand the problem, because at the time I was evading rather than confronting what was happening.
Prompts that arose from this journal:
* Describe the day you will live tomorrow. When tomorrow comes, describe the day as it actually was. Contrast your expectation with your experience.
* Describe your day in reverse. Begin from the present moment and trace back the day 24 hours.
* Register your current experience taking into account senses and emotions: where you are, what do you see, what do you smell, where you are emotionally, how does it feel sitting on a chair, and so on.
* You did something really naughty and now you're on trial. Create a dialogue with these characters: a judge, the devil, an angel, and yourself.
* Describe the person who speaks in your head.
* Describe who you are in the most detailed and comprehensive way possible. Then remove everything that is non essential so your essence is recognized.
* Stoic exercise: rehearse responding to setbacks with wisdom. Choose a real recent example of a setback or frustration and write how you would have handled it in the wisest way possible.
* Describe the most embarrassing moment you're willing to admit, but write it in a humorous tone.
* Stand up and spin until you are dizzy. Describe the experience of dizziness while dizzy.
* Think about something that makes you uncomfortable and then do it. Describe the feeling of discomfort. Describe the outcome.
* Describe your inner experience in an altered state of mind.
* Describe your day, then remove everything that is routine. What remains?
* What do you think is your purpose in life?
* You inherit an empty house under the condition that you inhabit and furnish it within a year. You receive an allowance of $1,000 USD/mo to furnish the house. Describe in chronological order the things that you buy and the justification to buy them.
* Describe your perfect day
* Soothe yourself with acceptance
* Stoic exercise: meditate on the impermanence of everything
* Recreate an emotionally powerful moment you've had, but now multiply your feelings by ten.
* Recreate an emotionally powerful moment you've had, but now diminish your feelings to nearly nothing.
* Express inner experience in metaphor
* Write a letter of acceptance to yourself.
* Describe a character of complete competence.
* Describe a character of complete incompetence.
* Go inside a difficult feeling and confront it.
* Describe an imaginary dinner with someone you admire
Many of the prompts from this first journal arise from the blindness I was experiencing at the time. The first times doing inner work you will bump against countless walls before understanding that often what we see as a problem to be fixed is actually a symptom of a deeper problem. You see moisture on the ceiling and you think the solution is to paint it over. The prompts don't give the solution, they say _yes, there's moisture on the ceiling, now let's find where it comes from_.
**Journal II**<br />
February → April 2014
In this period I began meditating. I didn't notice it at the time, but meditation liberated some stored wisdom. I wrote some interesting aphorisms and thoughts:
***
> We are constantly seeking the approval of our thoughts, beliefs, and behaviors. We tend to seek friendships who share these same values. One should seek friendships of all kinds and merge into their belief system as a method of exploring ways of living. One must recognize and admire all ways of authentic life, for living life is a trivial matter only when it's mechanic and unconscious.
***
> What you have is who you are?<br>
> What you do is who you are?<br>
> What you think is who you are?<br>
> What you know is who you are?<br>
> Are you are only when there's another?
***
> Our extremes are infinite (the cosmos and the self). One must be aware of both, but exclusive dedication to any one is a dangerous proposition. To understand both in one's lifetime is a gift of the universe, for it provides an overview of the vastness of knowledge, and deep humility in knowing that we will never understand everything, either on the inside or on the outside.
***
> To live a truly authentic life one must live life as art. A profound enjoyment of any circumstance, a constant striving to make life more interesting, full of appropriate challenges to one's skills, in persistent pursuit of developing one's abilities to full capacity and inner tranquility.
> The authentic life is initially challenging because one is accustomed to respond to the demands of others, but ignorant about how to respond to the demands of the true self. When one listens and responds to the voice of the true self, action becomes effortless. You possess limitless energy because you are doing what you're supposed to be doing. You are fulfilling your purpose in life.
***
> Every thought can be translated into action. One's existence implies giving meaning and transforming reality into your ideal through action. Thoughts that do not have an outlet in action settle in the mind in the same way unused calories settle as fat in the body. Most of of us are fat in the mind.
***
> Work in itself is purification, a meditative state in which we translate our values into action. Creative work is the most intimate expression of one's being and the most honest expression of one's philosophy.
***
> When informed by our true inner self, will has a strong incentive to achieve our true nature. However, we might have unconscious blocks of the will. We use awareness and decision to remove these blocks in order for our will to act freely.
***
> _The soul_ is the user interface for the human psyche.
***
> Forgiveness is always the best course of action, for unforgiven actions burden our existence. Who is more pleased with life, an old man who forgave everyone and everything, or an old man who exacted revenge on everything and everyone who damaged him?
***
> The more time you spend procrastinating on something, the more difficult it is to do later. There is no better moment than now to transform thought into action.
***
> Always help people in need, especially those in distress who don't ask for help, for they are the one that need help the most. Help should be lighthearted, compassionate, effortless and natural. Helping others is the biggest secret one should keep to oneself, for its healing effect on the soul of the giver is lost if he boasts about it.
***
> If you try to kill idleness with vice, your troubles will double. The natural state of being is highly curious and engaged with the world around you. When idle do not reach immediately for passions or entertainment. Savor your boredness so it breeds motivation.
***
> One should try to experience something new every day, for it widens your horizons and it lengthens your perception of life, for time flies when you repeat your days. Just talking to a stranger is a new experience.
***
> Efficiency allows you to use your will smartly. You should not spend much time doing what you don't enjoy, thus one should put attention in _how_ we can reduce the time doing it. Efficiency is a habit, and it manifests not only in work but in daily life.
***
> If one is able to exercise the body into a much better shape than what you'd get with a sedentary life, it follows that one should be able to exercise the soul into a personality that is more open, friendly, diligent, responsible and wholesome. One should approach these virtues as if they where routines where one should seek challenges that are progressively more difficult.
***
We should never lose our appreciation of beauty, as wisdom begins in wonder. We don't acquire wisdom by automating our life, we get it by being marveled at things or circumstances.
***
Now, the prompts that arose from this reading:
* Write about how you feel while sleepy or hungry. Inspect the sensations.
* Condense an essay into an aphorism
* List things that would get you out of bed immediately
* When was the last time you cried? Why did you cry?
* Describe the guilt a dog feels after he ripped open the doggie bag without the permission of his owner.
* Write a letter of forgiveness (try to be honest)
* Accomplish silence, then write your stream of thought.
* Imagine yourself at your worst (angry, stressed, depressed, etc) and then have you at your best (happy, wholesome) soothe you.
* Write your stream of thought as soon as you wake up
* Write a dream as soon as you wake up, then store it. One week later rewrite the dream without looking at the original dream. Compare.
* Form a cast of archetypes so that you can use them in dialogue.
* Describe small tweaks that you think would lead to vast improvements in the life of a person close to you.
* Do you remember the last time you lied? Why did you lie?
* Trim, shape and reorganize a stream of thought.
* Find the oldest piece of substantial text you've written, and become your own editor. Improve your piece and write tips for your former self.
* Play out inner conflict through characters
* Play out inner reconciliation through characters
* What are you grateful about today?
* Show and tell: describe a personal object that carries personal significance.
* Write about the shadows of light and the light of shadows (find the bad in the _good_ and the good in the _bad_).
* Describe an emotional state in metaphor.
I've begun to call the land behind my house my "real-world minecraft". As I don't have a budget to clear this land (or anything else actually) I try to use what's available within the land to accomplish what I need.
For example: there's a lime tree which grew too tall to collect its fruit, yet its trunk is too thin to climb and I don't have a ladder. The limes fall when they're past ripe, so I'd like to pick them from the tree, but they're too high up.
What am I to do if I can't buy a ladder?
First I thought: I ought to build it. There's enough logs and sticks to build a primitive ladder. But then I realized I can't lean it on the tree, so it would need to be self-supporting. I could perhaps pull it off, but I would need nails, which are affordable, but by now I had made the commitment to spend zero money on "in-app" purchases.
Why spend so much time collecting lemons when they cost next to nothing at the supermarket? Beyond the fashionable answers (it's organic, it's local, it's fresh), for the caregiver there is a spiritual responsibility towards accepting the gifts that the land provides. It is participating in the cycle of giving and receiving that plays out in the relationships among humans and with nature. (A ladder)[https://www.ccel.org/h/hilton/ladder/formats/ladder1.1.pdf] is also spiritually meaningful.
I chose to give the tree a good shake so that a couple of ripe lemons fell down. Not a sustainable solution, but good enough for now. Then I made _agua de limón_, which I served to my guest, a man who will advise me while building an MVP carpentry workshop when money comes.
The first product of the workshop will be a ladder, of course.
This morning I finished reading the third journal, only a couple of prompts came up:
1. When you perceive a "sign", pursue it instead of dismissing it. Write an account of what happened.
2. Write from a place of intense curiosity
3. Write something you will know you will do in the near future as if it were the present moment
4. Recall one of your first memories in at least 500 words. If you don't find enough words, fill it out with fiction.
What was most striking about this journal was this: I was seeking for relief from depression, and meditation plus exercise proved to be quite effective. But as soon as I felt better I strived for more: more focus, more exercise, more flexibility, more friends, and through striving I drove myself miserable. I read myself and smiled: it's through non-action that everything gets done to its own accord.
Very few people in this world understand what is achieving without attachment. The deal is this: wether you foul out or blast home runs, you are indifferent to the outcome. Activity in itself enough reward. So, in my journal, I was striving certain outcomes: independence, financial security, happiness, new friends, new romances. But I was trying and obtaining nothing, and then blaming myself either out of laziness or incompetence.
I was reading everything I was striving for and I thought _I have accomplished everything that I wanted, and yet I only got it when I stopped trying, how is that?_. There is no good answer to this conundrum. The mind thinks it know the solution. You are shy and the mind says "get out there" but you go out there and you feel miserable. And you try time and time again and you fail, finally you give up and accept your shyness. Then something special happens: by eliminating this conflict (I'm shy yet I feel lonely and I want to meet more people) you actually make room for new people in your life.
This phenomena plays out in numerous scenarios: the person ascending in a healthy institution is not the one who is most focused on climbing the corporate ladder, the boxer who wins the match is the one who doesn't need the win, the sure way to never reach enlightenment is to strive for it.
I identify this phenomena with a physical counterpart: when you are climbing a mountain or a hill, the best way to ascend is not in a straight line to the top, but by moving sideways, oftentimes in a zig-zag fashion. The will will always call you the top, but attempting to ascend though a straight line is foolhardy.
Yesterday I was trimming a Bougainvillea which was creeping up a tree. I couldn't reach the highest branches, so I looked at the tools I had at hand. Nothing adequate, but in my naiveness I taped a saw to an extensible pole and it worked surprisingly well. I went through the rest of the garden clearing dead or awkward branches from trees.
The turn came for the avocado trees. I wanted to remove as much foliage as I could, since this helps trees produce a yield (these trees are almost sterile). When I was done I brought the axe that I had bought the same day, but I saw it was completely dull.
Fortunately some weeks ago, while clearing the front yard, I found a wet stone buried into the ground, so I fetched it to sharpen the axe. Soon enough I realized I had no idea what I was doing, so I watched a video on youtube and got myself at it with better knowledge.
As I was there sharpening the axe I looked up and saw my image reflected on the window: a bald, bearded muscular guy without a shirt polishing an axe. "I do not recognize myself", I thought, "but I actually like the guy I'm seeing". I decided the scene was worth a memento, I wanted to take a picture of myself.
I set up a chair and brought an old prosumer camera that a friend inherited me, but since I never use it I couldn't find the timer option, so instead I just chose to record myself polishing the axe. When I was done I thought: "Since I have nearly zero experience chopping wood, I might as well record myself doing it, so that I can improve my stroke". And so my first hits were hesitant, but as I gained confidence I had fun, I'll surely analyze the technique of the Basque lumberjacks.
Then I saw that I had tons of avocado leaves on the floor. These are used in Mexican cuisine because they're slightly fragrant. "Hmmm, I could cover the floor of the garden with them" and I put myself to work, removing the twigs so that they wouldn't be bothersome to walk on. But then I realized these surely trap moisture into the ground, so I watered everything throughly, and then had it covered in avocado leaves.
These activities took me the entire day, but were throughly satisfying. When the sun came down I went inside the house and sat down to think about my financial situation. A client recently ghosted early into the project (which is not a big deal in itself) but it leaves me with a two month runaway. I understood it was time to seek new clients and my heart sunk: I'm doing exactly what I want to be doing, I get up every day at 6am without an alarm clock because I look forward to my day.
Is there any way I can monetize my current passion? Well, if those avocado trees at least gave avocados I could sell them. But they don't. And I don't want to deal with logistics. But I have digital assets. I see: I ought to begin experimenting with documenting my garden activities. It's that or seeking new freelance projects, and I very much prefer the garden.
So today my task will be to finish documenting my garden activities. This is meant to be an experiment, to improve my documentation abilities so that when the runaway ends I can actually lift-off. Let's get started.
<iframe width="560" height="315" src="https://www.youtube.com/embed/hc8bpuCxb90" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Here's the video I set out to do yesterday. I drew inspiration from [Primitive Technology](https://www.youtube.com/channel/UCAL3JXZSzSm8AlZyD3nQdBA), of which I am a big fan. As soon as I saw the footage I knew it was all a mistake, but I had boasted about what I would be doing, and withdrawing from the challenge would be cowardice, no? I threw some clips together and called it done.
There are some delicious lessons that the garden gives which are not visible in any video. As I water the garden, the garden waters my own projects. I make connections between nature, work and existence. I will allow my own projects be infused by this inspiration.
It is ruin to convert intimate inspiration into a product.
It is ruin to transmute passion into duty.
It is ruin to put the ego in charge.
**technique**: stream of thought<br />
**length**: 20 min
I have set myself aside 20 minutes aside to write my stream of thought. As you face the blank paper you think: will anything come to mind? Or my mind will be like the blank sheet? You dread that your mind becomes a white sheet? Why would be that? If you are not thinking about anything, then you would be meditating, no?
Well then, allow us to focus attention somewhere neutral, let us put it on the breath. Do you feel the air coming in and out of your nostrils? It's slightly cold, and it dries the moisture of the nostrils. It made me notice my entire body, my back is coiled up like a snake, I'll sit properly.
I set aside 20 minutes because that's what I have available before biking to my yoga class. But deepening into yoga at this moment is not to my apetite (and I hope for the reader too). Best to describe the things going in the inner and outer garden.
It has been observed that not completing projects works in great detriment to one's mindspace. I have my sacred objects list which I want to complete, I've seen so many new plants but I haven't uploaded them, yadda yadda. There seems to be more joy in starting than in maintaining, at least in my personal case.
These _loose ends_ cause your attention to fragment. _I haven't done this_, _I need to complete this_, but you do nothing about it. You simply worry.
At noon my mother came and told me she wanted to change the locks of the house. As an artist her creativity is also expressed in the shadow, and she manifests a benign paranoia where she thinks the neighbors steal her keys when she loses them.
I saw her mind reeling: "the other day they looked at me with evil eyes!" and one's mind wants to answer "Mom, that is not what is going on, it's all in your imagination" but the answer is useless. Will the day come when rational behavior trumps irrational behavior? Will my mother ever say: "I think you are right son, It's all in my imagination", no. You will only play games, the same games you have played with your family all your life.
--"Mom, we have nothing of value here, why would they want to break in?".<br />
--"They want to take our documents and inhabit the house so they claim it's theirs".
Worry and anxiety are misdirected energy. Activity is directed energy.
--"Mom, let's do this: let's go and pay all our debt with the city government, and make sure your name is on those documents. That way they know we are living here and we pay our debt.
[Prediction] Tomorrow we're paying the bills and not changing the locks.
[Prediction result] After we paid the bills her worries about the locks faded away.
Thoughts are becoming slow.
I'm following the breath.
I've landed.
I am here.
Existence is pleasureable in itself.
Am I at the the gateway of presence?
Can I remain here?
Something is crawling on my neck.
No, not now little fella.
Holy shit, it feels as if it's digging into me, but I know that if I swat it, presence will be lost.
I must prevail.
Motherfucker are you digging into my neck?
No no no back to presence, breathe.
I AM PAIN. AHHHHHHHHHHH!!!!!
Collect yourself dammit.
No larva digging into you neck shall interrupt your coming into presence!
You deserve better than this!
Is it gone?
Did the ego in its shining armor scare that motherfucker off?
Looks like it. Tastes like victory.
I didn't notice I was tense from the itches. Relax. Ahhhh.
MOTHERFUCKER!!!
That's it. There's a mirror three meters away from me.
I shall take a look:
It was a string.
What a strange portrait there is in the mirror.
I could have not set this up.
Hello there.
<img alt="IMG_5629.JPG" src="https://method.ac/writing/uploads/IMG_5629.JPG" style="width: 100%;" />
<img alt="y4360e00.jpg" src="https://method.ac/writing/uploads/y4360e00.jpg" width="550" height="716" style="display: block; margin: 0 auto;" />
Today I embarked on quest to remove a large date palm tree from the garden. I consulted with someone with more experience than myself, and he recommended that I chop it up with an axe. I had seen these date palm trees fall over and their root system looked flimsy, so I thought it would be easier to dig it out.
It took me about six hours. It was a complex operation which required a lot of trial and error until I understood what I was actually trying to do. The bottom of the palm tree has a bulb from which numerous appendages like ropes come out. In a healthy palm tree such as my nemesis, it is necessary to sever most of these roots to dig out the tree.
Chopping it up would have been faster, but the intimate time spent reaching under the palm tree to tug at its roots by hand proved to be very instructive. I was reminded of Goethe, his initial inspiration for _The metamorphosis of plants_ was precisely a palm tree. Its leaves fall leaving behind a trunk, and looking at the palm tree's bottom it is evident how this happens. It's roots too, are made from the same fibers that you can see on the leaves when you cut them.
I thought: will man ever be able replicate the power of a seed? From a tiny device emerges a tiny sail which captures light. The light serves as power to extract carbon from the atmosphere so that the plant can build itself. After it reaches maturity it attempts to replicate itself, but since it is bound to the ground and it needs to extend it's reach, it entices other organisms to transport its DNA when they snack on their fruit.
How is it that we can't send thousands of pellets to the moon, and from these pellets emerge nano machines which, powered by the sun, collect minerals to build themselves into more complex machines and so forth?
It this capacity exclusive to nature?
Outwardly busy, yet inwardly serene,
immersed in activity, yet quiet in the mind.
Knitting the tapestry of life through action,
yet utterly uninterested in the pattern revealed,
One unfolds the mystery within.
Forgetting oneself through activity
this is how one-self is revealed.
We believe we are the voice,
but we are the action.
We believe we are the image,
but we are the essence.
We believe we are the flesh,
but we are the soul.
How difficult it is to walk this path!
To declare everything you knew utterly useless.
The things that are important do not belong to this reality.
You lose your time but you gain your soul.
What good does a soul bring to life?
Breathing, it inspires and produces meaning.
Running, it is the white horse of spirit, galloping fields of freedom.
Remaining still, it appreciates the utter magic we live in.
But such an upside cannot come without a downside,
one cannot understand meaning without staring into the void of nihilism,
one cannot experience the thrill of a run without having been chained,
one cannot appreciate silence without having experienced the cacophony of life.
Yet, moving exclusively among dualities one experiences only a slither of life.
It is necessary to grow in a dimension which remains elusive,
that which escapes duality,
that which is not white or black, nor gray.
But from the extremes produces the spectrum of all colors.
The utter magic of transcending duality must be experienced,
it ceases to be one or the other,
to become one, the other, and something entirely different.
To the mind trapped in duality this is nonsense.
Still immature, it interprets the world as a child.
Perceiving forces of good and forces of evil,
ignorant that they emerge from the same source.
Narrow your eyes.
Observe beyond.
What lies beyond good and evil?
A universe that unfolds,
producing all the miracles and all the tragedies of life,
to the universe there is nothing good or evil,
it is in our pity minds that we perceive these things,
because we avoid pain and seek pleasure,
we confuse pain with evil and pleasure with good.
When we transcend this duality,
pain ceases causing suffering,
pleasure ceases to bring happiness.
The state has inverted: inwardly busy, outwardly serene.
As soon as one observes the inward state,
The winds of attention produce ripples on the surface of consciousness.
Obscuring depth, making everything appear shallow.
How does one observe without disturbing the surface?
Mystery of mysteries.
It never ends.
I want to tie a rope high up on a tree. I do not want to document the process, because that doubles work. Yet, in the process itself much is revealed and interiorized. Perhaps it can be shared. Let us document by writing instead of recording.
I used to have a rope hung high up on a tree as a kid in the land behind the house. My father and my uncle hung it up, and it provided fun for years. Some weeks ago I was shopping at a home supply store and I saw a _henequén_ rope and my heart beat faster. I knew I was meant to hang up that rope again.
When my fantasy faded away I noticed the rope I bought was way too thin (or my hands had grown bigger?) and it wouldn't last long. I matured the first impulse purchase with some learning.
I braided the two ends so that I would have a thicker rope, but in the process more than halved the length I had available. I had to find a smaller tree. "Great", I thought, "At least I'll get to practice".
Though it was on an incline and at first sight it looked like an easy climb, I underestimated what 25 years of not using your body to climb trees does to your skill. It's recoverable within half a year fortunately, but I want to tie this rope now!
Mind and body should challenge each other in these feats. "Step aside body I can resolve this with cleverness" says the mind. "Oh really?" says the body, "well, move aside because I'm climbing this fucker right now". But the climb was done with attachment, and as consciousness became aware of the danger it was to be dangling four meters in the air, it gave mind the precedence.
I look at some YouTube tutorials. I'm torn. One the one hand, it's a miracle that I can type "tie rope to tree" on youtube and observe a blabbering ape do it first. But the cost I pay, oh dear... _Hey guys, today I will show you how to tie a rope to a tree_ and then leave it to you to separate the wheat from the chaff. If you look closely, what is irrelevant is the ego of the host, what is relevant is the action he or she performs.
The ideal set-up for _recording while performing action_ would involve at least three different contexts. Starting from the small, it would be the action of the hands.
If you are threading, in the ideal scene you would understand without words what you need to do to replicate the actor. In fact, the observer's fingers might act on their own to mimic the movements of the actor (actor understood as the performer of action). Sound of the context should be preferably mute, if the sound of the fibers rubbings against the fingers could be heard, that would be idea.
The second context would be the gaze of the actor looking at the action he is performing. The eyes communicate the emotional aspect of the task at hand. Should the actor be placing hot stones in a temazcal as a shaman, his or her eyes would frown when touching the stones with the bare hands.
The third context would include the actor in his or her environment. It should answer: what is this place? what's the temperature like? what is the ambient noise? It's a simple matter of setting the actor into place.
Three levels of zoom. Can I document this without it being a hassle? No, proper action and documentation have a 1:1 ratio, and by documenting action one should budget for twice the amount, unless one has help from another mind.
But allow us to do a small trial, as a story board, to test the validity of the solution. Thinking in three different contexts, what storyboards are shown?
***
<iframe src="https://giphy.com/embed/THUoHeAd0bIJV1gi1r" width="480" height="270" frameBorder="0" class="giphy-embed" allowFullScreen></iframe>
The verdict is that documentation gets in the way of fun.
I heard a noise. It was one large scorpion:
<img alt="IMG_5686.jpg" src="https://method.ac/writing/uploads/IMG_5686.jpg" style="display: block; width: 100%" />
I captured it.
What should I do with this little fella?
Two days from now I'll have a party at my house.
It is an unwelcome guest.
I can't free it in this urban setting, I guess I _could_ bike to free it somewhere safe, but I won't do it now, it is 18:30 and it's already dark.
I could feed it to the chickens. Would it be safe? Allow us to identify the kind of scorpion we are dealing with. This might take some time. Allow us to observe, and to prepare some tea.
After some unsuccessful googling I put the picture on r/whatisthisbug. Let's wait.
While waiting for an answer, let us ponder the ethical dilemma:
* If I free it at the park outside my house, I'm dumping the problem somewhere else.
* If I free it in the land behind my house, it is possible that it stings a guests or myself.
Let us imagine that I find this scorpion the day of the party. Children are observing. There are two ways of being assertive: one is to minimize the threat, the other is to understand the threat. Should children be observing, I would eliminate the threat, because I am ignorant in the matter of scorpions.
But here is the chance to be curious about it. Should I go to the hospital if it happens to sting me? What should I do if one of my guests was stung? I lived in this house fifteen years a long time ago, but I had never seen a scorpion.
I must consider: Europe is wonderful because there are no threats. This is since ancient times, threat has been removed. The average European has no idea what privilege he lives in to be able to enjoy nature without worrying about spiders, scorpions, snakes and human snakes too.
Should all threat to humanity be removed without question?
What if this scorpion were a new specimen unknown to science? Would it not be stupid and foolish of my part to squash it with a rock. How would I explain my philosophy: "I think all threat to humanity should be immediately removed". That is roboto-discourse.
Let us see if there is any answer on Reddit. 35 minutes ago, no ID yet. I suspect it will be better to wait off before passing judgement.
Let us consider, if this scorpion were deadly, would it merit to die too? Should deadly animals who wander into households be killed on the spot? What if that animal were exceedingly rare? Or exceedingly common?
It feels as if this scorpion were relatively common yet a threat, it should be executed. If it were rare and harmless, it should be cherished. Yet, the answer will almost surely lies somewhere in-between. Stories about scorpion stings in Mexico are usually benign.
No new answers. Let us secure the scorpion and continue this narration tomorrow.
***
Today memories of my childhood surfaced: we went camping to the beach with extended family, and I went "hunting" (capturing) crabs with my cousins at night. We had a bucket and went back to camp with a good bounty of some five good sized crabs, not for eating but for our entertainment.
Along the way we came across a scorpion. I don't know who proposed it, but for us kids it was inevitable: we put the scorpion into the bucket to fight with the crabs. We crowded around the bucket and saw the events unfold.
The fight was long, grueling and I will spare the details, except for the end: one of the larger crabs lifted the scorpion with one pincer and with the other ripped it in half. The howls and the cheers were so loud the adults came to see what the fuss was about and promptly put an end to what had already ended.
I don't have any moral or teaching from this anecdote, I was just compelled to share it.
***
I put the scorpion in a spacious tin box. Tomorrow is the _posada_ party. Should I perceive that it is educational and safe to show it to children, I will. Parents, on the other hand... After the party it will be free to roam the land behind my house.
I did not come to this decision by reason or heart. I woke up in the morning and I knew it was the correct thing to do.
**8:44** I'm getting out of bed hungover. It's early in the morning, and I'm sitting on the sofa of a very messy living room. The task of cleaning up after the posada is up ahead. I will only be able to do this while high. Reader beware.
**9:00** The first task of the morning is feeding the roosters. Fortunately there's plenty of left overs. They don't seem to like _chicharrines_ (really low quality flour crisps) too much. Wise choice.
<img alt="IMG_5693 (1).jpg" src="https://method.ac/writing/uploads/IMG_5693%20%281%29.jpg" style="width:100%;" />
**9:15** Inspecting the results of an experiment: I set up the floor of the garden with the leaves of [Canna Lilly](https://en.wikipedia.org/wiki/Canna_(plant)), and other greens so that they would be crushed into the ground by unsuspecting party goers. I'd say it was successful. The plan is to allow vegetation to mulch into the ground all winter. Plus, the avocado trees will appreciate it.
**9:40** I had a layout problem in this entry and thought it was a quick fix. It took me almost half an hour. I'm getting hungry, better feed myself. It seems I'm not too willing to actually start cleaning!
<img alt="IMG_5700.jpg" src="https://method.ac/writing/uploads/IMG_5700.jpg" class="mt-image-none" style="width: 100%" />
**10:09** Despite having plenty of leftovers, I have a kilogram of meat that will go bad if do not eat it today. I ate five of these, which looks as dry as they tasted. Tea is brewing. I cleaned up the kitchen as I cooked.
**10:49** After twenty minutes of drinking tea while mentally narrating a story about what I would write about, I thought: I'm narrating a narration. I'm two layers removed from reality. I heard a bird chirp. I looked up. It was resting upon a branch of the avocado tree. It was a small yellow bird which I don't know it's name. They seem to be curious about the house, I've already helped two of them find the way out of this glassy house.
**11:20** Googling I came across a PDF [with the species of birds in Puebla](https://alasurbanaspuebla.files.wordpress.com/2016/11/aves-de-municipio-de-puebla.pdf) and it seems I got a match with the [Nashville Warbler](https://en.wikipedia.org/wiki/Nashville_warbler). Summers they spend in Canada, winters in Mexico. Smart guys.
<img alt="warbler.png" src="https://method.ac/writing/uploads/warbler.png" style="width: 100%" />
What a wonderful time to live, where I can see a bird and know it's name in half an hour. Still, it makes me yearn for the simplicity of pointing at it with a camera to know its name. Perhaps I'm too skeptical about the present, let us see what is available on the app store.
**12:27** Oh my what horrifying times we live in where one has to install an app, register, set up permissions, yadda yadda. I downloaded two apps: one is a guided narrowing down through questions, the other a machine learning assisted photo identification.
The problem with birds is that they are hard to photograph with your phone. Surely the latest iPhones are much better at this, but the experience of this through a phone will always be poor. There is tremendous potential in the intersection between nature and augmented reality but it doesn't happen in the phone.
[Prediction 2040] We will wear contact lenses that augment reality. Should this be 2040, I would plant microsensors in my garden, and through my contact lenses I would be able to see soil and air quality. Most people will have roomba like devices which will deliver water and nutrients to the living things that require them. The problem is both indoors and outdoors, but each has very different design constraints.
**13:00** I'm actually enjoying the leisurely pace. Mom called to ask if she should come help clean up. She was relieved and I was relieved when I said _it is not necessary_. Energies are low. I drunk a moderate amount yesterday. It doesn't require nursing but I don't have coffee. My tea! I left it outside. It must be cold now. Good, because it's getting warmer.
<img alt="scorpion.jpg" src="https://method.ac/writing/uploads/scorpion.jpg" style="width: 100%" />
**14:00** Haven't forgotten about you buddy!
<img alt="IMG_5709 (1).jpg" src="https://method.ac/writing/uploads/IMG_5709%20%281%29.jpg" style="width: 100%;" />
**15:30** Lunch. Leftovers with sour cream and avocado, with more meat. Currently feeling slightly lethargic after finishing the pan.
**17:00** Just woke up from a nap. I better finish the backyard before the sun comes down.
**18:00** Mosquitos and the waning light drove me inside. I'm used to living with them but they don't cease being a nuisance. I will light an insecticide spiral (raidolito).
<div style="width:100%;height:0px;position:relative;padding-bottom:56.250%;"><iframe src="https://streamable.com/s/1fncu/xvnipx" class="no-resize" frameborder="0" width="100%" height="100%" allowfullscreen style="width:100%;height:100%;position:absolute;left:0px;top:0px;overflow:hidden;"></iframe></div>
I made a deal with the scorpion: I'd find him a nice house at the frontier of my domains, and he would protect the border from the pests which threaten this home, which are grasshoppers and mice. We parted ways as friends (I hope).
[Intuition to be verified] I will never see a scorpion inside the house again
As much as I'm enjoying sitting down to document, it's taking me twice the time the accomplish work. But it could be due the hangover.
Does it happen to you that sometimes when you leave things out of place for too long, they just become fixed there? Like, there's a bottle of Stolichnaya behind me, if it stayed here three days it would become a fixture. It is virtue to be expedient in the restoration of order.
Let's try to have a long work session, and come back to write when rest is needed.
**19:20** I put on a Podcast to listen while I cleaned, but I made the wrong choice and put [Kapil Gupta](https://kapilguptamd.com/) on an interview with Crazy Wisdom. I say wrong because I couldn't continue my activities. I had to sit down to listen to him. Truth must be given proper attention by the mind, the soul and the body.
There are very few living spiritual teachers who don't belong to a religion and are honest in their teaching. [Intuition to be verified] His fame will only grow. Many people thirst for this kind of teaching, an understanding of their inner map so that they have complete freedom, instead of following the fixed path of ritual and misunderstood moral virtue. His words are seeding things on fertile ground. I accept him as my current teacher, though he won't know I'm his student.
**20:00** Procrastinated some more looking into how to fertilize the avocado trees organically. It seems I'm resisting the task of putting things into order, though I've advanced some. Here is an example of a schism in will: one part of the self wants to have the house ready for the weekend, the other is drinking his hot fruit punch, enjoying just hanging around writing.
Well, I shall write until I'm tired of writing then. That way I can resume putting things into order. See? Inspiration fades away as soon as you invoke it. But what should I write about? Should I delete this paragraph? Shut up!
[Question prompt] What is something that has inspired you lately? For me I shall speak about something that inspired me lately. Kapil Gupta again. The air is filled with _prana_. The more mind activity, the less _prana_ one draw out of the air. These things are spiritual in nature and are now to be demonstrated by Newtonian science but by Goethian science: to verify by your own experience. The more conscious you become of your breath, the more energy and presence one is felt. A deep _grounding_ or _coming into being_ is felt. One abandons the world of ideas and abstractions and comes into presence.
I don't need to write anything anymore. Following the breath brings inspiration.
**21:11** Inspiration indeed. The act of sweeping brought back memories of [Al-Ghazali](https://en.wikipedia.org/wiki/Al-Ghazali). An encyclopedic genius of the islamic variety who suddenly declares all his knowledge work _vain_, and then, through meditative Sufi practices he produces the most beautiful mystical descriptions. He steps down from the rectorship of the most important Persian university to sweep its floors. All knowledge is vain, says the man who knew everything. It is only direct communication with God which reveals what is True, and to get to know the Truth, knowledge gets in the way.
I must continue.
**21:50** The body is aching still. I have a pain in my neck, if I tilt my head towards the right. I am currently _leaning into pain_ and it seems to have progressively disappeared through observation. Very interesting.
Let's find other spots... Full backward brings not really painful but uncomfortable sensations. Let us look into it... Oh yeah that was paradise. Move your head in a circle, find the pain, and then rest into it. Breathe.
I think the entire body reclaims its acknowledgement. I put it through the hardest trials. I will log-off at 10pm and I have two minutes to write about whatever I want. Stage fright. Again. No no no, is there an art of self---- I interrupt the train of thought. It goes nowhere.
Good night.
I am writin thios with the screen turned off and in utter darkness. I had a moment of self-consciousness and felt ridiulous describing the scene. The crickets are chirmping. IO am high, and it is fine, because a lot of inspiration has come through in the last hours.
\\On the camino I met and authetic shaman seeker. This was a young man who had spent many years wandering the amazonian jungle. Her affirmed that these plantas maestras, or
can be interpreted as teacher-plant or master=plant. The meaning in Spanish is in-beteween. I sensed a magentic personality... nevermind the story. It ios irrelevant. He said: "María is a very potent teacher, the proem is that people do not tiake it seriously. They forget all they resolved and it is amnesia, waking up to resolve the same problem every day". His quote rung a bell: indeed. The realizations are important. It is important to be able to look into everuy crevice for the mind for old belifeefls, to scrape them off, . What do I belive that
.... Thios is done in intimacy. As soon as you ralize that there is someone reading, you cannot be completely honest with yourself.
Is this not true? Oh this schozophrenic voice that changes subjects all the time, a russian rullette. Where will we land next? William James? Nah, boring. The stream of thought. Oh how wonderful it was to write when I had no electricity. Is this not proff that I am asleeep? I realize things in flesh, yet I hive no continuatikon to it. I am asleep, just like everybody elese. And IO somethime think I'm more awake, but I am asleeep. I am asleep because much of what I do kis mechanical. But it is OK. I do have my life together, and I know to be in the right path in the macro and micro level. Only through elndless sel-compassion and the uttermost patience tdie I come to water this barren garden. Montaigne writes that hwne one has too much time, plants of all sppecies come up, as ai an abandoned lot tropical. The exoticism. Oh dear, see there? tThe ego, showing off it's knowledge. YUes
Momento of presence: dogs barking, crickets chirping. Breathe in, breathe -out.
Allow us to feel the ego. We lay here in awareness. I have a black screen and I'm tyiping. I can almost swear that I saw a bat fly. I am wondering if this is the ego being distractful or if I should really investigate. The reader will side with the ego: eys, go siee if it was really a bat! Bu8t the correct thign to do is to continue to write one's stream of thought. Allow us to do that. The ego is a coward and will use any distraction possible so that you so not find it. It is elusive, because it does not want to be discover3ed. To truly nitocie it is to say: loo, at this person whom I pretend to be. Jung called it a mask. But a mask is the outermost shell of the ego: the person pretends to be, I willl speka about myself: If I s-poke professionally to you as a designer, that is your mask.
The person who you believe your are, that is your ego. Here is a simple thought experiment: Describe yourself in an essay, then summarize as much as you can without losing your identity. Do not use your name. [prompt for the course]. I turned up the screen light to order my thoughts because I thought it was worth registering correctly.
I see I'm at 3 percent battery, publish now!
I can't find my notebook. As of late I use it for more executive functioning: planning the day, to-do lists and such. The work log proves to be enough emotional release so I'm completely indifferent if the notebook is lost. I just lost an organizational tool that was already 70% used.
But lacking my organizational tool, I thought _I ought to do this through the work log_, so that I use it to organize myself through the day.
One technique that I use is [course prompt] writing your day as a prediction of the future, and then verifying its validity. Let us do just that. Begin with a to-do list of all the things you want to accomplish in the day:
- Hand-off painting
- Work on the course
- Menu for Christmas dinner
- Grocery shopping at the market
- Drop-off at the post office
- Workout at the gym
- Drop off laundry
- Garden chores
- Document posada paraphernalia
- Answer emails
Some of these are fixed in time, for example: my mom painted a canvas for a client, the client will pick up the painting at my house at 9am. So that sets a fixed point in the schedule. I'd also like to settle on the menu for Christmas dinner before going to the market. We need to identify the dependencies and become a bit more specific...
- Hand-off painting (9am, fixed in time)
- Work on the course (answer René, assignment flow)
- Menu for Christmas dinner
- Pick up food from neighbor (in the morning)
- Grocery shopping at the market (depends on menu)
- Drop-off at the post office (prepare envelope)
- Workout at the gym (prepare backpack)
- Drop off laundry (pack clothes)
- Garden chores (plant aloe vera in the backyard, water)
- Document posada paraphernalia
- Answer emails
After this I have enough information to build a narration of the day. As a spiritual exercise, I write it as if it were the present moment, but it may be more straightforward for the reader to do it in a different way.
I remain typing this narration until 8am, when I go feed the chickens and then gather the amazon box so I can return the package. I grab a sheet of paper from the block to create an envelope for the letter. I put the letter in my backpack, and then pack up for a day outside (gym, library, lunch with cousins).
I go to the backyard and grab the shovel to fill up the holes the kids made at the posada. I choose a spot to plant the aloe vera. I water it. Then I water the avocado trees.
I put the dirty laundry in a bag and place it next to my bike, so I don't forget.
Mom's clients arrive. I hand them the painting. I then walk to my neighbors house to receive the food she wanted to give me last night, but I was already in bed. I come back home and have the food for breakfast.
I bike to the mall, dropping off the laundry along the way. Hit the gym, see what time is yoga in the afternoon and think about the Christmas menu. Or should I do it right now? Later, I am running out of time. I leave the gym and sit on the tables that are in the courtyard for a work session on the course.
I create the best flow possible (given our constraints) for completing an assignment and I sent it to René. I close my laptop and head to CityMarket, where I buy the things that I can't buy at the market, and the lunch I will eat when I go with my cousins. I leave CityMarket and head to my cousins, I have lunch with them and I ask them the best place to send my shipment. Then I go to post office and ship the things.
I then bike to the library for a second work session. Work on the article that details this very activity of writing your day in advance as an assignment. Yes, quite appropriate.
I bike back home, have dinner, answer my emails, document the posada paraphernalia, and go to bed.
It is time to allow the future to unfold. I shall report on the actual events.
***
The day went more or less as planned until noon. My father contacted me via whatsapp and proposed a business (which is uncharacteristic of him). I first balked because it has nothing to do with my passions but as I looked closer I saw it is actually a very low risk, low overhead business opportunity. We agreed on lunch to discuss business.
I went to the gym and I noticed my body terribly stiff and lethargic. I usually go directly to the workout, but this time I stretched and my body completely gave in to the experience. Bending my waist and holding my back straight, I reached for the floor and really used my abs to reach further down, as they taught me in yoga class. I felt the distance shorten and then tried holding the tension and the relaxation simultaneously, and the sensation was pleasurable.
I usually register my progress in the _traditional_ format: weight x reps, and I try to outdo myself on each visit to the gym. This usually holds true for two months, then the body sort of plateaus and your workout requires a little shake up. For me, it is time.
So I decided not to focus on reps or weight but upon sensation. How can one apply some principles of yoga to weight lifting? Yoga is full of useful prompts: _imagine the crown of your head wants to reach the ceiling_ or _your arm and your leg form a strait line that wants to reach out on both sides to infinity_. The gym has none of that. As long as the bar gently touches the chest and your elbows lock on the uplift, you gotta a valid bench press rep. If you shake, arch your back, tilt the bar, it's just bad form. The rep is valid, isn't it?
We are chasing numbers. If in my last session I lifted 125 pounds today I will lift 130. This works for a while, but then disappoints. It expresses the principle of the Tao perfectly: the day you hit a good record you are ecstatic, but the next day you will have to beat that record and you will dread it. The day that you go soft sets up the stage for a breakthrough, followed by a day of exhaustion. Up and down goes the mountain ride.
"Remain indifferent to victory or defeat" would dictate someone like Marcus Aurelius. What people don't consider is that they often gain by losing and lose by gaining, don't they? I did not complete all my assignments for the day. Yet, this is what the day brought. I had set out to hunt bison but I come back with rabbit and a poem for dinner.
After the gym I saw that I didn't have enough time for my first work session, but I wanted to have lunch with my cousins, so I head to their place. My cousin asked me for help setting up an Amazon Seller account. Two hours went by (the sign-up is ridiculously long) and I thought I better come home to work instead of the library.
However, when I got home, I was just looking forward to write the day and call it done. I really wanted to put some time towards the assignment flow but doing it now would be badly invested. I have become a morning person.
Good night.
***
Hmmmmm... this is quite a time investment. I'm sure the same can be accomplished in less time. Tomorrow I shall try a variation on the same theme.
Today I had that sensation of being overwhelmed with the amount of things to do. "Where should I begin", I thought. "Probably with what is most important". And so I sat down early in the morning to work on the course.
When I looked at the clock it was 2pm already, I told my cousins I'd join for lunch but they didn't answer, so I just went out to grab lunch and came back home. I had a two hour nap and then resumed work at five. It is 12:30 now. I worked... 14 hours today! I didn't even notice. Well, my back is kinda protesting that statement.
These kind of days are things that cannot be accounted for when registering virtue. When the muse calls it is better to cancel all other appointments. How wonderful when reason, passion and spirit agree on what is important to work, I was glad to forgo many things to have my intimate work time.
Tomorrow fixed appointments will necessarily interrupt this kind of work. It's good, there's chores that do not require as much concentration and can be picked up easily.
Today the strangest moods coloured the soul. There is a contradiction of sensations: a teenage angst and a peaceful serenity simultaneously. Yes, that describes it well. The teenage angst stuff was interesting to observe, it is if I were listening to myself when I was 17, on one part hating the world but on the shadow part desperate to fit in.
And behind this mental discourse, an old man amused at the tantrum. "Yeah kid! They all suck!". But he says so with that joviality that reveals the understanding of the sensation: in order to burn down what one believes, one must allow the fire to smolder. Then, one day, the ashes will fertilize the earth so that new plants can grow.
I had an appointment for lunch with my father, so I biked to his office. I arrived early and my sister, who is an employee of the company, was there.
--"How are your projects going, Mark?" she asked.<br>
--"Good, the course is flowing great, without effort". <br>
--"What course?"<br>
--"I think I've told you about it like three times by now"<br>
--"Oh I'm sorry, I do not remember"<br>
--"You do not remember because you are not interested. That is fine, we do not have to make small talk about it. It is not a good topic for small talk anyways."
She made several faces in succession, like not knowing what to answer. Finally she said:
--"Fine then, I wont make an effort towards making conversation. It's your turn".<br>
--"You're right, sorry for being so harsh, but I don't like speaking about my projects with people who have no interest in them. So how was [your son's] recital at school?<br>
--"It was good"<br>
--"What did [your son] do? Did he sing, did he dance, did he act?"<br>
--"Oh, it was..."
And so the small talk centered around the event of her son. We had a longish conversation about it. After lunch with my father I biked home, I thought: will I forget about the conversation with my sister in two weeks? Yes, absolutely. Is her son the most important thing to her in the world? Yes, absolutely. Then, perhaps, I give too much importance to my projects. Or perhaps, better stated, I give myself too much importance. Projects as small talk is fine, but silence remains golden.
I had an early Christmas meal with my family, and my task was to prepare the meal. I dug out a hole in the backyard, lined it with rocks, made a big fire with wood, then put the coals in the hole followed by foil wrapped vegetables, cheese and fish. I covered it up with wooden boards and let it cook for six hours.
I was relieved when almost everything came out well--a long cooking oven which you can't open is largely a matter of faith. this was my first time doing it and was expecting more challenges, if not a major disaster. It was a very long and manual process which I performed alone.
There was only one thing that I asked for, and that was "orange juice, natural, preferably freshly squeezed". My sister arrived. Did you bring the juice?. I forgot. Please go get it, it's absolutely necessary. And so she went away for a long time and we were sitting waiting for her, when she arrived she was holding four bottles of artificial orange lemonade. I put my hands to my head and blurted out "I asked for just one thing!" and she hurried away to get real orange juice.
Finally we were able to begin dinner. I served the orange juice in mimosas and we begun our meal under a negative note, arguing (briefly) about the importance of being reliable.
But later in the day I came to realize: the only reason why I dared to perform this big experiment on Christmas dinner was because my family is extremely adaptable and fault tolerant. Should the meal end up charred, we'd just remove the char and eat it. Should it be undercooked (which the fish was), they would be (and were) willing to wait an extra 45 minutes without batting an eye.
If messing up Christmas meal were such a big deal, I would have stuck to what is safe and what is known. From here comes my willingness to explore and to experiment! I came to understand: in the context of my family, the correct thing to do was to serve artificial orange lemonade mimosas.
Most of us human beings have at least one emotion that we have _difficulties_ expressing. It's not that we _try_ to express it but it doesn't come out, what usually happens is that the emotion comes out with a different expression.
Many people meet nervousness and guilt with laughter. Men often transmute sadness or frustration into anger. Women tend to cry out of overwhelming emotion, regardless if that emotion is sadness. Loneliness is often expressed as contempt, and so forth.
The source of this phenomena is to be discovered by the person who experiences it. It may be culturally inappropriate to express an emotion in public, it may be that one's parents dissuaded certain emotions from being expressed. It may be one's own judgements about a particular emotion.
The problem is: the person who experiences it rarely notices the phenomena. You may be angry at someone and the other person laughs. If you have difficulties reading the situation you could interpret the laugh as contempt, which makes the situation worse. Drama therapy is great for getting feedback on how you are reacting to certain emotions, should the reader feel that this is a challenge to be addressed (you are perfect as you are, nonetheless).
I've known for a long time that I have difficulties expressing anger. At times, when I would have expected to become angry I've felt a sinking feeling of sadness. But today, seemingly out of the blue, I got angry and was actually surprised at the emotion and the result.
I was running an errand when I came across what is considered the fanciest gym in the city. Even though I can't afford it at this time I wanted to check it out, in case the future holds a better financial situation.
I went in and said I wanted to check out the gym. They assigned me to a sales agent who sat me down on her desk to get my personal information. She was really clumsy at the keyboard and had lots of difficulties spelling out my name and email address. In the middle of the process I said "Look, I just dropped in expecting to check out the gym and figure out the prices. I don't think you need all my personal information". She repied they needed my email address to send me the rates. She went drilling more questions until she asked "where do you currently go to the gym?" and I replied "that's none of your business". "Look", I said, "I don't have the time for this and it doesn't seem we're a good match. I will leave now", to which she promptly stood up and said "never mind, let's do the tour".
As the anger was simmering I was a bit of an asshole, or assertive, depending on how you perceive things: "I'm not interested in the cardio machines or the bikes, let's move on". Then as the emotion receded I became more agreeable, but by now I was leading the tour and she was following me explaining what I was seeing (which required no explanation, really).
We parted ways in good terms and I felt emotionally refreshed after leaving the building. The anger was not expressed as verbal violence towards a person, it was expressed as having the assertiveness to walk out of senseless procedure. Should I deal with it as I usually do, I would have put up with their sales tactics and standard tour and I would have left annoyed, saddened and exhausted, knowing I would never consider becoming a member. Instead, a moment of anger steered the events towards a better outcome for both of us.
From both spiritual and evolutionary points of view, emotions exist for a reason. There are no "good" or "bad" emotions. Though we do need to possess a certain degree of emotional regulation to live in society, obstructing an emotion it like obstructing pressure: either it finds a different route to find release, or it explodes in your face.
I was about to begin to write and a WhatsApp message interrupted me. Let us address the matter and come back to write. It was my friend saying I forgot a card at his house. He sent me pictures. It was a business card with some requirements for my graduation photos. I decided to tell the truth: it was useless, but thank you very much. Most people avoid the _it was useless_ because it makes people feel they've wasted their time, but we're talking my best friend here and I consider that between true friends only truth can mediate.
He said _well, it could be that you're keeping her card to call her_ and I said _actually I hadn't thought about that, let me google her_ and then I made the mistake of grabbing the picture of the first person who appeared with that name and posting it to the group. I say mistake, because I got the wrong person, there is nothing inherently wrong in the event.
The fact that I am justifying myself by logic implies admission of at least questioning one's actions, for these times are throughly confusing and stating that one has shared the picture of a woman in a group of males is setting oneself up for public lynching.
Let us imagine the case where the woman whom I found was to my romantic apetite. I would have posted her picture (out of truthfulness) and I would have handled the jeering. I would have contacted her. After this it would be up to fate.
Is this true? I really do think so. There is one of way of verifying this truth practice: find out the real woman behind the name. Let us see her...
I come back some 30 minutes later, unable to find a single photo of her. It's fine. If things don't flow this way, they will flow in some other way.
And so many thing remain unanswered, don't you think? Was this all bravado? Is 30 minutes enough to search for somebody without falling into what society considers creepy? Is all this very _machista_?
And I feel a certain delight in rewriting the last paragraph. I put some meditation bullshit, but then understood it was a way of walking away of the problem, since I am actually getting hungry, and I find myself unwilling to answer the questions that I arose. Let us resist the temptation to cook, and continue with the task of reasoning.
> Was this all bravado?
I admit to feeling relief when I couldn't find her, because sticking to the principle of truthfulness, if I had liked her I would need to tell her the truth: "My friend found your business card and I googled you and I liked you. Are you single?". That requires some serious balls. I would have had to liked her a lot, but I would do it, yes. It was not bravado.
> Is 30 minutes enough to search for somebody without falling into what society considers creepy?
What society thinks is irrelevant. Minutes, days or years searching for somebody is irrelevant until the intention is known.
> Is all this very _machista_?
Why should I be concerned.
Enough, let's prepare lunch.
Christmas with my family has been surprisingly pleasant. If you are like me, a reforming grinch, an experiment to try is to go into seclusion during the entire holidays. Last year I was furiously working on the Boolean Game in Madrid, and though I received invitations to join dinner with the family of friends, I preferred work. I worked through Christmas, New Year's Eve, and Reyes.
The season passed as if it hadn't happened. There was no melancholy or loneliness, and no pleasure out of skipping the holidays either. The project I was working on had me so engrossed I barely noticed anything from the external world. I mechanically answered the holiday greetings I received from friends and family abroad and dove back into work.
The astute reader might think work was an escape, but I had just finished walking the camino and I felt great inspiration to start a new project. The feeling is one of being _pulled into_ a project rather than _pushed away_ from unsavory circumstances. At the time I thought it was the best Christmas I had experienced.
This year, however, was exactly the opposite. Since I am in Puebla and my extended family is from here, I've had an intensely social Christmas. Many friends who left this city long ago also came back for the holidays and we caught up after years of not seeing each other. It's been a flurry of activity not in work but in the heart.
Since this is the opposite of what I experienced last year, I would have expected this to be the worse Christmas ever. But it was not, and in a way they feel quite similar: a state of flow can be experienced in the mind (work) as well as in the heart (social).
What makes Christmas uncomfortable is that you yearn for solitude in a social setting, but if you were to retreat into solitude as an escape from social obligations, you'd soon be bored and begin yearning company. The movement of aversion is a trap, and yet it is a mirror image of pleasure seeking, which is also a trap.
How does one move in life without avoiding pain and seeking pleasure? These are just sensations. The fact that something _feels_ good doesn't mean it _is_ good, and something that _feels_ bad doesn't mean it _is_ bad. Have we not learned great lessons from pain? Hasn't experiencing pleasure lead us to great folly?
I hesitate to form a universal conclusion (that which applies to everybody), but I feel compelled to share the intimate lesson (that which applies to myself):
Wishing for things to be different is what prevents me from seeing Truth. This applies for holidays, for myself, and for the world. Thus, I accept the season as it is, myself as I am, and the world as it is.
When Truth is revealed, change happens without attachment or effort.
Yesterday was instructive. I met with two friends from the neighborhood, one since childhood and the other since adolescence. We were the troublemakers of the neighborhood but we've matured in different ways. Let us put it in a factual way: one has been in jail and the other should be in jail. The one who has been in jail is reformed of sorts, the other is not. My passport switcha-roo and visa overstays are children play to these gentlemen.
We met up for a game of Risk (the board game) and we complemented it with a walk around the neighborhood and a couple of swings on the rope I tied in the land behind my home. Though they surely wouldn't describe it a such, it was a very romantic evening in remembrance of the past.
They are great guys. I'm glad to have met them in life. And yet, I cannot help but notice they are _bad company_. Meeting at our neighborhood constrains us to less harmful activities such as drinking, smoking and playing Risk, but it would be very unwise to extend our friendship towards other realms of life.
They are both incredibly good at Risk. I am not, so they would be very manipulative towards my role on the board. This is part of any strategy game, of course, a reasoning that makes sense, but you're not seeing the bigger picture, and often following their advice leads to great loss to yourself and to the enemy of your enemy.
If you are not paying attention, they inflate the number of troops entering the board and such. It was so blatant that I even dared to do it myself (without getting caught, their mistake was believing my naiveness!). The untrustworthiness of all the players elevates the attention put on the game.
We had a great time and decided to repeat today. I put an asterisk on my participation: I didn't know if it was a good idea to meet them two days in a row, though I said _something may come up_ [observe truthfulness]. Then today, before writing this work log, I didn't know if I wanted to attend.
But writing this work log I understand it as a great opportunity to learn about the shadow: understand when deceit happens, understand when manipulation happens, because their voices are the same voices that struggle to manipulate you in your head.
_Oh, it will be fine if you smoke two days in a row, I promise. This is for spiritual work_ says one of the manipulative voices. _You are not really interested in deceit or manipulation, you just want to smoke again but you don't acknowledge it_ says another voice.
Hmmm... if it is made for spiritual reasons then I would need to report on my observations of the shadow. The voices inside of me just made a deal: I will only smoke today, for ritualistic reasons, and I must deepen in my observations about the shadow.
Tomorrow I will report.
I re-read the deal I made with myself, having just smoked a cigarette. The deal I made with myself was that I would just smoke one more day, yet I cheated on the deal and I'm smoking now.
What is seen here is the shadow: you make a prediction or a promise to yourself, convinced in all sincerity that you will upkeep it, yet you surprise yourself at breaking the promise. What is revealed when you look at the conundrum with equanimity is that the situation stems not from a lack of will, but out of lack of self-knowledge.
Should you have full self-knowledge about yourself, the decision about smoking would have happened earlier: I know that if I meet up with these guys for a game of Risk I will smoke again, and that is likely to go downhill.
The shadow is especially present in addictions. Because we suppress the urges we have it manifest in sleights of hand of the mind, _just once more_ and _I will quit tomorrow_ are the most elementary, but it can get quite sophisticated.
The shadow is not something to be eliminated. It is to be embraced and understood. The shadow is reduced in the same amount we gain knowledge about ourselves.
Regarding manipulation and deceit I learned nothing new by repeating the game of Risk. Yet, regarding myself, I learned a little bit more.
This is an exercise for sensing the future for next year. [Here is an article](https://method.ac/writing/spiritual_exercises/predictions_instead_of_resolutions.html) on why I did it this way.
I did the same for sensing _tomorrow_: [2019 12 17 work log: the day ahead](https://method.ac/writing/work_journal/2019-12-17_work_log_the_day_ahead.html)
***
I am writing from December 31, 2020.
My desk is devoid of vice.
[name pending for the dog] arrived exactly one year ago, I'm glad I kept her.
The walls have paintings of my own creation.
My shrine is a true shrine.
There is a basket with lemons, avocados and chillies grown on this land.
Is there someone with me? I cannot answer this question, it is a riddle too difficult for me.
There spoke attachment.
I will speak from what the heart yearns: a wonderful woman waits for me in the bedroom.
There spoke desire.
Wether I am alone or in company, I will be fine with it.
There spoke the soul.
Everything is as it's supposed to be.
There spoke truth.
2020 is the year I built bridges between spirituality and my profession.
***
My financial situation is stable, the source of income comes from _work_ in the sense that I have come to understand it: a sense of flow, indistinct of the source.
The writing course was a thrill, and I'm glad it opened new, unexpected doors. I feel much more comfortable with the idea of teaching now that I put it into practice under my own terms.
I'm glad my situation allows for some generosity. I treasured the three month yoga class fees that I received from my sister and my mother, and I am glad to have responded this year with more generosity coming from a point of more prosperity than last year, when my situation was dire.
I am still in Puebla. If one prospers at a place, it is a sign to stay put. The house is greatly improved, mostly through my own physical efforts. All the little places where mice can sneak in have been addressed, and I no longer encounter unwelcome visitors.
The difference between my garden and the land behind the house have been erased. It is clear of castor oil plants and the Canna Lilly plantation prospered, providing fresh foliage again this winter.
This year my material world skills leveled up. The path took me through the discovery of the body. Yoga, rythm, flexibility, strength, balance all increased this year. I am able to perform a press handstand. I also trained my hands with real world wood work projects.
I mostly consume information from the _real world_. I do not check news sites or social media on habit. I am more present. I am more aware. I am more conscious. I am more compassionate. I am... Shhhhh ego. If we head in the correct direction we will arrive eventually.
This year I explored Truth in principle and in practice. I say what I think, yet I have learned how to handle difficult truths and my current rough ways have given way to a gentler, kinder way of pointing in the direction which I perceive as correct.
***
Back to 2019.
If this is a true prediction of trajectory or just wishful thinking is to be discovered next year. The exercise is mostly about projecting one's desired future and knowing where to place action in order to fulfill it.
I had an early Christmas meal with my family, and my task was to prepare the meal. I dug out a hole in the backyard, lined it with rocks, made a big fire with wood, then put the coals in the hole followed by foil wrapped vegetables, cheese and fish. I covered it up with wooden boards and let it cook for six hours.
I was relieved when almost everything came out well--a long cooking oven which you can't open is largely a matter of faith. this was my first time doing it and was expecting more challenges, if not a major disaster. It was a very long and manual process which I performed alone.
There was only one thing that I asked for, and that was "orange juice, natural, preferably freshly squeezed". My sister arrived. Did you bring the juice?. I forgot. Please go get it, it's absolutely necessary. And so she went away for a long time and we were sitting waiting for her, when she arrived she was holding four bottles of artificial orange lemonade. I put my hands to my head and blurted out "I asked for just one thing!" and she hurried away to get real orange juice.
Finally we were able to begin dinner. I served the orange juice in mimosas and we begun our meal under a negative note, arguing (briefly) about the importance of being reliable.
But later in the day I came to realize: the only reason why I dared to perform this big experiment on Christmas dinner was because my family is extremely adaptable and fault tolerant. Should the meal end up charred, we'd just remove the char and eat it. Should it be undercooked (which the fish was), they would be (and were) willing to wait an extra 45 minutes without batting an eye.
If messing up Christmas meal were such a big deal, I would have stuck to what is safe and what is known. From here comes my willingness to explore and to experiment! I came to understand: in the context of my family, the correct thing to do was to serve artificial orange lemonade mimosas.
I don't write resolutions because they are a deal you make with yourself to be unhappy until the resolution is accomplished. I am putting attachment at the driver seat of my life, setting myself the trap of becoming unhappy if I fail in the resolution (and in all likelihood, I will).
All resolutions come from the ego, something that came from a deeper place would not require conducting a war against yourself.
The mind thinks that what you have is not enough. Yet we know very well that the satisfaction of accomplishment doesn't match the disappointment in oneself.
The deal the ego offers, in words of Naval Ravikant, is to make yourself unhappy until you get what you want.
And yet there is utility in doing it. We indeed become better by setting ourselves goals, by organizing our actions with the intent of becoming better people. It would seem it is a positive direction, it is a path which reaps healthy fruit.
And it is so. But the misery felt in the process can be entirely eliminated by a change in perspective: instead of putting willpower at the foremost of one's action in the world, take a step back and think: given my current trajectory, where will I be when 2020 ends?
And in this way we transform the resolution into a prediction. The purpose is not motivation, it is self-knowledge. If I write what I will think will happen to me in 2020 and then review it at the end of the year, I can account on the accuracy of my predictions.
The exercise could end here in a simple "what I predict about myself for the next year", but if if you wish to introspect deeper another change of perspective needs to take place. Imagine, for a moment, that you are reading this a year from now.
Look around the room, if you are willing to entertain me. What would be different? A spontaneous prompt appeared: a mouse just ran across the room in which I am writing this. I know this will not happen (or is likely to happen) next year. After taking notice about what is different around you, sense what would be different _inside_ you. Hopefully some changes have taken place this year, and they will reflect on your inner state.
The purpose of _placing yourself in the present moment, but in the future_ is to reduce the activity of the mind that plans and plots. _I will do this, I will change that. I will buy this. I will travel here_ becomes _I have done this, I changed that. I bought this. I travelled here_. It is useful to imagine oneself as an arrow shot into the air. The arrow was shot by yourself at the present, and you are aiming to describe the target where it landed.
In order to put these ideas into practice, I have written [Sensing the future](https://method.ac/writing/writing_exercises/sensing_the_future_an_alternative_to_new_years_resolutions.html).
It seems fatigue has caught up with me, I worked all day and yet feel behind where I started. I encountered some gnarly problems with the layout. I had been ignoring them thinking I'd have time to address it later, but when it comes to laying out things, something that seems a minor issue is deeply tangled with the innards. I had set up things to reduce redundancy, but this increased code complexity, and after many hours of fiddling I finally gave up and accepted redundancy in favor of simpler code.
Removing code often feels good, but this feels like a defeat. I must remember Knuth's dictum for the future: premature optimization is the root of all evil.
In spiritual circles people sometimes change their name when they accept a new reality. I used to think this was ridiculous, denying who they were to adopt _groupthink_. As I became more familiar with spirituality I came to understand it: who you are is not your name, yet I felt the most challenging thing to do was to accept your new reality and keep your birth name. But then I started seeing a Sufi psychologist and I came to understand how it really worked.
As a psychologist he went by his birth name: Rafa. And this is how I referred to him during the course of therapy. As I was interested in the Sufi tradition, he invited me to a _Dikr_ ceremony, which is a social reunion to pray and embody the ritual part of religion. When I got there I was received warmly, and was asked how did I know _Shahabuddin_. _Who?_ I asked confused, and he pointed towards Rafa. _Oh Rafa, he's my therapist_ I replied.
As I got a hang of it I would call him _Shahabuddin_ outside of the context of therapy and Rafa inside of it. If I had to schedule an appointment he was Rafa, if I'd inquire about a Dikr he'd be Shahabuddin. His wife, however, used her spiritual name to the point I don't know her birth name.
I gathered from tidbits that the transition from one's birth name to the spiritual one happens progressively. In a meeting a young man expressed frustration that his family would refuse to call him by his spiritual name, and he was counselled into allowing them to do so: it's them whom must accept the new person, forcing it would get him nowhere.
Though I have no plans to change my birth name, I felt this phenomena happen during the past year: I've let my former nickname, _duopixel_ fall into disuse, as I came to use _method of action_ more and more. The transition happened quite naturally, and when it came time to renew my portfolio domain, duopixel.ca, I simply let it expire. Then I deleted my duopixel Twitter account, and today I put myself to the task of renaming my [GitHub](https://github.com/methodofaction/) and [StackOverflow](https://stackoverflow.com/users/524555/methodofaction?tab=profile) online presences to this _spiritual identity_. I also redirected [duopixel.com](http://duopixel.com) to method.ac.
It felt natural and correct. What was abandoned lagged behind, and the new gets a an impulse from consolidating my energies into a single presence. So, FYI you can still call me duopixel if you know me from yesteryear, but I now call myself Method of Action (online, of course). Damn this is cheesy!
**Walked**: 30.0 Km
***
How do you recognize a good spiritual teacher from a bad one? For the longest time I've tried answering this question by looking closely at videos of teachers, knowing their backgrounds and trying to discern any tell tale sign that might give off their true inclinations.
The task is not easy: first of all defining what is _good_ and _bad_ is difficult in the spiritual task. Some teachers are accused of being psychologically abusive, but spiritual growth requires a certain degree of friction as to break down the cage of the ego. The ego is not able to notice itself if nobody pokes and prods at it, and a good teacher sees our pride and sometimes by simply saying a well timed phrase, he or she can arise a storm within us. To the student it will feel like they were unfairly bludgeoned, but to the external observer it will be obvious that the damage was self-inflicted.
Like this, there are a long list of asterisks, the most difficult ones pertain to money and sex. This is why it's probably a good idea to seek a teacher belonging to a well established tradition (religion) where the expectations of money and sexual involvement are clear. Spiritual teachers who do not belong to a tradition and also won't siphon resources or sexual favors are exceedingly rare. Yet, most spiritual people are at odds with religion, and thus fall victim to either poisoned teachers or charlatans.
Last night I stayed at an albergue which was headed by a spiritual teacher. He was an ordained priest, but from his speech it was clear he answered to Jesus Christ and not to the Catholic Church. His way of speaking reminded me of Claudio Naranjo, and his philosophy that of Tolstoy's Anarcho-Christianism.
I observed him with the outmost attention. He was speaking with a man whom I knew from a few days before, a very dull man who got drunk every day, to the point of having difficulty speaking. The teacher was speaking of some important things, and this dull man interrupted him to tell him about himself. He was this and that, was from Catalonia, and some other irrelevant details.
My blood boiled at the interruption, but the teacher didn't flinch, he listened as if he was saying something very important. I saw it at that very moment: if this teacher has an ego, it's exceedingly well behaved and non-reactive. He clearly didn't give himself the same importance I was giving him. I was in awe not at his self-control, but at his lack of annoyance at all.
The man went on rambling for a few minutes until a story where he visited a cave where there were some bats hanging from the ceiling which reminded him of legs of ham, and laughed. The teacher resumed his speech where he left off, without the slightest annoyance.
A while later, we went to a chapel where the teacher gave a speech. I call him a _teacher_ and not a _priest_ (which he was) because he called us _students_. He explained his philosophy of the camino, to which I would make no justice in repeating, but I will try anyways. The chapel had no religious images, instead it had panels painted on the walls which explained his vision of the way:
1. We live in a preconditioned state which supports the way civilization works today.
2. When emancipate ourselves from this state through the use of our hands (labor), or feet (movement), and our eyes (inner eyes, self-knowledge).
3. We will be lost for a time, grasping blindly at the way, bumping into things and people.
4. The meaningless arrows point towards Santiago, the true ones point at other people who are in need of help.
5. The path of helping others does not happen in isolation, but in community. Inclusive communities.
6. This brings true inner liberation.
All spiritual paths are simple in appearance, but are the most difficult thing to execute. The map shows a line connecting six stops, but the terrain walked is unknowable and different for each person.
***
I left the albergue in the morning feeling spiritually refreshed, moved at having the privilege of meeting a living boddhisatva. The biggest instruction was not what he said or what he explained, it was his presence. It feels as if, should we put away all our little dramas and self-importance, we'd be able to unveil a world which is already there.
There's so many trivial things I would like to document, but documentation takes one third of the time of execution so I've been avoiding it. But then I thought: I ought to either learn to enjoy the process of documentation, or to become more efficient in the way I document.
"Why not both?" the astute reader may ask. Well, my friend, speed and creativity are at odds. To try to optimize and be more creative is trying to pull in different directions at the same time. Breathing comes in and goes out. Should I attempt to breathe in and out at the same time I would choke myself out of stupidity. So, having agreed to not attempt both at the same time, what should we choose?
Creativity or efficiency?
Do I need more of this? Or do I need less of this? This depends on my enjoyment. The stoic philosopy is for people like Marcus Aurelius who governed because he knew it was his duty, but would have very much preferred to dedicate his life to philosophy. It has become popular because more often than not, people dedicate their lives to something in which they find no meaning, and stoic philosophy is great for putting you through things that you don't want to do.
But philosophies are just shelters for rain. It's warmer than outside and there's other people but ultimately must be learned is to be indifferent to rain, and to visit many shelters and chat with the people there. No shelter is my enemy, these are just communities of people who practice a way of thinking and get along together. It's better to be the wanderer who roams amongst shelters.
---
Today my task was simple: in two hours, remove all rocks from the garden, and figure out a way of organizing them.
I started here:
<img alt="IMG_5466.jpg" src="https://method.ac/writing/uploads/IMG_5466.jpg" style="width: 100%" />
Here's a closer sample:
<img alt="IMG_5467.jpg" src="https://method.ac/writing/uploads/IMG_5467.jpg" style="width: 100%" />
How should we categorize them? By size? By color? by shape?
That depends on the use, and I have no use yet. I wanted the flexibility to use them in whatever way I would deem appropriate in the future. So I first started by creating three piles where I placed large, medium and small rocks, subdividing them by color.
<img alt="IMG_5468.JPG" src="https://method.ac/writing/uploads/IMG_5468.JPG" style="width: 100%" />
I noticed how reticient I am at categorizing
Since the large ones were the fewest, I attempted to sub-organize them and I found easier to organize by spectrum. This could be suborganized into size and shape, but that's fastidiousness.
<img alt="IMG_5469.jpg" src="https://method.ac/writing/uploads/IMG_5469.jpg" style="width: 100%" />
Then I repeated the process on the rest of the rocks:
<img alt="IMG_5470.jpg" src="https://method.ac/writing/uploads/IMG_5470.jpg" style="width: 100%" />
I had allotted two hours to this "project" so I left it at this. Tomorrow or later in the day I'll make use of the rocks, and I'll document their final destination. It was fun!
I've been harboring a zit behind my ear which refuses to squeeze out and got infected. Last night I attempted to preform... ahem... self-surgery with an x-acto knife but I was unable to extract anything meaningful. Instead, this morning I was met with my right ear and nearby nodules inflamed. The infection had spread.
I decided to take my case to the doctor. Here in Mexico there are private doctor practices next to each pharmacy, and it costs only $2 USD per consultation. The quality of the doctors varies, but for simple cases or when you know exactly what you need it's even better than Spain's lauded healthcare because you show up without an appointment and the doctors are eager to get done with you as soon as possible (keep in mind you'd need to give 12 minutes to each patient to make just $10 USD/h. So if you have that pesky throat infection and you already know which antibiotics you need, you can get the prescription in five minutes simply asking for it.
The doctor who attended me was a lady as big as her heart. The kind of lady whose robustness makes you want to curl up to her lap. I told her I messed up trying to extract it myself. She saw it and shook her head. Conversation turned personal and she told me she quit smoking when she got pregnant with her first child, as a promise (to what or to whom was not specified).
She sent me home with antibiotics. As I walked I wondered if the antibiotics were less healthy than putting a knife to the ear. One kills the microbiome in the gut which I painstakingly collected from the numerous streams of the camino. I now can eat anything without getting sick, and my metabolism seems to be running very well. It's a delicate thing to mess with.
Then I remembered my roosters. Their feet still look scaly and inflamed, but they no longer peck at their feet in desperation of the mites that are wreaking havoc under their skin. The recommended course of treatment was to rub their feet with an ointment, but after an incident in which one of the roosters put a claw to a vein on my leg I'm no longer willing to meddle physically with them. So I put a grinded anti-parasitic pill into their water and allow the drug to act from the inside.
And so I subject myself more or less to the same treatment: when the direct course of action proves to be too painful, you take the next best option, drinking a bit of poison to do away with something that is undesirable within you.
Is not all life like this?
<img alt="00076EC7-8D53-4079-A71E-73BBD9B1594F.jpg" src="https://method.ac/writing/uploads/00076EC7-8D53-4079-A71E-73BBD9B1594F.jpg" style="width: 100%" />
_Is the doctor trying to tell me something?_
Yesterday I was writing in the living room when I heard a noise: a small mouse was walking among the bookshelves. For some days I've been encountering these unwanted visitors, but this time I found their hideout.
It was within a hollow pillar with an opening at the bottom and the top. I glued a wooden board to the bottom and put a couple of glue traps on the top, then I lighted a ball of toiled paper with alcohol and threw it over the opening on the top, expecting the mice to run away from the fire to fall into the glue traps.
It didn't turn out as I expected. Nothing came out from the top. I shrugged and continued working. Noise again, this time it was a large mouse mouse with two juvenile ones on the bookshelves. They had avoided the glue traps on the top and now mother mouse was helping her children escape from their compromised nest. I locked eyes with the mother and I had a brief moment of compassion. My mind seemed to search for an alternative to death, but there was nothing practical that could be done at the moment. I quickly fetched a broom but this only frightened them back on to their beleaguered nest.
Again, I threw a fireball into their hole, this time lining up the top entrance into the pillar with glue traps. Again, my enemies refused to come out. I continued working until it was time to go to bed. The siege was set up and it was only a matter of time before they would try to escape it.
The next morning I woke up to find the two juvenile mice glued to the traps, already dead. I threw them away and continued working. Noise again. Mother mouse was panting on the bookshelves. She looked tired and though I moved closer, she made no attempt at escape. She was conceding defeat and I knew it was my spiritual task to put her out of her misery.
I bludgeoned her with an improvised mace just once, saw that she was still breathing yet immobilized, so I put her into a bucket of water, and saw bubbles emerge from the bottom. Spontaneous spiritual poetry emerged: _the hand that put you out of your misery is the same hand that will put me out of my misery, for we share the same fate. I shall join you too little friend, to become one with The One_.
***
Today, on the first day of 2020 I was enjoying breakfast outdoors with my mother when we saw a cloud of white smoke pass over us. We went outside to find a fire on a pile of leaves where the gardeners leave green refuse in the park in front of the house. Some neighbors had already noticed and were busy carrying buckets of water to put it out. The fire was of considerable size, but it was quickly controlled. Putting out the fire completely took us much longer, as we had to make sure there weren't any pockets of lighted leaves under the pile.
I was quite amazed at the self-organization of such emergency: a human chain was formed to carry water from the nearest source, the people most knowledgeable with fire would receive the buckets and pour them over strategic locations, and generally everybody was busy without having to be told what to do.
The gray water that I collect to water the plants turned out to be of great convenience, as well as the direct access I have to the water storage tank, since I could fill buckets in an instant. When we thought we had put the fire out I went through the leaves with my bare hands, feeling any pockets of heat that would indicate that there was fire still taking place in the pile.
The tidbit of wisdom extracted from the event was this: in an emergency it is best to observe for a couple of seconds rather than spring directly into action. People would arrive wanting to throw buckets of water at the already steaming pile of leaves but their efforts were a waste of resources because they had no knowledge of the hot spots of the pile, or they would ask what needed to be done, but since everybody was so focused on their task they would just reply _bring more water_ (which was the best answer given our state of ignorance).
A couple of seconds of observation are enough to understand where the improptu fire fighter team is lacking muscle or knowledge. A couple of people were walking with flimsy tennis shoes on the smoldering pile. I told them to get out because they can melt on your feet, and I went to put on boots. The prompt _get out because your soles can melt on your feet_ got people much more careful about where they stepped. I got into the pile and poured water at strategic locations along with another older man who obviously had experience with fire.
In the end we put it out throughly. Everything was soaked wet. We congratulated each other on overcoming our first challenge for 2020.
***
My extended family organized a New Year's Eve party. I was asked to provide wood, to which I spent a considerable time chopping up. As I've been doing a lot of manual work, I feel my right (dominant) side of the body is becoming stronger than the left side. I inverted my axe stroke so that I would use my left side to address the balance.
How instructive it is to use your non-dominant side to perform manual tasks! Movement seems to escape reason, it must be experienced by the body so it can sense the movement and learn how to repeat it. My first strokes using my left side were as timid as a child. Then, gaining some confidence, I stroked harder but with appalling accuracy. Slowly, as my muscles got used to the movement, accuracy and strength was gained.
Though the experiment took me a considerable amount of time, in the end I came out more or less the same, because when my right side became tired I would use my left side. I intuit a parallel in the mind, but I'm still to discover it. I will continue exploring _using the left side of the body and of the brain_.
In the end I overshot the need for wood, but I was glad, because enthralled children would throw in as many sticks as they could, growing the fire to considerable dimensions.
After dinner an uncle brought out a large home made doll of an old man which he filled with matches and poured in oil. The doll represents the old year and it is a tradition to burn it (I have no idea if this is a Mexican tradition only). I held it with a stick over the fire and it promptly became a fireball.
2019 brought amazing experiences. I released the Boolean Game. I walked the Camino two months straight. I completed an important project with a great studio. I lived a short but intense romance. I moved back to Mexico. But that is the old man, and the old man must burn in order to make space for what is new.
A great sense of expectation. Just one day into this year and life has already brought great lessons, but I must stop writing about the past in order to face the present.
Until tomorrow.
Yesterday a cousin who is in a wheelchair came visit the house. I hadn't met her before, nor had I handled a wheelchair before, yet because of our situation (my uncle can barely walk himself and needed assistance from his partner) I would need to handle my cousin and the wheelchair.
My cousin has cerebral palsy. She came out of the car by herself, I brought the chair and positioned where I thought it would be easier for her to sit in, and then instinctively grabbed her by the arm pits so that she wouldn't fall into the seat. I let her down gently and then apologized "I'm sorry if you didn't like that, I really have no experience handling a wheelchair and you'll have to help me out a bit".
She smiled and said it was OK. As we went through the house I noticed just how many spots are inaccesible, little steps everywhere are an annoyance and normal steps a challenge. I made a commitment that when I have the equipment I will build some ramps.
Finally we reached the backyard and they commented on the swinging rope hanging on the tree. From seeing my cousin help me with the wheels of the wheelchair I knew that her strength was enough to hold herself on the rope. I asked her if she wanted a swing. "Yes, that would be nice" she said.
We got her to the rope and then I lifted her up so that she would wrap her legs around the knot, and she held tight to the rope. I let go, and she was able to hold herself on her own. I swung her to her delight and her parents, and after a while she complained about being dizzy, so I helped her back into the chair and then we went for lunch.
I sensed: in this environment of political correctness it is taboo to help people with _different capabilities_. Helping others is a way of saying they can't do it themselves. What nonsense!
Every person is different. Observe at the situation. Admit ignorance. Ask when in doubt. Have a lighthearted approach to accessibility challenges. Use your intuition, not fixed rules, to treat the person. Being afraid of making mistakes put you into the biggest mistake of all: the mistake of inaction.
Every couple of months I sense a big inner change is coming. It is felt as a strong pull, like the ocean does when a big wave is coming, it sucks all the water and then releases it, rushing forward in a big wave.
Sometimes the sensation fades away without effect. It feels like the wave passed through and I didn't ride it either because of fear of because of lack of skill. Sometimes I ride the wave for a bit but then crash. Other times I ride the wave successfully.
When you wait for a wave there is a split second when the pulling and pushing forces of the ocean come to a standstill, raising you up instead of pushing or pulling you. It is in this split second that fear is heightened: it is too late to pull out of the wave, so it is either riding it or crashing it.
I sense this standstill at this very moment. I'm up high on a big wave, and looking downward is cause of vertigo. The mind always thinks "this is the wave", but the soul knows all too well the real possibility of failure. Failure is the wrong word, for a rider of waves does not fail. He either rides the wave or not, and if he does not ride the wave he simply waits for the next one.
Today I was biking back home when my neighbor stopped me.
"¿a qué te dedicas?" (a more polite form of _what do you do for a living_).<br>
"I work on the computer", I answered.<br>
"I have a computer and I don't know how to write the _at_ symbol, and I would like to clean it from viruses", she said.<br>
"Is it a Mac or a Windows?", which is my exit strategy when people need help with their computer.<br>
"A Windows", she answered.<br>
"Oh, I don't know much about Windows. But I have a cousin who knows them inside out. I can tell him about it and I'll get back to you".<br>
I pinged my cousin to have lunch with him. He wanted me to pick up a roasted chicken for him to have lunch, and I was concerned because he's not very proactive about paying his part of lunch. I'm beyond a tight budget: the chicken would cost 50% of my entire capital at this moment. I bought it anyways.
Over lunch I explained that I had a neighbor who needed an easy maintenance task, but as I was explaining the situation to him I realized this is exactly the kind of easy money I should be seeking at this time. Instead of offering the job to him, I asked him what malware removal tool he recommended.
How was it that I couldn't see this opportunity that was in plain sight! It is the ego: computer maintenance jobs are menial tasks for which I am overqualified. I am a computer pilot, not the maintenance dude. I don't _run_ software, I _create_ it.
What nonsense! I am what the circumstances of life ask from me. I am a gardener when I walk into my garden. I am a brother when I am with my sister. I am writer when I sit down to write this work log. I am a computer repair technician when I need to make a quick buck.
And so tomorrow I'll tell my neighbor I can repair her computer.
Last night I had a long back and forth live email thread going on with René. Many ideas about the course platform and the ways things fit together begun to glean on us, and we exchanged paragraph-sized ideas over the course of an hour or so.
We then continued the conversation this morning. I was deeply engaged with the conversation and the flow of ideas, but at a certain point I felt something strange: it is unnecessary to speak anymore, I understand the vision, the product, the direction, the meaning of what we are building here.
What is it that which we understand when _things click_ in product design? It could be said that you understand the _system_, that you understand the _syntax_, but I think sometimes it goes beyond. I would call it _spirit_. The product does not possess the spirit, it was passed as a breath of life from the creator into the product.
I'm just noticing these things. There seems to be a different way of designing which comes from neither mind or heart, it comes from spirit. But because in modern times we've done away with the conception of spirit, very few people have stumbled upon it.
Some products are incarnation of spirit (spirit made matter). Most products are incarnation of ego (intention made matter).
I will keep on exploring this question.
Is Designing from Spirit the opposite of Design Thinking?
Are most worthy things incarnation of spirit?
Where is the sprit when we say a product is a _spiritual successor_ to x product?
I said I wanted to explore the intersection between design and spirituality and it is proving very difficult to write about, but I shall do just one thing today: define _Designing from the Spirit_.
> Designing from the spirit is breathing life into a product, and then giving care and attention so that the product may fulfill its potential.
The past few days have been a blur of activity.
Everything is flowing so fast, I cannot register all of it.
The wave broke and I'm surfing on it.
Partly excited, partly serene and focused.
I will pause the work logs until the wave has exhausted its power.
Then I will write about it.
Until then.
I'm lost in work, but the details of work have been throughly explored with the Boolean Project, and I feel I would be repeating myself by writing my work logs as I was doing last year.
Let us confirm this as a fact. Let us see what was written one year ago, on January 17, 2019:
> Today I don't feel like writing the work log, the day was partly frustrating, but I look at the reasons and they are not worth a grumpy mood: I spent most of the day trying to resolve a nasty bug in which callbacks weren't firing at their expected time. The animation library I had chosen wasn't doing what I expected: having simultaneous animations firing dynamically seemed to require a pattern I couldn't wrap my head around, and in the end I gave up and replaced the library for anime.js, which worked like a charm.
> Then I went to buy a DisplayPort to HDMI adapter in order to use the 4K monitor I have at home, but the inventory at the store was not the same as their website. I went to another store, same story. Then to a third one, same thing. I came back home and placed the order on Amazon.
> I sense the events didn't cause the mood, but I woke up sensitive to frustration and it grew from there. I came back home and had a nap, then meditated. I felt better and put an extra hour towards fixing more bugs. Grand scheme of things: awesome. Day: crappy. Accept and move on.
My day today was perfect. It included a little bit of everything:
I went to yoga early in the morning.<br>
I went to a café and treated myself to coffee.<br>
I implemented the offline version of [secret project].<br>
I hit the gym.<br>
I came back home, investigated on the api we'll use for [secret project].<br>
I lighted up.<br>
I did landscaping work.<br>
Beers with my cousins.<br>
Back home to write about it.
How strange is mood and disposition! The work log has always been acceptance about what comes out. If I'm not on the camino and greatly inspired, the inspiration comes from a different source. Work and the body is where my attention is focused at this moment, and it is worth writing about. I will officially resume the work logs next Monday ☯️
2020-I saw a couple walking on the narrow sidewalk of a bridge. It wasn't wide enough for them to walk side by side, so the man walked on the road as he held his girlfriend's hand. When the cars started coming towards him he positioned himself behind her, but still using his arm so that she would be protected.
"How strange it is to observe these things after years in Europe", I thought. But it was endearing. European women tend to feel uncomfortable with this kind of treatment, "I can take care of myself, thank-you-very-much[not]", they will say.
It is interpreted as an assertion of weakness or powerlessness from the man towards the woman. But it is not this, it is simply a dance that you learn when you begin dating. Early on your girlfriends will gently guide you towards walking on the correct side of the sidewalk, they will stand in front of a door waiting you to open it, they will expect you to order for them when the waiter comes to ask what you want for lunch.
It becomes a habit which does not translate well to more egalitarian cultures. But, to confuse chivalrous with chauvinist is a mistake. It is possible to be chivalrous and egalitarian at the same time when you realize that safety and comfort is something _everyone_ appreciates, so our deference in treatment should be extended towards everybody, not only towards the opposite sex.
And deeper down there's a deep cultural loss when chivalry is banished. To be egalitarian is not to banish these gestures, but to allow the opposite sex to preform them too, and to be graceful about it. What a wonderful culture would it be where women and men can open doors for each other without feeling offended.
Yesterday I drank a large coffee before going to my night yoga class. It proved a great booster of asanas, but when it came time for bed the mind remained alert, never attaining deep sleep. In the morning I fed the dog, the roosters and myself and then felt sleepy again, so I went back to bed to meditate.
A good directive in meditation is: if you fall asleep, accept it too. It means you needed more rest. Yet, I couldn't fall asleep again. I became deeply absorbed in my body, which is completely sore from a session of deadlifts yesterday at the gym.
I had made a vague commitment to work from my dad's office today, and my meditation was being interrupted by urges to prepare the journey. They say: in meditation put these kind of away, don't attend prompts from your mind, this is not the time to think about it.
And so I put my urges away, and eventually gave way to a long meditation session in which I recognized that my body wants a break. The last week I've been going daily to the gym and to yoga, this would be my first rest day.
Instead of putting my tattered body on the bike and take my sleep-deprived brain to work, I chose to clean the house, which was sorely needed. I washed dishes, wiped surfaces, cooked for the week, cleared stagnant water because it rained recently, and so on.
I realized: how privileged to be able to take a spontaneous day off. If flexibility were a measure of wealth, I'd be quite wealthy. But it's not, and now that I've seemingly recovered from the coffee and exercise hangover, I put my hands and my mind available to the project that has been consuming me for the past few weeks.
I will write about it when the time comes.
Nothing ought to be forced.
It is Friday afternoon and I feel no inclination to continue work. Good, I haven't taken a day off since that early January hangover. Will I be able to completely disconnect? If I work on the garden, for sure.
Wait, disconnect work with more work?
Work is when you stop thinking about yourself.
You don't work when you sit at your desk in the office.
You work when you silence your mind and put your spirit to the task it has selected.
Because if the spirit has chosen to sweep the floors or wash the dishes, the mind intervenes and says _when was the last time my flatmate washed the dishes?_, and it poisons all activity. Should we be able to focus on sweeping the floors instead of playing drama in our head, our spirit would accomplish great heights.
Or if you choose to write a work log and then think "will this be of any use or any amusement to the reader?", ah, the tricks of the mind, one is allowing his hand to happily type what the spirit yearns for, and yet the mind thinks it is doing the writing.
When the mind writes, my writing becomes contrived, planned, artificial. If I simply allow my hands to type, well, it might be a bit circular, rambling, but it comes off naturally and without pretension.d
But I am thinking about myself and yet this feels like work, ah, I identified what is going on: my hands are working. Indeed, if I stop interrupting myself trying to think what clever idea I will come up ahead, I can simply dump the contents of my mind.
I deleted a paragraph, because I quickly got trapped into a position impossible to justify through reason. But this is self-consciousness, sometimes I feel it is unfair to the reader: what I write is very raw, couldn't I be more succinct? Again, interventions of the mind which are useless. Quiet. Allow the hands to do the typing.
The hands are cold and would like to get some sun.
Until next time.
It's time to unveil what René and myself have been working on for the last... year and a half? I've written about it numerous times, because it is the tool I use to write these work logs:
[https://blank.page](https://blank.page)
Cool name, huh?
Blank.page is a no-frills _text creator_. I call it _text creator_ in contraposition to _text editors_, which are oriented towards formatting and edition of texts. Blank.page has no formatting tools, its only tools are constraints to help you _create_ text. In Blank Page, if you find your cursor jumping around the page you are doing it wrong. There's not even spellcheck underlines as to prevent distractions while writing.
Blank.page is a piece of a larger picture which will be revealed in time.
Though development has intensified in the last weeks, I've avoided writing about it becuase I enjoyed flying under the radar. But, as it reclaims more and more of my mindspace, I find less things to write about that are not related to Blank Page.
Anyways, the work logs will become more of a _work journal_, as I did when I worked on the Boolean Game. When projects consume your mind there is no other way. Life becomes the project, and if you don't write about your projects, it seems there is nothing left to write about!
I have fifteen minutes to write an account of the day.
I will focus on that related to blank.page.
I installed Jekyll to do some experiments with static publishing. I avoid databases like the plague, probably because I've lost data on them, while static files tend to be less ephemeral.
This is the theme of every project, and may I dare to say life, to manage the constraints wisely. If, at this time, a backend developer would partake in our project it would only slow us down. It is best to do what we can with the resources we have, which are not few.
But then you look at the solutions you can produce and it causes a certain... shame. You imagine your developer friend looking over your shoulder, shaking his head, "how dare you cut corners _there_" he whispers, but I tell him that if I listened to him I'd never get anything done.
But the things I put together seem to work somehow. I never think of them as anything else than fancy prototypes, and yet I see what developers are doing nowadays and it all feels so bloated, so slow, so fat.
I enjoy using this prototype.
<a href="https://blank.page/?placeholder=Write%20an%20account%20of%20your%20day%20in%2015%20minutes...%20&timeLimit=15">Written in 15 minutes on blank.page</a>
Yesterday I woke up with a pain in my chest and a difficult to describe dizziness. It was as if the frequency of your brainwaves were amped up and down suddenly and the senses registered the phenomena: tinnitus became more acute, the body shuddered, and the visual field would lose realism for a fraction of a second.
As I describe this state I realize how difficult it is to report on inner sensation, but as I was feeling miserable I deliberately meditated a lot so that I would disassociate myself from the feeling of sickness, and soon enough I was observing the phenomena with more curiosity than discomfort.
I reduced my activities to what was most essential for the day: host a breakfast with my uncle, answer blank.page emails, and pick up a suit for a wedding I will attend this weekend. The rest of the time was spent sleeping or in meditation (or an intermediate of both).
Today I feel in much better shape, to the point I was thinking of going to yoga in the morning. I was paining about the decision: if I go and I feel sick it'll be plenty of discomfort, but it could also go the other way: I could go and feel great afterwards, lessening the burden of this sickness.
As I was listening to the fragments of reason quarrel if this was a good idea or not, my body raised its hands and looked up towards the ceiling. Then my trunk folded and my hands tried reaching the ground. Though my cough and chest pains are almost gone, my body reeled with all kinds of pains and I knew yoga would not be a good idea this morning.
To which I pleased.
Now I can get to work.
_Written with <a href="https://blank.page">blank.page</a>_
Ah, how nice to open blank.page without being welcomed by error messages in the dev console. In fact, let us list the changelog for the day:
**1. Redirected www.blank.page to blank.page.**
Formerly, going to www raised a certificate error.
Tweaking nginx is both fun and frustrating, because it's powerful but not very given to iterative approaches (try, verify, try again) since [as far as I understand] you have to restart in order to reload the configuration. This brings down my entire nginx instance, blocking the games for a couple of seconds. Note to self: eventually migrate to a separate virtual server.
After finishing this, I walked the dog.
**2. I installed a new service worker**
We were having mixed content warnings and cache failure messages in the console. The cache seemed to be flaky, sometimes loading very old versions of the codebase. I looked inside but I couldn't understand anything. I basically swapped the code with another [approach to the problem](https://github.com/chriscoyier/Simple-Offline-Site) and this time it worked like a charm.
After finishing this, I washed the dishes
**3. Changed the behavior of the self-hiding toolbar**
Since we want blank.page to be, well, _blank, we want to _reveal_ stuff only when you need it. So we came up with some heuristics like: if the user moves the cursor near the top of the screen then reveal the tool bar. If the challenge was successful then reveal the toolbar. If the user starts typing hide the toolbar. And so on.
Well, if you so this then you will run into conflicting rules like "if the mouse is idle show the toolbar. When the user is typing hide it" and pretty soon I would have a stuttering header trying to obey the commands it was receiving in an alternating fashion.
To I took a step back: if I start from the experience of typing, I want nothing else to get in the way. So, while I'm typing I don't want a header to appear out of nowhere unless it had something important to say. If I reached my goal it's fine.
If I move the mouse my intention is not typing (unless I brushed the trackpad with my fingers, which I sometimes do and it's distracting but this is MVP interaction design. There's still room for improvement here, but using it right now it seems MVP ready.
After this, I collected to large bags of trash from the land behind the house, with the dog.
**4. Reinstated the Idle timer**
We've bounced around ideas for constraints, and a clear one is the time you spend without writing, a la _most dangerous writing app_. We register the time passed since the last keystroke each second: 1, 2, 3 seconds without typing. No interface or visibility for this feature yet.
After this I had a quick lunch of chicken tacos.
**5. Tweaked build process**
Tedious and boring. Nothing else to add.
After finishing this, I went to Home Depot with my mother to buy supplies for some repairs on the house.
**Many things which I do not remember**
What a joy is it to not work through cases, I just see things that are broken and fix them. Unaccounted productivity is found in this. The same approach was taken for the repairs at home. My aunt and uncle from Canada will be staying over and I would like that my home reaches MVP state by then (hot showers and a working kitchen sink). That was the excuse but when I brought out the tools I just fixed whatever was broken.
It was a productive day on both material and digital realms.
I had no plans of working today, but I woke up early and had two hours before my yoga class begun. I could barely pry myself away from the keyboard to go to class.
1. About button had ceased working, fixed now
2. When you type a space blank.page thinks the page is "populated", but this can be confusing because you have a blank page and no interface. I now trim whitespace at the beginning of the page.
3. When you complete a challenge successfully the success notice now lasts three seconds if you continue typing.
4. Removed jQuery dependency for builder
5. Progress bar now appears after reload if you have a wordGoal
6. Course builder and Blank page are now the same application (previously it was something inbetween).
Now I must run to go to the wedding of a friend.
On Saturday I attended a wedding, and went to the after party with the bride and groom in the beautiful guesthouse of a friend from my youth. I was sitting on a table with some guests when two women began speaking about politics, and a third person complained that the politics, religion and love were not allowed to be spoken while drinking.
"I agree on politics and religion, but love... Plato's Symposium is a dialogue on love in which takes place at an after party, not unlike ours. If the ancients could speak about love while drinking, I'd say we're allowed too", I said.
"But love can't be agreed upon if we all experience it in different ways, and since it can't be seen, touched, smelled or heard, I would say that it does not exist".
"We say love does not exist because we do not speak about it. We're too coward (and I include myself) to explain our inner experience. Of course you can't sense love with your physical senses because love goes beyond the physical (it's metaphysical), so the only way in which we would be able to verify its existence is that each one of us expresses what is felt in love. But again, we're too coward".
"Why don't you start?" the love-skeptic asked. I waved him away. He insisted. I gave an excuse. He insisted (he was drunk).
"What you're asking is that I expose myself to embarrassment with no reward. I would do it if you follow me explaining what is love after my turn".
"I won't explain it after your turn, I'll explain it right now: love is a product of our imagination. It does not exist", to which everyone protested and willingly exposed their own perceptions of love. I will not attempt to register what was said, my memory is hazy and the reader will be better off reading the Symposium rather than a pity account of some contemporary drunkards.
The night did not end as in the Symposium, in which a group of drunkards disrupt the party, steer the dialogue and destroy themselves drinking until daylight. We simply grew tired and decided it was time to leave.
Unlike Socrates, I'm not immune to alcohol and I paid greatly the price of drinking. Despite feeling beyond sick, a lot of work was accomplished _through_ me, not _by_ me, because by now I understand very well that _I_ get in the way of work, and it is only when I'm able to forget about myself when I'm able to create good work.
And there's no better incentive to forget about oneself than when you're hungover.
For the past few weeks I've been strangely on-spot with my development estimates. I used to think it was impossible to correctly estimate development time because in complex systems you never understand the full scope of the problem. Though most modern front-end codebases are complex systems (by virtue of including frameworks and libraries), [blank.page](https://blank.page) is not, so except for the service workers, I know exactly how each piece operates.
This makes development exceedingly enjoyable, because when I encounter a bug, I have a pretty good idea of how and where to resolve it. On the other hand, when you install third-party libraries or frameworks you are often at a loss on how to resolve a bug, because the library has abstracted away complexity and you do not understand what is going on under the hood.
Most devs would say my idiosyncratic way of programming is madness. But I tell them: I no longer have the patience to go hunting for bugs in the tower of abstraction. I've given up resolving errors with npm (which are most unhelpful). The "pros" have sucked out all the fun out of programming because they are too concerned about not making mistakes. So you have to write your code in Typescript instead of Javascript, you have to write tests, you must use React and with that comes JSX. You must use a linter because, oh the horror, you might be inconsistent with your code.
I know, of course, that this way of writing code is necessary for collaborative codebases, where more than one person is developing the application, but for the solo developer it's only overhead. It gets in the way of flow. Current practices dictate that a trailing whitespace on a line of code is more important than your focus, so the build will break if it finds one. What nonsense.
And so I've come to program the same way I write: somewhat haphazardly, first expressing intention and then refining, driven by the need rather than the method, focused on keeping things simple because I'm to dull to understand things that I have not written. It may not be the best code or the best writing, but damn I'm productive doing things when I do them this way.
**February 5, 2019**
Today I saw the feature complete product, and felt temptation towards forgoing the walk. It's close to being finished, just one last push and it will be done. But I was reminded of a quote of the Tao Te Ching:
> People usually fail when they are on the verge of success.
So give as much care to the end as to the beginning;
Then there will be no failure.
My eczema has spread, and I must have enough cortisol in my body to stress out a small nation. In any important endeavor, there is always some amount of wreckage done. The wreckage must be managed.
As I was walking back from the library I thought: _what would make me feel I've been successful in this endeavor?_. There is financial success, of course (which is very much needed) but beyond this I'd be satisfied with a modest popularity that opens doors to unknown things in the future.
Failure would be that it's met with indifference. _Would I feel disappointed?_ I asked myself, and surprisingly the answer that arose was _no_, the only alternative to this period would have been idleness, and that would have even more taxing on my wellbeing. We can only find our way through trial and error, and any miscalculation is a lesson, however hard to swallow it may be.
I decided that I would walk with one change of clothes in the direction of Santiago. My intention is to walk until exhaustion, there's plenty of bus stops along the way to come back, and two hostels if I decide I need to stay an extra day. Fortunately there's nothing to resolve mentally, it's simply a reset to come back to do things with patience and love.
**February 5, 2020**
Today I saw the product feature complete. After this I made up my mind about celebrating my 40th birthday. I felt a vague sense of protest, a part of me wants to remain the hermit I was in Madrid, but the time is ripe to celebrate a landmark decade, despite being _poorer than rats_ as they say in Spain.
The symptoms of the flu have almost completely disappeared, and other than the ocasional phlegm I'm nearing 100% health again. This time the flu was benign. The past year, in very similar circumstances I got sick and it was orders of magnitude worse. It may have been a worse strain, but I'm also in great health, and I'm grateful for it. There is nothing like sickness to be able to notice your health.
Let us ask us the same questions I asked myself last year: what would make me feel successful in this year's endeavor? Though I understand the question, this time it feels irrelevant. I have no attachment to success (or avoidance of failure). I did what I did because I couldn't help myself, it feels as if it wasn't me who did it. It is clear that when you renounce to the fruits of your efforts (or dedicate them towards a divine purpose) you cease worrying about the outcome.
What is failure when you don't care about success? Last year I wrote that failure would be that the Boolean Game was met with indifference (and it was). But this time I can't see a realistic scenario which I would call "failure", it's like an outdated model which I used to judge outcomes.
I accept whatever outcome [Blank Page](https://blank.page) brings. I expended no effort doing what I did. It simply happened.
Yesterday I woke up at 6am and prepared breakfast for the roosters, the dog, and myself. At 7am I begun work, deeply focused, until hunger got the best of me at 2pm. As I passed the rooster pen I saw the red rooster lying on the ground, eyes closed feet sticking straight and its comb dark purple. It was obviously dead.
The day before my sister had asked me about the roosters, "I'd rather get rid of them" I said, yet I was looking at the dead rooster and I wasn't glad. I was sad. Death is never a pleasant situation.
The cause of death would only be speculation. I observed no strange behavior other than that their water had run out pretty quickly. Googling I found out that in case of a fever chicken tend to drink a lot of water. It is possible that it caught an infection.
I grabbed a shovel and buried it in the land behind the house. When I came back I saw the black rooster and I felt a desire to sacrifice it. As a duo they were pleasant because they complemented each other. The red rooster was curious and exploratory, yet ran away in the face of threat. When this would happen, the black one would puff up and defend his companion. On the other side of this arrangement the red rooster would always be willing to eat new food and explore new areas, the black one timidly following behind. In psychological terms the red rooster had more _openness to experience_ while the black rooster was less _agreeable_ and physically stronger, so as a pair they complemented each other.
Despite my inclinations to sacrifice the black rooster, I sensed via intuition: this rooster will also die soon. Then I thought "this could be intuition via cowardice". Since sacrificing it is complicated (this is a really aggressive and big rooster), the ego makes excuses as to not acknowledge fear.
Is it fear or is it intuition? Now I'm curious. I will wait 60 days before settling on the answer. But even if I get an answer, I'm not positive I'm brave enough to sacrifice it. I may have more in common with the red rooster than the black one, and the fact that the red one died makes me desire the same fate for the black one.
Again, I will [postpone the decision of sacrifice](https://method.ac/writing/work_journal/2019-10-17_log_heal_or_sacrifice.html).
It's at times like this when I am glad that blank.page works offline. My phone battery drained, and without it I don't have access to the internet. Three times I tried to google things to no avail, and not having internet forces me back to the task of writing.
I have manually closed all the extra tabs open in Chrome.
I have quit all non-essential applications.
Get distractions out of the way. It is easy.
Aim for something and put a time limit: I will write until my phone battery recharges enough for the hotspot to be activated. I estimate around five minutes.
Sometimes I feel like I have opened a door into another world in which very few people live.
It is not better. It is living life at the most challenging level. Ah, the ego creates a myth around the fact that one is dreaming this, if this is an illusion what is left?
I quit the music player and take off my earphones.
A bird is chirping. A dog barking in the distance. The footsteps of my mother who is hurrying to get ready. The phone woke up. My best friend asking if I made it well to Puebla, since I stayed over on Sunday and came back from Mexico City this morning. My mom asked me to hail her a cab. I am back in the world of the ten thousand things.
I turned my hotspot off in order to write. I first came to the computer with the intention of writing, but I was captured by one of the ten thousand things, and though it wasn't useless (sending important emails and resolving quick wins on blank.page) when one sits down to write, on...
I was editing the preceding paragraph and the damn header came out. Many things are simultaneously curses and blessings, being able change the tool that you use to be creative is one of these blesses/curses. It is a blessing, because it allows you to experience the product from feeling, and at the same time you simply want to sit down to write but you think it will take five minutes to resolve but then you go down the rabbit hole and...
The header behavior is a blessing in disguise, it says "stop fooling around, I'll jump around until you stop editing, nananana". Perhaps a mode that we ought to implement: if you move the cursor a life bar is reduced. What are you doing reaching for that mouse, the cursor is blinking waiting for your words!
Though I admit that my favorite mode is no-mode. It's the place where I come to write and nothing distracts me. Except when I'm writing near the bottom of the page the word count obstructs my writing. Oh lord forgive my hatred to a thing that can be resolved in five minutes.
Let us jump into Sublime Text, test if it works...
Well, that was around five minutes indeed, and it seems to work for me. I'd say it was worth the detour. I've deployed the fix already. Ooops, I left some logging in the console...
Done.
Let's just write a bit more to verify the solution. I haven't reloaded...
Not a fan of the css scrolling effect. I think I would animate scrolling depending on circumstance. Upon load, animated scrolling is a distraction. Should I try to resolve this issue right now?
Oh dear it is terrible. Yes, I'll try right now,
19:43 Start
19:55 End
Now the page doesn't scroll-animate upon load.
Is it time to leave things at peace?
I almost forgot to deploy (blank.page)[https://blank.page].
Deployed.
Oh dear I looked at some preceding paragraphs, and now if I try to edit from the beginning of the sheet it brings me all the way back to the bottom. This is good for don't-you-dare-to-edit mode but not good for any other scenario. I must hot-fix this. Aha, I already know where the problem is...
It seems to work, but now I must look for what I was editing in the first place. One does not write with any elegance when one is debugging the tool he is writing with. I'll read from the beginning...
It seems that pain driven product design and development is a valid way of building products. I need to explore this way of writing and registering tasks more.
Parece que por fin tengo un primer acercamiento de [blank.page](https://blank.page) al castellano. Me desperté tempranito en la mañana y faltaban dos horas para la primera clase de yoga, _quizás me dé tiempo a terminar el interruptor de idioma antes de la clase_ pensé, iluso.
Lo que parecía una tarea sencilla se convirtió en un calvario. Nunca estuvo previsto que Blank Page (Página en Blanco?) fuese a funcionar en otro idioma mas que el inglés, por lo que hubo que hacer modificaciones por todas partes.
Por más que apuré mi chapuza, terminé 15 minutos comenzada la clase. Pensé _pos si ya me salté yoga, vale la pena rematar esto de una vez_. Lo quise hacer bien y terminé en varios agujeros de liebre, matando alguna que otra alimaña por el camino (esa cabecera me estaba volviendo loco), pero al final el entorno cedió lo que yo buscaba de él y parece que el interruptor de idioma ya funciona.
Hay algo en el detalle fino del interruptor que no me gusta, pero _ship it till you make it_.
Mañana llegan mis tíos de Canadá a quedarse en la casa, y esto ha sido mi procrastinación para evitar ponerme a limpiar. Si mi carácter me impide hacer lo que se supone que debería de estar haciendo, pues que al menos que haga algo de provecho.
Casi se me olvida: René, el _Escribe ahora..._ es de coña, pa que te acuerdes de revisar el copy!
A limpiar entonces.
Today the missing piece of the puzzle, the backend of [blank.page](https://blank.page) was provided by a really talented fellow. He suggested that we migrate to webpack and transpile and lint and... No. Not at this stage, not at this time. Just let me store and retrieve json data, dev workflows be damned.
Should we use a standard dev workflow, every change would take a couple of seconds to recompile. When you are designing with code this trade-off is unacceptable, if you have to wait five seconds to test a 100ms transition duration change, the wait makes it impossible to assess which option is better because you don't experience the options sequentially in time. You write code, you wait, you see its effects, you change the code, you wait, you see the effects. When you work with instant feedback you code, you see its effects, you change the code, you see its effects. _What's a five second wait?_ the experience dev asks, but truth is when we experience gaps between events we face difficulties comparing them.
This is acceptable when you _know exactly what you are building_. If I had a visual design, a functional spec and unit tests, it would even be a good idea! But [blank.page](https://blank.page) has none of that. We freestyle a great deal, and it's plenty of fun.
But I also know that--if things turn out right--devs will collaborate in the codebase, and I will have to break apart my neat little workshop in order to make way for a production line where features are clearly defined and designed. I will break my flow hunting code style violations and debugging npm dependency shitstorms. In the past I would have thought I was incompetent, now I know it's a different way of building.
An industrial designer builds a chair in his workshop with the intention of mass producing it at a factory. The technique he uses to build the chair is completely different than what happens at the production line because he is exploring form and function. He may build the seat, sit on it, and decide it needs a different filling. He changes the seat, sits again, and decides it's nice and fair. Let's say the same happens with the backrest and the legs. When he has settled on the form, he then produces a document which allows it to be built at a factory.
The fact that the designer enjoys building a chair in his workshop does not imply that he will enjoy assembling his creation on a factory line. The parallel should be understood by creative developers: most devs can put things together, not many devs can build from scratch. Their time is best invested _creating blocks_ rather than _putting the blocks together_. Most dev work is information age factory work and creative souls suffer greatly because of this, they get into coding because it's fun but then they discover that the industry has made coding frustrating.
Would it be possible to share a workshop with another person? Yes. But scaling into a factory should only happen at the right time. When is the right time? When the workshop proves to be so uncomfortable that a bigger, more organized space becomes appealing.
Meanwhile, I will continue having fun in my little workshop.
Percibo la apertura de demasiados frentes para la energía que traigo. Lo que comenzó en una corrección de layout (mi sidebar se ha hecho grande) se convirtió en un proyecto de rediseño de los work logs para acomodar bien el contenido de Method of Action y demás. Encima de eso, por momentos me apetece escribir en castellano peninsular y en México eso es taboo. Escribiré como me da la gana.
Luego pensé que en todo lo nuevo tengo que usar Runge, una notación de color inspirada en... lo explicaré a su tiempo. Permite usar esquemas de color dinámicos. En algún momento lo voy a publicar, pero la mejor forma de hacerlo público es mostrando una buena aplicación. En el juego de [Boolean](https://boolean.method.ac) hice el primer acercamiento. El _darkmode_ de blank.page es otro. La notación sigue evolucionando, cuando perciba estabilidad la comparto.
Y por supuesto blank.page debería estar al tope de la lista, pero lo veo tan cerca que de alguna manera este monstruo ha ganado terreno y ahora me tienta a perseguirlo. Sería en definitiva un error.
El rediseño de Method esperará. Frente cerrado.
En realidad estoy escribiendo esto antes de finalizar mi jornada de trabajo, pero estoy esperando a que el teléfono cargue. Mierda, nuevamente el contador de palabras obstruye escribir. Voy a ver dónde está el problema...
Mierda, es el caché. Bien dicen (parafraseando porque no tengo internet) _There's only two difficult problems in computer science: cache invalidation and naming variables_. Esto se corrige con urls parametrizados para obligar... Espera, no tengo internet! Cargó esto desde el caché. No sé si estoy viendo la versión que hubiese cargado _con_ internet, pero mi teléfono ya ha encendido.
Voy a abrir un nuevo tab con blank.page....
Tenemos el mismo problema? Creo que no, tengo que escribir un poco más para ver... El problema no está si cargo blank.page con internet. My cache is stale. ¿Porqué no se actualizó la última... no actualicé la versión del caché! Es una variable para obligar al navegador a guardar una nueva versión de blank.page.
Bingo!
Como verifico que mi intuición es correcta? Si quito el internet, debe cargar la versión con el bug en el cual el contador obstruye la escritura. Veamos si es cierto... No lo entiendo, no es cierto! La invalidación del caché es difícil, sin duda. No lo puedo replicar. De todas formas debería que invalidarlo con cada release, para asegurar que el caché no se quede estancado después de la primera carga.
El problema es que tengo que hacerlo a mano ahora. Si necesito recordar actualizar una variable cada vez que deployo muy pronto se repetirá este escenario. Cómo lo hago dinámico? En el proceso de build? A ver si gulp me lo puede resolver... Hmmm también debería de parametrizar con el tiempo `timestamp`, pero vamos paso por paso:
***
**Tarea 1: invalidar el service worker caché cuando haga un build**
[gulp-replace](https://www.npmjs.com/package/gulp-replace)
Parece que hará la chamba, probemos...
Después de uno de esos errores inescrutables de npm descubrí que no gustan los trailing commas en los gulpfiles. Fácil de resolver. Ahora tengo...
`var version = 'v4::';`
Y tengo que cambiarlo a:
`var version = 'v<timestamp>::';`
Luego la configuración de Gulp:
[Paréntesis: el contador me está obstruyendo!]. Ahhhh, hay un bug en mi implmentación. Bajo ciertas condiciones se sobrepone. Estaba escribiendo entre [] cuando [se manifestó el problem, a ver si logramos que se confunda..!]. Ya lo entendí! Para generar el espacio en blanco al final de la pantalla es necesario que el scroll esté hasta abajo mientras escribes. Para evitar que escrollee mientras editas, no escrolea si el cursor no está en la parte final del texto.
Si eres como yo, que escribe primero los paréntesis `()` y luego el relleno `(relleno)` no va a escrolear porque el cursor no se encuentra al final del texto. Por lo tanto...
`const caretAtEnd = writeSheet.el.selectionStart === writeSheet.el.value.length;`
Y qué debería ser? Quizás la longitud de los caracteres de una linea completa. Pero eso ni yo lo sé, veamos cuántos puntitos caben...
.................................................................
65. Mi TOC lo quiere a 64, pero no nos desviemos por el momento
Me desvié: ya lo he puesto a 64 caracteres de ancho, luego he visto que me contestó el programador que me está echando una mano, y le he respondido. A veces intento ser muy breve y me tardo mucho haciendo mis mensajes breves.
Uy, repitió el bug de la sobreposición del contador, esta vez sin paréntesis () de por medio. Son `carriage returns` ↵. Si cambiamos a...
```
const charWidth = 64;
const caretAtEnd = writeSheet.el.selectionStart >= writeSheet.el.value.length - charWidth;
```
A ver si sirve... Sí sirve! Un bug menos. Ni siquiera sé si estaba en Trello, veamos... Había un bug en el scroll que corregí hace semanas, el caché otra vez. Ugh Trello ahora no. Todo lo que intenta _gestionar_ rompe el _flow_.
Pero el reporte de René me remite a mi tarea original: corregir de una vez por todas el problema del caché. Desviarme está justificado: si tu editor impide que escribas cómodamente es un problema más notorio a que si te carga una versión antigua (a pesar de lo frustrante que es para los devs).
*Back on track*: invalidar el service worker caché cuando haga un build.
Gulpfile.js
```
gulp.task('cache', function(){
return gulp.src(['./serviceworker.js'])
.pipe(replace('<timestamp>', Date.now()))
.pipe(gulp.dest('./dist/'));
});
```
Veamos si funciona...
`ReferenceError: replace is not defined`
Me olvidé de incluir `replace`. Hecho. Ahora...
```
Error: File not found with singular glob: /Users/duopixel/Coding/blank.page/serviceworker.js (if this was purposeful, use `allowEmpty` option)
```
No está ahí el service worker? a ver? Ah claro, está mal la ruta. Que mensaje tan confuso, `singular glob`. Ahora sí compila, veamos el resultado...
`var version = 'v1582664636013::';`
Está hecho, a huevo! En teoría con esto resuelvo el stale caché. Es momento de hacer una pausa para comer.
***
**Tarea 2: parametrizar los ficheros**
Primero intenté una solución hecha en casa mediante el uso de `Date.now()`, luego me di cuenta que tendría que limpiar todos los ficheros antiguos en mis builds para que no se me acumularan, así que mejor recurrí a un plugin de gulp:
[gulp-cache-bust](https://www.npmjs.com/package/gulp-cache-bust)
Funcionó de maravilla.
Bien! son 15:45 y si no me apuro el gimnasio se llena. Ya voy más de mil palabras escritas. Hoy no hace falta escribir más.
**Worked:** 2.5 hours
Today I completed a feature related to the unannounced part of [blank.page](http://blank.page) (as it's still WIP) and I don't feel like writing about work today. Actually, I don't feel like writing today. Should I work through the feeling of not wanting to write?
Strange shuffling of leaves could be heard outside, Nina, the dog, is sleeping on the couch and she interrupted her nap to lift her head, but then decided it was unimportant and went back to sleep. I will ignore it too.
What a blessing it is to have a companion. I do not treat, think or feel my dog as a person, but the bonding is undeniable and I sometimes find myself thinking that her time with me will be short, as she's already 14 years old. Despite this she's in spectacular health, still chasing cats and birds with athletic prowess. She arrived to my house as a loan from my sister to see if she would deal with the mice. She didn't, but offered much more meaningful rewards.
The crickets are chirping. When I can't sleep I synchronize my breath to their rhythm, that usually does the trick. From the other side of the river I hear shouts from a soccer match, as I now there is a court there. Should I not know, I would probably think it is a gang fight. Some people in Mexico are very afraid, but it is not that bad.
Enough writing for tonight.
Voy a publicar este work log en el reader de blank.page. El motivo principal es que no he probado el reader con un texto largo, y aunque puedo meter un _lorem ipsum_ en menos de un minuto, mejor aprovecho para escribir.
El reader es una cosa realmente improvisada, lo hice el día de ayer. El motivo fue técnico: queríamos usar blank.page también para leer textos, pero sin posibilidad de edición. Como esto nunca estuvo previsto, había que deshabilitar un montón de features para que funcionara en modo _readonly_.
La solución era clara: había que separar la experiencia de lectura de la de escritura para facilitar la programación de ambas experiencias.El desarrollo de un producto a menudo se refleja como espejo en el diseño, y viceversa. El hecho de que lector y editor sean productos distintos ahora nos permite diseñar cada uno para su tarea ideal. Esta necesidad de separación de tareas se percibe en la programación pero se resuelve desde el diseño producto.
Todo diseño tiene una lógica que se manifiesta en la implementación. Si un producto no es _todo lo simple que puede ser_, de igual manera el desarrollo no será _todo lo simple que puede ser_. Pero no hay que confundir lo simple con lo mínimo (aunque hay una correlación, pues lo mínimo tiende a ser simple). Los problemas complejos nunca son mínimos, pero sí pueden llegar a resolverse en su _expresión más simple_.
Llegar a la _expresión más simple_ de un problema es prácticamente imposible sin llevar a cabo varios intentos (iteraciones), inclusive tirar todo para abajo porque has entendido que el problema no se resuelve de la forma en la que lo estabas intentado. Mi heurística cuando resuelvo problemas en programación es _no hacer nada hasta que duela_.
Cuando me encuentro plantando muchos `if (write.mode === readonly)` sé que la solución no es correcta, pero a veces lo completo porque me permite terminar de entender todas excepciones me ayuda a ver dónde está el código que necesito para la lectura y separarla del código que asiste en la edición de texto. Luego, plantando las excepciones como banderas, puedo destilar el código de tal manera que el reader comienza con el mismo ADN que blank.page, siguiendo un curso distinto a futuro.
Sigh. I opened blank.page without an internet connection, and it presented me a very old version of the app. This probably means that my cache is stale, and that the cache busting measure I implemented is not working. There is only one way to figure it out: connect to the internet, reload, disconnect, reload. Let's observe the results:
Well, that went better than expected, I'm now writing on the latest version of blank.page, without an internet connection.
I accidentally set the time limit to 30 minutes. Just this morning I was thinking: it is fine to write whatever comes to mind everyday. Sometimes I don't write because _I'm not in the mood_, the romantic vision of life is faded and anything I register woud be drab and gray. But the good thing about registering experience even if it seems it's _drab and gray_ is that you quickly bore yourself and seek more interesting ways of registering experience.
Was today gray? Well, no. But it wasn't inspiring either. I barely worked anything on blank.page and filled my day with exercise and lunch with the family. In the evening I went to a special yoga class because of a change of name of my yoga studio and there was a small gathering afterwards. I attended but felt avoidant and kept to myself, still smiling and being polite, of course.
That damn bug where the word count overlaps the text you are writing is back. Ah, I see, if you tend to accumulate empty line breaks at the end of the document, the app thinks you are editing and does not change the... It's 23:20, past my bed time. The rooster will begin singing incessantly at 6:30. That's seven hours of sleep. I have work to do tomorrow.
It's 4:11 and I've practically cleared my responsibilities on my trello board. But God knows I'm not done, a clear Trello board means that you're done with your _team responsibility_, and it would be a mistake to think one's work is finished just because the tool you use to track tasks tells you so.
Card driven product design and development is like taking the role of a robot in a factory: I am given instructions and dependencies and with those I assemble a piece that another robot will use to put together a larger piece that will finally fit into the product.
The role of Trello in blank.page's development has been thankfully minimal. We've only used it in this last pre-launch stage when we need to keep track of all bugs and kinks, and as a repository of ideas for future development. In the past our pace was just a dozen of hours per month at most, so email was sufficient.
Two weeks into it and I feel I spend half of my time answering comments on cards and moving them from column to column. It feels like I am working, but I am not. I am manipulating a model of a project and allowing others to know my progress, but for anyone who is not a project manager this is overhead, it is not work.
What would be a satisfactory solution to team communication then? I don't know. My naïve hope was that post-release the pace slows down so that we can go back to email, but that's aiming low. It would be aiming for a product that limps so that I don't have to run to catch up with it.
Just don't make me move cards, ugh.
This collective neurosis has reached unfathomable proportions. I do not read news, I have ten people on my Twitter timeline, I don't check on social media, and yet in my immediate surroundings conversations about it are overheard everywhere: in yoga, in the market, in the family, in my thoughts.
Is there anything I can do about it? I've already informed myself enough as to know what precautions to take. Apocalyptic scenarios are the product of fantastic imaginations, it is unnecessary to over prepare.
Is everyone well informed? No, especially those who think they are most informed. Can I do anything about it? I could spread what I consider "true" information, but who am I to spread "truth" about the virus? Whatever I say about it will be repeating a fact or an opinion from another another source with higher authority. The days when I had the patience to make _higher authority information_ more understandable to myself and to others are over. I'm sure somebody has already nailed a great infographic, and hopefully it's all over the web.
The thing with information is that most of us consume it in undigestible quantities. A great, "true" infographic might go viral, but then the facts and the data are retained in the memory for a couple of minutes, at most. The reader then clicks on Buzzfeed's 10 ways to spend your days at home in pandemia and at the end of the day recalls nothing of the "true" information, despite feeling well informed.
What I find most lacking is common sense, even in myself. People either wave the virus away (I was one), or give in to exaggerated reactions based on fear. It is OK not to be concerned. It is not OK to pretend nothing is happening. It is OK to be concerned. It is not OK to spread misinformed fear.
How does one change habits and actions without fear? If I want to wash my hands more, do I need to be in a state of anxiety to remember doing it? Some great souls have the capacity of transforming intention into consistent action, but us, wretched souls, tend to get lost in thought and will as soon forget a commitment as we make up new arbitrary ones.
How do we accomplish consistent action if it's so difficult to form habit and one is unconcerned? It is said it takes 30 days for habit to settle in and become effortless/reminderless. I like the challenge. I only wash my hands when I use the washroom or I prepare food. I'll try to remember washing my hands every time I arrive to a new place in order to understand unconcerned action.
Yesterday I committed to washing my hands upon arriving to a new place, more as a _spiritual exercise_ in the task of discovering how to perform unconcerned action. In the morning I couldn't make it yoga, so I went to the gym instead. I begun my workout when I noticed they had put up posters indicating precautions to take because of the virus: say hello by waving, don't come if you're feeling sick, wash your hands...
I was supposed to wash my hands on arrival! "Well, it's useless now, if I carried the virus in my hands I would have already spread it." I thought. I continued my workout, but soon I felt bothered by my own lazy attitude, and I went to the bathroom to wash my hands. It's only been a day, but I can already tell the habit will set in.
When I came back home I scrubbed my hands throughly, not because of concern, but the fact that I had to wash my hands deliberately and not on autopilot made me notice the filth under my fingernails. I've been working the garden and if you don't do your washing consciously, filth remains stuck. "How in the world Juanito manages to take care of two parks and at least one kilometer of tree lined sidewalks, all while wearing a tucked in white dress shirt and a sombrero". He's always impeccable, surely he made a deal with the devil.
As I was writing I received a message from my cousin. She asks where is my aunt, who is visiting from Canada and staying at my home. --Oh, they went to visit Tere. "Who did she go with?", my cousin asked. She is extremely fond of my aunt, and my mother has had contact with someone who works in a place where someone who is asymptomatic turned out to have the virus, so she doesn't want my aunt to see my mother. I feel it's an overreaction, but she looks for the best interest of her four children. However, controlling other people is not within your reach.
You can isolate yourself, if you are well trained you can isolate your household, but how will you isolate that which is beyond your reach? You can plead and beg and get angry, but that will only incentivize that people avoid telling you that they've seen other people. A car just arrived. It must be my aunt. I will leave it at this for today.
Yesterday yoga was cancelled until further notice. Today it was the gym. Though not a law, all businesses are encouraged to close their doors. Those who can afford it do, but this is Mexico and there's plenty of people hustling their living on the streets and in the markets. Many people live by the day, and not working can be disastrous. A stark reminder to support with whatever meager means I have myself.
On the weekend I had a meeting with René, he presented a vision for blank.page which I hadn't considered at all, and I accepted cautiously, because I like to perceive by experience if the premise is valid. Though many perspectives were presented by René, the one that I think merited verification by experience was _Writing about your quarantine is therapeutic_.
The first time I wrote about the virus it felt therapeutic. But then, as I was seeing my routine being disrupted, I would complain to my blank page and then notice how much of a complainer I had become. Like an echo that amplifies, writing about an experience will make the experience more vivid, and I found myself more neurotic than if I hadn't written at all.
For two days I was not sure the premise was correct. I wrote but didn't publish because they were mere ramblings unworth of reading. I wrote on my notebook and it felt quite nice, yet it is spiritually more instructive to publish than to feel comfortable registering experience.
Today I finally felt the inspiration to publish again, because I understood that the premise is not that it is therapeutic to write about the quarantine, the premise is that it _can_ be, and the process to get there is obtained through experience. I have already discovered that complaining to myself is not a useful release, and that is valuable information.
The quarantine in Mexico is not strict, restaurants, cafés, stores and bars are still open, though judging by the amount of patrons they will close voluntarily soon. Without yoga and the gym nearby, and unreliable venues to work around the city, it is best to accept one's fate, stop complaining, and accept the reality that it is best to remain home.
Everything has become eerie and there is tension in the air. Merchants at the market wore gloomy and long faces, because people have stopped buying perishable supplies. Around half of the usual stands were open. Almost all butchers were missing, I got meat from the sole one left and the hygiene was appalling. I guess that's why he still had meat, I'll just cook it throughly.
The man who sell chicken was particularly combative about the situation, "they're telling us that we should close! What are people going to eat! we can't close!", complained as he packed the chicken breasts. "Even if there's a government decree, we will continue selling. We can't afford take even one day off". I inferred that a sizable amount of his capital was the inventory he sells, and he couldn't afford to let it spoil.
It seems this _new reality_ extends like a slow moving tsunami and us on the opposite side of the epicenter are the last to receive it. We are lucky to have that amount of foresight. In Mexico, it is not clear yet if closing schools and this voluntary confinement has worked so far. I sure hope so. Even if the measure works, the precautions and the scare will delay the return to normality, and we will have to learn to learn to live in confinement.
Half of people seem to think it's an exaggerated response, the other half seems to think we are not doing enough. I think it's just right: if we meet the outbreak with the same measures that were applied in Europe we will suffer the same fate, but at the same time the situation does not merit a lockdown.
In the morning imagination took me to fanciful scenarios: what if I quarantined myself during forty days? I'd need to stockpile on food and hole myself up. I wouldn't want it to be very strict, I'd just not invite anyone over and not leave the house. I'd need to change my diet substantially (I normally rely on perishables) and...
The reality of the market made me notice this is not a time to engage in escapism. There are too many unknowns to commit to a game of strict self-confinement. But the opposite approach (committing to a somber war-like confinement) is not merited either. Something in between is taking form, it lacks the playfulness of a game, but it has romantic notions which are playful. It has not the gloom of war, but it will not be free of suffering.
Let's see how this goes.
Yesterday was the first day I've spent in confinement since coming back to Mexico four months ago. I enjoyed it, but I also see it will get old quickly. Some petty challenges have already reared their head: I ran out of drinking water and had to boil some for drinking, at least until the truck comes to deliver the 20L jugs we call _garrafones_.
The reader may be appalled at my lack of foresight, but Mexico's untreated tap water is not noxious, yet it is taboo to drink it. The taboo comes, I suspect, from former times in which sanitary conditions were worse than now.
These days, tap water often is mineral-laden and not the best choice for everyday consumption (it would cause kidney stones), but the upside is that this kind of water comes from deep aquifers and not superficial sources. It may become contaminated in the transportation from the well to the household (often due to leakage sewage infrastructure) so it would be sensible to test your water, but drinking a glass out of a random house would be above 99% safe.
Yet, since we are so stringent with the quality of the water we drink, we neglect the water storage tanks in our households. It's fine if the tank has a bit of dirt and gunk if you're using it for showers, dishes, toilets and so on, as long as the deposits are not stirred.
Months ago, when I arrived to this house I took a peek inside the water tank on the rooftop, and it was evident my tap water was not drinkable. It is almost certain that people are pilling up on water and the reason why the truck didn't show up yesterday at my cul-de-sac street was because it sold out early.
The next delivery is in four days. I have three options:
# Break my quarantine, go buy water.
# Boil water for drinking.
# Clean my infrastructure and drink tap water.
The habitual reader of the log knows that #1 is not an option, not because of quarantine commitments, but because I do not carry water as a sort of... both a game and spiritual commitment. Thirst is a great motivator, so allow us to stop doing #2 in order to make #3 effortless.
Yesterday I dedicated the entire day to the land behind the house. I picked up all the dead branches and pull out noxious weeds. It almost looks like a garden now.
''Experiment:'' take a picture at morning, noon and afternoon to figure out which parts receive most and least sunlight.
<img alt="Landscape" src="https://method.ac/writing/uploads/IMG_5834.JPG" style="width: 100%" />
In natural gardening one must remove plants that got a bad hand in the sunlight lottery, they lead pitiful lives. Best to reposition or compost them.
''Experiment:'' can [Taro](https://en.wikipedia.org/wiki/Taro) grow without soil?
<img alt="Taro plant" src="https://method.ac/writing/uploads/IMG_5841%20%281%29.jpg" style="width: 50%; display: block; margin: 0 auto" />
''Experiment:'' identify where the sun comes out and comes down, and see how it changes over time
<img alt="Sun dial" src="https://method.ac/writing/uploads/IMG_5827%20%281%29.jpg" style="width: 100%" />
''Experiment:'' Pull down a long creeping plant and encircle an area with it, wait until the rainy season
<img alt="IMG_5850.JPG" src="https://method.ac/writing/uploads/IMG_5850.JPG" style="width: 100%" />
''Experiment:'' Thread live creeping plants among naturally bent bamboos for a tunnel in the rainy season.
<img alt="IMG_5832 (1).jpg" src="https://method.ac/writing/uploads/IMG_5832%20%281%29.jpg" style="width: 100%" />
''Experiment:'' What would be the best way to fast a long wild grapevine for access to its fruit? (I was so excited at this fortuitous discovery).
<img alt="IMG_5844 (1).jpg" src="https://method.ac/writing/uploads/IMG_5844%20%281%29.jpg" style="width: 50%; display: block; margin: 0 auto" />
<img alt="IMG_5842 (1).jpg" src="https://method.ac/writing/uploads/IMG_5842%20%281%29.jpg" style="width: 100%" />
''Experiment:'' How do I prepare a spanish tortilla with the least amount of olive oil possible? (because we're in quarantine and we need to ration supplies. Not because we are cheap or becauase we mind the calories, of course!)
<img alt="IMG_5824.jpg" src="https://method.ac/writing/uploads/IMG_5824.jpg" style="width: 100%" />
Failure noted, but I'm almost there.
As I passed the dining room I saw the shadows perfectly perpendicular to the ground, _what time is it?_ I thought. It was 11:58, _oh, the spring equinox just passed!_.
<img alt="IMG_5851.JPG" src="https://method.ac/writing/uploads/IMG_5851.JPG" style="width: 100%" />
Our knowledge of the world may be heliocentric, but our perception is not even geocentric, it's egocentric. I do not experience myself as a conscious being standing on a sphere that spins around a ball of fire, I experience a ball of fire that climbs from my horizon to the top of my head and then descends to the other side from where it came out.
Draw an imaginary L with your finger on your forehead for someone else to read. Is the lower bar pointing right, or is it pointing left? Now think, when you were in school and signaled to a classmate that they were a _loser_ forming an L with your fingers, which hand would you use? Such is the difficulty getting past our self-centeredness.
Yesterday, four days into confinement I received my first visitor, my mother. _You don't have water_, she noted. _Oh it's fine, it's on purpose_. She eyed at me suspiciously. Then she begun informing me about the latest news on the virus and family gossip. I had to stop her because this barrage of information was jarring after my four days of silence.
Later in the day she slipped out without me noticing and came back hours later in a taxi, carrying groceries and six liters of water.
--"Mom, thank you so much, but you're disrupting my project".<br>
--"What do you mean, what's your project darling?"<br>
--"It's difficult to explain, imagine that things were truly bad and we had to be entirely self-reliant, I want a taste of that".<br>
--"So you're preparing for the worst? It's not that bad".<br>
--"No, I don't think things will get bad, but it's surely useful to camp in remote places and it's a spiritual exercise of sorts.
Mother was surprisingly unsurprised. We agreed that, for the duration of my quarantine, she would visit one day per week, and that I would need to make some exceptions in order to fullfil social obligations. Fair enough.
I don't know where this leads, but the last few days have felt like a _camino_ of sorts: I do physical labour all day long, I only check my phone twice a day, I eat copious amounts of food, and I lead a simple, secluded life. Mother's visit served as a checkpoint of sorts, bringing a whiff of the external world. It seems the external world doesn't need me, and I don't need it either.
Let us continue exploring within.
Today I sit down to write with a distaste for anything quarantine or virus related. I'm reminded of Bocaccio's Decameron in which a group of people take refuge from the plague in a countryside palace, and to pass time they indulge in story telling. None of the stories mention a thing about the plague, the point is escaping from it (in the body and in the mind).
Once you have accepted your fate, there is no point in wrestling the calamity anymore. It is best to put it in the background. This makes people nervous and they will tell you it's a mistake, but when you boil down their argument it is reduced to an ego driven I-need-to-save-the-world complex. Since we feel useless we feel anxious, and to combat the anxiousness we seek for ways to help, but this rarely turns out as expected.
You have surely been in a rush expecting guests. The first guest arrives and asks "How do I help?" and you lose your concentration to assign a task, "can you chop some carrots?", "of course, where's the knife?", you motion towards the drawer. "Oh, do you have a chopping board?", and so on. The guest feels useful but it would have been more efficient to do it yourself.
When you remove the ego help becomes effortless. The guest might be sipping on a glass of wine while you are chopping the carrots. You cut yourself and the guest springs forward with a napkin to contain the bleed. There is no "I want to feel helpful" behind the action.
It was done because it was necessary.
Yesterday I left the house for the first time in a week. My mother and my sister were coming over for lunch and I had just run out of food. Even without their visit it was necessary, I was indifferent about finishing my experiment.
An experiment about what? I was not sure, but today I understood: Mexico has declared a state of emergency, and has exhorted all non-essential businesses to close down, emphatically asking people to stay home an entire month. They appealed to Mexican culture of cooperation in dire situations, which I must say is born out of the incompetence of the government. If you lose your job you seek refuge with your parents, if there's a fire you put it out yourself, if a business insists on operating during a health crisis it's the workers who must refuse to attend, as the government is unlikely to follow through in a timely manner. Mexican culture is not self-reliant or government-reliant, it's _society-reliant_.
When I have an idea about an app or product that motivates me enough I first implement the essentials to see if my imagination matches reality. I will prototype a quick working _thing_, and if I decide it's worth pursuing I will scrap my first working prototype and being anew, because building an app over a prototype is like building a house over the foundations of a hut. It doesn't have to be bullet-proof or extensible or well-engineered, and this gives freedom for exploration. There are no _rights_ or _wrongs_ there's only _discovery_.
This is what I feel this week was about: a prototype of a quarantine. What did I discover? Neither drinking water nor gas has been distributed to my neighborhood in the last two weeks, and we weren't even in a state of emergency. People must have been foreseeing the situation and stockpiled on them.
I ran out of water ten days ago, and I've been without gas three days. Water, I boiled until I ran out of gas, sampling tap water in moderate amounts to see if it would made me sick. It didn't. As for gas, cold showers are fine and I've been cooking with fire in a hole in the ground, which is more time consuming but surprisingly enjoyable and tasty. I made myself an improvised gym made out of tires, large rocks, and a rusty oil barrel that was in the land behind the house (debris carried by the contaminated river). It looks like a crossfit gym coming out from a Mad Max movie:
<img alt="IMG_5859.jpg" src="https://method.ac/writing/uploads/IMG_5859.jpg" style="width: 100%" />
I also worked on the computer at home for extended periods and discovered this chair will destroy my back if I continue working like this. I threw my weed into the river because boredom would lead me to it too early in the day, and the daily haze is not a dignified state of living. I discovered that the garden is a great hobby and it is a tremendous privilege to have a piece of land in these circumstances. I've been enjoying toiling these sunny days clearing the jungle behind my house.
The _quarantine prototype_ proved immensely valuable as a preparation for the real thing, and even more apocalyptic scenarios. Eating roasted chicken from the fire hole in the backyard, I told my family that if any of them got sick, they should come to this house to spend their convalescence. My mother and my nephew are in the vulnerable age bracket and this would be the most sane thing to do.
I was suddenly hit by a _deja vu_: I've been through this before, but how? And then I remembered a dream I had five years ago which [I published on Medium](https://medium.com/@duopixel/an-exploration-into-dreams-5b8e9547f54) under the title _A desire to provide protection, unsure if I'm up to the task_:
> I was in my childhood home in Puebla, Mexico. The world was in great scarcity, a post-apocalyptic world. I was on the rooftop holding a rifle, along with a kid who was my protégé. The day was pleasant and we were enjoying the sun.
> Two guys in ATVs came from the field next to my house, I was frightened. We went downstairs to see what they wanted. They demanded food, we had none. They then restrained me and took my friend. I was left devastated, knowing that they would eat him.
This is not a premonition of the future, of course. It's the subconscious pointing out to the fact that you are not prepared for a situation like this. I may not be _there_ just yet, but I'm much closer now than I was five years ago.
''Warning'': Beta software, this is an early preview for log readers. Will be officially announced. Feedback is welcome at [mark@blank.page](mailto:mark@blank.page)
---
I had one outstanding task this morning before calling [quarantine diaries](http://blank.page/quarantine/) complete: to put a notice on mobile which said "sorry, this site doesn't work well on mobile, but you can try anyways". With [Blank Page](https://blank.page/) René and myself had agreed that any pleasant typing happens on a keyboard, and most physical keyboards go along with larger monitors, so for MVP mobile support was not necessary.
But, I cannot implement this without actually trying it myself. In these quarantine days my phone sits on the shelf all day long, only to be checked when I wake up and before going to bed.
Let the reader know I possess no self-control, and the reason why it sits on the shelf is because two weeks ago it slipped out of my pocket and it cracked it's screen, bad. I must consciously avoid the top part of the screen, or a shard of glass is likely to slice my finger if I attempt to use it without presence of mind.
How am I going to tell people to proceed at their own caution, and I have not taken that precaution myself? As I was anguishing myself over these questions, a text came from the other side: René had completed the flow and published quarantine diaries first entry, from mobile none-the-less. In his own words
> It should read "Proceed at your own discretion."
And so I felt some relief, if the flow could be completed, it meant the issues were merely a matter of layout. But, as often happens in matters of front-end, this was lead through numerous rabbit holes, reducing bundle sizes, providing alternate means of navigation, favicons, quick wins, yada yada, time flew by and in one morning I went from mobile hostile to mobile indifferent.
Yes, that's the word: mobile indifferent. Our aim is to be mobile friendly, but for now mobile indifferent will do.
Thank you for being brave enough to try it out.: Beta software, this is an early preview for log readers. Will be officially announced. Feedback is welcome at [mark@blank.page](mailto:mark@blank.page)
---
I had one outstanding task this morning before calling [quarantine diaries](http://blank.page/quarantine/) complete: to put a notice on mobile which said "sorry, this site doesn't work well on mobile, but you can try anyways". With [Blank Page](https://blank.page/) René and myself had agreed that any pleasant typing happens on a keyboard, and most physical keyboards go along with larger monitors, so for MVP mobile support was not necessary.
But, I cannot implement this without actually trying it myself. In these quarantine days my phone sits on the shelf all day long, only to be checked when I wake up and before going to bed.
Let the reader know I possess no self-control, and the reason why it sits on the shelf is because two weeks ago it slipped out of my pocket and it cracked it's screen, bad. I must consciously avoid the top part of the screen, or a shard of glass is likely to slice my finger if I attempt to use it without presence of mind.
How am I going to tell people to proceed at their own caution, and I have not taken that precaution myself? As I was anguishing myself over these questions, a text came from the other side: René had completed the flow and published quarantine diaries first entry, from mobile none-the-less. In his own words
> It should read "Proceed at your own discretion."
And so I felt some relief, if the flow could be completed, it meant the issues were merely a matter of layout. But, as often happens in matters of front-end, this was lead through numerous rabbit holes, reducing bundle sizes, providing alternate means of navigation, favicons, quick wins, yada yada, time flew by and in one morning I went from mobile hostile to mobile indifferent.
Yes, that's the word: mobile indifferent. Our aim is to be mobile friendly, but for now mobile indifferent will do.
Thank you for being brave enough to try it out.
I lost the habit of writing the daily work log because I did some writing on [Quarantine Diaries](https://posts.blank.page/quarantine-diaries), and I'm also participating in a _pilot_ writing course using Blank Page, organized and published by René, and taught by Ana María González Garza, his grandmother. The course is titled [The spiral of consciousness](https://courses.blank.page/), and while we are just one week into the course, the experience has been surprisingly smooth (but not without hiccups).
On writing I admit lacking diligence on several days, I usually sit to write even if I feel uninspired, work through it, and something interesting may come out, but these days I was going to bed exhausted.
My mother was staying with me for ten days straight, as my sister had to do a strict quarantine, so my mother and I engaged in several home improvement projects that were carried out with considerable effort, and for some reason when the body is in a battered up state, the mind also lags and writing feels like exerting more effort.
I understand the reason why I resist to write when I'm tired is because I'm still attached to "writing well" and "making sense", I could simply lay down in bed and allow my fingers to type whatever comes out. Indeed, some days walking is a drudge, others it's a pleasure, but looking back upon the way, one observes beautiful scenery of peaks and valleys.
I sense a willingness to commit to daily writing. But commitment takes away from spontaneity. So I'll interpret this as a willingness to write every day, again.
Today I spent the day alone, mostly in the bush, building something very strange that asked to be built. Using the stem of palm tree leaves stripped of their foliage and taking advantage of a few existing trees, I built some arches where creeping plants are emerging. I tried training them to climb, but they are very delicate plants that do not like to be disturbed.
This I discovered by trial and error, and I've butchered many of these gentle climbing plants before I discovered that my training proved too grueling for them, and they would wither away after a few days. So now know I must guide them gently, suggesting the spiraling limb to grab onto a stick that is inches away. If they are a good match, the limb will almost coil itself around the stick.
Having a structure set up, I begun tying ends with a fresh vine that I pulled down a tree, and begun spinning a spiderweb of sorts, so that these vines that are waking up from their winter slumber grab on to the structure. If things turn out as I expect, this structure will become a tunnel when the vines grow with the upcoming rains.
My task was concluded when the skies darkened and rain was imminent. I spun enough spiderweb around the structure for it to be stable. Or so I thought. As I listen to the sound of trees shaking from the gusts of wind, I become more concerned about my improvised craftmanship.
I just dedicated three hours to the [New Kerning Game](https://method.ac/type/). René wrote an email this morning: "I liked what I saw, but here are some suggestions..." I was about to protest because this is the earliest of earliest stages (pre-alpha, I would call it) but then I saw one of the suggestions was to bring back the guidelines of the original game. It's this...
<img alt="_Users_duopixel_Coding_type.method.ac_index.html (1).png" src="https://method.ac/writing/uploads/_Users_duopixel_Coding_type.method.ac_index.html%20%281%29.png" style="width: 100%"/>
Vs this.
<img alt="_Users_duopixel_Coding_type.method.ac_index.html.png" src="https://method.ac/writing/uploads/_Users_duopixel_Coding_type.method.ac_index.html.png" style="width: 100%" />
Hmmm I like it clean, but the lines certainly support the feeling that you move the letters horizontally, and it gives a certain comfort. It is also closer to the original game, which is one of the goals. I know that in future collections I do not necessarily want these lines, so I need a way to optionally add them, per stage.
So what I did was implement something very similar to the Boolean Game: each stage has callbacks which allow me to modify the stage or perform any operation when a stage is loaded or unloaded. In this way I can add the lines and also clear them when you are done playing a stage.
Once this was done I worked on the mobile version. After adjusting the layout and adding mobile specific code, it was working quite well! It is now playable on mobile phones.
**Check it out if you're reading this from mobile [https://method.ac/type/](https://method.ac/type/)**
But still, it's kind of awkward. Your finger obstructs you seeing the letters when you drag them, so an indirect way of manipulating the letters must be provided. My first intention (the quick one) is to make the hit area of the letters as tall as possible, and possibly distribute the available spacing as draggable areas.
<img alt="Group 1.png" src="https://method.ac/writing/uploads/Group%201.png" width="375" />
I will see how this works. In the meantime, if you happen to come across a good pattern to solve this, let me know at [mark@method.ac](mailto:mark@method.ac).
Today, on Hacker News, I saw a link to the [PWA Store](https://progressiveapp.store/pwas) and I thought: The Boolean Game should be here. The problem is that, to qualify as a PWA you need a Service Worker. I took a look into service workers when I first programmed this game (which was around a year ago), but the only benefit I saw was offline caching, and the entire concept was foreign to me, so I let it go.
In the last few months, however, I found myself only with a mobile connection provided in the form of a hotspot. I have to pair computer with phone multiple times per day, and when you want to sit down and write and get a "no internet connection" message, that desire fizzles away. So I took the time to install a service worker on blank.page so that it would cache the app for offline work. It is one of my favorite features.
The experience of adding a service worker to blank.page was really frustrating. It is javascript, but the things it does are very foreign to any javascript developer, front-end or backend, and the fact that it works only under https:// will make you spend a lot of time figuring out how to test locally.
But after some frustrating days it was working.
This time I knew what I was doing. It took me the same time it took me to write this little text, and then I submitted it to the PWA Store.
**[The Boolean Game on PWA Store](https://progressiveapp.store/pwa/911)**
Dear reader: I have not tested this on an Android device, should you find a show stopper please let me know at [mark@method.ac](mailto:mark@method.ac)
Today I locked the start and end characters of the [new KernType](https://method.ac/type/) for it to behave like the existing game. Then I had to modify the letter selection code to skip locked letters.
When I first released this game a lot of people would complain: "I can't move the start and end letters!", well, that's how it's supposed to be. If you squeeze your letters together, then spacing them will be much easier. I could reduce the score if you squeezed your letters together, but at the time I barely had any idea of what I was doing and this was a feature beyond my experience.
In future collections the width of the word will not be constrained, instead the score will be reduced if you wish to pack your letters tightly. There _may_ be locked letters, so this is added as a property of the stage instead as a property of the game.
What was done today in matters of work:
''Blank Page''
<a href="https://svelte.blank.page"><img alt="image 1.png" src="https://method.ac/writing/uploads/image%201.png" style="width: 100%" /></a>
I am writing this from the next version of Blank Page, which I'm building from the ground up with [Svelte](https://svelte.dev). After a long meeting with René, we decided the best course of action was to _stabilize_ what we have built, and then taking steps for a major rewrite.
But as of now, this [new version of Blank Page](https://svelte.blank.page) is little more than a textbox and some stats. Still, it shows a lot of promise. This could simplify our codebase drastically, and allow us to do things I always called impossible should my intuitions prove correct.
''KernType''
<a href="https://method.ac/type/"><img alt="image 2.png" src="https://method.ac/writing/uploads/image%202.png" style="width: 100%" /></a>
I implemented a drag area on the letters for touch devices, which distributes the available width among the letters. The results are very positive, but if the letter is dragged beyond other letters, the results are catastrophic.
I'm still debating if the right approach is to limit the movement of each letter. Tomorrow I will try and see how it feels hardcoding some limits.
I've been finding myself working at bursts on a new version of <a href="https://type.method.ac">KernType</a>. I have enough done to know it will be published, God willing. It is a task that I have attempted several times since it first came out, but it seemed a cursed project. I would always end up abandoning it when it became too complex.
The reason for the complexity was my ambition: first I wanted to space the letters following arcs, that got quite far. Then I didn't want to create stages by hand, so I made a Fireworks script that would automatically export all the assets and all the code necessary to produce a stage. Then I wanted letters to be images, so I could support both vector and photographic letters such as signage and stone inscriptions. Then I had to update my fireworks script. Then I wanted to support perspective kerning.
You get the idea, I got tangled in so many details that the project soon proved overwhelming, and I came out empty handed on every single try.
And as I write this I notice a certain hesitance to publish my thoughts: what if this attempt is cursed too, what if I come out empty handed?
But that is impossible, because my only aim, for the time being, is to replicate the existing game into a new codebase, with mobile support. I'm 90% done, and I will release it silently through this work log soon.
Something felt wrong upon writing this, and I took a look to see how much was left to be done before it was playable and tolerable to the bare minimum. The answer was: half an hour. And so to the loyal reader of this work log, here I offer a sneak preview of the new KernType (warning, I might have exaggerated that 90%):
**[https://method.ac/type/](https://method.ac/type/)**
Almost the same thing, as you can see, but the stage scales to the size browser. Many kinks need to be worked out, but the codebase is extremely simple. No libraries except for Anime.js, which I know I want to use down the road, and rewriting css animations or transitions into javascript is a pain.
"Why not create new stages while you're at it" I hear. But this would be premature, our mission is to replace the old game with the new one announcing it as the old kerning game with mobile support. Only when this happens will I work on more features and stages. Features such as collections of words Spanish, punctuation, rare scripts, inscriptions, wait for that I would need to support letters as images... Ah, always the same trap.
Let us release in the most simple expression possible.
I silently released the new version of [Kern Type](https://type.method.ac) today. To recap: the purpose was to replicate the form and function of the original game under a new codebase with added mobile support. In that, I succeeded.
I expected to make some quick wins with new features, but I only set up localStorage to save progress and cleaned up things a bit. I noticed that if I wanted to change something I would often cause things to cascade into the new version that I have in mind, and I had to contain myself to not open the door to the demon who puts everything out of place.
I have contradictory feelings because, on the one side, it better than the original game, and at the same time it is not up to my current standards. But this was a "spiritual release" in the sense that it is not about perfection, it was about transcending a block (unable to ship a new version of the game), so in this case shipping trumps quality.
I'm still planning on adding several improvements: a simple tutorial or landing screen would be appreciated, I suppose. But, for the time being let this be as it is.
**[https://type.method.ac](https://type.method.ac)**
Yesterday I coded a small animated tutorial for the new [[KernType|https://type.method.ac]], and while coding it I realised: the solution of the first two stages was way off because of a technical error! at some point I had changed the way in which I positioned letters, and these two were left with old values.
Since this was already in production, it injected a sense of urgency into finishing my task, and I was blazing through the code, squashing bugs I was finding along the way. I was done in some four hours, though I would sensed it be thirty minutes. I pushed to production, only to have my eternal enemy rear its ugly head: nginx's caching was serving yesterday's fudge, when today's were much better.
I sighed and connected to the remove server via ssh to tweak the site settings as to send `no-cache` headers, restarted the web server, and connected to https://type.method.ac to the... old version again? That's impossible! Unless it's not my eternal enemy, but a demonic cousin of it, called service worker caching.
I removed the service worker, pushed directly to production and boom! the nginx served the freshest version of the site. I was blaming the restaurant when I had prepared the meal at home.
The service worker was a non-essential, so I completely took it out until I actually understand it. Time and time again I see that I cannot delegate understanding. My two mortal enemies (nginx caching and service worker caching) are not sought to be exterminated, they should be understood. Keep your friends close, but keep your enemies closer.
When I saw the site finally load I felt satisfied and thought: this is good enough to announce publicly, so I tweeted about it. Some kind strangers notified me about certain important problems (didn't work in Firefox and the Tweet your score button didn't work).
I finished when the trees produced shadows of their canopy directly beneath them, and I thought: "noon already! Let us pry ourselves away from the computer there's much work to do", and so a different kind of work begun.
I was satisfied with the day.
Two weeks ago my blogging software ceased working, so I couldn't even warn the reader that updates would cease coming.
This afternoon, in a fit of procrastination, I thought: I ought to warn the reader that updates will not be coming until I port all my content to a new CMS, because Movable Type is a dead end. I ssh'd into my server, with the intention of updating the XML Feed and the index file by hand, but when I tried to autocomplete the path on the terminal I discovered the cause of the trouble:
I had run out of disk space.
And so I deleted some files and got things back in shape, and there was no need to update by hand, but I still feel that I ought to port all this content into a new platform, and I will resume my work logs when this is done.
I actually _want_ to keep on writing to tell the reader what I'm currently working on, but I will censor myself instead with two-fold intention: to not squander any more time, and to orient desire and intention in the same direction. The desire is to write, the intention is to set up a new publishing platform. If the desire is satisfied and I begin writing here again, the need for the new publishing platform diminishes.
Though I may publish _something_, the work log will remain silent, at least until writer and reader encounter each other on the same page of a different book.
Until then.
This morning I finished setting up a Shopify Store for my cousin, https://maskjerseys.com. It was a quick customization meant as an MVP to see if the store will work, as my cousin sells mostly on ~MercadoLibre and eBay.
Shopify seems to be quite sophisticated, and usability wise it is a wonder that they could accomplish so much, but it is not without quirks. Everything seems to happen in queues, so if you change something (say, add a tag) and then you navigate to a different page to use that tag, it will only appear after waiting a couple of minutes.
All in all, the process of creating an online store was quite straightforward. One concern that I have is that if you don't correctly categorize and tag your products
I love this wiki, but I hate how it looks. Yet, when I'll think: what is required to make writing here more comfortable? I must begin by this very box, and not get distracted with the details. The things I explored until now were to discover the best way to accomplish a full customization, but I often fall by the wayside exploring things and at the end of the day nothing is accomplished.
Visual hierarchy is of the outmost importance, and perhaps we ought to follow our own precepts regarding color, but as of now, it is enough to begin designing in black and white, and then add color as the last step. In this way, I do not get distracted and advance in this upfront investment. Last night I spent a lot of time unable to sleep, and I thought about this wiki and my current worklog: they are not faded into meaningles-ness, quite the contrary, they have been elevated to the realm of the sacred, and thus must be drawn inwardly again.
I may someday publish this wiki, but what I mainly seek here is freedom of expression, and so the spiritual task is to write as if nobody but myself were reading. In publishing there is always an editing act as to protect the identity of the people involved in your life. Romantic love is particularly something that inspires to write, but is more appropriate for the intimacy of the relationship rather than the people at large.
In this way, I have found in this wiki the perfect match: it is simply a matter of encrypting something with a particular tag. What would that tag be? [[Intimate]] perhaps.
Since I find these ideas inspiring, I will forgo "real work" until the contents of spirit are poured into this vessel. If the best way I find of expressing my thought is in writing, I ought to express my spirit through it. Socrates expressed this through speech, Jesus through the heart, Goethe though his being. I must have the courage. No pep talks. Do I have the courage? Inner doubt. I'm not sure if I'm a dull intelligence, trying to introspect what lies beyond reach. I seem to think that I do not profess enough lightness as to produce anything of notice.
Oh boy you got ensnared. Since the promise to the self was to make the ego obedient in the matter of priorities, it is my current spiritual task to finish everything that I started, and to finish enthusiastically. Because filling the gaps is not as interesting as painting the daily impressions, but it is the work done in the [[Mandala]] that contrasts against the dark background. Slowly filling the gaps is tedious work, but allows one to think as one is doing it.
The ego mislead me to a long train of thought and I lost the rhythm that my fingers had as I was typing, I sure sign of distraction. The ego seems to be at its last reduct. I notice all his misgivings and forgive them now. Like Nina, he recoils at the sight of the broom, that weapon that I used to think about myself. How could I have thought [[It is best to think about yourself as a dog]]? Let us use Ken Wilber's terminology and define ourselves through years.
There was a proto-Mark, whom peaked his level of development in Playa del Carmen. No, these are distinct psychological make-ups. Confusion. This is too complicated to be true. Nothing is to be gleaned from the past, if Aledrian Psychology is right. I sense myself very close to resolving a puzzle, but this will give way to a new puzzle. Let us attempt this from a spiritual instead of a self-biographic perspective.
The past is behind. The only thing is now. What do I want for myself? Nothing. I usually welcome what the day brings. I've been thinking: it is obvious that in other people that their philosophy of life has a great repercussion in their lifestyle, and I think: is it not obvious to your that your fallacious thinking is bringing you great harm?
And so, despite being perfectly capable I constantly choose to remain in this monk lifestyle, the reason, according to Alderian Psychology, is because I want to, and I agree. I love my lifestyle right now, and I would not sacrife my freedom for money. And I am very poor because of this. That is fine. I have debts, but they cause no anxiety. I must be [[practical]].
This has turned into a session of self-therapy, but when I compare the importance of the task I set to do when I begun writing, I see that is is more important to perform self-maintanance work, which I haven't done for a long time because of my public writing, and to disintangle the things that I come to find through introspection. Let us come back to the question:
I think of myself as somebody who has taken a severe beating because of his overarching ambition, and thus I come much humbled to the task of confronting myself: how is it that you did not accomplish what you wanted? Because the desire was not honest, it did not come from the self, it came from the ego. What comes from the self cannot be helped, as I find myself typing out these letters I notice an interplay between both. Make the ego a servant of God, is what is usually advised. The only way to submit the ego to god is through constant observance. But God is not an idea, I do not have to think about god or to humble myself to him, to castigate myself self-inflicting pain to beg for his mercy.
True answers are always simple: the way to submit the ego to God is through observance of the breath. Your ego suffers from separation. In this sense, Adlerian psychology is wrong: trauma does exist, and our story is one of separation. We separate from root consciousness and spiral up, generation upon generation working on the problems of ignorance. The child of this age reaches a psychological and intellectual level unknown in the current world. We are "progressing" no matter what post-modernists say. But where? Doomsday sayers and misanthropists have no idea, well, the future is uncertain, but the patterns that I perceive will come up in my lifetime will be amazingly meaningful, just like the past generation has been too.
Half an hour left. I do not care to ramble like this two hours straight. I feel things inside become "put in place" by writing about them. But they can decay and rumble. Let us come back to the task about answering questions to myself. The ego is enjoying this game, I feel ego and spirit working together. Who is observing, it is the self. Who is writing, at times, ego takes the keyboard, at others, it is spirit. They are both joyful, because—this may be important, I haven't felt this before, inner harmony. They like each other. If they where children, spirit would be the more profound but less assertive child, but they have grown up, and ego, the more dominant child, has understood spirit's disposition, and are willing to work together. Is this true? I smoked a bit before, and these "hazy therapeutical resolutions" often fade away without leaving an impression. It does make me chill, but it does not resolve the true inner work that is required. It is irrelevant. I will ask myself in the night: do I remember anything about what I wrote today? and I will almost certainly respond: yes, even though the journey of thought was confusing I do remember the scenery seen in the train:
First I wanted to dedicate two hours to the customization of this blog. I came with the feeling that this wiki would be private, because I wanted to write things for myself, the way in which I have written to myself reveals that indeed, it is time to make this private again, and that whatever I publish will be in it's finished form, these are raw materials.
Then I thought: something important spontaneously came up, I tried to resolve it, and I noticed the ego distracting me. What was this important thing? Did the ego just dance with spirit so that I could not answer myself? Ah! I just remembered! That I was too dull to do anything of importance. That I lacked the "brightness". Ah, the feeling of "things falling into place" came from the subconscious understanding that I have a tremendous brightness that is obscured by my ego. Ego has understood: if I place myself behind the light of the self, I will stop obstructing its light. It is not dullness that one possesses, it is ignorance. Veils that obscure the brightness have already been removed, for I have never written as good as when the ego tried to stop writing.
Oh, I got into executive mode and scrolled up to seek where the train of thought continued, but the task was to verify the claim that these hazy thoughts will soon be forgotten. They will not. For one, this comes from homegrown pot which is much less potent and much more functional in terms of thought, but in sobriety rarely do I indulge in this kind of self therapy. I must have access to this faculty without having to smoke. [[Todo: write two hours stream of thought, sober]]. Executive mode again.
Then I think I went into the understanding—I had to look back again. Indeed I notice my working memory greatly impaired, for I forgot that the refuge of both spirit and ego is the temple of [[breath-observation]], and thus one comes to appreciate the simplicity of the solution if immediate relief from the pain of separation. Oh, the underlying pain... I feel an opening of the chakras, it came as a flash. I suffer because I'm separated, and I reunite in breath. Like the man who has found an oasis in the desert, I must come here to drink. But this is the incorrect allegory. It's always been inside and I've found it before of course. A question I often ask to myself is "why do I keep forgetting to come here for relief".
I understand now, it is again the ego obscuring the spirit, for visiting this place of relief puts spirit at charge. This is why when I find myself in an egoic state and pass through the meditative state, I come back in the spiritual state. Is this true? well, if I sit down to work there is a much improved performance, less inner-quarreling, it becomes spiritual work without a doubt. I truly experience myself in a different way, I am afraid of it leaving me, it's been a really rough life, how can I not be attached to liberation? But it comes and goes, this is not arriving. But the ego has understood it's proper place, indeed the ego is like the dog and the self is the master, this was the insight I had at the time, yet I seem to forget my lessons over and over, and again I attribute this to my own dullness.
But I see this again and again: the dullness is obscuring of the light by the ego. The ego has matured enough to notice that he should not be a child dancing in front of the spotlight, but that the ego has a role in the shaping and direction of divine light. It is not the ego that shines, for the model for human understanding may be found in our very own arrangement of celestial bodies: the sun is the the root source; earth, spirit; ego, the moon. And all are sacred celestial bodies, but all of us have the order incorrect, for living from the ego we perceive the earth to revolve around us as we move around the sun.
I think I have reflected upon the problem enough to understand intuitively: I must submit to spirit. Spirit: this is ego. I feel foolish now that I noticed I've been obscuring you all this time. Come into gratefulness to see this happen. I understand. It is time to step behind you. I am glad we both noticed. It is 10:00AM, and we've both written two hours by now. Until tomorrow.
A sense of writing mastery has descended upon spirit! I can write what I think, and what I think is not as boring as I thought. The progress I've made in writing is amazing, I did not know I possessed this amount of skill. It would seem that all the years I spent scribbling the notebook has made me able to form sentences which I put down with muscle memory. The urge to edit myself has largely disappeared, though I sill edit lightly for the benefit to the reader.
I'm quite amazed that I never set out to practice, that I am able to write so fluidly without actually attempting to do it, and this make me able to write without attachment. I do not wish to //write well//, I wish to express myself with as much clarity as I can muster.
The other day René repeated something which I had written or said, but then forgot: it seems that, when you write in the same format every day, you get bored of it, the repetitiveness brings about new writing experiments, and this causes you to explore beyond the place where you feel most comfortable writing.
I had a sudden concern for reading everyone's exercises in Espiral. I feel selfish for living the experience with no concern for others, and now that I feel that the course is over, I have attention not only for myself, but for others.
Most definitely a change in outlook. I will sumerge into writing for the courses and for myself, and when the time comes, I intend to produce pieces of personal writing with design, to prepare my writing into a polished format that is easy to digest for the reader.
I come to sit down, the ego inside of me is dying, and kicking it's last bouts through pot. I have found the way out, and the ego is strangely cooperative. He himself it's been enough. The sacrifices in his name were numerous. He is tired. He wishes to submit to higher authority.
But I must not write about my ego as if were not myself, for here I am asking for higher authority. I've been neglecting my right testicle, I'm broke, I'm smoking a lot of pot, and yet I'm woderfully functional, and in harmony with my family. This period was necesessary for me to notice what is harmony with my mother, and if there is anything that makes things go awry between us is stress.
If we address the problem of human relationship through the lens of comfort... I think I understand now: I live in the same way I code. I do not want to "plug in to the system", and I accept myself just as I am. I do not mind that this makes me celibate, for nobody would want to be with an outcast as me.
I'm involuting to the state where I started my depression, no quite there, but this happens so that I can write down how I feel.
I agree with Adler: etiology and teleleology are different domains.
Etiology gives me acceptance, teleleology give me hope.
My consciousness is transformed through great adventures, inwardly and outwardly.
I am a wonderful being, blind to this very fact.
---
I come back in the morning, forgetting about having written this. It's putting a feeling into words, and that is of... I slept all day. It felt like when I was in Madrid, utterly drained of energy and gone into the mind, a whirling tornado of thoughts that would not cease even when I dozed off.
In the past I would have used the negative affect that is felt towards pot into an intention of not smoking again, but I have seen with my very eyes how this intention gives its way to an unhealthy relationship with the desired substance. Never have I been so functional when pot as when I completely accepted myself smoking it.
The entire situation is much more simple than I make it out to be, when you want to allow the outer layer of the onion peel off, you produce something in your center that will push out the dry layer. And so the way of removal of vice is through inner growth.
I resume the work log after only partially accomplishing what I set out to do, which was to move to a different publishing platform. I'm pouring in all the content I've written in the past two years and a half into a private <a href="https://tiddlywiki.com">TiddlyWiki</a> installation, where I am tagging and cross-linking everything I've written here. The idea is that I will produce more finished essays from this "raw material", like sifting through the dirt in order to find the precious stones.
We will see how that goes.
Meanwhile, having abandoned the _daily therapy_ of writing, I've seen my spiritual RAM depleted, and I feel sometimes feel overwhelmed by the amount of vague ideas that I haven't materialized in the form or writing.
Yesterday I was set myself the task of creating a donation page for Method of Action. It was the most difficult thing in the world and I would procrastinate at every turn. On the surface it seems quite simple: hey, here's what I've done. I don't like advertising, and I think this kind of education should be free. I appreciate your donation. Bam, done.
But there is an existential struggle that wants to manifest in this donation page, perhaps the reader of this work log will know what I mean. When I wrote copy from my _designer archetype_ it was simple and straightforward, yet inauthentic. If I wrote from my _spiritual archetype_ it would come out dramatic and existential, yet honest.
So I sensed these two forces at conflict, each having its own merit and shortcomings, and the conflict was manifested in constant rewriting between the simple and straightforward with the baroque and sentimental, and plenty of procrastination because the emotional relationship to the page I was trying to create.
So yesterday, exhausted after only creating three lines of copy and no design, I decided to work it out through this dialectic with myself on this work log. If my original intention was that I would be able to produce more polished pieces of writing through self-editing my stream of thought, then it follows that I could produce a simple donation page by navigating through the complexities of it through writing.
The following text will probably be disorganized as I write through it. When I finish, I will take a nap, and then I will come back to distill it into a simple donation page, hopefully.
***
People often write to me to suggest some new feature in one of my games: "can I skip stages on the Bezier Game?"--no, you can't. It's a good feature, but working on old stuff prevents me from working on new stuff. No, I cannot implement this at this time. Perhaps in the future. I do this for pleasure, and I make no money out of it.
Others come with a sense of entitlement to support, having made no effort at figuring things out for themselves. Here is a particularly illustrative case:
<img alt="Group.png" src="https://method.ac/writing/uploads/ad3b200097425fad42e319deb8203f068125fe01.png" width="100%" style="display: block; max-width: 800px; margin: 0 auto;" />
Sometimes I've felt that accepting donations is giving away the card that I use to say no to people, and I feel the need to clarify: giving me money entitles you to nothing. Time is my most precious resource. I live like a monk, without a TV or social media, my phone is perpetually in sleep mode. How could I sell this for the measly coins you throw into my tin can?
Yet I see the immaturity of this stance. I have a neighbor who is in a dire situation: he is a mentally handicapped thirty-something with the psychological composition of a 14 year old kid with behavioral problems. His mother died two years ago, and he was left to fend for himself living alone, taking up menial jobs to earn some money. Us neighbors help him out with food and other necessities.
My mother took him to a government institution to see if they could help him. A doctor took him into his office for diagnosis. 15 minutes later he came out with a big smile on his face "The doctor said I'm not stupid and I can work!", "Erm... that means you won't get any financial support". Too dull to put on a farce, yet too smart for government support, and so he is left empty handed.
The reason why I write about this neighbor is that someone tried to stabilize his situation by giving him a regular full-time job. He took up janitorial tasks at a non-governmental institution. Things seemed to be going well, but after some months he quit in a fit of rage: "I'm tired of being bossed around! This is unfair! They can't buy my liberty!", and instead of growing appreciative of the person who placed him at the job and coached him through it with saintly patience, he's now bitter towards him, and sees him as an exploiter of sorts.
It was tremendously instructive to see myself in him, because this is the emotional relationship I develop when I exchange my time for money, which I haste to state I do not actually believe, but I sometimes _feel_ that way when I have to push myself through work I do not want to do. When seen through the case of my neighbor, I observe that what he perceives as a "loss of liberty" is actually an avoidance of responsibility.
What is the responsibility of accepting donations? That depends on the author. Under a patronage model, the donation is expected to be transformed into creative output. But I cannot sell this, because in me creation seems to have a will of its own, and I'm moving more and more in the direction of spontaneity. I do things because I cannot help myself from doing them.
I used to work on <a href="http://blank.page">blank.page</a> on a pay-per-hour basis, but it became so enjoyable I just couldn't help putting way more hours than <a href="http://renegalindo.com">René</a> could afford. We didn't come into an agreement beforehand, he was like "well, let's try to resolve this through equity" and I was like "well, that's just a distraction at this time, let me continue working and we'll figure it out later", which we did, and it turned out great for both of us.
Let us attempt to answer the question directly: does a donation imply a responsibility of any sort? It seems the ball is on my side of the court, I must decide what responsibility I bear for the generosity of the user, and my first inclination is to answer as my neighbor would answer: I owe nothing, I already gave value without expectation, so the donation is given for the value already provided, not in expectation of a reward. Let us settle the matter of responsibility and obligation here.
It would seem that the only thing I could reliably provide is my honest gratitude, as--at this time--any donation, no matter how small, has a disproportionally large effect on my monthly income. I currently sustain myself with a ridiculously small monthly income, and I feel surprisingly comfortable with this budget, so despite it being "beer money" (that is, leisure money), it is appreciated beyond its nominal value.
Let us reframe the dialogue from obligation to gratitude.
I think I have worked through the major crux of the issue. I will now take a nap, and come back to write the copy of the donations page when I wake up.
***
**Fund Mark MacKay** <br>
The creator of Method of Action
I created these games and tools over the span of eight years, self-financing the time and resources required to design, program, and maintain them. I find plastering products with advertising distasteful,
and my only brush with advertising had very [negative consequences](https://7labs.io/technology-news/subdomain-leasing.html). The other alternative, gating the games behind a paywall, would make them unaccessible to most students unless the teacher paid out of their own pocket because institutional frameworks don't account don't account for this kind of educational material.
It is in this spirit that I ask for donations, to finance more time to do the things that I love without the question of _How am I going to make money out of this?_ influencing my decisions. It is said that when the product is free, then the user is the product, yet <a href="https://method.ac/writing/articles/we_dont_value_your_privacy.html">I refuse take this stance</a>.
Instead, let us frame your donation as a gift of freedom, one of the highest virtues in my book, and for that I am deeply appreciative of your generosity.
Thank you.
<img alt="nina.jpg" src="https://method.ac/writing/uploads/nina.jpg" style="width: 100%" />
This is me, Mark, with Nina, named after [the dog](https://drawpaintprint.tumblr.com/post/31675171421/diego-velazquez-las-meninas-1656-detail) of Las Me*nina*s of Diego Velázquez.
Yesterday work on the <a href="https://method.ac/donate/">donations page</a> was mostly pleasure. I now notice there is a significant amount negativity in the content, perhaps because the reception surpassed any expectation I could have. Thank you. I will rewrite it in time.
At the beginning of the year I was contacted by an unknown individual who shall remain nameless. He wanted me to work on a really interesting technical challenge, which I accepted. I begun work and some hours in I showed him an advance. Great! I advanced some more and emailed him, but got no response. Some days later I emailed him again. No response. I was ghosted by the client.
I was disappointed because this was an interesting and lucrative project. I had turned down something less fulfilling in order to make space for it, and now I was left empty handed. It was too little unpaid work to make a scene out of it, so I simply emailed the client "If you do not respond to this email, I will assume the project is cancelled". I didn't get a response.
Since my schedule was free I begun a month of intense work on <a href="https://blank.page">Blank Page</a>, and unprompted René generously covered my modest living expenses for the month, and then we agreed to a partnership. In the end I reflected on the person who ghosted me and I was glad that things happened this way. I'm effortlessly involved in blank.page, and it brings me great pleasure to work on it. I had warned René that I would be unavailable to work on blank.page for the duration of this vapor project, and instead I dedicated myself fully to it.
Well, the twist to this story is that, today, this person donated a sizeable amount of money, more than what he owed me. I got goosebumps of joy, not only at the relief of getting two months of my modest living expenses covered, but because it was the last thing that I expected!
Much grateful not only to my ghost, but to the people who have collaborated so far. And those who will collaborate in the future, why not. Thank you.
In the past few days the <a href="https://method.ac/writing/work_journal/2019-10-17_log_heal_or_sacrifice.html">black rooster</a> had been lethargic, in appearance dozing off constantly during the day. After some google fu I diagnosed sour crop, an infection that happens after an obstruction in the throat. To treat it, you massage its neck and it will vomit foul smelling undigested food and then you treat the infection.
My sister visited on the weeked, and between the two of us we tried to get the rooster to vomit, massaging its neck for a long time to no avail. But the massage seemed to perk him up a little bit, so I waited two more days to see how it progressed. Its apparent recovery proved illusory, and the next day it was in the same lethargic state.
Yesterday it poured rain, and usually the rooster takes shelter under a tree or in its shelter, but this time it was just standing there, dozing off while getting completely wet. Its majesty reduced to a sad state, I knew it was time to end its misery.
I meditated for a while before doing it. My emotional relationship with this animal I thought was inexistent, but at the prospect of ending its life I felt a hesitant hand, so I worked through it in meditation. I re-entered waking state with a clear mind, knowing in my heart that I was doing this out of compassion and not out of convenience.
This almost feral rooster is combative when you try to get ahold of it, but this time it remained huddled and barely moved when I reached for it. I laid it on the ground and put a broomstick on its neck, stepping on in, and then tugged its feet as hard as I could, as I had seen on a YouTube video.
But I wasn't able to kill it. I possess a non-trivial amount of strength, yet, as I tried prying apart its neck from its body, it continued flapping its wings, the instinct of preservation of life kicking in at the pain, I suppose.
"I'm sorry I'm sorry I'm sorry" I kept repeating, making the greatest effort at decapitating it. Finally I let go and ran for the axe, fearful that the rooster would get up and run, but when I came back it was still where I left it, twitching and breathing but close to death. I put it out of its misery with a blow to the neck.
I went back inside, soaking wet from the pouring thunderstorm, and collapsed on the stairs. I was panting and soon the panting turned into sobbing. The sobbing soon turned into relief. A fragment of a poem of Khalil Gibran came to mind:
> When you kill a beast say to him in your heart,<br />
> "By the same power that slays you, I too am slain;<br />
> and I too shall be consumed.<br />
> For the law that delivered you into my hand <br />
> shall deliver me into a mightier hand.<br />
> Your blood and my blood is naught but the sap<br />
> that feeds the tree of heaven."<br />
El mes de julio y agosto escribiré mis bitácoras de trabajo en español. A muchos habitantes de la península ibérica les encabrona que llamemos español a esta lengua que tenemos en común, "su nombre es castellano", corrigen. Esto lo concedo cuando escribo en el dialecto ibérico del español (el castellano), pero como ahora estoy viviendo en México pues <del>que chinguen a su madre</del> escribo en el dialecto local. Cuando me encuentre en aquella tierra (sagrada para mi) hablaré y escribiré en castellano.
¿Por qué lo hago?
<a href="http://www.renegalindo.com/">René Galindo</a> y su servidor hemos estado usando <a href="https://blank.page">blank.page</a> como un editor de texto para dos <a href="https://courses.blank.page">cursos online de escritura</a>. Lanzamos estos cursos sin anunciarlos porque no hacía falta publicitarlos, y también porque estábamos validando la idea.
La idea resultó ser válida.
Al terminar el último curso que organizamos, _Escribir para reir en serio_ impartido por <a href="https://es.wikipedia.org/wiki/Ricardo_Ch%C3%A1vez_Casta%C3%B1eda">Ricardo Chávez Castañeda</a>, nos propuso un ejercicio veraniego como puente para la segunda edición del curso que vendrá en septiembre: "escriban un diario usando el humor como clave, cada dos semanas me pueden enviar una entrada y yo se las puedo comentar, sin costo alguno".
Pensé "ahhh que idea tan chida! Si ya escribo mis bitácoras de trabajo en inglés, lo único que tengo que hacer es cambiar a español, meterle un poco de humor, y cada dos semanas enviársela a Richie". Y en esas sorprendentes sinergias que suceden cuando el _patrón de patrones_ te manda manda a fluir por laderas secas durante años, <a href="https://twitter.com/javiercanada">Javier Cañada</a> hizo mención de un artículo que escribí hace cerca de diez años: <a href="http://blog.duopixel.com/resenas/cafeina.html">experimentos con exceso de cafeína</a>.
Cuando me leí, no pude sino sorprenderme de cómo estaba escrito, _esto envejeció un poco mal_, pensé:
<img alt="cafe.png" src="https://method.ac/writing/uploads/cafe.png" width="647" height="545" class="mt-image-none" />
Pero luego fue lo que más risa me dio! La sociedad ha cambiado tanto que ahora es políticamente incorrecto escribir esto, y eso lo hace más gracioso ahora que cuando fue escrito. Ya no sabía si había envejecido para _bien_ o para _mal_. Es humor adolescente (todo el acto de tomarme un venti lleno de shots lo es!), y me siento cómodo dejándolo ahí para la posteridad. Viene de una parte inmadura de mi, pero lo inmaduro también es maravilloso, como cuando un niño dice algo que los adultos evitan decir por convención social.
La tarea espiritual, entonces, es retomar la clave humorística con un tono más maduro. Lo haré primero en español porque es lengua latina, y los romanos eran unos chicanos. La segunda tarea espiritual será la alquimia interior de lograr la unicidad del alma latina con el alma anglosajona. Lograr un humor universal. Hasta entonces:
> Estne volumen in toga, an solum tibi libet me videre?
¿Es eso un pergamino en tu toga, o sólo te alegras de verme?
Hace unos meses, al principio de la cuarentena, acompañé a mi tía al aeropuerto para tomar su vuelo de regreso a Canadá. Estaba muy nerviosa y no quería irse en autobús, por lo que un primo se ofreció a llevarnos.
En el camino mi primo me preguntó en qué andaba ahora, y le conté de mis proyectos. Me dijo "que raro, si Ramiro dice que andas de huevón sin hacer nada, que antes tenías chamba y lana pero ahora ya ni quieres trabajar". Sentí ese ardor que nace en el estómago y sube hasta los ojos cuando el ego es herido, guardé un momento de silencio para saborear el dolor: Ramiro es mi primo más querido, y el cabrón estaba enterrando un cuchillo en donde más dolía.
"Ramiro no entiende", pensé. Para mi el trabajo es tan sagrado que escribo a diario sobre ello, y si bien mi definición de trabajo es bastante distinta a lo que la mayor parte del mundo entiende como trabajo, prácticamente estoy trabajando todo el tiempo, interior y exteriormente.
Pero no me podía quitar la espina, y decidí hablar con él de manera casual, para dejar atajado el asunto. Pero cuando lo vi no sentí esa energía de desprecio. Cuando la gente piensa mal de ti, se nota. Ramiro habla mal de todo el mundo, es un mal hábito, "cómo pude pensar que yo iba a ser la excepción", pensé. "Si tengo que hablar con él, será para aconsejarle que no ande hablando mal de la gente".
Pero pasó el tiempo y lo dejé pasar. Hice alarde con él de lo "muy ocupado" que estaba, e hice conversación respecto a mis proyectos, cosa que normalmente no hago, pues la gente asocia el trabajo con tener un empleo, y si no tienes uno asumen que te la pasas echando la hueva. El orgullo provocó que exteriorizara más mi ocupación.
Pero el fin de semana pasado Ramiro me habló por teléfono: "Oye Mark, me pidieron el rostro de esta niña para unas playeras en serigrafía, no estoy en mi casa, me puedes echar una mano con Photoshop pasándolo a una tinta?". Mi primer impuso fue decir "ni madres", pero le expliqué que estaba en el super y que tenía que hacer unos pendientes regresando a casa, pero que me lo enviara para ver qué tan complicado era.
Era complicado. "No es trivial, mejor busca a alguien más que te eche la mano". Insistió. Lo llamé por teléfono, le dije "mira, voy a ser honesto contigo, no puedes andar diciendo que ando de huevón y luego pedirme que haga tu trabajo", se ofendió "yo cuando dije eso?", "mira, si quieres hablamos de eso después, mientras busca a alguien que te lo haga porque yo no lo voy a hacer". Me colgó. Minutos después envió mensajes de "me encabrona que pienses que yo ando diciendo eso de ti...", drama. "No voy a discutir esto por whatsapp, me pongo en contacto contigo en la semana para hablar".
Ayer llegó el día. Estábamos los dos calmados y en la mejor disposición de arreglar las cosas. Le dije: "mira, para mi el trabajo es sagrado, cuando me enteré que andabas diciendo que era un huevón pensé 'si Ramiro no sabe lo que hago, es natural que asuma que no hago nada', pero de ahí a que me estés pidiendo hacer tus chambitas ya es demasiado"--"pues es que tú mismo me lo dijiste cuando llegaste, que andabas de huevón pero bueno, siempre has trabajado un chingo y pensándolo mejor es normal que te des un descanso". Esta parte fue fácil de resolver, pero lo difícil era explicar que andar hablando mal de la gente es ir contra el patrón de patrones.
Recurrí a una historia.
"Cuando tenía catorce años iba cada fin a casa de Óscar (otro primo un año mayor que yo). Había una vieja que quería con él, pero a Óscar no le gustaba, y se acercó conmigo, seguramente para provocarle celos. Se puso a hablar mal de Óscar, y como Óscar era a veces culero conmigo, pues yo también me puse a hablar mal de él".
Ramiro y yo nos reímos de mi ingenuidad. Proseguí con la historia.
"Al día siguiente llegó y me dijo: mira MacKay, nomás porque sé que eres bien pendejo, ni siquiera me enojo contigo. Hay algo que tienes que entender: a pesar de que lo que hayas dicho sea verdad, no debes hablar mal de tus amigos. Si tienes un pedo conmigo, dímelo a mi, no a esa vieja que va buscando sembrar discordia".
Y le dije a Ramiro "desde ese día lo entendí perfectamente: existe un círculo de confianza, y ese círculo de confianza jamás se traiciona. Si no le puedes decir algo a la cara a un amigo, mucho menos se lo vas a decir a otra persona. En esencia tú y yo nos emputamos de la misma cosa: yo porque porque hablaste mal de mi algo que no has confrontado conmigo, y tú porque le creí a alguien menos cercano que tú. Los dos estábamos violando un pacto implícito de lealtad".
Y así, sin razonarlo demasiado, llegamos al meollo del asunto. Nos dimos un abrazo y el asunto quedó zanjado.
Todo es trabajo, inclusive esto.
En el ámbito religioso debe haber un día de descanso, y se debe dedicar a Dios. Para los judíos es el sábado, para los musulmanes es el viernes, y para los cristianos es el domingo. Algunos budistas descansan cada cuarto de luna (luna llena, luna nueva, y los cuartos de luna).
Mi día sabático lo he descubierto durante la cuarentena, lo muevo conforme a mis circunstancias, y es mas familiar que devocional. Normalmente es los viernes, porque es el día que mi madre viene a casa para quedarse el fin de semana, y viene con mi hermana y mi sobrino. Estos días de cuarentena vienen pocas visitas, pero a veces nos acompaña una prima muy querida con su hijo.
El día lo comienzo limpiando la casa. Si hay algo que va a tardar en cocinarse, lo hago en paralelo con las tareas de la cocina. El trabajo de limpieza que se hace en este día resuena con el trabajo de limpieza interior. Se barre y sacude tanto la suciedad material como la espiritual.
No hay dogma en este acercamiento al día sabático. Si se tiene que trabajar en la computadora, se trabaja sin apuro alguno. Si la familia llega el jueves, el día sabático se mueve al jueves. Es algo que ha surgido espontáneamente, y disfruto de la sensación de cambiar el énfasis en el tipo de trabajo que se hace ese día.
El sábado y el domingo no los trabajo enteros, normalmente me levanto temprano y tengo unas dos o tres horas de trabajo . Mi madre prepara el desayuno y luego hacemos algún pendiente como ir al súper o reparar algo de la casa. Entre quehaceres compartimos alguna lectura que nos resulte interesante a ambos. Uno puede estar lavando los trastes o pintando mientras el otro lee en voz alta. En la familia somos demasiado inquietos como para sentarnos a ver una película o un documental, además de que no hay televisión en esta casa.
Parte de la sencillez de nuestra rutina de fin de semana viene de la cuarentena, llevamos ya cuatro meses de semáforo rojo en Puebla y esto nos ha obligado a permanecer los fines de semana en casa. Antes de la cuarentena íbamos a algún un museo o hacer alguna actividad que es una logística estresante cuando hay niños pequeños involucrados. Había que gastar dinero.
"Accept constraints willingly" decía Charles Eames. No hay nada más inútil que desear estar donde uno no está. De desear ser lo que uno no es. De hacer lo que uno no puede hacer. De tener lo que uno no tiene. Sólo cuando llega esta aceptación puede uno disfrutar del presente.
Ayer fue el cumpleaños mi tío Tito, que es arquitecto. Nos tomamos turnos para decirle unas palabras cariñosas.
Yo dije:
> Lo que más admiro de mi tío Tito es su sensibilidad estética. Parece siempre estar rodeado de belleza: mi tía es guapísima, mis primas son hermosas, su casa es preciosa, hasta se viste impecable! Ahora mismo estamos todos rodeados de cosas bellas.
> Pero lo que me parece aún más especial es poder desarrollar esa sensibilidad a pesar de lo que me han contado de mi abuelo, que fue un hombre tosco y fuerte, que exigía a sus hijos varones seguir su ejemplo. Desarrollar esta capacidad debió requerir un coraje increíble.
> Mi tío Tito es una gran inspiración para mi como diseñador y como persona, y es un privilegio para todos nosotros contar con un gran artista en la familia.
En Puebla estamos en semáforo rojo desde hace cuatro meses. Los lugares en los que trabajo normalmente: la biblioteca, el café, la librería, las mesas del centro comercial; están cerrados. Esto me ha obligado a trabajar en casa, y creo que lo he llevado bien.
Sin embargo, por primera vez ayer sentí el hastío de estar en casa. Estaba trabajando sobre algo desagradable: instalando y configurando software de servidor que requería una serie de llaves secretas para entrar en distintos servicios sociales (GitHub, Facebook, Twitter, etc), y tuve que dar de alta muchas aplicaciones OAuth... nomás de acordarme me da mal cuerpo.
Pensé que sería más llevadero si me llevaba el trabajo al parque. Le puse la correa a Nina y caminé al parque con mesas más cercano que conozco, a unos veinte minutos caminando de casa. Me acordé de <a href="https://www.google.com/maps/d/edit?mid=18Cqw1TswU0UcIZ9CSb2W8Qhevtn0rnnV&usp=sharing">mis exploraciones de bibliotecas en Madrid</a> y pensé "quizás sea buen proyecto explorar lugares de trabajo apropiados para este contexto".
El trabajo fue regular. Un error fue llevarme a Nina (aunque seguramente ella estará en desacuerdo) pues no podía evitar tener un ojo en el perro y el otro en el currelo. El sol del medio día hacía más difícil ver la terminal, y los esquemas de colores que uso para la pantalla están orientadas a reducir el deslumbramiento de estar viendo la pantalla todo el día.
Pero no hay nada en esto que no sea corregible. En definitiva el exterior no es el mejor lugar para trabajar, pero ver gente es una delicia especial estos días de aislamiento y me alegra el corazón hacerlo. A pesar que no fui productivo, hoy tengo ganas de hacerlo nuevamente con los ajustes necesarios. Así que ya he comenzado un nuevo mapa.
<iframe src="https://www.google.com/maps/d/u/0/embed?mid=1z8QKfk8o-Na6Y2MpNj4gsLjagAZe1bdz" width="800" height="600"></iframe>
¿Cómo se traduce <em>procrastinate</em> al español?
Vamos a ver qué dice Google...
`Postergar, dar largas, aplazar`
Me he propuesto no usar anglicismos, pero estas opciones no capturan el significado en inglés.
"Procrastinar" es evadir la responsabilidad de realizar una acción, generalmente relacionada al trabajo. En mi perspectiva todo es trabajo, <a href="https://method.ac/writing/work_journal/2019-09-06_log_on_working_with_love.html">a excepción del amor</a>. En este caso <em>uno mismo es el objeto de trabajo</em> de una voluntad superior.
¿Acaso la naturaleza evade realizar acciones? Eso es inconcebible. Evadir acciones es una condición artificial, sin duda.
¿Por qué evado realizar acciones?
En el caso de ayer lo noté claramente: no contaba con suficiente información para realizar mis tareas. Había que hacer mucho esfuerzo de prospección, y la mayor parte de mi esfuerzo se iría al desperdicio.
La naturaleza no recurre al esfuerzo porque no tiene voluntad.
Sin embargo, sí que prospecta a través de la evolución.
¿La evolución tiene un destino?
Los materialistas dicen que no.
Pero si sumáramos la inteligencia de todos los seres sintientes en este planeta, y lo midiéramos a través del tiempo, veríamos una clara progresión: en cenozoico es más inteligente que el mesozoico, y el mesozoico es más inteligente que el paleozoico, y así sucesivamente.
El destino no lo podemos conocer, pero la dirección es conocida.
Trazando el paralelo con la labor del diseñador, la evasión de la acción se produce cuando no se está seguro que la dirección de la acción se encuentre alineada a la dirección de mayor inteligencia. Se puede retroceder en lugar de avanzar, y ese es el esfuerzo desperdiciado que se quiere evitar.
Pero no hay nada más agotador que quedar atascado evadiendo el trabajo. El agua interior se apesta, y hay que renovarla mediate el descanso o la meditación, ¡a pesar de no haber trabajado!
¿Qué es lo contrario de la evasión de la acción?
El flujo y la constancia.
Habrá que seguir encontrando inspiración en la naturaleza para resolver este acertijo.
Ayer tuvimos la segunda reunión de consejo de blank page. Los reunidos fuimos René, Sam y yo. Sam es nuestro consejero, y como le tenemos en la más alta de las estimas, nos motiva a llegar con resultados a nuestra reunión mensual.
Blank Page tiene una historia muy peculiar. Estoy viendo cómo se teje una leyenda, porque suceden cosas muy sutiles en la biografía vital del proyecto que enlazan el trabajo con la amistad y la espiritualidad, y a veces me veo tentado a escribir acerca de ello, pero pienso "la leyenda aún no está completa, no hemos llegado a nuestro destino todavía". Hay literalmente tanto material narrativo que se podría escribir una novela, sólo que la novela aún no tendría final.
Pero esto provoca el mismo efecto narrativo que percibo en mis caminatas: puedo caminar durante días en la más absoluta de las carencias, en el terreno más agreste, bajo el sol más castigador y sufriendo una soledad absoluta, simplemente porque la caminata es un marco más grande que el día a día. El sufrimiento me purifica y le da significado al camino.
El último tramo de la Vía de la Plata fue particularmente miserable. Lo hice por tramos, tomando semanas de vacaciones mientras trabajaba de tiempo completo, y este último tramo fue muy solitario y con mal clima. Estaba a unos cinco kilómetros de Santiago, y llovía a cántaros. Estaba muy justo de tiempo, pues mi tren salía en dos horas, así que no podía esperar a que pasara la lluvia.
Era noviembre y hacía frío. El agua ya se me había colado por debajo de la chamarra, y resolví desistir de intentar protegerme de la lluvia, pues para fines prácticos estaba más húmedo con la chamarra encima que sin ella. Me metí en un bar, pedí un café con leche y pregunté dónde estaba el baño. "Pero si vienes empapado!" me dijo la dependienta. Las señoras gallegas son madres sustitutas de todos sus párrocos--"No puedes seguir caminando así, vete a cambiar".
--"No tengo otra opción", dije, "mi tren sale en dos horas"<br />
--"Ay hijo, no hace falta sufrir tanto, te pido un taxi"<br />
--"No puedo arruinar el final".<br />
--"Ay hijo, aunque sea ponte un plástico".<br />
--"Tendrá una bolsa de basura?".<br />
--"Sí, déjame ver...".
Se metió a la cocina y salió con una bolsa grande. Sacó unas tijeras y me fabricó una camisa de plástico. Me tomé el café de a full, me puse la camisa, y tanto la señora como los párrocos aprobaron. "Suerte, muchacho, apresúrate", me dijeron. Me deshice en agradecimiento, y seguí mi camino con un brío desconocido para mí.
<img alt="IMG_2984.jpeg" src="https://method.ac/writing/uploads/IMG_2984.jpeg" style="width: 100%;" />
La gente en Santiago me veía y sentía frío ajeno. Los gallegos parecen ser gente muy empática, pues numerosas veces vi cómo la gente se frotaba los brazos como calentándose por mi, pero yo ya estaba feliz y caliente por dentro. Apenas dio tiempo de pasar a tomarme una foto frente a la catedral, y luego corrí a la estación de trenes. Llegué al andén con sólo cinco minutos de antelación. Terminé de secarme en el tren.
El sufrimiento de este último tramo contrasta con el gesto de la señora de tal manera que se me acomodó en la memoria como un ángel. No fue la camisa improvisada lo que me redimió, fue su cariño y consternación al ver a un muchacho empapado y derrotado llegar a su bar.
Sin la carencia y el sufrimiento, los gestos de generosidad y compasión pasan desapercibidos. La luz es luz porque hay sombra. Sólo hay redención cuando hay pecado. Vivir únicamente lo positivo es vivir una vida sacarina, hay que darle la bienvenida a lo negativo como algo que nos otorga profundidad.
¡Qué hermoso es vivir!
Creo que nunca he registrado el fluir de mi consciencia en español, lo siento hasta extraño. Estoy tumbado en la cama, cual [Chaac-Mol](https://www.mexicodesconocido.com.mx/el-enigma-de-los-chac-mool.html#:~:text=Chac%20Mool%2C%20la%20misteriosa%20escultura,un%20recipiente%20circular%20o%20cuadrado.). Lo estoy haciendo porque me traje el ordenador a la cama, porque ayer no podía dormir y normalmente un rato de meditación logra darme sueño, pero en esta ocasión parecía resistirse.
Mi horario se descuatrapeó de forma importante. Dejé de fumar mota hace unos diez días y se me descolocó no sólo el horario, sino las ambiciones y el estado emocional, pero estoy meditando tanto que lo observo con desapego. Sólo es un periodo de reajuste.
La mota que estaba fumando era muy suave. La usaba para hacer cosas que me disgustaran. Si venía la vecina amiga de mi mamá que es insoportable, fumaba un poquito y su compañía se volvía tolerable. Si necesitaba trabajar sobre algo desagradable, le daba una fumadita y avanzaba lo suficiente como para pasar el bache. Le daba una fumadita antes de irme a la cama.
Tengo la suficiente objetividad para saber que no es el gran lastre que es para otras personas, especialmente esta maría que es tan suavecita. Quita la aspereza que tengo conmigo mismo y con los demás.
Ayer vino la vecina: "por qué no me has pasado a ver? ya te olvidaste de mí!". Cuando salgo al súper o al mercado le toco para preguntarle si quiere algo. Pero siempre que lo hago comienza una verborrea interminable de quejas respecto al barrio, al vecino, al gobierno, son quince minutos de intentar volver la conversación a la tarea inmediata "pero entonces dime, qué vas a querer del súper?"--"Arroz! Qué crees? Se me llenó de gorgojo el arroz! No puede ser! La última vez que me pasó...".
--"No he pasado a verte porque pensé que Óscar te estaría echando una mano". Óscar es un chico con retraso mental moderado al que prepara de comer, y él le lleva sus encargos.
--"Pero ya sabes que Óscar a veces se clava mi dinero".
--"Bueno, mañana paso al súper, qué vas a necesitar?".
--"Necesito pasar al cajero, me acompañas no?".
--"No Gaby. Porqué no puedes pasar al cajero tú sola?"
--"Es que si no me tengo que estacionar y pierdo mucho tiempo".
Me estaba mintiendo. Gaby es una persona increíbilemente ansiosa. En estos días de coronavirus sale con doble cubrebocas, pantalla de plástico, gogles y guantes de plástico. Pero no deja de fumar. Tampoco va al banco más cercano porque para llegar hay que pasar por un puente que cruza un río, ¡le da miedo pasar en su coche!
Nos había contado, al inicio de la pandemia, que fue al cajero pero con tanto obstrucción que llevaba en el rostro le resultó difícil leer lo que había en la pantalla. Se puso nerviosa y pidió ayuda, pero "nadie se quiso acercar a ayudarle". Sacó su tarjeta como pudo, y desde entonces me pide que la acompañe al banco a sacar dinero.
En este nuevo modo áspero me vi diciéndole "Gaby, hay que aprender a ser más independientes. Me pides que te pague tus recibos de luz, de la tienda departamental, que te saque dinero, que te compre cosas por internet...", bajó la mirada y vi que la había lastimado.
"Discúlpame Gaby, mira, me cuesta trabajo decir que no, se me van a acumulando las cosas, y el último recibo que me encargaste pagar, tardé dos horas investigando cómo se pagaba correctamente, porque si lo pago mal el responsable soy yo. Procura distribuir tus necesidades bancarias entre varias personas. Yo no puedo ser tu banco".
Terminamos la conversación cordialmente. Sé que en los próximos días va a intentar devolverme los favores a su manera, me va a hacer hot cakes (que no me gustan) o va a insistir transportarnos a mi mamá y a mí en su coche para ir al súper o llevar a mi mamá a casa de mi hermana. El problema es que es tan nerviosa que no puede ir ella sola, tengo que ir yo. Y termino agotado, prefiero cargar que ir en su coche, escuchándola quejarse.
No hay conclusión en este fluir de la consciencia. Pago el conflicto interpersonal con mal cuerpo, y mi bálsamo era la mota. Fumaría y sentiría que no es para tanto. En esta aspereza la mente dice que no es para tanto, pero la sensación es de desprecio: "has dejado que la ansiedad te carcoma a tal punto que no puedes operar de manera normal en el mundo, y dejas tus responsabilidades a otras personas".
Honestamente no sé porqué escribo esto aquí, quizás sólo porque estaba registrando mi flujo de la consciencia, y fue aquí a donde fluyó. No hay que tomar el discurso de la mente como una fuente de verdad, hay que dejarlo fluir mientras uno observa con desapego. No hay nada que resolver, esto es una foto del interior que viene sin filtros.
He anotado casi todos los sueños que he recordado en los últimos siete años, y de vez en cuando repaso mis diarios en formato de libreta (proto-work logs) y los transcribo en un blog privado, con la intención de eventualmente construir una obra de arte digital con ello. Voy colocando metadatos en cada sueño con el fin de poder filtrar y categorizarlos mediante una taxonomía, por ejemplo:
Muéstrame todos los sueños en los que aparece equis persona.<br>
Muéstrame todos los sueños con contenido sexual<br>
Muéstrame todos los sueños que tienen lugar en España<br>
Muéstrame todos los sueños donde hay agresión<br>
No me importa demasiado exponer mi subconsciente al público, y la mayor parte de los sueños son inofensivos. Es más, voy a transcribir el siguiente que encuentre en la libreta que voy minando ahora...
> Soñe que iba a lanzar algo, un proyecto personal, y estaba muy ocupado haciendo cambios de último minuto. Sam me felicitó y me dijo que le gustaba cómo trabajaba, lanzando a producción prematuramente para trabajar sobre el proyecto en vivo. Me desconcertó su comentario, pues mi intención era lanzar la versión final a producción y no volver a tocar el proyecto.
Este es un sueño relacionado al trabajo, donde hay una emoción (desconcierto, pariente de la ansiedad), con un personaje que es Sam. Pero no todos los sueños son inofensivos. Podría, por ejemplo, haberme encabronado con Sam y darle una paliza. Me preocuparía si Sam leyera esto mi relación con él se viese afectada.
En los sueños, la mayoría de las veces los personajes son proyecciones de uno mismo. La forma consciente de experimentar este sueño es pensar "estoy harto de este proyecto, ya lo quiero lanzar para no volver a tocarlo", y casi inmediatamente aparece otra voz "pero nunca he lanzado un proyecto para no tocarlo de nuevo, uff habrá más trabajo por delante una vez lanzado".
Si uno quiere reprimir la segunda voz, en los sueños puede aparecer una parte violenta que puede ser muy desconcertante si se interpreta de manera literal.
La solución a esto parece ser anonimizar al personaje, Sam ya no es Sam sino Casimiro, pero hay muchos personajes que necesitan una explicación más profunda para entender cómo encaja el personaje en mi subconsciente: Sam es una persona a la que admiro profesionalmente y esta gente a menudo aparece en mis sueños para guiar mi trabajo.
Esto se torna complicado con amigos más íntimos, entre mayor intimidad mayor es la complejidad de mis interacciones. Los amigos íntimos aparecen como personajes que más cuestionan lo más profundo y a los que reaccionas con mayor agresión (o amor), y se vuelve casi imposible de anonimizar, aunque el nombre esté cambiado es fácil hilar eventos compartidos e inferir quién está detrás del nombre falso.
Es una cuestión fascinante: si un amigo me cuenta un trauma de su infancia, y yo sueño con ese trauma y lo publico, mi amigo pensará que he violado su intimidad, pero al pasar a través de mi imaginación ya no se sabe si el sueño es un eco de la realidad o de mi imaginación. O puede suceder lo contrario: si sueño que un amigo hace algo terrible que nada tiene que ver con la realidad, estoy dejando abierta la posibilidad que el lector piense que esto es un eco de la realidad.
No estoy buscando resolver esto ahora, sólo estoy pensando en voz alta. Es muy probable que los sueños interpersonales más problemáticos permanezcan en el ámbito privado.
Hace dos años <a href="https://method.ac/writing/notifications/hibernation.html">resucité Method of Action</a>. Una de las cosas que escribí en su momento fue esto [traducido y resumido del inglés]
> Antes escribía únicamente acerca de diseño. Hoy en día sigo mi curiosidad, y algunas veces esto se relaciona con el diseño. Sin embargo, me cuesta trabajo sentarme a escribir porque estoy acostumbrado a escribir únicamente acerca de lo profesional.
Fue una evolución lenta, pero ahora me siento enteramente cómodo escribiendo lo que Goethe llama _poesía del momento_: el mundo provoca impresiones que escribo a diario. La temática la pone el espíritu, no la razón.
> El diseño no ha dejado de interesarme, pero conforme mis intereses se han ampliado, no he encontrado la expresión creativa para procesarlo. Mucho de esto proviene de una crisis existencial, del sentido de identidad y cómo reducir estos fragmentos del ser a una única expresión. Reducir la ecuación interior a su expresión mínima y más elegante, por ponerlo de alguna manera.
La forma en la que implementé este impulso fue reuniendo todas mis presencias online en Method of Action, pero nunca llegué a integrarlo bien. Method of Action no ha dejado de ser un aparador donde hay juegos y herramientas de diseño, pero si pasas del mostrador al taller encontrarás a un artista trabajando en proyectos que nada hay tienen que ver con lo que se muestra al frente.
Hace semanas vengo pensando que este frente y detrás poco tienen que ver. En estos dos años sólo <a href="https://boolean.method.ac">he creado un producto</a> que he puesto en el "aparador" de Method of Action, pero no puedo decir que no he hecho otra cosa. He estado constantemente ocupado en mis exploraciones interiores y exteriores y de ninguna manera siento que haya sido tiempo perdido.
Este año me gustaría "mudar" el taller a otro lado, para hacer más espacio y dar más visibilidad a las cosas que hago, y que poco tienen que ver con el diseño (como es tradicionalmente concebido). No sé aún si será en duopixel.com o en un dominio nuevo, pero sé que usaré mi nombre más y que tendrá un enfoque más artístico que utilitario. Method of Action no vuelve a hibernar, todo lo relacionado al diseño que produzca el taller irá a parar al aparador de Method of Action.
De la fragmentación a la unidad, y de la unidad a la fragmentación. Pareciera ser un paso atrás, pero en realidad fue la concentración de la energía creativa en un sólo lugar hasta exceder sus límites, y ahora toca fluir las energías creativas a otro lugar con más espacio y libertad artística.
Si esto no está hecho para el final del año, autorizo a las mismas medidas que tengo al final de mi <a href="https://method.ac/writing/legal/privacy_policy.html">política de privacidad</a>:
> If you ever think I violated the standards I'm setting here, I give written consent that you call me a hypocrite, coward, double faced or any other insult related to a faulty character publicly, online and offline. The insults may be accompanied by mocking gestures, such as a clucking chicken or the classic finger. If I don't know why I'm being mocked, I may ask for clarification, but I will never respond in a violent way (verbally or physically). As long as physical contact is not involved, I renounce to my right to denounce you for perjury or even object to your mocking.
Prácticamente no he hecho ejercicio desde que me cerraron el gimnasio y el yoga hace cuatro meses. He observado sin mucho apuro cómo los músculos se me han ido reduciendo y el abdomen ha perdido definición. Estaba orgulloso de haber llegado a los 40 años con el mejor cuerpo que he tenido, pero también estoy orgulloso de poder dejarlo ir.
<img alt="beforeafter.jpg" src="https://method.ac/writing/uploads/beforeafter.jpg" style="display: block; max-width: 800px; margin: 0 auto" />
Tampoco es que haya habido un cambio drástico en la composición corporal, mi cuerpo se autoregula en el consumo de calorías y no experimenté ningún rebote. Pero sí hay un cambio evidente en el aspecto físico. Al inicio de la cuarentena pensé: me voy a dejar completamente natural, quiero conocerme tal cual soy, así que no voy a hacer labor alguna de mantenimiento personal:
Realmente no tenía pensado publicar esto, y a algunas personas les parecerá pretencioso, pero espero que el lector habitual entienda que así como me someto a los más profundos escrutinios del espíritu y de la mente, también lo hago del cuerpo, pero siempre he sentido cierta renuencia a compartirlo porque el mundo ya está lleno de gente fascinada con su propio cuerpo. Una chico más que postea fotos de su progreso físico no aporta nada nuevo al mundo.
Pero hay una dimensión más profunda del cuerpo, y su relación con el espíritu, el sexo y la mente. Una persona rígida en sus opiniones pocas veces es flexible en el cuerpo, una persona sensual/sensorial a menudo carga unos kilitos de más, pues el asceticismo le resulta insoportable. Las hormonas como la testosterona y el estrógeno tienen un gran impacto fisiológico y emocional.
En la práctica del autoconocimiento uno quiere alinear estos aspectos del ser armoniosamente. Tenemos una tendencia a compensar nuestras "desviaciones de la media", por lo que el hombre pequeño se erige sacando el pecho a fin de que no pasen por encima de él, el hombre naturalmente alto y robusto se joroba y se vuelve excesivamente amable a fin de no intimidar, el hombre gordo se vuelve afable a fin de evitar el desprecio, y así. Estas son desviaciones de nuestra propia naturaleza.
<img alt="beforeafter2.jpg" src="https://method.ac/writing/uploads/beforeafter2.jpg" style="display: block; max-width: 800px; margin: 0 auto" />
Esta cuarentena aproveché que no sería visto por demasiada gente para conocerme sin desviarme de quién soy. Cuando sentí que me había conocido lo suficiente, fui al peluquero y di instrucciones muy específicas de cómo quería que me recortara sin profanar la naturaleza percibida. Me gustó el resultado.
Hoy pude ponerme al corriente con mi tarjeta de crédito gracias a los <a href="https://method.ac/donate/backers/">donativos que he recibido</a> para Method of Action. Estoy muy agradecido con la gente que ha colaborado. Hace unos años era impensable para mi hacer esto, recolectar donativos me parecía de mal gusto, como el que pide limosna en la esquina.
Pero hace unos seis años, al término de mi primer sabático, se terminaron mis ahorros y comencé a trabajar de nuevo. Sentía un vacío existencial, pensaba "no necesito tanto dinero, ojalá lo pudiera cambiar por tiempo, pero como no puedo hacer eso, voy a intentar ayudar a otros con este dinero sobrante, quizás esto me de un poco de satisfacción", y me propuse donar cierto porcentaje de mi salario a personas que lo necesitaran (que incluía tanto a conocidos como a desconocidos).
No resolvió mi insatisfacción existencial, pero sí me dio unas historias muy peculiares que recuerdo con mucho afecto. Una en particular me viene a la mente:
Había una señora sin hogar que habitaba una casita de cartón sobre la calle Florencia, en el DF. La veía siempre que salía del trabajo para ir al gimnasio a la hora de la comida. No pedía dinero, pero un día me acerqué y le di veinte pesos. Me lo agradeció y tomó una manzana que tenía encima de un trapo sucio, y me preguntó si la quería. Mi primer impulso fue decirle que no, pero luego pensé "si yo siento bonito al dar, también será bonito para ella aceptar su manzana", así que la tomé, y sin pensarlo dos veces le di una gran mordida.
Nos vimos a los ojos, sonriéndonos, y sentí una dicha indescriptible.
Allí fue cuando aprendí lo bonito que es saber recibir.
Gracias.
Feliz cumpleaños Helen! Ahora acostumbro escribir lo que admiro de las personas en su cumpleaños. De ti hay mucho que admiro.
1. Tu capacidad de confrontar tus propias creencias (que experimentas como dudas existenciales) pero que en realidad son purificaciones existenciales. Se requiere mucho coraje para soltar un punto de apoyo para alcanzar uno más alto. La mayor parte de la gente se queda atorada en las mismas creencias toda la vida.
2. Tu faceta como madre. Das una cantidad increíble de atención y presencia para Nachito. No me queda duda que eres el sol, el agua y tierra fértil para él, y es precioso verlos juntos. Como chisme, Héctor comentó tu valentía y coraje como madre soltera, y Héctor no tiene piedad con nadie.
3. Tu autenticidad. Creo que en toda la familia no hay nadie que sea más cercana a su propia naturaleza que tú, y eso habrá sido infinitamente más difícil de llevar a término en tu entorno familiar que en el mío.
4. Tu calidez y cercanía con todas las personas, tu capacidad de aceptación de todo (lo tradicional así como lo poco convencional), tu curiosidad por entenderlo todo.
Cómo tenemos en común la dificultad en aceptar cumplidos, te comparto un tweet de una psicóloga famosilla que me resonó mucho:
Cuando te hagan un cumplido:
1. No lo refutes
2. No lo regreses a la persona que te lo dio
3. Haz una pausa y permite que aterrice en ti, siéntelo!
4. Pide más información para entenderlo mejor (de la misma forma que lo harías con feedback negativo)
5. Anótalo y guárdalo con otros cumplidos
Estoy pasando <a href="https://blank.page">Blank Page</a> de _vanilla javascript_ a <a href="https://svelte.dev">Svelte</a>.
Ahora que lo escribo en español, se me hace rarísimo que en inglés _vainilla_ sea sinónimo de algo sin sabor! De dónde vendrá esto, habrá que investigarlo:
<a href="https://slate.com/human-interest/2005/08/how-vanilla-became-shorthand-for-bland.html">How vanilla became shorthand for bland</a>
TL;DR; el sabor a vainilla que conocemos es artificial y los estadounidenses se lo echan a casi todo. Una traducción al español mexicano quizás sería _javascript picante_ o _javascript limón_. En España quizás sería _javascript oliva_ o _javascript jamón_.
Hablar de los aspectos técnicos de los proyectos ya no me parece interesante, pero me confronto a un mes y medio de trabajo netamente técnico. Estoy debatiendo si es necesario escribir acerca de ello. Ya lo hice antes durante los tres meses que me tomó programar el <a href="https://boolean.method.ac">Juego Booleano</a>, y cuando he vuelto a leer lo que escribí, lo único interesante es lo que _no_ es técnico.
Pero el trabajo técnico provoca ciertas cosas que son interesantes de registrar. Tengo la certidumbre que me causa una especie de autismo, el mundo material se me desvanece y descuido la casa. Mi alimentación se orienta a la practicidad, que en mi caso significa alimentarme casi exclusivamente a base de tacos de carne asada, y comer de pie, directo del sartén.
El mundo se vuelve casi enteramente mental, y escucho voces casi de una forma esquizofrénica. Me murmuro cosas y me tengo discusiones imaginarias en la cabeza. Me olvido de lavarme los dientes. Me surge una bipolaridad por horas: concentrado soy el Gran Arquitecto y programo improvisando como pianista de jazz, disperso soy el esclavo que sólo avanza a fuerza del látigo y que resiente a su amo.
Para escapar de esta locura estoy saliendo a pasear con Nina. He desistido de intentar trabajar al aire libre. Lo sabía desde que iba a trabajar a las piscinas durante el verano en Madrid, no se puede hacer otra cosa mas que contestar correos o completar pendientes de poca importancia. No tiene caso, mejor estar presente.
Hoy he pasado un buen rato en el terreno detrás de la casa, quitando hierba mala. Es buena terapia para la costosa aventura de programar. No digo que no me guste, sino que pago un costo al pasar tanto tiempo dentro de mi cabeza, y más cuando no tengo acceso al gimnasio ni al yoga, con lo que normalmente balanceo estos demonios.
Pues sí, quizás sea bueno escribir acerca de las polaridades entre la mente y el cuerpo y su función en el trabajo.
El viernes es [sábatico para mi](https://method.ac/writing/work_journal/2020-07-12_el_dia_sabatico.html). Aún así, tengo ganas de describir mi día. Anoche soñé varias cosas, entre ellas esto:
> Salí de mi cuarto, y en el pasillo me encontré a un vagabundo. Le dio vergüenza que lo encontrara ahí. Sabía que había dormido en mi closet. Le dije "voy a quitar las herramientas de ahí para que estés más cómodo".
En los sueños todos los personajes son representaciones de uno mismo, sin duda.
Mi hermana se lastimó la pierna y no puede manejar. Caminé hasta su casa y luego traje a la familia a la casa en su coche. "Espero que estén confesados", dije "tiene ocho años que tomé mi curso de manejo en un estándard, y no he vuelto a manejar desde entonces". El coche se me apagó varias veces, pero llegamos sin incidentes.
Vi con mi madre dos episodios de la serie de Hernán [Cortés]. Lo disfrutamos mucho. Está sorprendentemente bien apegada a los hechos históricos, con dos o tres licencias románticas de poca importancia. Cortés es considerado un villano en la historia de México, y me da gusto que una serie mexicana lo coloque en el arquetipo indicado (un diplomático increíblemente tenaz). El que quizás está mal representado es Pedro de Alvarado al que pintan como un ersatz-vikingo volátil, cuando sus descripciones son como un tirano de gran porte, psicópata y sanguinario. Un retrato de él dice más que mil palabras:
<img alt="Pedro-de-Alvarado.jpg" src="https://method.ac/writing/uploads/Pedro-de-Alvarado.jpg" style="max-width: 800px; display: block; margin: 0 auto;" />
Innumerables veces--en la vida así como en el trabajo--uno se confronta a situaciones que no sabe resolver. El primer impulso es el de permanecer inmóvil, permitir que otra persona intente resolverlo. Y aquí se encuentra la principal razón por la que me gusta trabajar solo: la persona inmovilizada por la ignorancia no puede evitar verter su opinión acerca de lo que está haciendo mal la persona que lo está resolviendo.
"¿Quieres hacerlo tú?"--a menudo esta pregunta logra que el inútil dejé de asediar con sus opiniones. "Sólo estoy intentando ayudar", responden. "Me ayudas más si te quedas callado, déjame concentrarme". Y luego lo miran a uno como si fuese un tirano intolerante.
La solución de problemas que no tienen respuesta evidente a menudo _requieren_ que uno realice acciones en apariencia estúpidas e inútiles: intentas encajar un tornillo donde no va, meneas algunas piezas para ver si están fijas o sueltas, y así. No estás intentando resolver el problema, estás intentando _entenderlo_.
La persona que está mirando detrás del hombro lo está haciendo precisamente porque no se atreve a equivocarse. No posee las herramientas cognitivas para confrontarse a cosas que no entiende, sin embargo, sí entiende cuando una acción es inútil, y te lo hace saber "eso no va a funcionar".
Sin embargo, a pesar de que uno trabaja solo, aún hay una parte fragmentada de uno mismo que observa y susurra exactamente lo mismo que dice el observador crítico e inútil: así no es, ahí no encaja, pero cómo vas a creer que eso va a funcionar. Si uno es interiormente iracundo, puede inclusive llegar a la violencia interior, que se manifiesta en mal cuerpo y una desazón absoluta al trabajo. Lo deja a uno tumbado en la cama como si le hubiera pasado un tractor por encima.
Si bien es cierto que cierto grado de disciplina interior es necesaria, tanto en el interior como en el exterior es un grave error actuar con violencia. En este caso el yo-crítico se vuelve sombra: los susurros ya no se experimentan como voces en el interior, sino que nos volvemos ultra-sensibles a las críticas del exterior, porque son un reflejo de nuestra parte reprimida.
El trabajo interior consiste en integrar todos los fragmentos en una sola unidad. La parte crítica es necesaria, no se le debe reprimir, pues aunque pudiésemos castrar la capacidad crítica, esto sería volver al estado infantil donde lo ingenuo tiene la misma validez que lo sublime.
A menudo es suficiente con notar esta voz: "hay algo dentro de mí que me impide explorar porque sabe que esto no va a funcionar". Y se le reafirma "pero sólo estoy explorando, ahora no quiero _resolver_, quiero _entender_". Dicho esto, aquel que mira detrás del hombro toma una actitud más relajada al problema. Lo mejor sería que permaneciera callado, sin duda, pero pasa de decir "así no es" a decir "¿y si intentas esto?".
El último par de meses he estado contactando con personas que me parecen interesantes. Es algo muy poco característico en mí, tiendo a ver por mis propias cosas y siento que la soledad me otorga mucha libertad. Pero detrás de esta sensación también hay una comodidad. Ya que en estas épocas no puedo ponerme retos físicos, me pongo retos emocionales.
Es posible que--en algún momento de mi vida--un psiquiatra me hubiese diagnosticado con <a href="https://es.wikipedia.org/wiki/Trastorno_de_la_personalidad_por_evitaci%C3%B3n">trastorno de la personalidad por evitación</a>, ahora creo que el psiquiatra diría que tengo una _tendencia_ hacia este trastorno. Pero, cuando uno inspecciona de cerca las herramientas que usan los psicólogos y psiquiatras para diagnosticar trastorno de la personalidad, es evidente que _el emperador está desnudo_, la medición de la personalidad mediante cuestionarios es un concepto ridículo.
Basta con encontrar un cuestionario estandarizado oficial que se usa como instrumento de medición, y aplicarlo en una persona que uno conoce más o menos bien. Puede contener afirmaciones como "soy el alma de la fiesta" o "siempre soy puntual" o "es importante exponer la verdad, aunque sea incómoda", y luego se califica qué tanto uno concuerda con esa afirmación, en una escala de Likert (del 1 al 5).
Cuando uno aplica este instrumento a una persona conocida, a menudo se sorprende de las respuestas: la gente contesta con toda honestidad cosas diametralmente contrarias a su personalidad. Normalmente tiene que ver con auto-conceptos deseables: exponemos quienes queremos ser, no quienes somos realmente. Exponer a nuestra consciencia a esta realidad causaría conflicto interior, por lo tanto se coloca en un punto ciego ¿Cómo podemos pedir a alguien que nos exponga su personalidad, si esa persona no se conoce a si misma?
Con esto no quiero decir que las pruebas de personalidad sean inútiles, sólo que existen hace poco más de 70 años, lo cual es un micro-instante en la escala del conocimiento humano, y que queda mucho por discernir no sólo acerca de cómo medir la personalidad, sino de cómo entenderla.
Mi sensación es que--si fuésemos expuestos a una gran cantidad de estrés o trauma durante un tiempo prolongado--desarrollaríamos algún tipo de "trastorno de la personalidad" como método para lidiar con este estrés.
---
Comencé a escribir esto como una descripción de mi labor acercándome a gente que me parece interesante, y luego he terminado por hacer una descripción de los trastorno de la personalidad. Parece ser una evasión a escribir mis sensaciones acercándome a la gente. Es necesario salir de la jaula del ego, y el ego se escuda en las discusiones intelectuales.
Hice una cita con un diseñador que me parece muy auténtico, inteligente y que compartimos muchos intereses, para charlar por zoom. No llegó a la cita, mi primera sensación fue:
"Pues que se vaya a la verga, al final yo soy el que le da ese privilegio, yo soy más reconocido que él". Identifiqué este pensamiento narcisista como una forma de lidiar con el rechazo percibido.
Luego: "Él no da la importancia que yo doy a una cita porque hacer una cita es algo bastante inaudito en mi persona, hace falta recordarle que teníamos una cita". Así lo hice. No hubo respuesta.
Luego: "Esto es una señal de que mis esfuerzos por conectar con otras personas es erróneo, piensa que soy uno de esos dudes random que sólo hacen perder el tiempo. Es mejor usar mi tiempo construyendo cosas que atraigan el tipo de gente con la que quiero conectar".
Luego: "Es mi primera experiencia negativa intentando conectar con otras personas, ¿porqué provoca una sensación desmedida que me hayan dejado plantado?".
Y me fui a meditar con estas sensaciones y pensamientos y los pude observar como son: aguas turbulentas. El ego es una barca que navega en estas aguas, cuando medito lo observo desde la profundidad. Sin duda el rechazo interpersonal me causa más turbulencia de lo que ocasiona en la persona promedio, pero no destruye el barco del ego, ni hace falta refugiarse en un puerto tranquilo y plácido.
El espíritu pide navegar por el océano y otorgarle a esta aventura lo expone a turbulencias difíciles de navegar. La vida plácida me aburre, quiero más de esto para aprenderlo a navegar. Cuando se disculpó al siguiente día por haberse olvidado, esto fue lo que contesté (reescrito para mayor claridad):
> No te preocupes, nos olvidamos de las citas cuando las aceptamos por compromiso, y quizás he sido algo insistente. Además, el tiempo con tu hijo es claramente prioritario.
> No creo que tengamos que reagendar la cita. El momento correcto de tener esta conversación es cuando te despierte la curiosidad lo que yo estoy haciendo y lo exponga públicamente. Pero sigo abierto a la conversación cuando venga de tu propia iniciativa y curiosidad.
Hoy el mar se ha calmado ya.
Hoy medité más de lo que trabajé. Llegué muy profundo, me vino una memoria del maestro Sufí al que visitaba en la Sierra de Gredos, lo había olvidado completamente! Le pregunté "¿para qué sirve el ego?", y respondió "el ego es indispensable para la búsqueda, es el que carga la llave para abrir el corazón". No entendí la respuesta en su momento, y por eso lo había olvidado. Otros caminos apuntan al mismo fenómeno. El Tao dice "en la meditación, sumérgete en lo profundo del corazón". El cuarto camino dice "repite 'yo soy' hasta que lo escuches venir desde el corazón".
Cuando vivía en Madrid asistí por primera vez a un grupo que practicaba las enseñanzas de Silo, un maestro espiritual Argentino. La maestra se mostró consternada cuando llegué, "vamos a hacer un ejercicio muy difícil, es posible que te parezca extraño" me dijo. Le aseguré que no se preocupara, que me gustan los retos, y me dieron la bienvenida.
Dieron las instrucciones: formaríamos grupos de seis personas, y uno se pondría al centro. A la persona del centro había que insultarle de la forma más cruel posible, con el propósito de que se enfadara. El propósito del ejercicio era sentir el enfado pero no permanecer en él, aprender a lidiar con las emociones.
Primero pasó una chica con de lentes. Como ya es conocían entre los asistentes era más fácil para ellos. "Uy te crees mucho con tu maestría, pero eres una ignorante", la chica se río. "No te debes reir, es otra forma de sacar la emoción" dijeron. "cuatro ojos", "mira que pelo tan feo tienes", "ni te sabes vestir", la chica se ponía roja e intentaba no reirse.
Así pasaron varios hasta que fue mi turno. Me pidieron disculpas por adelantado, se sentían más cómodos insultando a sus compañeros porque había confianza, pero yo era un recién llegado. "Por favor, no se limiten, yo rara vez me enfado y necesito que hagan su mejor esfuerzo". Les gustó mi actitud.
"Mira este sudaca, se siente español pero no es mas que un indio", "mírale el pelo, ya se le ve toda la calva", y así varios insultos inconsecuentes. "Échenle más ganas, de verdad que me quiero enfadar", les dije. Pasó la maestra y pidieron ayuda. La maestra me miró a los ojos y pareció medirme "este chico se siente mucho, pero no sabe nada, ni sabe seguir instrucciones, le dije que llegara quince minutos antes para registrarlo, pero no lo hizo, no entiende y ni se da cuenta de su incompetencia".
Los insultos de mis compañeros los había sentido poco atinados para ofenderme. Sólo el que me conoce bien es capaz de poner el cuchillo donde hay carne, y estos estaban atestando golpes donde sólo había ropa. La maestra sí pareció rozar algo, pero no lo suficiente para despertar mi enojo, o al menos así lo percibí yo.
"Tienes un bloqueo en el corazón" me dijo. Te disocias de ti mismo para lidiar con los insultos. El problema de esto es que no puedes escapar del sentir las cosas malas sin dejar de sentir las cosas buenas también. En el momento no lo quise creer, pero luego de procesarlo un poco tuve que admitir que tenía sentido, pues era una persona hermética tanto para lo bueno como para lo malo.
Esa misma noche cuando me fui a la cama, soñé que iba al psiquiatra. El doctor tenía la pared llena de diplomas detrás de él. Yo le aseguraba que estaba ahí por equivocación, que yo era una persona perfectamente cuerda y que se lo podía demostrar. "A ver, muéstreme esas libretas que tiene ahí". Eran mis diarios. Los deslizaba hasta el otro lado de la mesa. El psiquiatra los ojeaba con rostro burlón, "pero qué mamadas son estas, jajaja! Y dice que está cuerdo! Jajajaja! Está loco como una cabra!".
La cabeza casi me explotaba del encabronamiento y la vergüenza que sentía simultaneamente. Le grité hasta de lo que se iba a morir y desperté con una horrible sensación de querer estrangular a alguien.
Me quedó una sensación de haber cuarteado la coraza que envuelve al corazón. Sin duda, ahora tengo mayor capacidad de sentir que en aquel entonces, pero aún hay trabajo por hacer. La llave para abrir el corazón la carga el ego porque es un trabajo que se hace deliberadamente. La meditación a menudo la hacemos para refugiarnos de las emociones difíciles, y es excelente para ello, pero hace falta el ego para proponer entrar dentro del corazón a explorar las sensaciones desagradables. La exploración de nuestro centro emocional nos trae una mayor capacidad para amar, para experimentar lo sublime, para vivir la vida de lleno.
Hace dos días, Nina, la perra, amaneció inexplicablemente triste. "Estará enferma"--pensé. Apenas comió, no pidió sus paseos del día (que son dos), y se la pasó echada. Llegó mi sobrino de visita y me sorprendió que se diera cuenta, el niño de cinco años preguntó "¿porqué está triste Nina?" sin que yo mencionara el asunto.
Ayer se invirtieron los papeles. Amanecí con tal dolor existencial que creí estar enfermo. Me senté a trabajar, pero no pude hacer lo más mínimo. Nina parecía estar repuesta y quería dar un paseo, así que resolví ir al mercado con ella. Corrió con bríos inusitados mientras que yo arrastraba los pies al caminar. Tenía un leve dolor de cabeza, pero además de eso no podía describir otra sensación a la que los angloparlates llaman "feeling on the edge", una sensación de ansiedad y malestar sin motivo aparente.
Pensé: "la forma de distinguir entre la enfermedad espiritual y la enfermedad corporal es a través del vicio, si fumo un cigarro suelto sabré la respuesta", así que me acerqué al kiosko a comprar uno. El alivio fue tal que no dejó lugar a dudas. Volví a casa y pasé la mayor parte del día dormido.
Luego hoy, al igual que Nina, he despertado en la mejor de las disposiciones. Que cosa tan extraña es esto. Ayer intentaba repasar las razones de mi malestar, hoy recuerdo que hace un año me solía pasar esto mucho más a menudo, y <a href="https://method.ac/writing/work_journal/work_log_day_1030.html">lo entendía como el clima</a>: algunos días son nublados, otros son soleados. Intentar predecir o encontrar razón del clima es inútil.
Para entenderse es necesario dejar de intentar entenderse.
Hoy me encontré sufriendo el más terrible de los dolores existenciales, a tal punto que me pregunté si no estaría enfermo. Tenía un dolor de cabeza ligero, el cansancio era infinito, y el trabajo fue imposible. Decidí ir al mercado a hacer la compra y pensé "si compro un cigarro suelto y me proporciona el alivio que creo que me va a proporcionar, no es enfermedad sino dolor existencial".
Me fumé el cigarro y sentí tal alivio que en cuanto me lo terminé sentí ganas de fumarme otro, lo cual no hice, sino que cargué las bolsas del mandado que me parecieron el doble de pesadas de lo que llevaban. Volví a casa, dormí, me levanté, me hice de comer, me volví a dormir, ack, esta sensación tenía por lo menos un año que no la sentía.
Hay algo removiéndose dentro, parece que las meditaciones de apertura del corazón de ayer me están obligando a lidiar con trauma no procesado. Siento grandes deseos de ir a comprar marihuana, mi ansiolítico y analgésico de preferencia, pero al mismo tiempo percibo que esta enfermedad espiritual es un maestro, y no debo callar al maestro.
***
Acabo de terminar una llamada imporvisada por zoom con un amigo al que no veía hace años. Hablamos de proyectos, de viajes, de sueños. Me alivió el momento, pero casi inmediatamente volví a mi pesadumbre existencial.
No tiene caso publicar esto, mejor guardarlo.
Los últimos días he estado intercambiando correos con un posible cliente que necesita una customización de <a href="https://editor.method.ac">Method Draw</a>. A menudo estos tipo de intercambio no llegan a ningún lado porque son gente no técnica que no tiene la más mínima idea de cuánto tiempo lleva adaptar un producto hecho a sus necesidades--"Está muy padre tu editor, sólo que lo quiero usar para una tienda online de camisetas, así que necesito integrar una librería con mis diseños y luego que el lienzo sea en forma de camiseta y que cuando escalas un diseño no exceda estos bordes y...". No es que no se pueda hacer, es que--aunque el cliente tuviese los recursos para pagar todas las horas requeridas para lograrlo--no quiero pasar los próximos dos años programando una tienda de camisetas.
Entonces siempre que me llega alguien preguntando si estoy disponible para customización, contesto que estoy disponible siempre y cuando el proyecto abarque entre 2 y 20 horas. Luego, cuando contesto que no, se ve que contratan a programadores de la India que luego me asedian con preguntas. Mantener Method Draw online no me ha supuesto mas que pérdidas de tiempo y a veces pienso que sería mejor retirarlo por completo.
Sin embargo, este editor de vectores lo usan mucho en escuelas, y tiene la nada despreciable cantidad de <a href="https://editor.method.ac/stats.html">3,000 visitas diarias</a> en estas fechas, pero en temporada escolar anda en 6,000 - 8,000, y luego pienso que me gustaría que cayera algún cliente que pudiera financiar un poquito de desarrollo.
Este cliente tenía un caso de uso muy peculiar: hizo hardware para estéticas en el que, mediante el uso de un proyector, proyectaba cejas sobre el rostro del cliente, y luego un técnico dibuja las cejas de la forma deseada. A pesar de lo específico de su caso de uso, lo principal que necesita es una herramienta para reflejar la ceja en espejo, y quitar varios elementos de interfaz no necesarios para su caso de uso, por lo que fuimos buen match y voy a dedicar algunas horitas a Method Draw.
Por otra parte, ayer <a href="https://svelte.dev">Svelte</a> finalmente comenzó a hacer click en mi cabeza. Pasé lo peor de la curva de aprendizaje y comencé a fluir programando <a href="https://blank.page">blank.page</a>. Clave en esto fue dejar de intentar hacer todo bien y simplemente enfocarme en las funciones básicas para que la interfaz funcione. Por ejemplo, al principio quería retener la traducción español/inglés y la librería para hablar con Firebase, pero cuando decidí prescindir de estas dos cosas no sólo comencé a avanzar mucho más rápido, sino que trabajar en Svelte se volvió placentero, y acabé el día con mucho mejor estado de ánimo.
Interiormente, es muy peculiar observar estos altibajos de ánimo, esperanza y concentración. Cambian según la hora del día, y requieren de una cantidad inusitada de meditación. Anotaré mi práctica de meditación actual, que va cambiando conforme voy descubriendo cosas por dentro.
---
{{Práctica de meditación 2020}}
Este es mi "paseo interior" actual, el cual anoté para contrastarlo con mi <a href="https://method.ac/writing/work_journal/2019-07-25_camino_log_markina_ziortza.html">práctica hace un año</a>, pero ahora que me releo, veo que no estaba tan estructurado. En el interior uno va encontrando paseitos placenteros que repite, pero uno nunca debe de dejar de explorar.
Hace varios años fui por primera vez a casa de un amigo. Junto con unos amigos tomé un taxi, y al entrar al fraccionamiento, el policía preguntó a dónde nos dirigíamos. "Vengo a ver a Miguel en el tercero A", dije. El policía me vio sospechosamente y dijo:
--"El tercero A no existe en este fraccionamiento jóven".<br />
--"Pero Miguel A. sí vive aquí? Vengo a verlo".<br />
--"No puedo proporcionarle esa información".<br />
--"Entiendo, déjeme llamar... Miguel, cual es tu dirección? Tres A? Pero eso le dije...".<br />
--"Ah ese sí, el Tres A sí existe", dijo mientras levantaba la pluma.
Nos quedamos con la boca abierta mientras el taxista decía en voz alta "Pero como hay gente tan pendeja!". A mi me recordó un robot humano, como un formulario web en el que si no introduces los datos exactamente como lo espera el sistema, te devuelve un error indefinido.
Cada vez que hay un avance en la inteligencia artificial hago una comparación con este ejemplo. En aquel momento no existían los agentes inteligentes, de haber sido un guarda automatizado es probable que cometiera el mismo error, pero luego que salió Siri pensé "ese policía tiene los días contados porque no está usando sus facultades humanas".
La mayor parte de los empleos en la base de fuerza laboral las deberían hacer robots. La creatividad y el sentido común se disuaden proactivamente en favor de procesos estandarizados y mecánicos. Un empleado de MacDonalds tiene que limpiar los pisos cada tres horas, sin importar si el suelo está sucio. Sería mejor que lo hiciera un roomba. Mucho se habla de que nos van a venir a quitar el empleo, pero a menos que uno encuentre significado en la comunidad (como en una prisión) este tipo de empleo destruye el alma.
Con los avances impresionantes detrás de GPT-3, a los creativos nos pone nerviosos que la inteligencia artificial parece estar sobre nuestros talones. Si GPT-3 genera cosas tan aparentemente creativas sobre el lenguaje textual, sólo está a un paso de entrar en el lenguaje visual.
Este tipo de inteligencia artificial infiere patrones a partir de un cuerpo de entrenamiento. Me ha llevado a pensar en los sistemas de diseño, uno podría diseñar unos pocos elementos y el equivalente visual de GPT-3 inferiría el sistema a partir de los ejemplos. Es parecido al la mecánica de trabajo que tiene un diseñador senior con otro junior. El diseñador senior puede diseñar una pantalla y a partir de ahí el junior infiere el resto de pantallas.
Otra cosa que algo como GPT-3 haría fácilmente es cambiar entre estilos. Si le doy el logo de Figma y le muestro todos iconos nuevos de Big Sur, quizás podría inferir cómo hacer la conversión de estilo.
<img alt="figma.png" src="https://method.ac/writing/uploads/figma.png" style="width: 100%;" />
Es aquí donde muchos diseñadores nos ponemos nerviosos: ya no basta con encontrar inspiración, _nosotros_ tenemos que crear la inspiración para que la inteligencia artificial haga el trabajo mecánico. En esencia, todos seremos diseñadores senior, y la parte que aún no entiendo es: ¿cómo llegaremos a ser senior sin pasar por el junior? ¿Cómo entrenamos nuestra inteligencia visual sin interiorizar el proceso de un _maestro_ diseñador?
Esto sólo es un esbozo de las implicaciones que voy viendo con GPT-3 y de los avances en inteligencia artificial. La gran mayoría del trabajo que se hace en el diseño actual es _talacha_ agrupar y disponer de elementos bajo un sistema interiorizado, que luego se hace explícito en código.
Voy a formular el problema de manera que lo pueda meditar:
Actualmente el trabajo manual es la forma en la que el aspirante a diseñador entrena su inteligencia visual. Si ya no hay trabajo manual, ¿cómo se entrena la inteligencia visual?
Ayer resucité el proyecto de <a href="https://github.com/methodofaction/Method-Draw/">Method Draw en GitHub</a>. La última vez que lo toqué seriamente fue hace unos seis años, y lo recordaba mucho más esotérico de que lo en realidad es.
Lo reestructuré completamente para establecer un nuevo método de compilación, pues el anterior se hacía mediante un _Makefile_, y aunque muchos programadores de la vieja escuela me dicen que esta es la forma correcta de hacerlo, es un poco como decir que la forma correcta de vestirse es yendo al sastre a que le hagan a uno un traje a la medida.
Los pormenores de esta tarea provocarán lágrimas de aburrimiento en el lector. Basta decir que quité todo lo que no servía, actualicé algunas imágenes para dar soporte a monitores retina, y eché un ojo a algunas _pull requests_ que me habían hecho hace años para rescatar alguna cosilla de utilidad, cerré _issues_ que me parecían irrelevantes, y pulí el _readme_.
Lo más difícil fue evitar meter la mano en la caja de pandora. Hay miles de cosas qué resolver en este repositorio, pero no puedo comenzar algo que no voy a terminar. Mi tarea es muy específica: dejar todo listo para hacer una modesta personalización para un cliente. Al cliente le dije que esta tarea de resucitación no se la iba a cobrar, que es un poco como la tarea de arrancar un tractor viejo, pero lo que se cobra es la tarea del arado.
En el ámbito personal percibo un profundo deseo de caminar macerándose. Echo de menos España de una forma muy peculiar, estoy viendo la serie de <a href="https://en.wikipedia.org/wiki/Hern%C3%A1n_(TV_series)">Hernán</a> y cuando veo imágenes de España me surgen recuerdos de tanta inspiración que sentía en mis caminatas, pero cuando las proyecto en México no puedo evitar sentirme algo ridículo. El ser extranjero te da cierta licencia (auto-impuesta) a comportarte de forma excéntrica, pero cuando me imagino caminando en México, esa excentricidad se manifiesta más bien como ridículo. Es una cosa bien curiosa.
A fin de conectar mis caminatas en España con mis futuras caminatas mexicanas, estoy jugando con la idea de completar la Ruta de Cortés, y caminar desde la costa del Golfo de México hasta la Ciudad de México. No hay un camino trazado como tal, pero encontré <a href="http://ri.uaemex.mx/bitstream/handle/20.500.11799/6622/A%20pie%20por%20la%20ruta%20de%20Cort%C3%A9s.pdf">un libro en formato de PDF</a> de un profesor de la UNAM que lo recorrió a pie, y este precedente me facilita muchísimo la tarea.
Por la situación actual del virus, y la temporada de lluvias, lo más temprano que podría comenzar este viaje sería en noviembre, pero quizás sea mejor pensarlo para inicios del 2021. Como este no es un camino de Santiago con albergues, tendría que prepararme mejor. Hay mucho tiempo. Veremos cómo madura este anhelo.
La diarrea ha sido terrible. Dudo mucho que el lector quiera saber los pormenores del progreso de mi enfermedad. En lugar de ello, relataré otra historia relacionada.
Hace unos siete años me sucedió algo similar. Estaba pasando más horas de mi tiempo despierto _dentro_ del baño que fuera de él. Algo andaba bastante mal. Siempre googleo mis síntomas antes de ir al doctor, para comparar su diagnóstico con el mío. Sí, al principio uno siempre cree tener cáncer, pero con la práctica afinas los términos de búsqueda y encuentras cómo ser más objetivo con tus propios síntomas. Diría que--con la ayuda de Google--tengo 90% de certidumbre en mi diagnóstico.
En aquella ocasión mi conclusión fue que estaba padeciendo <a href="https://www.who.int/es/news-room/fact-sheets/detail/salmonella-(non-typhoidal)">salmonelosis</a>, pero--según leí--la única forma de verificarlo era mediante estudios de laboratorio. Había uno cerca de donde vivía en ese entonces, entre Chapultepec e Insurgentes.
--"Ejem, quiero hacerme un estudio de heces fecales".<br />
--"Querrá decir un estudio coprológico o coproparasitológico, ¿trae usted la receta?".<br />
--"Vengo por cuenta propia" dije, sobándome la nuca con vergüenza.<br />
--"Pues supongo que el corpoparasito... es para parásitos no? Ese no, el otro. O bueno, supongo que me pueden hacer los dos con la misma muestra, cierto?"<br />
--"Así es".<br />
--"Pues dígame ¿cómo traigo la muestra?"<br />
Sacó tres frasquitos de plástico en donde tendría que "colocar" la muestra de la primera emisión de la mañana durante tres días. ¡Tres días! "¿No basta con uno?" No señor, estos estudios requieren tres muestras. La naturaleza explosiva del problema haría de ello una tarea difícil, pero lo hice, y volví al tercer día a entregar mis muestras. Para colmo de males, una chica guapa recibió e inspeccionó visualmente mis vasitos de chocolate frente a mi.
Los resultados estarían listos en tres días, así que llevaba una semana adicional de sufrimientos en el baño. Recogí los estudios a primera hora de la mañana, y volví a casa para _googlear_ los resultados: una cantidad anormal de <a href="https://www.google.com/search?q=klebsiella+pneumoniae+feces&oq=Klebsiella_pneumoniae+fecal&aqs=chrome.1.69i57j0l2.7549j0j4&sourceid=chrome&ie=UTF-8">Klebsiella pneumoniae</a> y de leucocitos que indicaban una infección, pero esta podía ser de varios tipos, salmonelosis incluida. Así que no obtuve resultado conclusivo.
Resolví que sería mejor buscar la ayuda de un especialista. Hice una cita que me dieron para la siguiente semana, pero mejoré en ese lapso, así que la cancelé. No me repuse del todo, pero a menudo uno queda sentido de la enfermedad y tarda en volver a la normalidad.
Todo parecía progresar conforme lo que esperaba, pero un mes después volvió la diarrea, y esta vez--harto de perder el tiempo--acudí directo al doctor sin cita, con mis estudios en la mano.
--"Doctor, hace un mes tuve una diarrea horrible, sospeché Salmonelosis, me hice estos estudios, pero creo que no los supe interpretar, porque nunca di con lo que estaba padeciendo".
Se puso las gafas y miró los papeles "hmmmm sí, aquí indica una infección, a ver, acuéstate". Me oscultó la barriga, preguntando dónde sentía dolor, o nausea. Varios lugares resultaron muy sensibles a la presión que iba a aplicando.
"Hmmm mira, sí, lo más probable es que hayas pasado por Salmonelosis y lo que estás sufriendo ahora es una repercusión de la infección original. El problema es que la salmonelosis no se detecta con un estudio coprológico, se detecta con un estudio de sangre". Me puse pálido.
--"No me diga eso doctor, ¿pasé una semana entera en el baño, y cagué en esos horribles vasitos de a gratis?"<br />
--"Sí. Bueno, al menos ya sabemos que no tiene parásitos".<br />
La lección es clara: cuando sospeches salmonelosis, hazte estudios de sangre.
Anoche me agarró un aguacero cuando iba en la bici. Llegué a casa completamente empapado. Hoy me sentí mal, con <a href="https://method.ac/writing/work_journal/17-03-2019_work_log_fever_driven_design.html">ese zumbido en los oídos</a> que <a href="https://method.ac/writing/work_journal/17-03-2019_work_log_fever_driven_design.html">invariablemente siento cuando me enfermo</a>. Pero esto definitivamente no es una gripe, puesto que es el estómago es lo que tengo deshecho. También me duelen algunas articulaciones.
Se supone que, a pesar de lo que nos dicen nuestras madres, mojarse no es motivo de enfermedad, sino que el sistema inmune se deprime, y tenemos toda clase de virus y bacterias dentro de nosotros esperando ese momento de flaqueza en la salud para hacer de las suyas. Esto no exime de que sea COVID el patógeno oportunista, por supuesto.
Voy a esperar un par de días adicionales, tomando precauciones de cuarentena estricta, para ver cómo evoluciona esto. Hoy estuve durmiendo la mayor parte del día, ¡no sabía que podía dormir tanto! y tengo esa sensación febril, pero no puedo asegurar tener fiebre, pues no tengo un termómetro en casa. Hay una depresión a la que soy bastante indiferente, pero me despierta curiosidad haberlo notado que hace unos días vengo sintiendo como preludio <a href="https://method.ac/writing/work_journal/2020-07-29_dias_nublados.html">malestar existencial</a>.
La dualidad cuerpo/mente parecen desvanecerse cuando el espíritu las integra. Hay mucho que tengo que escribir acerca de este tema, pero es puramente especulativo. Quizás en un par de décadas observando mi salud mental y física pueda decir algo al respecto. Mientras, observo.
Hoy estuve largo rato trabajando en una personalización de Method Draw para un cliente que tiene unos requerimientos bastante particulares: este cliente quiere armar un dispositivo de hardware + software para hacer video mapping sobre el rostro de personas, proyectando cejas que un estilista acomoda en Method Draw, y cuando queda satisfecho las dibuja con un lápiz. Al más puro estilo startupero, este es su primer cliente y si sale bien el experimento luego intentará venderlo a más estéticas. En mi charla con él por Zoom hubo muy buena química y la intuición de colaboración fue un rotundo sí, que en mi es muy raro.
¡Qué difícil es encontrar buenos clientes! El cliente a menudo es el peor enemigo del buen diseño. Yo ya me he dado por vencido: si tengo un cliente mi propósito no es hacer buen diseño, si resulta bueno es porque el cliente tuvo suficiente presupuesto y no intervino demasiado. Mi propósito es dejar al cliente satisfecho y llevarme algo de dinero al bolsillo para financiar mis proyectos personales en los que pueda crear cosas bajo mis propios términos.
Sin duda hay diseñadores con la tenacidad, autoridad o colmillo para llevar al cliente a la decisión correcta--lo he visto con mis propios ojos. Pero el costo emocional es altísimo: hay conflicto, manipulación, postureo, negociaciones estresantes. El cliente se quiere disparar en el pie y uno forcejea con él intentando convencerle que es una pésima idea!
Por eso me resulta mucho más fácil el trabajo de desarrollo cuando trabajo con clientes. El dilema moral del tren que arrolla gente inocente se presenta como una buena alegoría:
> Un tranvía corre fuera de control por una vía. En su camino se hallan cinco personas atadas a la vía por un filósofo malvado. Afortunadamente, es posible accionar un botón que encaminará al tranvía por una vía diferente, por desgracia, hay otra persona atada a ésta. ¿Debería pulsarse el botón?
Y luego se contrasta con la siguiente situación:
> Como antes, un tranvía descontrolado se dirige hacia cinco personas. El sujeto se sitúa en un puente sobre la vía y podría detener el paso del tren lanzando un gran peso delante del mismo. Mientras esto sucede, al lado del sujeto sólo se halla un hombre muy gordo; de este modo, la única manera de parar el tren es empujar al hombre gordo desde el puente hacia la vía, acabando con su vida para salvar otras cinco. ¿Qué debe hacer el sujeto?
El diseñador que diseña algo mal porque el cliente lo quiere así, es el que empuja al gordo para detener el tren. El desarrollador que implmementa algo mal diseñado, es el que aprieta el botón. Las víctimas, en ambos casos, son los usuarios. Las cinco personas atadas son el ego del cliente.
La persona que quiero ser, es la que no tenga que confrontarse a estos dilemas por dinero.
Cada día mejor del estómago. Cuando enfermo no puedo evitar estar continuamente monitoreandome. Pensé: para qué escribo el worklog, pues sería hipócrita de mi parte escribir sensaciones ajenas a las del momento, porque ni siquiera tengo disposición para ello. Si voy a escribir, que sea de cagar.
Y preferí no escribir.
Pero el día de hoy me encuentro recuperado, y la enfermedad lleva a reflexionar acerca de la salud: ¿qué es "sentirse saludable"?
Enérgico, energía cuya fuente no es emocional.<br>
Despejado. Simple. En armonía.<br>
Enraizado. Presente.
Los síntomas espirituales son difíciles de ver cuando uno se observa a si mismo. Es más fácil que otra persona que lo pueda ver por ti, cuando te dicen "no hagas mucho esfuerzo, estás pálido todavía", están hablando de tu condición espiritual, no física.
Pero es importante conocer el estado espiritual para llevar a término la enfermedad. Uno no puede pretender que--como ya no tiene síntomas--puedes hacer tu vida como sin nada, ignorando por completo la salud del espíritu.
Con esto no aconsejo quedarse en casa viendo películas. La fuente de inspiración de este texto fue la visita a un gimnasio que legalmente no debía estar abierto. Que la primera tarea del cuerpo recuperado sea la de salvar de la flacidez al espíritu.
Llevo unos días escribiendo en cuaderno y he redescubierto la libertad--pero también honestidad, detrás de la letra manuscrita. Es la forma más honesta de comunicarse. No permite ediciones. Uno obliga al lector a acompañarlo en sus dilucidaciones.
He de decir: he trabajado más bien poco, el espíritu parece traer una semana de retraso con respecto al cuerpo, pero lo percibo recobrándose. He de admitir: sentí anhelo de un cambio grande, a veces es necesario descansar hasta hartarse, para retomar bríos, y esto es a lo que me he dedicado los últimos días.
Solía escribir mejor en manuscrita (según recuerdo), espero recobrar habilidad conforme haga este ejercicio. Creo que entiendo el compromiso: es necesario ser completamente honesto, y las hojas vienen numeradas, así que no las puedo arrancar. Me gusta el ejercicio, pero que no se convierta en vanidad, por el momento es sólo sentarme a escribir lo que causan las impresiones del día, el resultado de la experiencia.
Pero la experiencia es personal, para anotar mi trabajo tendría que hacer pública la interacción con mi familia, y eso no lo voy a hacer. Por lo tanto, en lo público lo personal es fuente de inspiración. Es necesario hacer poesía para transmitir ese saber--pero yo qué sé--socrático. ¿Cómo puedo transmitir una sensación en un aforismo?
¿Qué sucede en mi cuando desprecio a alguien?
Un deseo de sometimiento, según la teoría Adleriana. Despreciar a alguien es una reverenda pérdida de tiempo porque es entrometerse en la tarea de los demás. Cualquier pensamiento de desprecio hacia el prójimo es una terrible enredadera que hay que arrancar de raíz.
> Despreciar es meterse en la tarea de los demás
Ese es el aforismo que estaba buscando. Me gusta.
Voy a intentar este formato unos días más. Me gusta la sensación de no poder retroceder en mi camino, que es la misma regla que tengo para explorar el mundo físico: evita pisar tus propias huellas, no vuelvas por donde llegaste (a menos que te encuentres en una situación de emergencia).
Sólo hay tanto qué escribir en un día, y el día de hoy ha terminado.
<img src="https://method.ac/blog-images/20201508-page1.JPG" style="width: 50%" ><img src="https://method.ac/blog-images/20201508-page2.JPG" style="width: 50%" >
Hay días en los que despierto sin saber qué es lo que tengo que hacer. Creo que el trabajo y la escuela siempre marcan esa pauta: hay que estar presente en tal lugar a tal hora para llevar a cabo determinada actividad.
Creo que la gente lo asocia con un sentido de propósito, "si bien sé que este trabajo no es mi propósito de vida, me asiste en llevar a cabo mis propósitos de vida", aunque lo mejor es que propósito y trabajo estuviesen empatados. Rara la persona cuyo propósito también llena las arcas, puesto que la aceptación de remuneración conlleva responsabilidad. Es una forma de atadura.
Pero miro mis propias opciones y considero que va siendo tiempo de darme un empujón de "inversión en uno mismo", esto sería: definir mi presencia en internet, o mejor dicho, definir quién soy. En términos prácticos hacer un _about_, si no de Mark MacKay entonces de Method of Action. La tarea más difícil ¡sin duda! Pero intentémoslo.
¿Es necesario separar Method of Action de Mark MacKay?
En principio y en experiencia, es necesario comenzar desde cimientos nuevos. No me atrevo a jerarquizar el "aparador de mi tienda" con mis propias pertenencias personales, como las páginas de esta libreta. Evidentemente la respuesta (que viene en forma de intuición) es: _sí, es necesario un nuevo comienzo bajo otros cimientos.
Es "otra cosa".
En el pasado he intentado consolidar todas mis presencias, porque suelo concentrarme sólo en una. Está bien tener presencias estáticas--eso, no se pueden postergar los nuevos cimientos de algo enteramente distinto. Estas libretas habrán de ser prueba de ello.
No hay tarea en la que haya procrastinado más que en la definición de quién soy. Me he observado con cuidado y cada vez termino más perplejo: ¡pero si todo lo que soy son imaginaciones!¿Cómo cuento quién imagino que soy yo? A un artista que busca la honestidad y la belleza en la expresión le son permitidas toda clase de licitaciones. En la búsqueda de lo perfecto se pasa por mucha imperfección, y esta libreta misma es prueba de ello.
En mis divagaciones místicas se intuye otra forma de pensar. Hay gente que creo que ya posee esta forma de pensar, porque son como una manifestación viviente de lo divino. Me gustaría atreverme a dar nombres, pero no lo haré. Hay quienes brillan con luz divina, y su ejemplo es el mejor maestro. Su acción, no su conferencia o su nuevo libro.
Uno naturalmente desea brillar con esa luz.
¿Es posible?
<img src="https://method.ac/blog-images/20200816-page1.jpg" style="width: 100%" >
<img src="https://method.ac/blog-images/20200816-page2.jpg" style="width: 100%" >
<img src="https://method.ac/blog-images/20200816-page3.jpg" style="width: 100%" >
Algunos días sólo se escribe como método para provocar que los nubarrones interiores suelten agua. No hace falta transcribir los rituales para llegar a ello. el propósito era esclarecerme para escribir un _about_ personal. Esto fue lo que resultó:
---
I take a deep breathe in, exhale.
I detest this task.
To define myself.
Definitions are boundaries.
As soon as I see a boundary I wish to transgress it.
The rules that I put myself are rules meant to be broken,
but underneath the rebellious nature of this insight,
lies a deeper way of doing things,
rather than performing a futile attempt at inner control,
the detached mind observes the forces at play without intervention.
Without attention, all insight goes to waste.
With senses heightened, one perceives within:
Where does the "I" exist?
Does it come from the head?
Today it exists in the heart.
I have not learned how to remain there,
and I still arrive by trial and error,
but I can come to exist in the heart,
an aching can be felt,
but who is not reeling lately,
is it really pain?
no, look more closely: it is yearning.
Yearning for what?
That is the question.
Where does this yearning want to go?
To be reunited with the one?
The way of reunion is art.
That would make me an artist,
But a failure of courage has been observed,
in which I constantly put off my responsibility,
to share the insights of this great journey.
The journey is never complete without embodying it.
Let actions speak louder than words.
Who am I?
I am what I do.
<img src="https://method.ac/blog-images/20200817-page4.JPG" style="width: 40%;" />
<img src="https://method.ac/blog-images/20200817-page3.JPG" style="width: 40%;" />
<img src="https://method.ac/blog-images/20200817-page2.JPG" style="width: 40%;" />
<img src="https://method.ac/blog-images/20200817-page1.JPG" style="width: 40%;" />
<div class="article-body">
<p><em>Ahora estoy intentando editar a partir de lo que escribí, así que el texto concuerda en su mayoría con el manuscrito, pero no del todo</em> </p>
<p>Escribir en el gimnasio es la cosa más peculiar. Lo comencé a hacer cuando noté que hacer ejercicio ayuda a pensar con mayor claridad. Llegan más <em>insights</em>.</p>
<p>Han sido cuatro meses prácticamente sin hacer ejercicio. En este descanso he notado lo necesario que es para el funcionamiento correcto de la mente. Es la cosa más peculiar: me puedo llevar un problema importante al gimnasio, y a través de la práctica del ejercicio el problema se resuelve a sí mismo: si es un problema interpersonal, toma su debida perspectiva debido a la regulación emocional natural del ejercicio.</p>
<p>A veces comienzo a trabajar en la mañana, y no puedo resolver un problema. Me llevo el ordenador al gimnasio, y después de mi sesión me siento a trabajar en las mesas que están afuera. Es literalmente ver el problema con otros ojos, la relación emocional con el problema ya no es de frustración y desesperación. Se recobra el enfoque y las cosas suelen resolverse por si mismas.</p>
<hr>
<p>La segunda parte es una deliberación respecto a cómo dividir mi presencia online. Llegué a la siguiente conclusión:</p>
<ol start="1">
<li><p>Necesito un lugar donde poner mi “stream of thought”, mi actividad diaria. Esto reemplaza los work logs. Para esto compré el dominio https://inner.observer/ </p></li>
<li><p>Necesito un lugar donde colocar mi trabajo exploratorio. Esto es, las cosas que voy haciendo en el “taller”. Pueden ser proyectos de diseño, programación, espirituales, intelectuales, etc. Se vale comenzar y abandonar proyectos, pero es necesario documentarlos. Para esto compré el dominio: https://exploration.work</p></li>
<li><p>Method of Action pasa a ser un repositorio de “herramientas y artículos relacionados con el diseño”. Duopixel se incorpora a Method of Action. En el futuro puede haber más “aparadores” (dominios nuevos) donde se van colocando las cosas comenzadas en exploration.work.</p></li>
</ol>
<hr>
<p>Catálogo de plantas indeseables en el jardín.</p>
<p><img src="https://method.ac/blog-images/20200818-page1.JPG" style="width: 45%">
<img src="https://method.ac/blog-images/20200818-page2.JPG" style="width: 45%">
<img src="https://method.ac/blog-images/20200818-page3.JPG" style="width: 45%">
<img src="https://method.ac/blog-images/20200818-page4.JPG" style="width: 45%">
<img src="https://method.ac/blog-images/20200818-page5.JPG" style="width: 45%"></p>
</div>
<pre>
Entre mis textos random encontré una lista de personajes famosos de la historia,
sólo sé que viene de <a href="https://ybogdanov.github.io/history-timeline/">este proyecto</a> pero
desconozco la forma en la que está ordenada, y parece que abarca un periodo específico de tiempo.
Se me hizo buen ejercicio para enterarse de lo que uno mismo no sabe. No importa cuanto sepamos,
la ignorancia siempre será mayor a nuestro conocimiento.
<strong>Key:</strong>
▫▫▫▫▫ Never heard about 'em or just heard the name.
▪▫▫▫▫ I know the name and historical context
▪▪▫▫▫ Can name a few works and its importance in history
▪▪▪▫▫ Read a couple of second hand accounts of the work
▪▪▪▪▫ I have experienced the work of art in person
▪▪▪▪▪ Not a scholar but has resonated with me
★ I'm ready to level up
▪▪▪▫▫ Napoleon Bonaparte
▪▪▫▫▫ William Shakespeare
▪▪▪▪▪ Muhammad
▪▪▫▫▫ Voltaire
▪▫▫▫▫ Francis Bacon ★
▪▪▪▫▫ Aristotle
▪▪▪▪▪ Johann Goethe
▪▫▫▫▫ Julius Caesar
▪▪▫▫▫ Martin Luther
▪▪▪▪▪ Plato
▪▫▫▫▫ Napoleon III
▫▫▫▫▫ Edmund Burke ★
▪▪▫▫▫ Homer
▪▪▪▫▫ Isaac Newton
▪▫▫▫▫ Cicero
▪▪▫▫▫ John Milton
▪▪▫▫▫ Alexander the Great
▫▫▫▫▫ Pitt ★
▪▪▫▫▫ George Washington
▫▫▫▫▫ Augustus ★
▫▫▫▫▫ Wellington ★
▪▫▫▫▫ Raphael
▪▪▪▫▫ Rene Descartes
▪▪▪▫▫ Christopher Columbus
▪▪▪▫▫ Confucius ★
▫▫▫▫▫ Penn ★
▫▫▫▫▫ Scott ★
▪▪▫▫▫ Michelangelo
▪▪▪▪▪ Socrates
▪▪▫▫▫ Byron ★
▫▫▫▫▫ Cromwell
▪▪▪▫▫ Gautama
▪▪▫▫▫ Immanuel Kant ★
▪▪▫▫▫ Gottfried Leibniz ★
▫▫▫▫▫ John Locke ★
▪▫▫▫▫ Demosthenes ★
▫▫▫▫▫ Mary Stuart ★
▪▫▫▫▫ John Calvin
▫▫▫▫▫ Moliere ★
▪▪▫▫▫ Abraham Lincoln
▫▫▫▫▫ Louis Philippe
▪▪▫▫▫ Dante
▪▪▫▫▫ Jean Rousseau ★
▪▫▫▫▫ Nero
▪▪▪▪▪ Benjamin Franklin
▪▪▫▫▫ Galileo Galilei
▫▫▫▫▫ Samuel Johnson
▫▫▫▫▫ Robespierre
▫▫▫▫▫ Frederick the Great
▪▪▪▪▪ Marcus Aurelius
▪▪▫▫▫ Hegel ★
▫▫▫▫▫ Petrarch ★
▪▫▫▫▫ Horace ★
▪▫▫▫▫ Charles V. (Germany)
▫▫▫▫▫ Mirabeau
▪▪▫▫▫ Erasmus ★
▪▫▫▫▫ Virgil
▪▫▫▫▫ Hume ★
▫▫▫▫▫ Guizot
▫▫▫▫▫ Edward Gibbon
▪▪▫▫▫ Blaise Pascal ★
▫▫▫▫▫ Bossuet
▪▫▫▫▫ Thomas Hobbes ★
▪▪▪▪▪ Jonathan Swift
▫▫▫▫▫ Thiers
▫▫▫▫▫ Louis XIV
▫▫▫▫▫ William Wordsworth
▫▫▫▫▫ Louis XVI
▫▫▫▫▫ Nelson
▫▫▫▫▫ Henry VIII
▫▫▫▫▫ Joseph Addison
▪▫▫▫▫ Thucydides ★
▫▫▫▫▫ Fox
▫▫▫▫▫ Racine
▪▪▫▫▫ Friedrich Schiller ★
▫▫▫▫▫ Henry IV (France)
▫▫▫▫▫ William Herschel
▫▫▫▫▫ Tasso
▪▫▫▫▫ Thomas Jefferson
▪▫▫▫▫ Ptolemy ★
▪▪▪▫▫ Augustine ★
▫▫▫▫▫ Alexander Pope
▪▪▪▪▫ Niccolo Machiavelli
▪▪▪▫▫ Emanuel Swedenborg ★
▫▫▫▫▫ Philip II
▪▪▫▫▫ Leonardo da Vinci ★
▫▫▫▫▫ George III
▫▫▫▫▫ Julian
▪▪▪▫▫ Pythagoras ★
▫▫▫▫▫ Macaulay
▪▪▪▫▫ Rubens
▫▫▫▫▫ Burns
▪▪▫▫▫ Mozart ★
▪▪▫▫▫ Humboldt ★
▫▫▫▫▫ Auguste Comte ★
▫▫▫▫▫ Cousin
▫▫▫▫▫ Georges Cuvier
▫▫▫▫▫ Justinian
▫▫▫▫▫ Euripides ★
▫▫▫▫▫ Camoens
▫▫▫▫▫ Talleyrand
▫▫▫▫▫ Fenelon
▫▫▫▫▫ Thomas Carlyle
▫▫▫▫▫ Pius IX
▫▫▫▫▫ Pitt
▫▫▫▫▫ More
▪▫▫▫▫ Hannibal
▪▪▪▫▫ Benedict Spinoza ★
▫▫▫▫▫ Chateaubriand
▫▫▫▫▫ Peter Abelard
▫▫▫▫▫ Grant
▫▫▫▫▫ Charles I (England)
▪▪▪▪▪ Charles Darwin
▫▫▫▫▫ Mazarin
▫▫▫▫▫ Lord Bolingbroke
▫▫▫▫▫ Elizabeth (England)
▪▫▫▫▫ Ovid
▪▫▫▫▫ Joan d'Arc
▫▫▫▫▫ Livy
▫▫▫▫▫ Corneille
▫▫▫▫▫ Rabelais
▫▫▫▫▫ Huss
▫▫▫▫▫ a' Becket
▫▫▫▫▫ Jean d' Alembert
▫▫▫▫▫ Grotius
▫▫▫▫▫ Peter I
▪▫▫▫▫ Polo
▪▪▪▫▫ Carl Linnaeus
▫▫▫▫▫ Raleigh [John Strutt]
▫▫▫▫▫ Palmerston
▫▫▫▫▫ Lamartine
▫▫▫▫▫ Jos. Bonaparte
▫▫▫▫▫ Tennyson
▫▫▫▫▫ Plutarch
▪▫▫▫▫ Charlemagne
▪▫▫▫▫ Aristophanes
▫▫▫▫▫ Philipp Melanchthon
▫▫▫▫▫ St. Ambrose
▫▫▫▫▫ Richelieu
▫▫▫▫▫ James I.
▫▫▫▫▫ John Hunter
▪▫▫▫▫ Victor Hugo
▫▫▫▫▫ Disraeli
▫▫▫▫▫ Dryden
▫▫▫▫▫ Origen
▪▫▫▫▫ Titian
▪▪▪▫▫ Boccaccio
▫▫▫▫▫ Alberoni
▫▫▫▫▫ Lessing
▪▫▫▫▫ Johann Fichte
▫▫▫▫▫ Etienne Condillac
▪▫▫▫▫ Dickens
▫▫▫▫▫ Wallenstein
▪▫▫▫▫ Friedrich Schelling
▪▪▪▪▪ Durer
▫▫▫▫▫ Charles VII
▪▪▫▫▫ Kepler
▪▫▫▫▫ Trajan
▫▫▫▫▫ Knox
▫▫▫▫▫ Constantine
▫▫▫▫▫ Jean La Fontaine
▫▫▫▫▫ Van Dyck
▪▪▪▫▫ Cervantes
▫▫▫▫▫ Germaine Stael
▪▫▫▫▫ Hippocrates
▫▫▫▫▫ Louis XVIII
▫▫▫▫▫ Clive
▪▫▫▫▫ Rembrandt
▪▫▫▫▫ Denis Diderot
▪▫▫▫▫ Geoffrey Chaucer
▪▪▪▪▫ Michel Montaigne
▫▫▫▫▫ John Napier
▫▫▫▫▫ Sand
▫▫▫▫▫ Marmont
▫▫▫▫▫ Tiberiius
▫▫▫▫▫ Peel
▫▫▫▫▫ Francis I (France)
▫▫▫▫▫ Nicholas I
▫▫▫▫▫ William I
▪▪▪▫▫ John Mill
▫▫▫▫▫ Sophocles
▪▫▫▫▫ John Adams
▫▫▫▫▫ Webster
▫▫▫▫▫ Athanasius
▫▫▫▫▫ Richard Bentley
▫▫▫▫▫ Savonarola
▫▫▫▫▫ Marlborough
▪▫▫▫▫ J. Cook
▪▪▫▫▫ Seneca
▫▫▫▫▫ Zwingle
▫▫▫▫▫ Cavour
▫▫▫▫▫ Buffon
▫▫▫▫▫ Goldsmith
▫▫▫▫▫ Brougham
▫▫▫▫▫ Alexander VI
▫▫▫▫▫ Gerson
▫▫▫▫▫ Alexander I (Russia)
▫▫▫▫▫ Louis XV
▫▫▫▫▫ Roger Bacon
▫▫▫▫▫ Pericles
▪▫▫▫▫ Herodotus
▪▫▫▫▫ Hadrian
▫▫▫▫▫ Humphry Davy
▫▫▫▫▫ Frederick II (Germany)
▫▫▫▫▫ Catherine II
▫▫▫▫▫ Conde
▫▫▫▫▫ B. Jonson
▫▫▫▫▫ Antony
▫▫▫▫▫ Lucretius
▪▫▫▫▫ Pompey
▫▫▫▫▫ James II (England)
▫▫▫▫▫ Canning
▫▫▫▫▫ Strafford
▪▪▫▫▫ Mencius
▫▫▫▫▫ La Feyette
▫▫▫▫▫ Alexander Hamilton
▫▫▫▫▫ Alfred the Great
▫▫▫▫▫ Pierre Gassendi
▪▪▪▪▪ Hernán Cortés
▪▪▫▫▫ Ludwig Beethoven
▫▫▫▫▫ L. Bonaparte
▫▫▫▫▫ Sevigne
▪▪▪▪▪ Xenophon
▫▫▫▫▫ Wycliffe
▫▫▫▫▫ Alfieri
▫▫▫▫▫ Charles X (France)
▫▫▫▫▫ William Harvey
▫▫▫▫▫ Marius
▫▫▫▫▫ Juvenal
▫▫▫▫▫ Firdousee
▪▪▫▫▫ Johannes Gutenberg
▪▪▫▫▫ Lope de Vega Carpio
▫▫▫▫▫ Pierre Laplace
▫▫▫▫▫ Garibaldi
▫▫▫▫▫ Necker
▫▫▫▫▫ Froissart
▫▫▫▫▫ Arius
▫▫▫▫▫ Aeschylus
▫▫▫▫▫ Etienne
▪▪▫▫▫ Epicurus
▫▫▫▫▫ Mithradates
▫▫▫▫▫ Isocrates
▫▫▫▫▫ Jerome
▫▫▫▫▫ Andrew Jackson
▫▫▫▫▫ Canova
▫▫▫▫▫ Atterbury
▫▫▫▫▫ Bulwer
▫▫▫▫▫ Joseph Gay-Lussac
▫▫▫▫▫ Wilhelm I. (Prussia)
▫▫▫▫▫ Barthold Niebuhr
▫▫▫▫▫ Fielding
▫▫▫▫▫ George IV
▫▫▫▫▫ Albrecht Haller
▫▫▫▫▫ Friedrich Schleiermacher
▪▫▫▫▫ James Watt
▫▫▫▫▫ St. Bernard
▫▫▫▫▫ William III
▫▫▫▫▫ Joinville
▫▫▫▫▫ Francois Arago
▫▫▫▫▫ Fouche
▫▫▫▫▫ Handel
▫▫▫▫▫ Edmund Spenser
▫▫▫▫▫ Joseph Lagrange
▪▫▫▫▫ Johann Herder
▪▪▪▪▪ Velázquez
▫▫▫▫▫ Robert Bunsen
▪▫▫▫▫ Alcibiades
▫▫▫▫▫ De Foe
▫▫▫▫▫ Hastings
▫▫▫▫▫ Colbert
▫▫▫▫▫ Metternich
▫▫▫▫▫ Richard I.
▫▫▫▫▫ Tertullian
▫▫▫▫▫ Lamennais
▫▫▫▫▫ Leo X
▫▫▫▫▫ Cobde
▫▫▫▫▫ Gustavus Adolphus
▫▫▫▫▫ Christoph Wieland
▫▫▫▫▫ George Berkeley
▫▫▫▫▫ John Law
▫▫▫▫▫ Maintenon
▫▫▫▫▫ Cranmber
▫▫▫▫▫ Samuel Coleridge
▫▫▫▫▫ Chrysostom
▫▫▫▫▫ Beza
▫▫▫▫▫ Murat
▫▫▫▫▫ Mazzini
▫▫▫▫▫ Marquis de Condorcet
▫▫▫▫▫ Polybius
▫▫▫▫▫ Ariosto
▫▫▫▫▫ Chatterton
▪▫▫▫▫ Phiny (Elder)
▫▫▫▫▫ Turgot
▫▫▫▫▫ Tacitus
▫▫▫▫▫ Nicolas Malebranche
▫▫▫▫▫ John of England
▫▫▫▫▫ Danton
▫▫▫▫▫ Chalmer
▫▫▫▫▫ Germanicus
▫▫▫▫▫ Joseph Haydn
▫▫▫▫▫ St. Basil
▫▫▫▫▫ William of Orange
▫▫▫▫▫ Longfellow
▫▫▫▫▫ Philip IV
▫▫▫▫▫ Sully
▫▫▫▫▫ Christiaan Huygens
▫▫▫▫▫ Louis VI
▪▫▫▫▫ Charles Montesquieu
▫▫▫▫▫ Eugene
▫▫▫▫▫ Charles II (England)
▫▫▫▫▫ Bernadotte
▫▫▫▫▫ A. Severus
▫▫▫▫▫ Klopstock
▫▫▫▫▫ Innocent III
▪▫▫▫▫ Zoroaster
▪▫▫▫▫ Attila
▫▫▫▫▫ G. Monk
▪▪▫▫▫ Adam Smith
▫▫▫▫▫ Ney
▫▫▫▫▫ Victor Emmanuel
▫▫▫▫▫ Prescott
▫▫▫▫▫ Pindar
▫▫▫▫▫ Beranger
▫▫▫▫▫ Gregory VII
▫▫▫▫▫ Beaumarchais
▫▫▫▫▫ Rossini
▫▫▫▫▫ Jeremy Bentham
▪▫▫▫▫ Drake
▫▫▫▫▫ Moreau
▪▫▫▫▫ Michael Faraday
▫▫▫▫▫ Boetius
▪▫▫▫▫ Thomas Moore
▫▫▫▫▫ S. Clarke
▫▫▫▫▫ Channing
▫▫▫▫▫ Alexander II (Russia)
▫▫▫▫▫ Maria Theresa
▫▫▫▫▫ Richard Wagner
▫▫▫▫▫ Joseph Priestley
▪▫▫▫▫ Josephine
▫▫▫▫▫ Thackeray
▪▫▫▫▫ Nicolaus Copernicus
▫▫▫▫▫ Blucher
▫▫▫▫▫ Soult
▫▫▫▫▫ Maximilian
▫▫▫▫▫ Sadi (or Lazare) Carnot?
▫▫▫▫▫ Philo
▪▪▫▫▫ Averroes
▪▫▫▫▫ Calderon (de la barca?)
▪▫▫▫▫ Bolivar
▫▫▫▫▫ Sulla
▫▫▫▫▫ Ali-weli-zade
▫▫▫▫▫ Le Sage
▫▫▫▫▫ Heinrich Heine
▪▫▫▫▫ Robert Boyle
▪▪▪▪▫ Loyola
▫▫▫▫▫ Marie Antoinette
▫▫▫▫▫ Wesley
▫▫▫▫▫ Poussin
▫▫▫▫▫ Winckelmann
▫▫▫▫▫ Turenne
▫▫▫▫▫ R.B.B. Sheridan
▫▫▫▫▫ Weber
▫▫▫▫▫ William Hamilton
▪▫▫▫▫ Avicenna
▫▫▫▫▫ Anthony Shaftesbury
▫▫▫▫▫ Bright
▫▫▫▫▫ Catullus
▫▫▫▫▫ Herman Boerhaave
▫▫▫▫▫ C. Grey
▫▫▫▫▫ Leopold I. (Germany)
▫▫▫▫▫ William Irving
▫▫▫▫▫ Henry IV (Germany)
▫▫▫▫▫ Tamerlane
▫▫▫▫▫ Massena
▫▫▫▫▫ Retz
▫▫▫▫▫ B. Constant
▫▫▫▫▫ Reuchlin
▫▫▫▫▫ Sainte-Beuver
▫▫▫▫▫ Baxter
▫▫▫▫▫ K.W. Humboldt
▫▫▫▫▫ Jenner
▫▫▫▫▫ Justus Liebig
▫▫▫▫▫ Philip II (Germany)
▪▫▫▫▫ Thomas Aquinas
▫▫▫▫▫ Dumouriez
▫▫▫▫▫ Murillo
▫▫▫▫▫ Lucian
▫▫▫▫▫ Agassiz
▪▫▫▫▫ Mehemet Ali
▫▫▫▫▫ Thomas Wolsey
▫▫▫▫▫ Solon
▫▫▫▫▫ Jansen
▪▫▫▫▫ Antoine Lavoisier
▫▫▫▫▫ R. Walpole
▫▫▫▫▫ Hogarth
▫▫▫▫▫ Derby
▫▫▫▫▫ Bichat
▫▫▫▫▫ Sherman
▫▫▫▫▫ Frederick W. III (Prussia)
▫▫▫▫▫ St. Simon
▫▫▫▫▫ Wilkes
▫▫▫▫▫ Phidias
▫▫▫▫▫ Philip Augustus
▫▫▫▫▫ Moses Mendelssohn
▫▫▫▫▫ Boniface VIII
▫▫▫▫▫ Cobbett
▫▫▫▫▫ Jean Bailly
▪▫▫▫▫ Emerson
▫▫▫▫▫ Joseph II (Germany)
▪▪▪▪▫ Russell
▫▫▫▫▫ Vauban
▫▫▫▫▫ Ferdinand V. (Spain)
▫▫▫▫▫ Bayle
▫▫▫▫▫ Archimedes
▫▫▫▫▫ Christina
▫▫▫▫▫ Scipio
▫▫▫▫▫ Thou
▫▫▫▫▫ T. Fairfax
▫▫▫▫▫ Metastasio
▫▫▫▫▫ Louis IX
▫▫▫▫▫ L. Hopital
▫▫▫▫▫ Marat
▫▫▫▫▫ Guicciardini
▫▫▫▫▫ Jacob Berzelius
▫▫▫▫▫ Akbar
▫▫▫▫▫ Sarpi
▫▫▫▫▫ Marcus Varro
▫▫▫▫▫ Armeniuis
▫▫▫▫▫ Vergniaud
▫▫▫▫▫ Bayard
▫▫▫▫▫ Gregory I. (Pope)
▫▫▫▫▫ Louis XIII
▫▫▫▫▫ Beaton
▫▫▫▫▫ Wilberforce
▫▫▫▫▫ Tieck
▫▫▫▫▫ Andrews
▫▫▫▫▫ Lycurgus
▫▫▫▫▫ O'Connell
▫▫▫▫▫ Burnet
▫▫▫▫▫ Reynolds
▫▫▫▫▫ Seward
▫▫▫▫▫ J. Franklin
▫▫▫▫▫ Galen
▫▫▫▫▫ A. Dumas
▫▫▫▫▫ Alarie
▫▫▫▫▫ Campanella
▫▫▫▫▫ Arnauld
▫▫▫▫▫ Honore Balzac
▫▫▫▫▫ Plautus
▫▫▫▫▫ a' Kemple
</pre>
Subí a la azotea a escribir. Dentro de la casa hace un frío que cala los huesos. Increíble pasar agosto con frío. He echado mucho de menos el calor de España estos días. Recuerdo que lamentaba la pérdida del verano desde antes que llegara, pero con el tiempo y la experiencia he comprendido que cada estación tiene su forma de encanto. En Puebla la temperatura es muy regular todo el año y echo de menos las estaciones. Aquí hay temporada de lluvia y no lluvia.
Acabo de hablar con René respecto a los siguiente pasos de <a href="http://blank.page">Blank.page</a>. Llegamos a un acuerdo respecto a cómo movernos hacia adelante, pues hubo un mal cálculo con mi enfermedad y luego una reconsideración de factores para aplicar mejor nuestras aptitudes y gustos personales en el trabajo. Ya he estado trasteando con servidores, pero volvemos al área de expertise que es interacción, hacer juegos, divertirnos un poco!
Lo que resta de Agosto lo quiero invertir en mis proyectos personales. Hace falta acomodar muchas cosas en mi presencia online, con la incorporación de inner.observer y exploration.work. De hecho, debería comenzar ya. Iré al gimnasio, dejaré la ropa en la lavandería, pasaré a comprar cosas al super... es mejor prescindir de la bici. ¿Qué quiero lograr en estos 10 días respecto a mi presencia online? Buena pregunta para el gimnasio.
---
Conforme entraba a la plaza comercial donde se encuentra el gimnasio, salió una chica hermosa con un smoothie de Starbucks en la mano. Se la regaló al policía, que sudaba bajo el sol del medio día. La escena me conmovió, particularmente en el ambiente hostil actual. Quedé flechado por la chica, evidentemente. Es cierto lo que dice Sócrates, en cuanto vemos belleza queremos adueñarnos de ella.
Pero pensé "¿soy parte de este evento?--o--¿soy testigo?" y lo percibí claramente: soy testigo. Y con ello me vino una satisfacción muy sencilla de haber evidenciado algo hermoso sin intervenir en ello.
---
Las metas para hoy ya están cumplidas: <a href="https://inner.observer">inner.observer</a> y <a href="https://exploration.work">exploration.work</a> están online (pero desnudas aún)
[Bla, bla, bla]
La tarea de encontrar lo que uno realmente quiere hacer es la más difícil de las tareas, pero si uno lo encuentra, debe dejar atrás toda obligación no esencial en la búsqueda de esa inspiración.
<img src="https://method.ac/blog-images/20200819-page1.JPG" width="50%" ><img src="https://method.ac/blog-images/20200819-page2.JPG" width="50%" >
He estado leyendo "Civilization" de Kenneth Clark, y algunos comentarios me resuenan a ese dicho de Hermas Trismegisto: como es arriba es abajo, como es adentro es afuera. Habla de la "fuerza revitalizadora del conflicto" pues algunas civilizaciones que prescindieron de ella se quedaron "cristalizadas", y por ende, mal adaptadas al mundo siempre cambiante.
Parece haber una necesidad de conflicto para iniciar un cambio, y esto aplica tanto en la escala del individuo con en el de la sociedad. Sin embargo, lo más curioso es que a menudo la fuerza opositora al status-quo termina revitalizando o modernizando la institución disputada. Esto es: no hubo mayor benefactor de la iglesia católica que Lutero, pues teniendo el monopolio de la salvación, la iglesia católica había degenerado sus modos, a tal grado que parecía imposible reformarla.
Y como dice Clark: el nuevo catolicismo no fue un "medio protestantismo" sino que revitalizó la proyección de sus símbolos (el arte) con el barroco. Creo que estoy navegando las mismas estrellas que Javier Cañada me señaló el año pasado.
El individuo también tiene que trascender este mismo conflicto interiormente: hay dos fuerzas, arquetipizadas en el ángel y el diablo, Apolo y Dionisio, pero nótese la maestría de la grecia antigua al integrar a Dionisio en un arquetipo vividor más que de maldad. El que vive la sensualidad y la sensibilidad.
El tao diría: ambos, Apolo y Dionisio son expresiones del Tao, acepta lo que viene con resolución, la transcendencia de toda dualidad requiere una vigorosa sacudida de realidad.
<img src="https://method.ac/blog-images/20200821-page1.JPG" style="width: 50%" ><img src="https://method.ac/blog-images/20200821-page2.JPG" style="width: 50%" >
Estoy en la azotea. He vuelto del gimnasio. Puse mi mat de yoga en el suelo.
¡Cuánto hace que no hago yoga! ¡y como lo echo de menos! Pero no disfruto hacerlo solo. Quizás porque no lo he hecho bajo las circunstancias adecuadas. Pareciera que en las asanas hay koans. La respuesta no la encuentras a través de la razón, la encuentras en el cuerpo mismo.
Cuando uno se encuentra en una situación tanto física como psicológica, esta tiene una manera de resolverse. Pensemos en la posición que la une a todas: perro mirando hacia abajo (Adho Mukha Svanasana).
En el cuerpo se perciben fuerzas dinámicas. Uno no sabe exactamente cómo funcionan, intenta dominarlas a través de la imitación, pero la imitación no sirve para el entrenamiento del cuerpo, hay que percibir la esencia del propósito de "hacer yoga", que no es mas que entender al cuerpo desde el cuerpo mismo. Esta postura nos permite descansar mientras sentimos las energías sutiles que se vienen con la activación del cuerpo.
He hecho adho mukha y estoy más tieso que una tabla. Habrá que volver a estirar. Que cosa más peculiar. Sin duda el cuerpo almacena recuerdos. El cuerpo se acuerda y le es muy placentero. Dice Jodorowsky que el cuerpo es el alma porque es el contenedor de los tres centros. Me intrigó mucho este comentario, peus es un sacrilegio y al mismo tiempo, sin conocer a Jodorowsky parecería un comentario desatinado, pero viniendo de esta fuente uno se ve obligado por lo menos a cuestionarse: qué es el alma.
Volvemos al dicho de Hermes Trismegisto: Como es arriba, es abajo, y como es adentro, es afuera. El alma es el contenedor de todo lo metafísico dentro de mi, el cuerpo es el alma material de todo lo físico dentro de mi.
<img src="https://method.ac/blog-images/20200822-page1.JPG" style="width: 50%" ><img src="https://method.ac/blog-images/20200822-page2.JPG" style="width: 50%" ><img src="https://method.ac/blog-images/20200822-page3.JPG" style="width: 50%" ><img src="https://method.ac/blog-images/20200822-page4.JPG" style="width: 50%" >
Hoy mi madre me pidió poner a Alejandro Jodorowsky en YouTube. Le puse [[un episodio de Carta Blanca|https://www.youtube.com/watch?v=-0MYId3xoS0]] en el cual Jodorowsky funge el papel de entrevistador. Al principio del programa aclara cuál es su intención: quiere hacer entrevistas para sanar.
El primer participante es Santiago Segura, que parece deslumbrado por momentos de que Jodorowsky lo lleva por caminos tan íntimos: "¿te sientes querido, Santiago"--"Ehhh... sí claro... por mis amigos", contesta como dudoso de su propia honestidad. "¿Amor?"--lo confronta Jodorowsky "Jeje, bueno, alguna amiga...", responde casi en el personaje de Torrente.
A Jodorowsky se le ve honestamente fascinado con Santiago Segura, lo celebra como una gran expresión del Tao: a través de la fealdad se puede llegar a la belleza y a lo sublime. "¡Deberías de ser crítico de cine!", ríe en otro momento Segura, después de recibir tantos halagos.
En cierto momento discuten la psicomagia, y Jodorowsky dice no se deben romper los lazos familiares, se deben hacer actos psicomágicos que actúan como contraveneno de esos lazos. Para un padre tóxico, por ejemplo, recomienda quemar una foto del padre tóxico y beber las cenizas con agua.
Luego dijo "¿Qué haces con una madre invasora?", y mi madre se volvió a verme. Yo alcé las cejas y dije: a ver qué nos dice. "En un altar colocas una foto de tu madre, dentro de una jaula. De vez en cuando le dejas un poquito de comida. De esta forma alimentas a la madre y obtienes independencia". Nos reimos. Mi madre se paró a buscar un huacalito donde colocar una foto de ella ¿en serio mamá? si si no quiero ser yo la que impida que consigas novia.
Nos reimos. Se me ocurrió que en la reja metálica donde cocinamos las verduras podría ser buen lugar en lo que encontramos un mejor reemplazo, pero luego lo pensé bien y le dije "mamá, ¿sabes qué? cuando termine la cuarentena, ahora qué caso tiene, si conozco te aviso y ya está, para qué ahora. Mi madre concedió de mala gana.
Luego insistió en lavarme la mochila. Yo dije que no, pero insistió en lavarla. La vació toda, y en un rinconcito recóndito aparecieron dos fotos tamaño infantil de mi madre. Corrió a traérmelas, "¡Mark, mira lo que encontré!", eran para su pasaporte, dos fotos pequeñas iguales donde se le ve muy estresada. Nos reímos mucho y las metimos en la rejilla de las verduras, que luego pusimos en el altar de la casa.
No sé cómo tomarlo mas que como experimento: le pondré comida y estaré atento a lo que me muestra el mundo. Si hace un par de días decidí que era testigo, quizás ahora decida ser partícipe. ¡Pero me gusta tanto mi independencia! Shhh... Sólo hace falta observar.
<img src="https://method.ac/blog-images/20200823-page1.JPG" style="width: 50%" ><img src="https://method.ac/blog-images/20200823-page2.JPG" style="width: 50%" ><img src="https://method.ac/blog-images/20200823-page3.JPG" style="width: 50%" >
> Leo trocitos de lo que he escrito y me sorprendo: ¿yo he escrito eso? a veces es superficial, a veces es profundo, otras porque fue escrito sin ganas y otras porque son demasiadas ganas. Sin embargo, las únicas entradas de las que me arrepiento son de las que no escribí.
> Honestamente ya me he cansado de transcribir mis propias divagaciones, a veces el pensamiento es pura textura y no es necesario tanto escrutinio, pero los beneficios de siempre cargar una libreta y hacerla pública, creo que es algo que merece la pena
<img src="https://method.ac/blog-images/20200824_page1.JPG" style="width: 50%" ><img src="https://method.ac/blog-images/20200824_page2.JPG" style="width: 50%" >
Esas conversaciones que saltan de un lado a otro, que se tienen con gente que es dispersa, que no tienen consciencia del flujo y propósito de la conversación... Eso mismo cargamos en la mente todo el tiempo, salta de un lado a otro y no nos damos cuenta de ello. Es en estos momentos que la atención necesita llegar a lo que el cuerpo está haciendo. Es volver al presente
<img src="https://method.ac/blog-images/20200825_page1.JPG" style="width: 50%" ><img src="https://method.ac/blog-images/20200825_page2.JPG" style="width: 50%" >
Estoy espeso hoy. Seguiré mi rutina de ejercicio. Parece que hoy se trata de mantener la mente en silencio.
<img src="https://method.ac/blog-images/20200826_page1.JPG" style="width: 50%" >
> Hoy tuve una meditación respecto al amor: me acepto y me quiero incondicionalmente. Entonces, parece que la tarea es extender este sentimiento, al menos una vez que... no, siempre. A todo mundo ofrezco mi aceptación y amor incondicional. Pero esto no se puede alcanzar racionalmente, se tiene que poner en práctica.
<img src="https://method.ac/blog-images/20200827_page1.JPG" style="width: 50%" >
> No sé cómo dar forma a lo que hago, espero que la información que recabe se organice mágicamente, pero supongo que con el tiempo y la constancia la arquitectura de definirá a si misma.
<img src="https://method.ac/blog-images/20200827_page1.JPG" style="width: 50%" >
Ahora que he releido un montón de lo que he escrito, quiero escribir más del tipo de cosas que aprecio leer meses o años después: el registro de eventos que tienen una repercusión intelectual o emocional en el alma. Pero, al mismo tiempo, he estado tan ensimismado que pareciera que falta la fricción del mundo que es necesaria para causar una agitación interior que revele algo que no sé acerca de mi mismo.
Pareciera que, cuando a un amigo nos llama y nos pregunta con entusiasmo "¿cómo va todo?" y respondemos "todo bien, como siempre", hay una carencia de fricción que haga que algún evento parezca relevante. Una fricción puede ser "estoy bien, pero la semana pasada murió mi perro" o "todo muy bien, ¡conocí a alguien!", pero la mayor parte del tiempo estamos tan inmersos en la rutina que al voltear a ver lo que hemos hecho, pareciera que nada sobresale, todo va "como siempre". Es algo que podría responder un astronauta que llevara semanas en el espacio, no importa lo extraño que sea la vida de uno, siempre hay un "normal" en esa vida.
No es que ayer no haya eventos fuera de lo ordinario, pero son eventos fuera de lo ordinario exteriormente, si no causan una agitación, se puede decir que los eventos pasan sin causar fricción. Esto, como muchas otras cosas en la vía espiritual, paradójicamente puede ser un síntoma de algo positivo o algo negativo. Negativo, cuando no permitimos que los hechos del día nos transformen porque estamos en un estado de conservación, con resistencia al cambio. Positivo, cuando nuestro interior se ha acomodado de tal forma que se encuentra estable, y las fricciones del mundo no ocasionan desacomodos.
El ensimismamiento causa que las preocupaciones que uno experimenta tengan que ver con el //yo//, y las fricciones del mundo parecen distantes. Pero esta situación es insostenible, pues se experimenta una especie de estancamiento. La vida interior se alimenta de la luz del mundo exterior, por lo que no es buena idea permanecer en estado de introspección durante demasiado tiempo.
Hoy será mi primera clase de yoga en casi cinco meses. El estudio pidió que no dejásemos nuestras esterillas ahí como acostumbrábamos, sino que la lleváramos y trajéramos todos los días que fuésemos a clase.
Compré una bolsa para la esterilla en Amazón, que resultó ser unos cuatro centímetros más pequeña de lo necesario, así que la tendré que devolver. Pero, viendo las otras opciones que tenía en Amazon, y considerando que podría pasar por el mismo problema debido a las dimensiones del tapete, decidí recurrir a una tía a la que le gusta la costura para que me ayudara con el problema.
Obviamente no tiene ningún mérito creativo, pero más creatividad que hacer click en un producto de Amazon, sí que lo es. Luego me pareció tan divertido que dibujé una parrilla para cotizar con el herrero.
<img src="https://method.ac/blog-images/esterillayparrilla.JPG">
Today I worked on and uploaded some exploration work for blank.page at https://exploration.work/blank.page/shortcuts/.
The purpose is to explore an idea for a text based game, more or less like Method of Action's games, but for writing. Tomorrow I will align visions with René, which for some strange reason our intention seems to converge without communicating with each other, the forecast is positive.
The example provided, as of today, still needs a lot of work, but this is why it is called exploratory work. It is meant to prove an idea, and that idea is to develop "keyboard agility", to place the cursor where you need it without reaching for the mouse.
I will write in stream of thought. I always felt guilty about dumping what is basically vomiting thought on to readers, and so at this new house I must always feel comfortable doing it. Where should we begin: with the inner facts or with the outer facts?
Inner facts are: I find myself in an impatient disposition. I find myself yearning change, yet unwilling to negotiate the terms of change. And so one sees two options clearly: either acceptance, or making a deal with yourself to make yourself unhappy until you reach "change".
What is "change" anyway? Would a change in context make me feel better? For a short time, if I were to go to Madrid, I would sill have the same lifestyle. The change I refer to is this: I realize I have an ego, certain personality traits, certain intelligences and lack of others, and I have a mood that goes up and down. But beyond that, one observes a light that is sometimes bright, others dim, and that most people have more consistent light than I do, but I have a rhythm, and it is natural in me as in many people to have ups and downs, periods of rest and periods of creativity.
Between change and acceptance, what ought to be chosen?
What is desired is inner change. If I change my environment, I'll just be putting off the work. [[The Self is that which cannot be designed|The Soul]].
It feels like sometimes change should be tackled, but Carl Rogers used to say acceptance of current circumstance was the first step toward real change. Why be unhappy desiring change? I am just a leaf, a gust of wind will eventually pick me up and throw me through change.
First accept the monotony of your life.
Yesterday I had a long todo list that I intended to complete during the morning. Since the list was long I intended to complete it in two legs: I'd go out in the morning for yoga, then complete some errands, come back home, resupply, and then go out for my next leg of todos.
Everything went according to plan, except that when I came back home, my sister called to come for an unexpected lunch at home. It was inconvenient for my own purposes, but I allowed to happen, reasoning that I could complete the second leg in the afternoon.
When the afternoon came, after lunch, I was tired and unwilling to complete my second leg of responsibilities. I tiredly jumped on the bike and pedalled slowly out of tiredness. However, with physical activity I felt my energies surge again, and soon I was pedalling at speed down the streets.
I picked up two pieces of work that I had comissioned: the first was a home print of Goethe's Theory of Colors, the second was a bag for my yoga mat. I will post both of them to exploration.work when I find some time.
Today I hosted lunch with my father and his wife. It seems I don't have much to reflect on, except that when they left I was exhausted and wasted two or three hours "catching up" on social media. It had been a while since I indulged in this kind of leisure, and I didn't feel any remorse, but the feeling of being bombarded by things completely irrelevant to my life left me in a state of... I would call it indirected thought.
I will recall what I saw: a video of Wilt Chamberlain speaking about the joys of solitude, I resonated. A video of Teal Swan speaking about gaslighting, I saw myself being an unconscious gaslighter. That is what I can recall from a two hour mindless browsing.
Some months ago a feral dog appeared in the neighborhood with three puppies. My sister saw them and asked "what are we going to do about it?", I shrugged and said "there is nothing to do about it". The puppies have grown to be young dogs, and they frequently appear in the land behind the house. Sometimes they come to the backyard and start barking at Nina, who gets hysterical and pounds on the glass window while she barks.
When this happens I go out and I woo them away. Sometimes they won't bulge and bark at me, in which case I throw things at them so that they will go away. It makes me peculiarly angry that they come to my house to bark at me, but then I realize these are just young feral dogs who do not understand about human territory yet. Their mother would not dare to put a foot in a private backyard.
I sometimes wonder if what I told my sister is true: is there really nothing to do? There's way too many stray dogs in Mexico as to expect adoption to be a positive outcome. And in the case of feral dogs adoption is doubly difficult.
I see two possibilities for action: one is to be hostile towards them, as to educate them in matters of human property. The second is to be friendly and possibly leave them food, as to be able to capture them and sterilize them.
Nina seems to be equally ambigous towards them too. Sometimes she will charge towards them at full speed, not really intending to get into a fight but to intimidate. The dogs inevitably whimper an run away. Other times she simply looks at them and wags her tail. The dogs bark from a distance.
I too, sometimes whistle at them, try to coax them into submission to the human hand, but they seem to be immune to human charm, and stand barking defiantly despite my best efforts.
In the end, it is not me who makes the choice between hostility and sterilization, it will be them. And even then I wonder: if they are friendly to me, they will receive the worst end of the deal, because they won't get a home or offspring to pass their genes unto.
I'm tired of being pulled into //streams of content//. Everything on the web seems to be a stream of content: YouTube, Twitter, Hacker News, Email. These present me things which are not related to my current life or projects, and yet they hold a certain appeal: soothing me out of doing what is truly important.
It is true that some times we need to disconnect. Yesterday, my dad's wife (a psychologist) mentioned something that I had already heard from a psychiatrist: the first thing I do after therapy with my patients is sit down to watch a TV series in order to disconnect. I can imagine the proclivity to take your patients problems into your personal life and the role of disconnecting, but creative people need to take their work into their personal lives.
Why is that? Because you find the parallels. Today I was listening to Robert Greene talk about self-transformation through work, and he mentions his "wandering years": he held 50 jobs in a number of different countries, and he matched his reading in history with his bosses and colleagues, and in this way he produced a book. Should Robert be sleepwalking through life, he'd come back home after work to watch TV to disconnect, instead of threading the fabric of life into a work of art.
As of the last few weeks I've been bored with what these web timelines offer me, and I think: how to I connect what I'm reading online with my current work? I have two projects: mini-games for blank page, an update to the bézier game, and a third early stage project where I'm simply reading Goethe's Theory of Colours in order to produce something into the future. When I notice I'm mindlessly scrolling I think: how do I connect current work with leisurely web browsing?
And I find it difficult to piece together a query I can ask google in order to get information which supports current work. I may think: perhaps others have invented writing games before, but searching for "writing games" does not yield anything interesting. It seems the web has become a low common denominator, top results are often blog spam.
What I desire above all is not to be fed content, but to seek what is nutritious for me. But the online world seems to be full of fluff.
I ought to be persistent as this is swimming against current. The material world conspires into putting you back to sleep, but one must awaken himself through whatever means are possible.
It is 3:51 AM and I am in front of the computer eating a warm porridge. I went to yoga last night, and sometimes yoga gives me insomnia. This, and and room full of mosquitoes have prevented me from gainful sleep. But sometimes, when you put warm milk into the stomach it will put you to bed.
I feel much more comfortable writing these kind of things in this new home. Still, I know I need to pursue my "public persona" at exploration.work. I've been using it to post [[blank.page's experiments|https://exploration.work/blank.page/]], which is exactly the use case of why I bought this domain.
Yesterday I had a remote meeting with the guys from MeetUp in Madrid. It was great. I will miss these remote sessions when things become normal again, meetups are being held virtually for the time being and I take advantage of this.
Perhaps, post-COVID I ought to form my own meetup group here.
Work-wise, I've been cranking out blank page exercises on a daily basis. It is liberating doing experiments instead of the stressful work of working on live systems. Reliability is niether a talent nor an interest of mine, what makes me tick is exploration and prototyping. After the prototype is done, work becomes boring.
But I do admire people who are good at making systems reliable. The kind of work we are adept at doing seems to stem from our own personality, and the more flexible our own personality, the more skills we bring to the table. I am reminded of Sebas, that Colombian genius who seems to possess all kinds of contradictory qualities, he is the only person whom I'd trust to do exploration and reliability work.
The porridge seems to be doing its effect and I feel the need to go back to sleep. I wonder if I should write to the Yoga studio to cancel my appointment. Class is at 9am but I doubt that I will feel inclined to attend in the morning. If I were to fall asleep right now and wake up in four hours I'd be able to make it. It's a close draw. I will keep on writing stream of thought and see if this is true sleepiness or simply tiredness.
As of late, I've had these random sensations of shame accompanied by "painful" memories. I put it in quotes, because the memories are objectively unimportant: it may be something awkward I said a long time ago, or a small uneducated detail that springs to mind—that I served myself too much wine and I did not share enough with my dad and his wife, for example. This is experienced as shame and it comes at the most random moments.
I am reminded of the conundrum presented by William James: does emotion elicit memory, or does memory elicit emotion? To the amateur observer of mind it would be obvious that the memory produces the emotion, but observing deeper, they seem to arise at the same time. It would be as if the emotion triggers a part of the brain where the memory is contained, and they both emerge at the same time.
This kind of shame only arises when I've been free of weed for a couple of days, but it never seems to stop. It seems to be a feature of my sober consciousness. Wait—I remember, this is true, but something else is also true, I used to experience this while walking the camino, and yerterday I distinctly remember feeling it while biking, as I became concerned that this emotional state would interfere with my driving.
Shame and fear seem to go hand in hand, for I also remember having the sensation that I would have an accident, a sort of intuition that something bad would happen to me. But I know this to be folly, I do not listen to intuition in the form of fear, because it has proved time and time again to be false. But one day I will have an accident with a preceding "intuition" and I will lament that I didn't listen to my intuition, but if I listened to it I would do nothing in life.
In general, the state of being at this time is quite paradoxical: I wish to remain in my solitude, but I also wish to form a group of friends that are in accordance to my new state of being. I've seen a couple of friends from my younger days, but I have nothing in common with them anymore (I don't think I ever did), I'm just not willing to waste away life drinking with buddies.
I yearn for so many things, and yet I tell myself that these are illusions, that—if I got what I wanted—I would find myself in this exact same state after a couple of weeks or months. Unsatisfied. The solution to this, it is said, is gratefulness. What am I grateful about? If I do not feel gratefulness, it feels artificial to go fishing into memory for something I //should// feel grateful about. I actually feel like an ungrateful prick.
The mood is overcast, but the time of the night and the circumstance in which this is being written is abnormal too. The fact that I can't sleep influences thought, for sure. I must sit down to meditate so that I disidentify with these thoughts, and hopefully fall into peaceful sleep.
Yesterday I saw a video with Sam Harris where he spoke about things that you could do if you were depressed. His rational approach to the problem is where I begun when I felt depression, do the things that science tells you to do if you are depressed: exercise, to out, meet people, take your meds, get some sunshine, meditate so that you do not identify with thought.
But the host was asking about existential depression, and Harris' assessment is that this dread is imaginary, that your life has no meaning because you are believing your thoughts. This is a terrible way of dealing with existential issues. No amount of meds, exercise and sunshine will fix this. The rational approach to existential depression is a dead end.
It is not that one should not do these things, these things are fine and dandy, and perhaps a necessary step to open up to meaning. In a state of depression everything seems bleak and useless. Exercise especially brightens up this issue, but meaning, oh meaning, that can only be gained from courage.
We seem to grow comfortable in our own skin, the day comes in repeat. This morning I realized I've been a year in Mexico. Time flew by in contrast with other years. Have I lacked courage? A little bit, I have grown comfortable, and the price of growing comfortable is having life pass quite fast.
I feel a veil of existential depression threatening me because I have not sacrificed anything to the gods of meaning. I have not embarked on a seemingly useless adventure, partially because I am broke, and because of the virus. I yearn for depth, for extenuating my body, for putting myself through the toughest trials, for manifesting my existential angst in the toughest physical and psychological trials. I yearn to put my body, my mind, and my heart through the purifying fire of the adventures of walking. To climb up a mountain and strip myself naked and scream at the sky.
But day in, day out, I work, I go to the gym, I get sunshine, I go to yoga, I feel myself in a healthy way, and the days are on repeat, I follow Harris' advice and life is dry and barren, an emotional wasteland. I yearn for the cascading meaning that comes with this kind of suffering, for the soul demands sacrifices to celebrate its source.
The feeling of being drifting wood has slowly reared some agency. I've had present the feeling of choice. Every time I felt habit pulling me towards routine I could interrupt myself by thinking: I have a choice. And so I would begin coding and find some difficulty and then go back to the browser and go to Twitter or Hacker News, and almost immediately think "I am the owner of this choice" and so I would come back to Sublime Text and finish what I was doing.
I admit that I procrastinated too, but in a good way. Sometimes, when we feel like not doing something, we replace the thing that we should do with other things that we should do, and in this way I went to the supermarket early in the morning and I dropped off my clothes at the laundry and I ran a couple of chores which were important.
If one's nature is to procrastinate, at least let it not be a waste of time. It is different to procrastinate with things that you will eventually have to do anyways rather than with things that "waste time".
---
I encountered the neighbor that lent Oscar a brushcutter and that he attempted to fix, unsuccessfully. She was in her car, I asked her to roll down the window: "ma'am, I see that your brushcutter is on Oscar's dining table since a couple of weeks ago, I can rescue it for you if you want". "Oh, I had given up on it, but yes that would be good, you can have it if you do it". I pondered a bit: I wasn't doing it to get ahold of it, but it was useful, so I agreed to her deal clarifying that it was still hers and that I would simply keep it.
When I encountered Óscar I told him that I would pick it up. He was sorely disappointed and I felt bad. Oscar can't hide his true feelings but the truth is: he would have never been able to put it back together. It was as good as ruined if left at his house. It was an unexpected reaction, he does not realize I'm getting a problem off from him, but he is so dull that he does not know that he's in trouble.
I think he may even have gotten angry, as he stepped forward and stood up to me, I asked him "what are you doing?" and then he backed off, as if he was unsure himself. After this happened I questioned the wisdom of interceding in the situation: my only desire was to resolve a tension between the neighbor and Óscar, and now there was tension between myself and Óscar.
My sense of agency and free will was a part of this, a wanting to become part of the world inclined me to intercede in the affairs of the world, and now I feel a slight regret. I originally expected to transport the disarmed equipment from Oscar's house to her house, and then she would comission a fix, but somehow, out of my own niceness, I offered to take it to get it fixed and she offered me to keep it.
So, what I choose to do is this: I will give the brushcutter to Lalo for him to fix, I will pay for it, then I will give it back to Oscar. I don't need or want to keep a bushcutter.
---
I got a new chair. It's a nice chair. My mother bought it for me. I didn't ask for it, and was actually angry that she would buy it without consulting with me first. "You would have said no", was her reason for not informing me. Indeed, I would have said no.
As of late, I've been resenting the intermission of my family in my life. My mother is especially prone to this. "I will make a honk noise everytime you say something which intercedes in my life" and then I would make almost constant honking noises, "you should not carry your yoga mat on the bike like that, a car might hit you"—honk. "You shouldn't drink so much coffee, it is bad for you"—honk. "You shouldn't have eaten such a large breakfast, that's why you got sleepy after breakfast", no honk, but a reprimand: Mother, it is Saturday, I'm fit, I'm healthy, and I can eat and have a nap whenever I want. This is none of your business. "Ok son, you are right". That calmed me down. But it is growing old.
And so I am sitting on a much better chair than I had before, yet I feel resentful about it. There is no pleasure in having your choice taken for you, even if it is a net positive. And yet I feel like an ungrateful prick.
I'm fighting things which are out of my control, but what is the solution, resignation? I must warn that my patience is now running very thin, and if things keep on going in the same trajectory I will eject this cockpit to parachute into new grounds.
I see that it is much easier for me to meet circumstances with acceptance when I'm smoking weed regularly. But this option is fake, it dulls the will. If my sober psychology demands change, then I must accept the tension of change.
It is almost 1am and I can't sleep, for no particularly good reason, so I've come to write.
In the last few days I've had the feeling of determinism creep up on me. When this happens I feel myself taken from place to place as if I were a piece of drifting wood floating on a river. But there are two ways of experiencing this, one is with acceptance and the other is with resignation. I feel I am currently at the latter.
I can trace these feelings to last Thursday, when I discussed an idea with the people from Meetup originating from Michael Sandel, and this was the idea that we all come into this world with certain faculties and circumstances, and that we are really have not much of a say in our life, these faculties, character, and circumstances dictate our life, and so any merit or fault is irrelevant. It sounded reasonable at the time, but as I have given it further thought, I have discovered the—can I call it fallacy?—no, the issue merits much more thought than my limited capacity for philosophy—here it is, deterministic thought.
I came across "The will to believe" by William James, since I read part of it on the phone I can only say that I understood the gist of it, which is: one must believe in free will, one must believe that he has the choice in order to exercise it. This must be, by necessity, a factor in "waking up", for the deterministic mindset can only lead to the feeling of aimlessness, and this aimlessness is giving up on one's own freedom. Why intercede in the affairs of my life, if my life plan is already laid out stemming from my character and circumstances in life?
And it seems James struggled very much with this question in his own depression and I understand his conclusion: you cannot prove that you have free will, but you must choose to believe it. "I have a choice". Today I allowed myself to endure many things that I did not want to experience: an hour long monologue by Gaby complaining about all the things in her life, I smoked cigarettes with her and Moises, pictures of women whom Moises is chasing and I found distasteful, another change of direction in blank.page. Some of these things I accept willingly, others I accepted because they came to me.
Should the day repeat itself in a way in which I believed or exercised my free will, what would have changed? Well, ignoring economic constraints, because I expressed just today to René that I desired very much to go to Spain and walk and escape from my current circumstances—which is strange, because it feels just like when I was chained to my 9-5 job: I had no say about how to live my life.
But I do now, more than ever in my life, but I do not exercise it. I do not say: fuck everything, this is not what I want to do today. And so I feel desires to escape my current situation as to not to have to deal with the task of setting boundaries. I prefer to escape into territory where the boundaries come naturally because I don't know anybody.
It would seem then that the task is to constantly remind myself: I have this choice. I don't have to accept that cigarette. I don't have to see this person. I don't have to be nice. I choose to exercise my free will.
It is not a matter of avoiding what I do not want to do. It is a matter of consciously choosing what I want to do. For me, it is often easier to go along than to say no. But I must find the inner initiative, the will to believe. Make a choice and participate in life.
Today I had the most terrible of moods. It came seemingly without reason. In the morning I first noticed myself unfocused. I went to the gym. I didn't feel like working out. I was tired. When I came out of the gym I started looking at the logos of the stores at the mall. It is something which I hand't done since my student years: assess the quality of the graphic design of my environment.
I would say 20% were good, 60% mediocre, 20% bad. I walked throughout the mall deliberately, looking with curiosity at everything, but with a judging mind, not with my usual perceptive mind. Most of the logos I could tell what was wrong with them. A kitchen company called ICARUS, the middle bar of the A and the R were almost the same height but not quite the same. I thought: if they do not notice that, then how would I trust them to install an expensive kitchen at home?
I also pondered something different for my work logs: the previous day I had sent a voice whatsapp message to my yoga teacher, and when I heard myself I saw a hesitant voice. I write much better than I speak, perhaps because I //write// much more than I //speak//, and I toyed with the idea of having video work logs, but I'm still toying with the idea. But I also have the idea that—if I do not start today—it will fade away. I will do it right now.
---
So I recorded myself speaking in Spanish during 30 minutes. I was uploading it to YouTube, with the intention of not having it listed but available to embed in this wiki, but then it said the 1GB file would take two hours and a half to upload, so I decided against it. But recording myself speaking was actually useful, so I will supplement my work logs with self recordings, but the recordings will not be shared. It is not worth watching anyways, it's just someone thinking out loud.
Yesterday I was struggling all day with Svelte stores. I do not understand very well how they work, and I was fiddling all over the place, trying to get the store to work in the way I intended. I went to bed without having been able to get it working. At the same time, I noticed myself procrastinating a lot.
In the morning I woke up and I knew I had to change my approach. "Perhaps I ought to simply read the documentation", which is something I surprisingly hadn't tried before. But this seldom works for me. In programming you see symbols, most of the time if you do not understand the code, reading the description of what the code is doing will not do anything for you, for the best explanation is in the code.
This is precisely what had happened, I was still at a loss at how things worked, and I got sidetracked multiple times. I even begun writing this work log before accomplishing my task, describing my frustrations, but something felt wrong about it. I thought: I haven't tried enough, I shall replicate my issues in the Svelte's REPL so that I can say I tried *everything*. So I did this and somehow things worked!
I debugged my code, and saw that, amidst the modest complexity of the codebase, I was triggering something in the store inadvertently, and thus things were not behaving in the way that I had intended.
The lesson for this seems to be: when facing a problem outside your domain, remove everything extraneous to the problem. Understand from principles. Even if I had been successful in resolving the problem by tinkering, I would have reached the solution without understanding the problem.
After I resolved this, a sense of mastery came to me: not only have a I resolved the problem, I have understood how to resolve all programming problems. Nothing will stop me now, HA HA HA!
I write this in the midst of deep existential pain, which cause I know, but it is irrelevant to this writing. Going into the reasons of the pain is as useful as analyzing the reasons for a car wreck, the past is left behind but it leaves an imprint on presence which can grow uncomfortable at times.
I simply want to write about how I feel. At the center of everything is an exhaustion. I was watching a video on YouTube with a character unknown to me: Gastón Soublette. He speaks that this civilization is in the process of collapse: the complexity of living life is reaching unsustainable levels. Our lives are driven by our alarm clocks and our calendars. Life seems to be a never ending stream of tasks, some more pleasant than the others.
Depending on our professions, the cognitive demands of the kind of work we do is staggering, it requires long periods of deep concentration. Done correctly, work is art. But we squander our intelligence and creativity on creating desire, on competing for attention, in more and more addictive ways, and the result is that most people are now putting more attention to merchants of attention than to reality itself.
To be the master of your own attention is the most important of tasks. YouTube algorithms recommend Michael's Jordan relentless hustle. There is much to learn about this man too, but one must learn where the source of one's own energy, as Keith made me note. What is the source of your function energy? Meditation and contemplation. It has worked.
But in the liberation of trapped energy in ones own development, there also comes deep pain which must be handled with wisdom, spun into meaning quickly, so that a registration of ones own struggles serve as guides towards a better life. To understand the general pattern of the life one is living, and then come back into it in full.
The easiest and most difficult thing in this world is to remain asleep, easy because it requires ones natural evolution-induced chase of pleasure, and to wake up is to renounce to the chase of pleasure, which in reality is an escape from darkness. Spiritual growth requires one to stop chasing and remain in the darkness, to seek into the closets of one's own palace, and to find the time and disposition to put things in order.
The soul, which I have come to understand through two chilean geniuses: Jodorowsky and Soublette, is the container of the body and the spirit. The body is a thin line which contains the area of the soul, and in the center a small dot, which is the spirit.
We could adopt an atomic model where the spirit is the nucleus, the electrons are the mind, the electromagnetic field is the body, and the system is the soul. The vast majority of one's experience is mind, we vibrate in a certain way, our thoughts making quantum leaps from one position to the other. This is how we know we have free will, it cannot be predicted where our next thought will land.
We tend to vibrate in patterns, synesthetic people see auras, a visual representation of the vibration. But a synesthetic sense is not needed, more often than not the vibration is picked up by senses and reflected back to the emitter, and a common vibration is settled upon the people who are conversing.
Another thing Gastón taught me today are that ancient Mesoamerican cultures are more in line with the Tao because all knowledge seems to emanate from the same source, if we look and ancient pottery and hand axes we see it emerge in a globalized way, without communication! The atom that I am in this global consciousness is connected by necessity, I could not be writing this if I were not connected to the world, for I would understand—I would by an animal. We all participate in the process of unfolding of consciousness.
From Mesoamerican culture a terrible loss was experienced: the loss of intuition, and the emergence of reason as the only way of conducting one's life. Only through the discovery of one's inner duality—that of intuition and reason—can one advance in the difficult trials.
I notice myself going into branches which I have no interest in pursing, I will simply allow my hands to type.
Sócrates was in pursuit of Truth, Jesus was in pursuit of Truth, was in pursuit of Truth. Mohammed was in pursuit of Truth. Lao Tze was in pursuit of Truth. The Buddha was in pursuit of Truth. Who were the Mesoamerican prophets? But priests were undoubtedly prophet-like, for not only priests but warriors and the general population were sure they would pass into a better life by being sacrificed, and much to the Spaniards surprise, the would allow themselves to be sacrificed willingly.
Was Mesoamerican culture in pursuit of Truth? This was not of their concern yet, the mono-theistic meme was just beginning to manifest itself as it became connected to the godhead of Christianity, and thus Mesoamerican devotion became compatible with Catholicisms Saints and opposing spirit forces. It is most definetely a different way of feeling. One Spanish acquaintance was surprised to find find herself in Mexico and people from work begun talking about "spirit" stories.
The calm after the storm has made its presence the next morning, and in the same way I write during the storm, I feel inclined to register calmness. What is calmness?
The energetic sensation is most definetely different. Where yesterday there were sparks flying because of a short circuit, today energy flows harmoniously. The mind is not jumping from one place to the next, and an inclination to put the mind towards productive endeavors is sensed.
Even Nina was restless yesterday, right now she is sitting, observing the stairs with an attention that makes me curious about what she is seeing, staring into apparent nothingness.
In this state of calmness I see the decisions that split me yesterday are clear today: the choices were illusory, I must do what I am supposed to do, with the dedication of it being to the higher purpose. If I do not want to be in the situation that I am in now, I must resolve what keeps my in my current situation in order to advance. Trying to vie into a different direction will only bring me back to the same place.
During the past few weeks I've experienced desire for change, and yesterday it culminated in telling my mother I'll move somewhere else in 2021. I don't know where, but I know I wish to change my current circumstance, because what I have now has become stagnant.
The experience of stagnancy to me is the same as routine, but some routines have outcomes and this routine seems to go in circles without a destination. If I were asked—Where would you want to move right now? I'd probably go back to Madrid, but even then, I can't say I knew what to do better, but at least I'd have the independence I yearn for.
When one lives in his hometown, his schedule does not belong to him. Social obligations eat up on creative time. Nina is begging for attention. I'm waiting for a truck to arrive to deliver gas. My mother closed all doors and the dog pooped inside the house, which required me to wash with bleach. I feel like I have a hundred of menial tasks which arise from my situation. A whatapp message from my cousing saying that he say a video with me yesterday on Facebook.
I remember my immense isolation in Madrid with affection, though at the time I felt a profound loneliness. The issue at hand seems to be not appreciating what one has at the current time. It would seem the solution is finding more gratefulness for what I currently have rather than yearning for something I will have in the future.
Even the, it seems I will move in 2021. Let this work log serve as a marker of prediction.
Yesterday I was meditating when I heard someone knocking at the door. I came out to find Moisés, Sam, Óscar and Marina outside. They wanted to see how the backyard looked after the flood, but in reality Moisés wanted to take a look at the wood for the bonfire we're planning on Friday.
I let them come through and we swung on the rope, then we collected some wood, and then we went out. Óscar whispered to me: my house is very clean right now, as if inviting us to his home. I proposed having a tour of Óscar's house. Everyone agreed.
We were greeted by a very clean house, everything was in its proper place and clean. I felt a tinge of envy: how is it that this brute can have his house in a nicer shape than us? But it was simply a sting that inspires one into action, not the kind of envy that desires to bring down the foe to your current circumstance.
We then went out and walked around the neighborhood, showing them the hidden spots where we used to play in childhood. It was nice and pleasant, though I recall this same activity from last december. I suppose it would turn boring should it be done often, but it was perfect for the moment.
When we reached the entrance to the neighborhood we proposed going to the store to buy junk food, but we did't have any money. So Moises, Óscar and I went to Moy's house to fetch his wallet, and then we headed to Oxxo. There we bought a 3L coke, cigarrettes and chips. We walked to the park in Prados Agua Azul, and spread out at some benches.
The entire event had a feeling of youth: bored people with nothing to do, hanging out at the park munching on cheap snacks. I guess this would be called "wasting time" decades ago, but under this guise it smelled of novelty and camaraderie. There was an interesting simplicity in all of it.
I seem to seek people according to my self-perceived values, but the most important value is acceptance of all things. Accept what comes to you willingly, while knowing your boundaries. Now, let us go back to work.
I sometimes debate wether I should have a framework for the thing what is I'm doing most lately, which is a strange kind of introspection into my current state, because I do observe with attachment: I wish I had less bleak things to report, but the inner weather is a storm of sorts, and this mood is not conductive to work, as it demands inner attention to deal with correctly.
When these kinds of shake-ups happen, the ego grasps for fixed points to orient itself, for one is swimming in the storms of the subconscious, and there is a natural attempt to grasp at that which is fixed: Truth, timeless beauty, perennial wisdom, because meaning at this stage has been understood as a weaving of self-narrative, the dissipation of the self-narrative can be met with acceptance or yearning.
In order to distinguish what is that I yearn from the self narrative, and the doors that its dissipation would open, a brief analysis can be made: what is that which I love about the self narrative, and what is that that I could do without it.
I would say: I am afraid that I simply disconnect from my own myths in order to appear normal, that I have not walked naked and barefoot on the face of this earth, that I have not drunk the purest water I've found upstream in the mountain, that I have not danced and made love in the most passionate ways, as well as kept years of celibacy in keeping with I perceive as God's will, but this I must question too.
The fixed points that I seek, which are them? There is always one fixed point: that would be [[The One]]. Seeking the all merciful, all accepting, nothing-exists-out-of-it and we are all instances of it. But in this philosophy there is nothing fixed to grasp on. I must accept the inner storms as waves of the ocean, which I deal with the best that I can but sometimes throw me down and tumble me underwater.
I deal with my own existence the best that I can, and even to external eyes it is evident that I suffer no privation, the truth is that I perceive myself as lacking, as not being as being in the way that I am at the current moment, and this is a natural drive in my character which can either energize or drag down.
Do I really wish to escape this delusion? That there is a storm inside of me, that I must choose between awakening my own inner narrative, or that I should explore the benefits of its extinction? It seems clear, after writing, that I wish to drown the inner narrative, because I do not like what it speaks. But it is unnecessary, I have no choice about the volume of the narrative, but I do have a choice to abstract and observe.
1. This would be the way of the [[inner refuge|Inner Refuge]], in which one—through observation of the breath—is able to train attention in such a way that it knows the path to find the inner refuge. What is the inner refuge? The place within yourself that narrative has no place. Your narrative is not yourself, look inside to find it out.
2. What is [[Truth]], then? It is known intuitively. When seen, it elicits the aesthetic sense, and is often experienced as beauty. Truth is beyond False? It would necessarily create a mirror image, but as Jodorowsky made evident: is is possible to appreciate Truth by observation of the False.
3. If we can learn what is True from exploring the False, then it holds that they possess equal value, everything that happens to us is karmically neutral, but it will be our own karma—how we deal with this experience.
4. This is why there is nothing good and bad, and Truth and No-Truth do not map out to them, but can we say that there is nothing bad? A pedophile sows No-Truth into a child, the only way that No-Truth can be extracted is by flipping it into Truth, but that No-Truth often corrupts the entire individual and he becomes entirely No-Truth, a pederast himself.
5. It would seem obvious, but often times we choose not to see: No-Truth has a corrupting behavior, it is the mirror image of God, and it is in the individual to fight for him or herself against it. With the oblivion of religion, we have lost touch with the methods available to us to to fight the corruption taking place within us.
6. What role pleasure has with corruption? Can it be said that pleasure is related to beauty, and we know beauty to be a direct descendant of Truth. If beauty is to Truth, what is ugliness to No-Truth? Can one can obtain pleasure from ugliness? This would be a corrupted state of being.
7. What role plays aesthetics in this? I am too ignorant on the subject, despite being a designer. Draw from inner experience: what is an aesthetic experience? A vibration with the authors intention. Who is the author? Consciousness.
8. The bridge to nature: Nature is a manifestation of primal consciousness, following her dictum will never stray you from the path. To become more natural is to become more True. But this True predates the first duality, we reach the Tao levels, that which has no opposite because it is the mother of all things, it predates duality.
Now, if I were to put this rambling into an actionable list, how would I practice what I preach?
# Finding the [[Inner Refuge]], at least once a day.
# Seek [[Truth]], in whatever form it may present to you.
# Accept the [[No-Truth]], in whatever form it may present to you.
# Prevent [[Corruption]].
# Prevent [[Inner-Corruption|Corruption]].
# Understand [[Aesthetics]].
# Seek pleasure through the route of [[beauty|Beauty]].
# Imitate [[Nature]].
I sit down to write quickly, as I want to use most of the time available during the morning for work. The mind, by habit, seems to look into what was done yesterday, but today I woke up for a will that wants to tackle the tasks from the day.
And at the same time it feels unnecessary to write down the executive musings of the tasks today. What is needed is to put the mind down to concentrate on the task at hand.
I came to Mexico City to visit my best friend. It is the first time I've been outside of Puebla since the beginning of the pandemic. There is not much I can add to this brief anecdote, as we arrived yesterday from Puebla and had a late lunch which then morphed into moderate drinking which we ended at 2am.
The weekend was filled with lessons, but I cannot and don't need to register all lessons. But I do wish to register what is most salient: the fact that I proposed Marina that she performed as a nude artist model. Her response was more or less what I expected: hesitance. I am hesitant too, I am not really sure this is something I want to get involved in, and I felt sympathy for her hesitance.
But I also sense that we will end up doing it, Marina in her need for economic support, me in my need for new experience. This is a prediction of outcome, and only time will confirm or deny this prediction.
I come back from Mexico City with just as many lessons as I had collected before, because I have experienced the Tao of friendship. The weeklong visit from Moy, an extroverted sensual partygoer, and then four days with my best friend, David. And then I met up with Victor David
I have come to understand that one should vibrate with whatever is presented upon the soul, and these vibrations manifest in lessons and experiences which are reflected upon after their fact. One should not always choose to vibrate with the present moment if the engagement of the senses withdraw within ourselves in a strange introversion, and one gains the senses needed for inner exploration.
It is unnecessary to pass any ideology. The purpose is to look into the eye and vibrate with whatever is in front of us. Any attempt at controlling the situation is our ego in action. Flow, vibrate with the people whom cross your path. Offer no resistance, it is futile for both parties. I have never changed anyone's mind. The only times I've said anything wise is when it is not me speaking.
In discovering this itself, it seems that the ego fragments, because it realizes: anything that I have really created is not mine, since most of what I do comes from when I forget about myself. I can only create when I don't get in the way.
Often times I have a sense of dread at work. The emotional relationship to work is soured, and my response to dread is avoidance. I will do many productive things in the name of avoidance, because I feel bad about avoiding work, and so I engage in less dreadful work, so that I least I can think about myself as an avoidant productive person rather than a lazy bum.
It is only when there is an alignment with work and intention when flow can be accomplished, and the big question seems to be: it is possible to put work into alignment with intention? It is the ego who desires to work, but the intention comes from spirit. It is the ego who avoids work too. "Just do what needs to be done", calls the Tao.
I try to concentrate deeply, but I waste time. I take ingrained paths. At first, ingrained paths feel tao-like: effortless, soothing, non-violent. But the clear stream of consciousness becomes tainted through contaminated ingrained paths, and to make the flow take a new path, one must not only obstruct the flow, but allow the flow to take a different course.
That is: the blockage of vice is temporary. You are able to withhold it for a time, but then it spills over the blockage and soon it will wash away the barrier. Energy needs to flow, once you set up the blockage you direct the current into a new stream. Make sure you know where the current will flow, you will miscalculate, but persist. A better way of living is possible.
Let us collect the lessons written down so far, and attempt to boil them down into actionable tasks for the purpose of personal growth.
# [[Vibrate with the energy that people present to you]].
# [[Offer no resistance]], put yourself in the heart of the other person.
# [[Align work with intention]].
# [[Block vice, have a reflow plan]].
Any words before bed? An unpleasant but necessary day with myself. Accept and move on. Despite the unpleasantness, it is preparation, for the shadow demands sacrifice in exchange of the creative act.
I am stoned, but I feel compelled to make this promise to the inner observer: it is necessary to capture state in the normal consciousness. Register altered consciousness only as a conscious act, not as the ignored veil in the registration of experience.
[[Block vice, have a reflow plan]]
The deal with myself is this: I [[dare to be more courageous and open]], without the use of marijuana. I ask of myself: do stupid things, but sober. All worthy lessons come in time of sobriety.
I debate wether to write any more insight, because I have just set myself two tasks ahead. Let things raise to their own accord.
Yesterday I committed to making clear my state of consciousness when I was writing. I came back from my night yoga class and indulged in some weed. I had an idea today: what if I write a concrete todo-list for the sober Mark of tomorrow? As we have stated before, [[Block vice, have a reflow plan]]. Let us taper off by doing the things I do while stoned, but sober.
''Ritual: Perform the keystone''
The keystone is a technique to make your soul aware that it is undergoing transformation. How many times we've attempted change and then reverted back to our old ways? Ritual is necessary, but start with something simple, and perform it as soon as you remember it.
My keystone will be: put my forehead to the ground, in reverence. This marks a day where I vow to at least attempt to do the following:
''1. Sunbathe''
I seem to be more sensitive to cold while stoned and this house is very cold so I've gone into the habit of bathing in the sun to regain heat, and in this way when I'm blazing hot (this I learned from the pools in Madrid) you get into the cold shower. My mind needs conscious unaltered mind concentration, because since I've done my showers stoned, I've suffered more than is necessary.
''2. Seek the inner refuge''
Sometimes I feel excess anxiety while high, so I go into my bedroom and I meditate, going to that place where I can completely relax and feel safe. I've pleaded with myself to make the effort to find this place in an unaltered state of mind, but I find myself taking shortcuts.
''3. Say hello to everyone you see in the eye''
Crossing glances, smile, acknowledge existence, say hello if friendliness is corresponded. It is not unpleasant.
''4. Do you work''
Every day has things you do not want to do, the work is part of The Work. The world begins to change when you take responsibility for the dishes. Anything that you cannot change is not your work. The work is transforming oneself through The Work. All things meaningful are work.
But be practical, things that pay the bills are a priority now.
''5. Practice frugality''
I have enough comforts. I am satisfied and content with my way of living. Nothing material in my surroundings needs to be changed. It is only a matter of food and services. I am a very lucky person.
''6. Prepare more meals''
I'm sick of steak tacos. Soak lentils tomorrow.
---
Six todos which the Mark in an unaltered state of consciousness tomorrow will pick up, and decide if they are worth implementing, at least for one day. The task is tremendously simple.
State: unaltered
Yesterday I set myself some tasks, this is the status at the end of the day:
- The keystone: done
# Sunbathe: how wonderful, I didn't want to leave the sun. Will do again without effort.
# Seek the inner refuge: I tried it, but fell asleep.
# Say hello to everyone you see in the eye: I refused to do it.
# Do you work: I did it
# Practice frugality: I saved some and spent some unnecessary things (gave Oscar money for cigarrettes).
# Prepare more meals: Chicken and lentils are cooking at this very moment.
---
State: weed.
I come back to write, after having finished cooking and cleaning up.
My intention was to write down my impressions of the day, with the todo-list that the altered state facet of my personality "chose" for the unaltered state consciousness.
When I woke up I immediately remembered about my vow to begin the day with the keystone, but there was no urgency, more of a sense of "I will do this even if I don't feel like doing it, because this will mark a day of transformation. All days that begin with the keystone have tasks, and one need not to engage with them if one sense it is the moment.
So, if I chose better tasks for myself, I shall find them more agreeable to complete. I do not want to look at people in the eye and smile, if my heart is not in that state. Emotional fakery is the most draining thing in the world. But when aroused states are natural, the smile comes out spontaneusly, and is energizing.
So, let us see what can be done better in the matter of tasks:
1. Sunbathing.
Morning sunbathing is best done sitting down, with a cup of coffee on hand. One has not woken up before greeting the sun. This is the new keystone.
2. Seek the inner refuge.
I felt no anxiety, so I felt no need to sit down to meditate. Still, I made an attempt and did not get too far before falling into sleep. It was welcome rest, so the experience of doing this was positive, and thus worth repeating.
3. Say hello to everyone you see in the eye
Ugh, this is not the moment. The task is connection, not to say hello. I'll change this directive to:
3. Look in the eye.
And let us experiment what derives from this.
4. Do your work
The direction is clear and meaning is reconnecting with work again. It was pleasant to work today.
5. Practice frugality
I just hung up with my mother: my nephew will have his birthday party at my house. My sister thought that by odering pizzas all would be covered, but she ignores the mechanics of social gatherings. Napkins, plates, cups, must be provided for. We will be 11-12 people, and I must figure out how to seat that many people. No, these are children, adults we will be... I can't count people in this state, it's quite striking!
The conundrum is clear: balance frugality with practicality.
6. Prepare more meals
Quite frankly, today's great meal cookout was uninspiring. I don't enjoy cooking for myself. I threw plantain with onions to the chicken and half roasted and half steamed it, threw in some seasoning, and called it done. But now that I describe the actions, I notice there is a certain art to this simplicity in cooking. I would call it "slow lazy cooking with whatever ingredients you have at hand". But it is very good to cook in this way, so you understand the fundamentals of the things that you are eating.
Perhaps change the "prepare more meals" directive, to:
6. Be practical in nutrition.
If, at this time, I am preparing food for nobody except for myself, I shall regulate the tastiness according to how much I wish to lose weight: the more weight I wish to lose, the less palatable food I eat.
At this time results speak for themselves: I must control nothing to have a good nutrition anymore, the nutrition comes from the practice of respect to nature.
---
These things I will adjust for tomorrow, but I think I am on the correct course.
State: unaltered
{{Virtuegraph October}}
Yesterday Oscar came for dinner. I served a massive plate of spaghetti with high-protein bolognese. I was amazed that he could finish the plate. After dinner we walked around the neighborhood with Nina. Oscar was very excited because he was about to meet a woman that would give him sex, assuredly.
As he was utterly unable to contain his excitement, and from his energy I knew he wouldn't get laid (it was not clear to me if the arrangement was paid, or simply a date that someone hooked up Oscar with, but I doubt it). So I told him "Oscar, you got to dial down your energy, when you are sorely lacking sex, you frighten it away by wanting it at any cost".
He looked at me quizically, and I tried to frame the problem in a way that he would understand. "Do you know the law of attraction" I asked him. "No". "Well, the law of attraction states that you will attract more of what you already have, and you will scare away that which you lack most".
"Have you ever had a girlfriend and suddenly all the girls start looking at you?, well, that is the law of attraction at work. When you are desperate for money, for sex, for friends, that's the toughest moment to get ahold of it, because of the "law of attraction".
I felt kinda bad about taking a shortcut to explain something which requires more nuance, I'm actually sick about hearing the gross oversimplication of this spiritual phenomena, which is terribly labeled as a "law". I would call it a universal tendency, or even a bias, as the things that we want the most never seem to be satisfied. If we get what we want, we will want more.
After Moisés came Oscar seems to be another person. He is ecstatic that a friendship is developing between us, and this makes me a little bit hesitant. This in itself is the law of attraction: the fact that he needs a friend so badly makes me want to withdraw my friendship, because I don't want dependencies in my life. I help in what I can help, but people cannot expect to depend on me, at least not yet.
For the past few months, Friday has been my sabbath day, which I dedicate to my family. However, in the last few weeks I've been disconnecting with this idea. Why? Family is the most difficult interpersonal relationship. It is most definitely easier to escape than to grow, but I don't know how to escape my own ingrained habit of treating the people closest to me to different standards than I treat anybody else in the world. There is nobody to whom I am more judgemental than my own family, and I think a lot of people are in the same situation.
The only way to escape this is to be present, perceiving and understanding.
{{Virtuegraph October}}
State: weed.
I write in high times, on the condition that tomorrow morning I do the same in an unaltered state. Let this be a comparison of thirty minutes of stream of throught. Thirty minutes of writing is a non-trivial amount, and I suspect that by the end of the exercise I will be fed up with writing. So, I will simply allow my fingers to type whatever they want during thrirty minutes.
I had set out to have a frugal day, but I splurged in something which seemed important: I can use Oscar's help in fair exchange, and then asked Marina for help to clean the house. This allowed me to work a bit, and to go to the gym and to yoga.
The principle that I was exploring was frugality. Frugality is my default way of being, but I came across a modest amount of work related income to "splurge" on luxury items such as external speakers and an Alexa for mom. And then I grew accustomed to spending a bit more than normal. It is easy to revert to "not spending" but the principle is: spend wisely.
Were the expenditures of today good expenditures? Indeed, because not only my house is clean and the front yard is in great shape, but I have helped neighbors. Oscar's improvement is remarkable. Through listening and being present with him and also being straightforward "dude, don't show me porn", I have learned how to treat him.
I'm growing tired of typing, the hightimes are asking for good-nights. Today a lot of work was done, and I see the exercise is not a matter of time, it is a matter of patience, let us see if prime waking state produces better writing. And compare to evening-unaltered state tomorrow.
***
I come to complete my promise to myself to write in the morning, in an unaltered state of consciousness. What I wrote barely seems worth registering, just thinking out loud blabbering, and yet I seems incapable of writing anything better than I already wrote.
For the past few days I've been sunbathing in substantial amounts. It seems to have a wonderful effect on my mood. But it is strange: I thought—as I am living in Mexico—that I would already be receiving enough sunlight because I bike and I walk everywhere.
But the kind of boost you get from shirtless—or even better—naked sunbathing, is unlike what you get from a walk to the supermarket. And I look at myself at the mirror and I think: I must be on vacations! and then I think—but I _am_ on vacations, I am the owner of my time, I can do whatever I want, is that not vacations? The notion of vacations is strange when you do what you want to do, because there is no need to "disconnect" or to "recharge".
I remember, when I used to work, that I would escape to the camino in the winter to Andalucía, and as the sun is a little less impotent in the winter than it is in Madrid, I used to walk with my shirt off, even if it was cold, so that the sun would warm my bones, and the farmers would wave at me and motion to put on a jacket, I'd just smile and wave back. Surely they would have thought I was a foreigner, and they would have been right.
But, in the larger picture, I notice there are a tremendous amount of things I do to escape my foul mood, now that I think about it, most of my Virtuegraph is precisely that: and escape from meaningless-ness and depression. If I could, I would prefer to be drawn to feelings of completeness and joy, an attraction rather than an escape.
It is 9:30am, which means the sun is strong enough to have my morning thawing on the rooftop. I will go upstairs.
Regarding writing high or unaltered, I'd say I prefer writing unaltered. But it seems to have the same effect that booze has on some writers: the sense of feeling is heightened, and so it is easier to write because what might seem boring while unaltered may seem amusing while high.
In any case: everything is self-knowledge. Everything is an exploration to understand the self, to understand the ego, and to understand my purpose on this earth. As of late I've been thinking: I can't answer the basic questions that I set myself to answer seven years ago, I can't say what is the meaning of life, what is the meaning of _my_life, what is love, what is... It seems the importance of these questions faded away when I transcended the logical aspect of development. Indeed, these questions have no verbal answer, because the answer lies in feeling and action.
It is time to begin the day.
{{Virtuegraph October}}
I just showed mom the land behind the house, which is more or less in good condition. "I want to use this space for nude modeling, mom", her face was initially inescrutable, so I kept on going:
"I've been working on this space for nearly a year and it's very close to being beautiful, but I couldn't find a use for it. But it occurred to me: this is a very convenient spot with a lot of privacy, and I want to learn to draw the human figure but now is not supposed to be a good time. I don't even have the money to pay for lessons, even if they were available."
—I can't approve of that, son, you know I'm very conservative.
"But you're an artist, mom! This is not about sex, it is about art. I want to learn how to draw and I wished there was someone who had a garden who would offer natural drawing in a natural setting."
She grew in enthusiasm as I projected ideas: here will be the model and I can put chairs here, but her approval was always grudgingly, finally she said "I want no part of it", to which I replied "I will invite you to the sessions", to which she displayed some enthusiasm.
We parted ways, me to begin writing this, and she to do some reflection, I guess, and she came back to say "I just don't want that Marina is your first model, she has a boyfriend and he will be jealous". "Well mom, actually, I would prefer that he come if that would make her feel more comfortable".
"And models who do not have a boyfriend, how can you guarantee that they can make it back home safe?"
—"Well, I can take them home"
—"That's smart, but how?"
—"They could sit on the cargo platform of the bike".
And we both laughed.
Intuitively I sense her enthusiasm will outgrow her conservatism.
{{Virtuegraph October}}
Status: worked unaltered, writing altered (weed)
Today I worked for a good amount of time, with good concentration, and at a good pace. In short, I was flowing with work. I am glad because it had been some weeks since I last remember being in this state. The kind of work I've been tackling in the last few weeks is outside my area of expertise, and this causes the flowing machinery to stutter, because of multiple reasons: you might need to consult the documentation, you may hit a technical roadblock and not know how to surpass it, you are more prone to be distracted when things are not going right, etc.
So, for blank.page courses René and I agreed to go with a lighter approach to code. I even opened a Squarespace account with the intention of seeing if we could customize it to our needs, but I was utterly bored by the activity of "themeing", and I knew we would run into many limitations, so I decided to do the front end myself.
I was meeting the task with some tedium, as I had these feelings that front-end layout was below my skills, but I noticed the ego thinking. There are many areas of my craft which I do not know, and today it gave me particular joy to expand my capabilities as a creative developer, so I flew through the tasks and finally found out that no, I am not retarded, I just want to eat more than I can digest, and that I must be wise enough to move work in that direction, if I find things too hard, how do I make them easier?
Here is perhaps a new task for the [Virtegraph October]. I feel like it could be more descriptive than prescriptive, because describing comes for free. Let us keep the number of prescriptive tasks to five, they must be memorized, and each finger of one hand will be assigned to the prescriptive task.
Sun showers: I'm smoking cigarretes and weed. A temporary cycle of vice. I go out and take the sun in as I smoke with my shirt off. It's wonderful, but I'm sick of smoking. I have exactly one cigarette left, after this I will register how many cigarrettes I smoke per day. I may go off and buy a pack of cigarrettes and smoke it over two days, who knows, but I want to register it.
So, the task of sun showers is prescriptive, and is chosen as keystone of the day. I have discovered this is the best way to wake up for the day, at 9am the sun is hitting the rooftop and resonable temperatures to bathe in the sun. The difference in my mood is starking, and the amount of energy I have is increasing. I would be broothing in my bedroom if I had not absorbed energy from the sun.
This forms the keystone in virtuegraph practice, and this is why it heads the virtuegraph. You do not begin your spiritual day if you do not start is with a "trigger". You do not have to perform it every day, it just means: on this day I will perform the following things:
Sun Shower<br />
Look in the eyes<br />
Meditation<br />
Material Work<br />
Body Work<br />
If I prove to be consistent with these five, I'll add "observers".
{{Virtuegraph October}}
State: unaltered
Today I had dinner with Óscar. He was supposed to come at 21:30 but he was running late, so I decided to walk Nina to make use of the tolerance time. I encountered him outside his home, he had just arrived. We walked Nina and then set to have dinner.
I bought two sandwiches, one for me and one for him, but he was engrossed in his conversation and was barely touching his sandwich. I was already three quarters done, and he hadn't even given the first bite. "You already had dinner, didn't you?" I inquired, but he denied it and said that he was just distracted.
After dinner we went outside to smoke a cigarette, and he told me he had drunk tea of one of the datura plants in the neighborhood. He prepared tea and had it in his bedroom. He said that he "seen" Ninel Conde and the neighbor naked with the help of the plant (I read in wikipedia that in medium doses it has an aphrodisiac effect. I pleaded with him to be more careful, datura is toxic and that he could have a bad trip.
But as he was telling me all this I observed a strange tic-like movement of his jaw, and it hit me like a ton of bricks:
He was late because he was out looking for drugs.
he wasn't hungry because he was drugged.
He was so enthusiastic because he was drugged.
I narrowed my eyes and accused him of having had coke before dinner. He conceded. I was a bit let down, why? I want to put him on a storyline which makes it easier for me to dedicate time to him, and drugs were not part of that storyline until yesterday.
But it is not Óscar whom let me down, it is my own storyline, for Óscar never pretended (and I can't even pretend) to be someone who he is not, but I saw a young man with many handicaps who wanted to improve himself and seek out friendship (which he still is), but the cocaine part will be like a hole in an inflating air mattress, a loss of resources lessons and attention.
And at the same time I see my hypocrisy. I came back home after the cigarette to write this up, and as in the last few days of writing at night I wrote "state: weed" at the top of the day's account, and I saw my own mistake, for I am seeing the shadow in the other and not in myself.
{{Virtuegraph October}}
State: unaltered.
I'm writing about yesterday already halfway through the day. I don't remember much about yesterday, it seemed a blur of work. It was my uncle's birthday, and he wanted me to visit him, but then my schedule didn't fit. I felt regret: yoga I have everyday, but not every day is the birthday of my uncle. I wanted to visit today, but it seems today my schedule is not adequate for a visit either.
State: altered
Enough of work for today, I begun 9am and finished 3pm, how many hours is that? Six, it feels like a ton, and it was not even very intense. I will try to... nothing needs to be changed if things are going in the direction of improvement. I am becoming more engaged by the day with the technical challenge, and seeing the possibility of fruition is a great inspiration for work.
I've seen so many opportunities escape: the domain rush, bitcoin, technical expertise, but at the same time it is fine, because it means I am deeply engrossed in my projects. I can only have two projects: one of them is blank.page and the other is...
I must choose:
* exploration.work
* Introspective writing course
* Runge
* New Bézier Game
* Dibujo con modelo al natural
It would seem that, in order to share any project, exploration.work is what needs to be done first. But, at the same time I need to begin with some content. I already have some content through blank.page, so in order to have two projects functioning in parallel, I must choose the second project.
The second project will clearly be "Dibujo con modelo al natural", as this project feels most fresh and outside my domain.
The answer to the question: what should I be doing? and no immediate threat of hunger, despair, or any uncovered basic need is required, then the answer shall be: work on blank.page, or work on the natural modeling project.
But now I sense a need to pee. This marks the end of this stream of thought.
{{Virtuegraph October}}
State: altered (weed)
I can't help but notice I have no inclination to write if I am in an unaltered state of consciousness, but as soon as I light up I'm possessed with desire to write. This is not true in periods when I do not light up regularly, the creative impulse of writing seems to find its outlet easier in the altered state.
At the same time, I know that the task is to bring this quality of state of non-judgmental flowing in writing into the unaltered state, because what I so call "unaltered" is actually a very altered state of consciousness. Let me call this my "sober state".
My sober state is judgmental, practical, self-referential, and to him this would be a waste of time. Is that true? No, it is not, because I write beautifully in the sober state. I can get drunk from things that are not substances, but experiences. When I am in a heightened state of consciousness through experience it is that I am most aware.
It would seem that my vitality problem stems from problems which have been already been addressed. I am amazed at the quality of energy that the sun provides. And no time is lost, because I no longer nap during the day. I lay in the sun and take it all in.
{{Sun shower}}
{{Virtuegraph October}}
State: unaltered
Yesterday was Friday, so the family came to have lunch. I prepared a BBQ and invited Gaby the neighbor and her cousin who is visiting. We had a nice pleasant lunch, and when they left Gaby came back with some excuse and then started spewing negative things about her cousin. Most complaints seem innocuous, like her cousin is cooking all day, that she can't see her TV show, that the house is a disaster with the visitors (it is worse when she doesn't have visitors). I listened to all her complaints and I wondered what to do: to give her empathy, to give her compassion, to give her rejection, to give her guidance. I just listened and supported her points when they made sense (for she was complaining about a lot of things which didn't seem to merit a second thought even: that her cousin had made a huge souffle).
The way in which I "calm myself down" when I'm weary of visitors or whatever stressor is to focus on the finitude of the situation, and I dialogue with myself to find the positive angle of the situation, but when I present this dialogue to someone who is angry or stressed or whatever, they don't seem to want to cool down, they seem to want to incense themselves and that you burn in anger with them. Is this empathy? or is it just burning because the person next to you is burning?
[[Vibrate with the energy that people present to you]] is something I wanted to try beginning October, and the thing that I want to resolve is this question: "Should I vibrate with negative energy?", and the answer that I present to myself, as I write this question, is that I have always vibrated with my own energy. It doesn't matter much to me that the other person is amused, happy, angry, sad, etc because I... I could come up with a ton of reasons, let us just say that—since I have practiced emotional independence all my life, the way of learning would be to open up and vibrate with whatever energy is present as a form of empathy.
Then, after getting sad, angry or depressed in solidarity with another person—if I am able to accomplish this—I will see the results of my actions.
{{Virtuegraph October}}
State: unaltered
This morning I went to donate blood for a cousin who will have an operation next week. As I was sitting having my blood withdrawn, I saw my fellow blood donors and I thought how strange was all of this, sitting there with more people draining our blood so that they can give it to other people.
I consider this far removed from nature, at least for the recipient, because blood loss must have been a common occurance, and I would not be surprised if blood loss was actually reinvigorating in the medium term. Blood transfusions, however, are a recent development.
But the fact that it is removed from nature does not mean it is harmful or evil or wrong in any way, it just means it needs to be scrutinized more carefully. I remember reading cyclists used to recycle their full volume of blood in order to gain competitive advantage, and it sounded like a terrible thing, a vampire-like setting where the lust is not blood but championships.
I myself felt vain because I found myself thinking that it could impact my physical performance for some days, and I've been quite dilligent at the gym and at yoga recently. "Oh, how vain catch myself thinking that", but proper thinking is not to shutting oneself up. Proper thinking is... I actually deleted some sentences because I notice I don't know what proper thinking is. Let us meditate on it.
A child will never get hurt if the parent protects him at all times, but this impedes development. The parent ought to pay attention at what the child is doing. If the child is getting in trouble, the parent will feel anxiety, but some degree of trouble is necessary for development. The child is the heart and the parent is the mind.
Proper thinking is supportive of the curiosity of the heart. It would involve inverting my direction of action. I see blood donation like a vampire conspiracy because I have not used the heart to understand the reason why I donated blood. It is love of course!
{{Virtuegraph October}}
State: unaltered
Last evening I had promised dinner to Óscar, so I head to his home and found him in the company of his friend, Moy. I told Óscar I would be back with supper, and so I made four hamburgers and took them to his house in a tray.
When I arrived, the tarot had been set on the table. Óscar was expecting to play the tarot, but I was hungry and I asked the table to be cleared (note to self: I should have accommodated a leisurely reading during dinner, instead of gobbling up our hamburgers as fast as we could, but I guess we were all hungry.
I had put forth the intention this month of [[Vibrate with the energy that people present to you]], and, this time this vibration was challenged.
Moy told me he had seen the interior of my house, and saw that I had "some books" which he ascribed to esoterism. I said yes, these are books on esoterism, but esoterism is ultimately about self-knowledge because what you perceive in the external world is really about yourself.
For example, if the cards would spell out the "destruction of the world", it would surely predict the destruction of the world that the person lives in, not the world at large. When one "sees" things, when one "hears" things, and when one communicates with the "spirit world", one is communicating with the inner psychology manifested in the material world. It manifests in the material world because we project the mind or the spirit unto the material world.
I explained this to Moy, to which he answered some vague words, which I recognized as the post-modernist trap: "you believe what you believe, and I believe what I believe" and I said "you are right, we should have begun on the opposite side of the discussion, what do you believe about the esoteric?".
And then they showered me with an hour of explanations on paranormal phenomena. I was desperate for moments, wanting out of the conversation, but ultimately the experiment is to [[Vibrate with the energy that people present to you]] and I made an effort in remaining present, because as people speak to you about sacrifices and the devil and witchcraft it is difficult for the mind to remain where the conversation is. Instead, it will ceaselessly repeat "what am I doing here with these bozos".
I was instructed on the diet of witches (baby human flesh or blood), on the enslaved relationship gnomes have with witches, of the different kinds of sacrifices satanic sects perform on different kinds of animal and human victims.
In the end, I think exploring instead of rejecting this worldview with them was correct, because if the esoteric is the means for inner knowledge, then hearing the esoteric ravings of another human being is also a window into the person's psyche. The devils and angels that this person talks about are not devils and angels in the material world, they are components of his own psyche projected unto the material world, and so it is "real" in a psychological sense.
{{Virtuegraph October}}
I will begin registering the day, as if this were a journal, and I will record my stream of thought. At least for today. A writing exercise could be: register your entire day, then write a summary with the lessons. Or: boil down to the lessons. That is right. inner.observer is stream of thought in the direction of my [[→ work]]. Even though my stream of thought is murky, it carries some nuggets of gold with it, and my own job is to sift throughout my thought in order to find nuggets of gold. This is how I shall write at inner.observer, without any self-awareness. And yet, I find myself editing this very paragraph.
I shall not edit. This is a vice of the keyboard, when you write in a notebook you cannot delete. This does not mean you do not make mistakes, you simply steer the direction of the writing into the intended place and you leave behind mistakes that you must learn to live with, which maps well to real life.
The computer, however, with its undo, its re-spawn, and it's start over, has vied to make us useless, because mistakes in the digital world are (most of the time) impermanent, while the emotional and physical landscape does not have this luxury. If society were to make a huge mistake, could we simply undo our mistake and live on?
No, big mistakes cause big trauma, the human process is very different from the digital process, even though the digital worldview holds many truisms which should be learned upon on the spiritual dimension, on the contrary of the human soul, un-doing, rebirthing, starting over and forgiving are acts that—if done as an act of starting blank slate, you soon realize that it is hopeless, one does not possess the capacity to erase or overwrite. We are pearls that collect coats, and, if one possesses a long nose because he or she lies too much, the coats of paint will emphasize this feature. This is why old people have such salient personality, the bitter are very bitter, the content are very content, the solitary are very lonely, and so forth. They left themselves get into old age without doing any work on themselves, and thus their salient defects intensified in old age.
But there is a kind of old person who listens more than he speaks. Who perceives more than she judges. Who loves more than he thinks, that the sweet grapes of childhood did not age into vinegar, they turned into wine. Older people can be exceptionally wise, if they were able to digest experiences of their life properly. The acquisition of wisdom is tremendously painful, but necessary for one's growth.
One would never grow wise if one could erase, delete, re-spawn any aspect of our experience. The reason people are wise is because they accept everything in their past, un such a way that they have a more amplified consciousness, because the layers of their life are transparent. If you say "nothing is my past is worth hiding" or better yet "it is unnecessary to hide anything from myself or from others", that we are able to show our scars, or festering wounds, is necessary for us to grow wiser. Never try to forget.
{{Virtuegraph October}}
State: [[Altered]].
It is noon and I have indulged on a joint. I am quitting smoking tobacco, and I sense the vice of cigarrette smoking transmuting into desire for any kind of smoking. Perhaps I ought to smoke something less altering.
I just came back from a google search. I can smoke Chamomille, but the effects of Damiana look very interesting. I will try to get my hands on the dry plant from a traditional herbalist, as this is a mexican plant. To have a medicinal garden of sorts would be a nice project. But this kind of project emerges naturally, as I find the need for creating my own boticary.
Vice in the individual is like a constant stream of energy. If you block the energy it will flow somewhere else. To be conscious of these energy flows allows us to design something specific to ourselves. In AA the stream of energy is dedicated to [[The One]], and perhaps this is the only way to free oneself from vice, one day at a time, and dedicating it to God.
The Quoran says: "Don't seek God while drunk", and so I will end my spiritual musings here, should I become lost and then have to undo my way.
Instead, I need to be practical. Let's put ourselves to work.
{{Virtuegraph October}}
State: unaltered
Last night Óscar came to give me back the tupperware in which I had gave him some food. He was distressed. It all came blurting out at the same time... work, friends, state of life. I told him that I would grab a snack and we head out to the park in front of us in order to chat.
"That damn neighbor is saying bad things about me", well, what is he saying? "That I screamed that I wanted to kill him, but that was months ago". Yes Óscar, you will have to deal with this all your life. When you change, people think you are the same as always, it takes them time to notice and accept that you have changed.
He was tense and full of different demons pulling in all directions, so I told him "Óscar, do you remember when we stayed at home instead of going partying? We should do a meditation like that, to calm down. He sort of sulked and I felt like I had said something wrong, like I didn't accept him while angry. So I added: perhaps you ought to let it all out before calming down, but he didn't quite get it.
I realized he was out of cigarettes because he didn't smoke in all this time, and because I am quitting smoking and I wanted to bum one off from him. But this made me realize: a large part of his distress came from the fact that he hadn't smoked, or at least his emotional state would vastly improve after a smoke, so I told him that we should go inside my house to fetch my wallet.
While we were inside, Óscar seemed restless and said that he would do his meditation. "Sure, I'll follow you", I said. He dropped to his knees in front of the [[The Virtuegraph]] and formed a triangle with his hands, which he then put on his forehead. He was really into the ritual and I followed him, feeling tingles of excitement, I'm not sure why.
We went through some ritual motions, which all seemed adequate for a meditation like the one Óscar was doing, and then he prayed Our Father twice. He finished the meditation and came back into himself, being much more relaxed.
Then, all his problems seemed to fade away. He begun chatting not about his problems, but about the goblins and creatures that supposedly inhabit this neighborhood, in his child-like imagination. Óscar, the more I know him, the more complex he is. He has very good spiritual intuition, but he is as dull as a butter knife. This is wonderful in its own way: his lies and deceit are transparent. It is possible to learn much from him, as long as you don't attached to rescuing him.
Today does not have a virtuegraph because Friday is [[Sabbath]] day.
State: altered
Today I was in a terrible mood. Why?
I felt that people "dispose of my time".
That people only think about themselves.
Yet I include myself in this group.
We are only interested in what _we_ see.
We are seldom interested in what the other person sees.
I am seldom interested in anybody.
What am I really interested in?
Where does my thought wander, if it is not triviality?
It is only triviality.
I think I digest, but I regurgitate
Is a repetitive thought a puzzle to be resolved?
Most thought is useless.
Let us be honest: in practical terms, what is one to do?
To catch oneself thinking trivialities.
Come back into [[presence|Presence]].
The world of thought dispelled.
I feel my breath.
I am here.
Writing this, in itself, is triviality.
I'll go to bed now
{{Virtuegraph October}}
State: unaltered
Yesterday I felt bored of it all. "I would like a big change" I thought. "But big changes require stepping out of your comfort zone". I was at the gym when I thought this, and I wondered if there was anything I could do at that precise moment I could do to break my monotony.
I pondered this question a little bit, the only thing that could break this monotony would be to strike up conversation at the gym with someone, preferably someone whom I liked. And I looked around to see whom I liked, and I thought "no way I can do this". Perhaps, in my current hermit lifestyle, stepping out of my comfort zone would be striking up conversation with one of the instructors whom are always friendly.
But I didn't do this. Instead, I went deeper inside of myself. I put my introspection into the inward physical sensations and completed my training without pushing my comfort zone.
I think, starting November, I will start a new [[virtuegraph|The Virtuegraph]] where I push my comfort zone.
{{Virtuegraph October}}
State: unaltered
Today I spent most of the day clearing the wild land behind the house in preparation for the [[nude modeling project|2020 10 10 Nude modelling project]]. I debated wether to document it, and in the end I decided that no, at least not for today. The documentation of work is supposed to go into [[exploration.work|https://exploration.work]], and I still haven't set up this part of my online presence.
I more or less decided that this is will be my main activity every Sunday, until I get the land in the shape necessary for the event. There is much work ahead, years if I wanted, so I have to choose what is important for "launching". I might choose to document what I do on the land next Sunday.
{{Virtuegraph October}}
Today, after many days of dispersion, I finally found a day of focus, but the habit of checking on HN and Reddit kept creeping up on me. I thought: I ought to take breaks creating things that don't require so much concentration, so I traced the platonic solids into a vector format:
<svg viewBox="0 0 1350 390" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="1456" height="390" fill="#FAD7CA"/>
<g filter="url(#filter0_f)">
<path d="M395.5 304L310 286.5L395.5 272L495 286.5L395.5 304Z" fill="#8F7000" fill-opacity="0.4"/>
</g>
<g filter="url(#filter1_f)">
<path d="M680.5 304L595 286.5L680.5 272L780 286.5L680.5 304Z" fill="#506826" fill-opacity="0.3"/>
</g>
<g filter="url(#filter2_f)">
<path d="M944.5 304L859 286.5L944.5 272L1044 286.5L944.5 304Z" fill="#265868" fill-opacity="0.3"/>
</g>
<g filter="url(#filter3_f)">
<path d="M1210.5 304L1125 286.5L1210.5 272L1310 286.5L1210.5 304Z" fill="#68265A" fill-opacity="0.36"/>
</g>
<path d="M117 261L121 101L31 244.5L117 261Z" fill="url(#paint0_radial)"/>
<path d="M218 244.5L121 101L117 261L218 244.5Z" fill="url(#paint1_radial)"/>
<path d="M121 101L120.5 104L118.5 184L121.5 104L121 101Z" fill="#FFF6F3"/>
<g filter="url(#filter4_f)">
<path d="M117 304.5L218 271H31L117 304.5Z" fill="#B22A1A" fill-opacity="0.2"/>
</g>
<path d="M404 124.5L313 112L405 101L496 113L404 124.5Z" fill="#EDB307"/>
<path d="M312 238.5V111.5L404 124.5V250.5L312 238.5Z" fill="url(#paint2_radial)"/>
<path d="M495.5 113L404 124.5V250.5L495.5 239.5V113Z" fill="url(#paint3_radial)"/>
<path d="M404 124.5L366 119L403.5 125.5L404 163.5L404.5 125.5L438 120L404 124.5Z" fill="#FFF6F3"/>
<path d="M683 275.5L590 183.5L683 89L775 183L683 275.5Z" fill="url(#paint4_linear)"/>
<path d="M683 275.5V195.5L775 183L683 275.5Z" fill="url(#paint5_linear)"/>
<path d="M683 193L590 182.5L683 89V193Z" fill="url(#paint6_linear)"/>
<path d="M683 193.5V89L775 183L683 193.5Z" fill="#869A1F"/>
<path d="M606.5 184.5L683 193.5V125L681.5 192L606.5 184.5Z" fill="#E2D994"/>
<path d="M869 189L877 133.5L930.5 102L952.5 141L915.5 195L869 189Z" fill="url(#paint7_linear)"/>
<path d="M1012.5 159.5L1027 132.5L1036 181L1027.5 228.5L1020 230L1012.5 223.5V159.5Z" fill="url(#paint8_linear)"/>
<path d="M952.5 141L930.5 102L977 98L1027 132.5L1012.5 159.5L952.5 141Z" fill="url(#paint9_linear)"/>
<path d="M952.5 141L915.5 194.5L952.5 245.5L1012.5 223V159.5L952.5 141Z" fill="url(#paint10_linear)"/>
<path d="M879 237L869 188.5L915.5 194.5L952.5 245L930 271.5L879 237Z" fill="url(#paint11_linear)"/>
<path d="M930 271.5L952.5 245L1012.5 223L1020 230L1027.5 228.5L1026 237.5L976.5 267.5L930 271.5Z" fill="url(#paint12_linear)"/>
<path d="M944 126.5L929.5 103L930.5 102L976.5 98L931.5 103L944 126.5Z" fill="#CEDBE0"/>
<path d="M916.5 193L915.5 194.5L885 190.5L916.5 193Z" fill="#CDDBE0"/>
<path d="M1130 232.5L1160.5 191L1209.5 266.5L1130 232.5Z" fill="#C4C4C4"/>
<path d="M1130 232.5L1160.5 191L1209.5 266.5L1130 232.5Z" fill="url(#paint13_linear)"/>
<path d="M1289.5 230.5L1288 135L1259.5 191.5L1289.5 230.5Z" fill="#C4C4C4"/>
<path d="M1289.5 230.5L1288 135L1259.5 191.5L1289.5 230.5Z" fill="url(#paint14_linear)"/>
<path d="M1209.5 266.5L1160 191.5H1260.5L1209.5 266.5Z" fill="#C4C4C4"/>
<path d="M1209.5 266.5L1160 191.5H1260.5L1209.5 266.5Z" fill="url(#paint15_linear)"/>
<path d="M1130.5 232V135.5L1160.5 191L1130.5 232Z" fill="#C4C4C4"/>
<path d="M1130.5 232V135.5L1160.5 191L1130.5 232Z" fill="url(#paint16_linear)"/>
<path d="M1289.5 230.5L1209.5 266.5L1260 191.5L1289.5 230.5Z" fill="#C4C4C4"/>
<path d="M1289.5 230.5L1209.5 266.5L1260 191.5L1289.5 230.5Z" fill="url(#paint17_linear)"/>
<path d="M1210.5 110V99L1288.5 135L1210.5 110Z" fill="#C4C4C4"/>
<path d="M1210.5 110V99L1288.5 135L1210.5 110Z" fill="url(#paint18_linear)"/>
<path d="M1260.5 191.5L1210.5 110L1160 191.5H1260.5Z" fill="#5E4471"/>
<path d="M1160.5 191L1130.5 135.5L1210.5 110L1160.5 191Z" fill="#C4C4C4"/>
<path d="M1160.5 191L1130.5 135.5L1210.5 110L1160.5 191Z" fill="url(#paint19_linear)"/>
<path d="M1260 191L1288.5 135L1210.5 110L1260 191Z" fill="#583E61"/>
<path d="M1130.5 135.5L1210.5 99V110L1130.5 135.5Z" fill="url(#paint20_linear)"/>
<path d="M1209.5 108.5L1210.5 99L1211 108.5L1269.5 128.5L1211 110L1237.5 154.5L1210 110.5L1180.5 158.5L1209 110L1152 128.5L1209.5 108.5Z" fill="#D5B7C1"/>
<defs>
<filter id="filter0_f" x="280" y="242" width="245" height="92" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="15" result="effect1_foregroundBlur"/>
</filter>
<filter id="filter1_f" x="575" y="252" width="225" height="72" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="10" result="effect1_foregroundBlur"/>
</filter>
<filter id="filter2_f" x="839" y="252" width="225" height="72" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="10" result="effect1_foregroundBlur"/>
</filter>
<filter id="filter3_f" x="1105" y="252" width="225" height="72" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="10" result="effect1_foregroundBlur"/>
</filter>
<filter id="filter4_f" x="11" y="251" width="227" height="73.5" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="10" result="effect1_foregroundBlur"/>
</filter>
<radialGradient id="paint0_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(121 101) rotate(91.7899) scale(160.078 90.1706)">
<stop stop-color="#B4280F"/>
<stop offset="0.186341" stop-color="#B22A1A"/>
<stop offset="1" stop-color="#EF8A6A"/>
</radialGradient>
<radialGradient id="paint1_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(123 105) rotate(73.718) scale(210.44 136.761)">
<stop stop-color="#F59474"/>
<stop offset="0.552083" stop-color="#B4280F"/>
</radialGradient>
<radialGradient id="paint2_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(400 125) rotate(127.788) scale(143.618 94.2013)">
<stop stop-color="#FAD7CA"/>
<stop offset="1" stop-color="#F1B715"/>
</radialGradient>
<radialGradient id="paint3_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(406.5 126.5) rotate(65.0513) scale(126.836 84.0975)">
<stop stop-color="#E3A713"/>
<stop offset="1" stop-color="#D38F14"/>
</radialGradient>
<linearGradient id="paint4_linear" x1="590" y1="184.5" x2="774" y2="184" gradientUnits="userSpaceOnUse">
<stop stop-color="#ADB047"/>
<stop offset="0.53125" stop-color="#4A7219"/>
</linearGradient>
<linearGradient id="paint5_linear" x1="684" y1="197.5" x2="721" y2="233.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#889A34"/>
<stop offset="1" stop-color="#5C8122"/>
</linearGradient>
<linearGradient id="paint6_linear" x1="632.5" y1="141" x2="677.5" y2="193" gradientUnits="userSpaceOnUse">
<stop stop-color="#B6C56E"/>
<stop offset="1" stop-color="#97AB28"/>
</linearGradient>
<linearGradient id="paint7_linear" x1="892.5" y1="111.5" x2="943" y2="139" gradientUnits="userSpaceOnUse">
<stop stop-color="#9DB6BD"/>
<stop offset="1" stop-color="#669AA5"/>
</linearGradient>
<linearGradient id="paint8_linear" x1="1016" y1="189.5" x2="1036" y2="189.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#477573"/>
<stop offset="1" stop-color="#376259"/>
</linearGradient>
<linearGradient id="paint9_linear" x1="938" y1="107" x2="1011" y2="155" gradientUnits="userSpaceOnUse">
<stop stop-color="#72A0AF"/>
<stop offset="1" stop-color="#A5B6BD"/>
</linearGradient>
<linearGradient id="paint10_linear" x1="934.5" y1="180.5" x2="1007" y2="221" gradientUnits="userSpaceOnUse">
<stop stop-color="#356359"/>
<stop offset="1" stop-color="#588A91"/>
</linearGradient>
<linearGradient id="paint11_linear" x1="874" y1="194" x2="946" y2="245" gradientUnits="userSpaceOnUse">
<stop stop-color="#406F69"/>
<stop offset="1" stop-color="#598993"/>
</linearGradient>
<linearGradient id="paint12_linear" x1="936.5" y1="269" x2="1027" y2="232.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#3E6C69"/>
<stop offset="1" stop-color="#8AA8B3"/>
</linearGradient>
<linearGradient id="paint13_linear" x1="1149" y1="210" x2="1202.5" y2="261.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#503A4F"/>
<stop offset="1" stop-color="#735682"/>
</linearGradient>
<linearGradient id="paint14_linear" x1="1274.5" y1="135" x2="1274.5" y2="230" gradientUnits="userSpaceOnUse">
<stop stop-color="#261815"/>
<stop offset="1" stop-color="#4D374E"/>
</linearGradient>
<linearGradient id="paint15_linear" x1="1163.5" y1="192" x2="1231" y2="229" gradientUnits="userSpaceOnUse">
<stop stop-color="#35262B"/>
<stop offset="1" stop-color="#553D4D"/>
</linearGradient>
<linearGradient id="paint16_linear" x1="1131" y1="139.5" x2="1146" y2="208.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#7D5D8E"/>
<stop offset="1" stop-color="#9F7C9C"/>
</linearGradient>
<linearGradient id="paint17_linear" x1="1271" y1="210.5" x2="1213.5" y2="264" gradientUnits="userSpaceOnUse">
<stop stop-color="#735161"/>
<stop offset="1" stop-color="#4F374D"/>
</linearGradient>
<linearGradient id="paint18_linear" x1="1212.5" y1="107" x2="1281.5" y2="131.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#76567B"/>
<stop offset="1" stop-color="#79597E"/>
</linearGradient>
<linearGradient id="paint19_linear" x1="1134" y1="137" x2="1206" y2="114" gradientUnits="userSpaceOnUse">
<stop stop-color="#A481A1"/>
<stop offset="1" stop-color="#7F5D8F"/>
</linearGradient>
<linearGradient id="paint20_linear" x1="1145" y1="128" x2="1211" y2="106" gradientUnits="userSpaceOnUse">
<stop stop-color="#513172"/>
<stop offset="1" stop-color="#694C86"/>
</linearGradient>
</defs>
</svg>
It is possible that I will do more of these things.
{{Virtuegraph October}}
State: unaltered
Today I was biking toward my yoga class when a thought popped up: what do I want to do with all this registration of inner experience? And the answer came—I seem to like to explore in all senses and in all realities, and I seem to be collecting experiences that will become //something// when I grow old. Right now I need to be not concerned at all about what I will do with it, but when I'm old and my desire to explore diminishes, I will have time to come back to all my entries and decide what to do with it.
In the last two days thought has been coming back to material work: I've blocked Reddit and Hacker News, which are my usual distractions, and when I type these addresses by muscle memory, I'm greeted with an error page that reminds me to create, not to consume.
So on my breaks from work, I shaped up a very basic structure at [[exploration.work|https://exploration.work]].
{{Virtuegraph October}}
State: unaltered
There seems to be three ways to respond to emotional events:
# Repress it
# Express it
# Observe it
Repression can take the form of a //transmutation// of emotion. You may laugh when you feel embarrasment, you may sulk when you feel angry, you may get angry instead of crying out of sadness. The other form of repression is more straightforward: you remain outwardly impassive while inwardly you are on fire.
This is the most immature way of dealing with emotion.
The second tier, expressing emotion, is what we observe in psychologically healthy people. Emotions are treated naturally, and if you get angry you express anger, if you're sad your express sadness and so on.
The third option, while being the spiritually more advanced option, outwardly seems like repression, but it is actually a detachment from the emotion. "Oh, that made me angry, I'm boiling inside!" and one has the option to //live through the emotion// or to simply observe. There is no judgement about the emotion itself, you let it run its course and observe.
I write this because of the interactions with my family. It is funny how family changes the usual rules of interpersonal engagement. Where most people who know me would say I'm a non-judgemental and accepting person, my immediate family would say the opposite. I know I'm not alone in this, and a lot of people display this in even more pronounced ways.
I would say in my younger years my way of dealing this would have been #1, I would go into my bedroom rather than to have to deal with the emotional exhasperation. But nowadays I find myself at #2, expressing more disapproval and negative affect rather than shutting myself in. And I almost dislike myself by doing it, "why am I such an asshole", I think, but at the same time it feels like I'm being honest by not concealing my emotions.
The direction of growth would be to move to #3, to observe my own emotion and to accept it without judgement, but not roll my eyes or blurt out something hurtful. It would be to have five seconds of silence and react with a degree of wisdom that a purely emotional response will not have.
{{Virtuegraph October}}
State: unaltered
Today I was biking towards my university, which is a long ride, and as my body was tired from yoga earlier in the morning, I biked at a leisurely pace. I've done this trip perhaps a dozen times, but I had never taken the time to observe the scenery (which is quite uninspiring, the biking lane is in the middle lane of a busy highway).
I looked at the billboards and nothing seemed to make sense: "Where everything begins" said an advertising for a school. Then a typical image of the church on the top of the pyramid of Cholula, with the volcano as a backdrop, "At the vertex of an oath" it said, with a logo that I hadn't seen before. Then a logo in the inspiration of the London Underground logo saying "Look for this logo 7Km ahead", with no explanation about //why//.
Useless advertising is nothing new, but on this occasion it made me feel alienated, as if I wasn't in the joke, and I fantasized about escaping to live to a small town where this kind of bullshit doesn't pop up, and my yearnings to head back to Spain reappeared. It's been one year since I came back to Puebla and I feel as if it was a lost year. Nothing of relevance has been produced, no new friends or romances have appeared on the horizon, I feel like I'm kicking a can waiting for something to happen, but then I think //I need to make things happen//.
I use an inordinate amount of time keeping myself sane. Three hours of exercise per day, thirty minutes of meditation, thirty minutes of sun bathing. When I don't do this, my mood deteriorates rapidly. The boredom has led me to overindulge in weed, which I ceased smoking a week ago, and the boredom has hit me like a train and made me realize I'm stagnated in my current situation.
I approach change with the outmost caution, because 9 out of 10 times one should seek acceptance, not change. Change often comes with acceptance, I still don't understand why, but as Carl Rogers said: "I can only change when I accept myself". Yet, on this occasion, I've been patient enough to know that it is time to for the ego to shuffle things around in order to induce a collapse of sorts. The collapse may be painful, but at least it will be different.
{{Virtuegraph October}}
State: unaltered
Two days ago I fell into a pothole while biking. I didn't fall from the bike, but I felt the shock on the handlebars, and then the bike made some strange noises while pedaling, but I couldn't find the source. I went on biking and I felt the bike had lost rigidity. The sensations were strange, if I would shake the handlebars it would feel as if the bike would make swimming motions, like a fish.
I inspected the bike, but could find nothing. I shrugged and kept on biking. But the sensation of instability was getting worse by the kilometer, to the point where I was afraid it would somehow fall apart if I was too rough on it. Yesterday I inspected the frame and found a crack on one of the joints that had almost completely run through the diameter of the tube.
I lamented my accident, because I thought this was game over for my bike. I pondered my options and decided that the best course of action would be to get a new bike on monthly payments, as I can't afford a new bike at this time, yet it is absolutely essential for my transportation because moving in public transport in Puebla is slow, inefficient, and in these times dangerous to health due to covid.
But I wanted to verify with my bike mechanic, so I head with him and he told me it was fixable, all I had to do was go to the muffler store so that they soldered the frame. I expected the price to be considerable, but I was surprised that it amounted to $3 USD.
{{Virtuegraph October}}
The last day of October, full moon. I want to create a new [[virtuegraph|The Virtuegraph]], and for this I must establish a //destination// of sorts. Where would I want to be at the end of November? I hesitate. I feel like I cannot do much about my current situation, even though I'm dissatisfied with it. I'm not in the frame of mind for setting myself goals, it will be better to simply register experience. But I'm too tired for this. I will wait for the morning to come in order to come from a fresh start.
But, for now, I will try to glean on what I have learned from practicing my current virtuegraph.
[[Sun shower]]: Effortless. Good for the soul. But having this habit well established, I feel like it is no longer necessary to keep as a [[keystone|The keystone]]. I will put this in the background.
[[Look in the eyes]]: I can only do this when I'm in a certain frame of mind. Most of the time I don't feel like doing it, and it reflects on the amount of times I did it this month. I think, what I really want, is to meet new people. I don't have to become friends. I just want some variety in my social life, which is difficult during the pandemic. Tomorrow I shall see how I evolve this task.
[[Meditation]]: Effortless. But I notice I do this more when I need it more. I would like to establish a more formal schedule for it. In the last few days I've been doing it before going to bed. When I begin dozing off I go to bed. Perhaps this is the time to do it.
[[Material Work]]: I feel like I register hours sitting down at the computer rather than effective time working, or flow. I would like to register better the subjective experience of work.
[[Body Work]]: Comes naturally. There are certain areas that I would like to explore more, this feels like it is not a matter of registering my activity, but of registering new things that I discover about my body.
* Expand upon experience
* Do new things
* Registration of mood
* Family work
* Dreams
* Wiki work
---
The next day. My credit card statement came in and I'm ~500 USD in the red. The priority then is to work towards financial freedom. I've lived like a monk for long enough. Let us put the majority of our effort towards paid work. This is quite simple in practice so no virtuegraph will be required.
Last night I dreamed about the [[Bézier Game]] and it was plenty interesting because it gave me a real idea: you could draw the assets of a stage yourself. This could give the sensation that you are building your own game. I still need to ponder this idea, but I think it has potential.
---
On Friday I was ready to give up on my experiment of ceasing to smoke weed. In a sober state I'm experiencing very negative affect with my family, I notice myself being resentful towards the smallest things, and I make myself angry by thinking these things. It is ridiculous.
So I biked to the smoke shop and the attendant told me to come back next week because they had run out of it. By intuition I knew //it was meant to be this way//, that I must work out my anger by inner rather than by outer means. And yet, when I came back home and had dinner with Oscar, I asked his roomate if he had a tiny bit so I could sleep better. But he had none. Again, confirmation that I am meant to work through this in an unaltered state.
The first few days I was waking up in the middle of the night and having trouble going back to sleep. However, by now my sleep schedule has become more regular, and my affective state has improved a lot through compassion meditation.
Time and time again I see that any positive change caused by external agents is missing inner work. In seeking inner freedom one must liberate oneself from the chains of external agents.
---
{{Keith Twitter exchange}}
It is time to jump into [[exploration.work|https://exploration.work]]
I will begin writing my work logs as I did when I started them back in Method of Action: a simple description of the tasks performed, along some insight on how to do things better.
I woke up quite early, it was 7am perhaps. I got sidetracked by a number of things and noticed I begun work at 10:30. The thing that took me most of the day was writing the "financing proposal" for the next version of the Bézier Game, which I would like to crowdfund.
Asking for money, no matter if its payment for work done or work in advance, such as is the case with crowdfunding, is terribly difficult for me. These kind of tasks usually take the most of the day, and I end up drained because I always have trouble doing things which I do not want to do.
In work, one needs a secondary task with which to procrastinate productively. So, when I would get stuck I responded to a couple of emails, strategically chosen as to reduce the amount of time I'll need in the future, and to advance other projects.
One of these projects is my university degree. It has been a nightmare. Last semester I applied for graduation, but it turned out one of my documents was missing a "legalization" where my high school diploma need to be verified against the archive because... I was given no reason, high school certificates from before a certain year need to be "legalized", whatever that means. I suspect there used to be a lot of forged documents and this is a way of verifying it was real, but it caused me to waste an additional six months waiting for my degree.
In any case, I should add my degree to my list of projects.
After I was done writing the text for the crowdfunding page, and I had done my email chores, I head to the gym to blow some steam off, but I found myself weak. I always register the weights I use and how much I lift, but on days like these I tend to avoid it becuase it is a fluke. If I am usually performing 12 pull-ups and today I did 10, I know it is because my stomach is queasy, and it feels like there is no point in registering this.
But there's also flukes on the other end of the spectrum, the day you feel particularly strong and are able to perform 14 pull-ups. Why is it that these are proudly registered? But this actually rarely happens now, because I know if I am able to exceed my normal progression I self-adjust and avoid setting the bar too high. You may be proud of yourself that day, but the next day you must perform the exercise and match your performance, you will resent your pride.
After the gym I biked to yoga. It was a particularly intense physical class, while I was hoping for something easier on the body, I still enjoyed it quite a lot. The teacher had a lot of praise for my classmates but not for myself. I'm not sure if it was noticeable that I was on a slump, but I interpreted the fact as such. I was not envious at all about the praise that I didn't get, but at the same time I was surprised at not feeling the slightest tinge of envy.
I came back home and wondered what should I do until I wait for Óscar to show up for dinner. So I opened blank.page and I put myself to write. All came out quite easily, and I am surprised, but now I must understand how everything fits in in exploration.work.
Marina is a sweet-but-though 26 year old woman from El Salvador whom arrived to my neighborhood about four months ago. The details of how and why she arrived here are irrelevant to the case, but she is making her way to the US in order to reunite with her brother, who is an honest and hard-working man, though this is just the impression I got from the interaction we had arranging a bank transfer and withdrawl for her sister.
We arranged this transfer two days ago, on a Sunday. She was insistent that it all had to be done that same day. I was happy to help, but irritated at her insistance that I do it the same day. Besides, why was it me who had to help a hand? She has a Mexican boyfriend who has the necessary documentation for that. Ahhh, maybe the boyfriend might want to be indulge in the financial stash and she wanted to keep it secret.
After a failed attempt at withdrawl because I had arrived too early to the bank I texted her that I would try again the next day, on Monday. She pleaded with me to make some time and try again. Irritated to the point of frustration, I head to a dollar store and wasted time and money buying things I didn't want or need. I went back to the bank and got the withdrawl, and then planned on lecturing her on being more considerate with the urgency of her plights.
Despite her throughly reserved manners, when I gave her the money I sensed her relief, and I understood that it was important for her. So I promptly discarded my lecture and head back home.
This morning I encountered Óscar, the owner of the house where Marina is living. He is a man with a biological age of 36, but I estimate his mental age to oscilate between 9 and 18, depending on his well-being. Stress puts him under terrible fits of rage, which have been under control lately, but I could see he was boiling inside.
—"Marina has COVID! That's enough! They are out of my house!"
—"Wait a minute Óscar, what? Who says that?"
—"The doctor!"
—"Well, and what are you going to do?"
—"Somebody needs to speak with them, I cant... I can't do it".
—"Hmmm hmmm. Look Óscar, it is a complex situation. You shouldn't throw her out because she is sick.
—"It's not just that. She treats me like I am stupid and she bums my cigarrettes. She uses my shampoo without my permission. She takes food without asking".
—"Look Óscar, we need to talk about this over dinner. Drop by tonight and we'll chat about it".
I considered his plight seriously. This was indeed a crisis situation well beyond his capacity, and given his mental situation. She arrived to Óscar's house via her boyfriend, who is friends with Óscar. Her boyfriend often stays over, but does not live with her.
If it were possible, it would even be wise for him to kick her out as soon as possible. He can't take care of himself, it is impossible to ask of him that he attends her needs because she can't leave her room. But that would be leaving her the terrible state of finding another home while sick. A likely scenario, should nobody intercede.
The other likely scenario was that she would flat out refuse to leave, because she knows her situation would be dire. Marina claims to have been a gang member, which I believe, and in her situation it is also wise to defend a safe haven, her alternatives could be much be much worse.
I thought this until Óscar came for dinner today.
He played down the incident and said that his friend, Marina's boyfriend "made him believe it", and when I asked him to elaborate, he made it seem it had all been a joke. "But what happened then? They let you go thinking she had covid?", he demurred and changed the subject.
"Listen, Óscar, it is your house and it is your right to ask someone to leave, but it can be very messy and even if she does not have COVID, you've been complaining every day about them, but I must ask you to consider: remember when you were all alone, and how difficult it is to be on your own. Your current life looks more sensible than what you had before. If you are kicking out your friends, you will be back on your own and you must take that into consideration."
He thought about it two seconds.
"No, it's not worth it, they are fighting all the time, it scares me, it messes me up. Today it was terrible, they hit each other. I yell them to stop it, but they don't stop.".
Well, Óscar, yes that indeed sounds terrible, no wonder you want to get away of it. And he kept on complaining about minor things which anybody who has gone through privations will understand where they come from. We continued with dinner, and it came to me suddenly: "Óscar, was X violent with Marina because he discovered she was hiding the money his brother had sent?". He looked down and said: yes, it was about that.
So this bastard beat her up because of the money. He probably took it. If this is true, he would have left, leaving a window of opportunity to intercede, even if the chances of things getting messy are high. I must operate entirely from spirit, and allow reason to seek no attachment to outcome.
The Sufis speak of veils removed, and I felt this one removed and understood her plight: she is trapped in a horrible situation from which she clearly has to move on. I must speak with her tomorrow, and ask her what she needs to get her unstuck.
I've spent most of the day thinking about Marina's case. I was at the gym and I tried focusing on my breath, but my attention was insisting on resolving the issue. I think I have resolved it, and I will write it down in order to process what this means.
People who most need help are those who pretend nothing is happening to them. That they are tough, that they can handle whatever life throws at them. This is an admirable quality and good adaptation to a life full of misfortune, but underneath the thoughness, underneath the crust flickers a flame, which everyone can see it if they pay attention.
I have come to understand Marina's plight from an objective perspective: despite living with a mentally challenged individual and suffering through an abusive relationship, passing difficult privations, she has to put up with it because she has no other way.
Spiritual knowledge says not to carry other people. What I need to find out, and for this I must interview her, she complains about her living situation, but she has never spoken about other plans. If she is as trapped as I think she is, I will show her a way. I saw it clearly and it is relatively simple to execute, but I must not write about it until it is done.
State: altered
I looked at myself in the mirror and I remembered I developed a case of dermatitis on the face. This only happens when I am under stress. I was also snappy with my family when I had lunch with them, today. I find myself well-immersed in projects, not pushing myself but perhaps asking too much from myself in all realms: the body, the spirit, and the mind. But, if I were asked, I would say I am not under stress, but the body says otherwise.
To whom to listen? On Sunday I smoked a joint and stretched my body. I noticed all kinds of pains in each one of my muscles, pain of soreness, but I was able to relax myself through the act of //noticing//. It is true: I had not noticed I was sore before inhabiting the body.
What is inhabiting the body? Well, I am sitting right now crouched in front of the keyboard. Let's put the feet on the floor in order to ground ourselves. Lean back. Relax into your body.
Follow your breath, then begin typing. Sometimes self-consciousness gets the best of us, and we begin making even more mistakes than normal. Relax, allow the observer and the observed to become one.
An old memory of Goethe came to mind: in his autobiography, he tells of a story that during his childhood he invented for his friends on the fly. The amount of detail is staggering, and later on I read a fantasy short story of him, which name I do not recall at this time, exhibits the same attention to detail.
How can such minds exist? One is humbled by the genius exhibited in these minds, in comparison I am a chimp pounding at the keyboard. What contribution could I make in these poor attempts at poetry of life in the face of such genius.
If I cannot write or think as he does, I shall at least echo his creation through the means that I posess.
State: altered
A long productive day. Was it really productive? Well, I technically released the v0 of Runge to René, so some degree of productivity is felt on the day one releases something. I find myself immersed in work, not in the best of moods, but this mood is often necessary to push oneself past that idealism that brings great inspiration but also makes projects impossible to deliver upon.
How does one present the result of a spiritual exploration as a practical means of solving something? Is this a way of designing? I suppose it is. But let us make this a five year project on which I build upon. I will understand what this project means when it is "done", and any meta thinking about it at this stage is //ego-in-action//.
In the matter of foul mood as necessary for work, I wonder if this is truly necessary. The inner game one plays is "becoming tough" and pushing through aversions to work, or impulses towards procrastination. When I read my Twitter of only a handful of extremely curated accounts I still sometimes roll my eyes and I'm gently reminded I should go back to work.
I've practiced a bit of awareness, instead of heading to hacker news on my phone, I will answer myself a question that I have been pondering lately that the internet can answer. It could be something as simple as what bug was creeping in my house but often it will be work related topics.
Anything that is a "stream" where you can tune out and be fed from it, you should have complete control over the ingredients. Let your stream be as pure as possible. I've never been glad about clicking on the trending topic. Be ruthless letting the AI know what you don't like. Silo yourself if necessary, it is ruthless out there.
And yet I seem to produce a stream blabbering to which I hope nobody wastes their time reading through them. If there is a reader of these words, let him or her know that they should not waste their time reading the ramblings of this man for whose mental sanity cannot be accounted for.
These are just high thoughts. It is 21:14, should we drink from the polluted stream that is YouTube? Clearly not, I should stop doing that for lunch, or anytime actually. You could ask YouTube what is on the menu, which is limitless, yet you choose the day's special because you are lazy, and then YouTube starts recommending things for lazy people.
Wake up. There is nothing to be seen but the things that are worth seeing. The things that are worth seeing are the natural, inner impulses of curiosity, not the things that are being fed to you. This is just the old TV repackaged in another format.
Which is a shame, because it had so much potential... It is time to wrap this up. It seems a topic worth writing about when I'm unaltered.
State: unaltered
Many days without writing. I sometimes stop writing when life gets too intense, because processing emotion is difficult, and thus even though the day could have been interesting, it can be difficult to write about.
But every time I look back into I write, the only thing I regret is //not writing//, and yesterday I was laying in bed and I thought to myself: "if I consider what I experience important, I should write about it first thing in the morning tomorrow". And yet here I am, wondering why I made this commitment, because with my fingers on the keyboard, things seem to make little sense.
I think the purpose of making a commitment to write was simply to be able to prove that Will exists and it is possible to actually "do what you want". This statement may seem strange, but given my life situation it is an important piece of evidence that I am not being dragged by the flow of life itself—That I am swimming in the river of experience rather than being dragged by it.
These days I have chosen to stop smoking tobacco, to restrain from releasing my sexual energy, to diminish my weed smoking, and it is going well, but I notice a transformation of thought, a more aggressive and willful masculine energy that has no time for nonsense. If I come back to my vice I become more mellow, content about my life situation, and I would even dare to say: more creative because my attention and thought is not directing towards the striving for reproduction or status.
I shall describe some of the events of the last few days as to fill the gaps from my experience.
---
In front of me is my new bike. Some days ago, as I was struggling to pedal over a hill pulling strong on the handlebars, these seemed to give out and I found the handlebars to incline on an impossible plane. I looked at the base and saw a crack which was the source of the instability.
I debated wether to buy a new bike, or to repair the old one. The bike was rusting from the inside, yet it is still serviceable. I decided to take a look at the bikes available at supermarkets, with the intention of buying if I encountered something decent at a $150 USD price point.
I found a perfectly good bike at $120. It is very similar (if not the same) model that I left behind in the Madrid bike shop last year. Despite being a low quality bike, compared to my old one it feels smooth and luxurious.
---
Oscar stole two cigarettes from me when I was not looking. I had invited him over for dinner. The next day I confronted him about it. He sweared he hadn't done it, and looked at me in the eye and said "I swear I didn't do it, I can't look in the eye if I'm lying", and he made me question my assessment.
I got up and went into the kitchen. Then, for some reason I don't understand, he confessed. He probably thought I had risen from my seat out of madness. What was most strange was that I actually had believed him. I thought I was good at looking through lies, but now I see that detecting lies is a skill that develops in an environment, and he surely lied a lot to his mother and became quite good at it.
I made a big issue about it: "Look Óscar, for two cigarettes you are risking our friendship and the daily dinners that I give to you. If you ever steal the smallest thing from me again I will not be mad at you, I will simply start treating you as before: I will say hello and be cordial, but you will never enter my home or obtain anything from me again".
He was quite sheepish about the whole situation, which surprised me because his way of confronting conflict is by getting combative. He even said "I feel mad, but I know I have no reason for being mad, it is me who is at fault".
Sometimes Óscar's self awareness surprises me.
State: unaltered
Yesterday I had thanksgiving dinner with my family.
I dislike myself when I am with my family. I become demanding, judgemental and sarcastic. I notice this while I am with them, and strangely enough I cannot prevent myself from behaving like this, even if I am aware of it.
There were two children at dinner, one was the son of my sister, the other the son of my cousin, and I brought them two gifts, one was a book, the other a pump to inflate balloons. The child that received the book cried and made a big scene, running to the arms of this mother for consolation.
I felt contempt and I thought that the kid needed to toughen up. I could almost feel myself sneering at him. Eventually the crisis resolved and the children were able to play with the new toy, the book forgotten in a corner.
When I came back home I reflected upon the scene, and I understood it was all perfect: the mother must provide unconditional love. If the child seeks consolation, no matter how senseless the tantrum, the mother ought to provide that consolation. My own role in the situation is to provide rejection, because the behavior is socially unacceptable, and in this way the child receives both the consolation from disappointment, and the understanding that crying after receiving a gift is not socially acceptable behavior (I dislike this phrase, but it is what it is).
As Ram Dass said: if you think you are awakened, go have Thanksgiving dinner with your family. Indeed.
State: altered.
I come to sit down with certain spasms in my back, which I can't tell for sure if they are muscles or kidney which is in pain. I feel myself and I feel inflammation. My gums seem inflamed too. I must be in the low polarity because of the stress manifested in my skin. So I must not be running at a sustainable pace.
It is true that I push my body to stupid limits because I am constantly wanting to "progress", and this progress is the metrics of your lifts, so I broke my deadlift record and I am paying that price. I have given myself some days of rest and will probably skip the gym for tomorrow, or take things very lightly. The stress phenomena is clearly self made, because I have no boss and no responsibility except to myself, but unfortunately "myself" seems to be an ideal I try very hard to grasp, but I am inevitably attracted to the banal, the pity, the desires, and I can't let myself shine through these stupid aspirations.
I have told myself all possible stories in all possible ways, and I have explored them vehemently, with all the passion I could muster at the time, which was at times equally dramatic in its gloom as it was in its glory, those times were lived intensely and are remembered as great lessons of The Way. Only God will know what I've been through, and through his permission will I find the inspiration to share my spiritual findings.
It is a very strange situation in which I find myself. I feel like the Quijote, I came back home wounded. I woke up again. I am supposed to be doing something important. What is that? It does not matter, any conclusion that I reach in this state will be forgotten. This inspiration belongs to sober-land, so that it can be acted upon.
Is this true? Can't we just forget about sober-plans and imagine what could be accomplished over complete control of one's means for... Too many times I have fallen into this trap, altered inspiration belongs to a different realm, in which a pointer of one's own capacity to delve into the confines of the self to which the sober self does not have access.
It is a place that is found, but is not opened. It is the closet of the 10,000 things, and if you begin ordering it you will never end. Awakening is knowing that your closet is in disorder and being happy with it. Sometimes the labor of re-ordering it is progressive, and we wish to meet awakening at the middle point.
Let us at least quit smoking weed, because this was my last joint, and continue this level of inspiration, but in the unaltered state. I truly think that if I read myself in this state, tomorrow I will be able to pick up the stream of thought of this process, but only if my awareness at this time is to tell myself: reading this will lead to a treasure box that you did not want to open in this state.
Tomorrow morning I will come to continue writing here.
---
Today see I was led to something that looked like a treasure chest, but was not exactly that. It is interesting, none-the-less. It is true that I am not happy with my closet, despite it being pretty tidy, at least compared to what I've seen out there.
Right now I just feel like beginning work. The only way true progress is done is through work, be it inner or outer work. Let us admire sobriety and continue walking this path.
I've been toying with the idea of having a public medical check-up every year. I would get blood, urine, testosterone, cholesterol and other health markers measured, as well as a picture taken, and then compare these numbers year after year.
What worries me about this situation is the pain it would cause me to see the decline—I'm 40 years old now, in the best shape I've been in my life, not without health issues but pretty healthy in general, and in order to do this I would need to be detached from my own health.
I seem to suffer from things even though I have not gone through them, so let us suppose I am able to observe these health markers with detachment, until I come to my—say, 90th birthday—and see a progression of 50 pictures with health stats, and one would see a decline in the body, and very likely of the mind too. Should I continue writing, would my writing be worse than it already is?
A second question is: these markers of health are really markers of unhealth. The fact that your indicators are at normal levels is no guarantee of health. What is health then? How could one account for the health of the mind? Should I get an MRI every five years?
I am fortunately not a hypochondriac person, and so I think I could do this without getting too involved in it. It is taking your health in your own hands, instead of depending on a doctor. Doctors are there to save your ass from grinding your health to the ground, but there are no "well-being doctors", doctors whose role is to keep you healthy instead of taking you away from disease.
I have convinced myself already of performing this feat. It must be done before the end of the year, as to mark the beginning of this experiment in 2020, a health-conscious year. I must find what are good tests to perform on myself on an annual basis so that I am able to sense my overall health.
Yesterday I encountered Marina by chance. I was on my way to the gym, and she was walking somewhere. "Hi, how are you?" I said, "Ehhh good" she said, as if responding to a courtesy greeting. But I insisted "how are you?" and she said "I guess you've heard that Óscar asked us to leave"—yes, I said, and then I told her I wanted to speak with her, whenever she wanted, to "see what alternatives were available". We convened to meet at night.
Earlier in the morning I had called a phone number for women who suffer from domestic violence, I exposed her situation: a migrant who was very likely trapped in a relationship and situation which she didn't want, but was there because there was no alternative. I see my own projection here, as I was a undocumented migrant in Spain and the range of possibilities in the matter of freedom is much constrained. Her situation is much more vulnerable and "illegal" than mine was, so I can only imagine her sense of trappedness to be worse.
The woman on the other side of the phone informed me that it was only the woman who would ask for information and get help. I assured that yes, I would pass on the phone number, I just wanted to be able to offer her an alternative—any alternative—to the life she is currently living.
After gym and yoga I rung her doorbell, but Óscar came out and said she was not there. We came home for dinner and then I asked for a cigarette. He said he had them at home, so we went there. We went upstairs and Marina came out of her room. I said hello and was startled, I didn't expect to find her at home. But then I saw that her boyfriend was there too, and I couldn't speak with her.
Some days ago I read that Napoleon Hill had a "council" of people he admired—in his own imagination, which he would consult while in need of guidance. He would write as if it was the actual person speaking, and by doing this he gained insights that he couldn't get if he only debated himself.
I thought this is a great idea, so I the purpose of writing this entry is to deliberate how and who should form part of my own council. The council should be formed from people whose work and personal story I know, so that I am able to put a voice unto their archetypes. Additionally, it should be formed by individuals of different characters so that I may obtain different perspectives. Perhaps I ought to start by listing the famous people I would be able to "speak for" to some degree:
"""
Goethe
Muhammed
Socrates
Plato
Lao Tse
Jesus
Hernán Cortés
Benjamin Franklin
Marcus Aurelius
Dürer
Wittgenstein
Dostoievsky
Tesla
Aicher
Eames
Tara Brach
Norman Foster
Buckminster Fuller
Steve Jobs
Richard Feynman
Carl Rogers
Abraham Maslow
Ken Wilber
Gurdjieff
Gandhi
Carl Jung
"""
Just by writing this down I notice I have important gaps in my council, there's too much in the receptive and mental (spirituality) and perhaps not enough in the active and the masculine. I would also like at least one woman in my council because I need a female perspective, but Tara Brach though great overlaps with a number of spiritual teachers with whom I find greater affinity. I must investigate a woman whom I admire, but I don't know enough about in order to "speak for her soul".
That will be Eleanor Roosevelt.
There must be someone who represents the creative principle, Goethe is a no-brainer.
Someone who represents my profession as a designer, that most definitely will be Eames, though I would like to have Aicher whispering behind his ear. I hate to leave Bucky Fuller out because he covers many other areas: philosophy, mysticism, creativity... But these bases will be covered.
There must be someone who has direct experience of God, a mystic. Lao Tse without a doubt. And someone who puts God's will into action in the world, would that be Jesus? I'm afraid his way of the heart may be too much of a challenge for me at this time. But... I will try. Let it be Jesus.
There must be someone who represents correct mental cognition. I would narrow it down between Socrates and Feynman, and I think Socrates' ignorance and methods of questioning are very useful to this task.
I also need an explorer, an adventurer, someone with masculine energy to speak in the matters of courage and effort. The only person on my list that has these characteristics is Cortés. He is a good fit, but I take note that I should read about Napoleon so that I am better covered in this gap, which I explore vehemently when I am free.
And I would also want someone with deep psychological insight. Who is he or she? Rogers? Maslow? Jung? Difficult choice. Rogers would just listen to others. Jung would perhaps take things off track. I think Maslow is the psychologist I am looking for, though I sense he is the one I know the least about.
And so we end with this list:
"""
[[Eleanor Roosevelt]]
Johann Wolfgang von Goethe
Charles Eames
Lao Tse
Jesus
Socrates
Hernán Cortés
Abraham Maslow
"""
My usual relationship with pot is this: I quit for some days or weeks after I finish a bag. The initial clear-headedness is welcome, but then I suffer from pity memories that come up. Small injustices, embarrassing moments, moderate angst about the future, wonders of why I don't live a normal life, doubts and such. My mood deteriorates by the day and then I find myself cranky and wanting to get away from my life situation.
Then I go buy some pot and I have great sense of meaning, I "remember" why I'm doing what I'm doing, and I make peace with my memories, and my mood brightens and my quality of inner experience is sharply improved. Smoking after a break, I often can't deny that it is psychological medicine for me.
But, as pot is not sold in small quantities, I want more of my medicine and I indulge a bit too much. Things become hazy, the drive to move forward is replaced by complacency, and then I get a vague sense that I am narrowing my consciousness, that I am avoiding facing reality, that the conclusions that I reach while stoned are simply states that don't carry on to the sober me.
Some days ago I was watching a video of Daniel Schmachtenberger and he mentioned the importance of sleep in mood. He said that sleep was the number one thing to address in mood disorders, and mentioned a lot of important things happen during sleep: memory consolidation, clearing of toxins in the brain, etc. He highlighted the importance of good sleeping conditions: a dark, quiet room at the proper temperature; and I saw that I didn't meet a couple of these conditions.
There is a very bright light from a street light lamp which is quite far away, but it is bright enough to bother me. My room is often populated with mosquitoes, which are a pest in my neighborhood because of the river. But since I've lived here in my youth, I know how to sleep so that they cause the least disruption to my sleep at the cost of probably breathing too much CO2.
I addressed my sleeping conditions by putting a curtain on my window, and I kill the mosquitoes before going to bed, and this time I feel like my mood is not deteriorating and my life narrative is in good shape. It is strange how we become used to the most crippling conditions and then we medicate in order to counter these conditions. If my theory proves correct, the reason why pot can have such an effect on my mood is—at least partially–due to the fact that it allows me to sleep better under non-ideal conditions.
Furthermore, I seem to ascribe exotic reasons to my perceived shortcomings when I haven't addressed the fundamentals. I see this clearly in my sister too, and it is obvious to me, but not to her. When I point it out she protests, it can't be that simple. But the reason I notice this is because I have this phenomena in my own shadow.
Let us get the basics right, and then everything will fall into place.
I'm so tired I have no inclination to write at this moment, yet I do this because the only alternative I would have would be distraction. As I have blocked distractions I tend to go to YouTube and I quickly get fed up by the format. Most things on YouTube seem to move too slowly and its recommendation AI is terrible, at least for me, so in five minutes I often deflect from this distraction.
It is in this moment of deflection that I think: instead of consuming, I should be producing. But producing requires much more energy than consuming. At the end of the day, I don't feel the creative energy necessary to produce anything, and so I come to blank.page to write my stream of thought.
But this is also creation! And it can be told by the quality of my writing that I am not in a good place to find the inspiration necessary to produce an interesting account of anything, and here I am writing down my own mental diarrhea which at this moment seems to have no value, though I do not know if I will ever come back and think I am glad I wrote this, even if it's uninspired.
Speaking of diarrhea, I've been suffering from it since... I've forgotten when it started. I wish not to write much about my bowel movements, but I'm slightly concerned now that I know that the gut is the second brain, and the source of all serotonin in the body. Foul mood is often accompanied by stomach woes. William James would often speculate about the relationship of both in letters with a friend who would also manifest the same problem.
This evening I debated wether I should go to the gym or not. The past few days I've been taking it easy because of my stomach woes, feeling weak, not really putting the effort necessary to progress, or even mantain my current physique. But I did it anyways. When I arrived I looked at the exercise menu and nothing was appetitizing, but then I thought: I haven't squatted in ages, but this is perhaps the worst idea to do when having stomach woes.
Still, I put the bar on my shoulders without any weight and I squatted a couple of times. It felt not only fine, but nice. Muscles that have not been excerted give a pleasure difficult to express. So I put two 20Kg plates, one on each side, and performed another couple of squats. It felt fine and pleasureable too.
So I loaded the bar with a new record weight, 30Kg on each side, and was pleased to see that I was able to perform the squats without any stomach uneasiness or even too much effort. After heavy weightlifting the body is inundated with happy chemicals, and I went on to the bar to attempt some muscle-ups, which I've been practicing lately. I saw much progress too, I'm very close to be able to perform my first muscle up.
And this went on and on, and at the end of the workout I had gone beyond what was a "normal day" even at 100% health (probably becuase I was well rested), and I was quite amazed at the difference between the expectation and the outcome.
Perhaps I ought to leave it at this: in times of uneasiness in body or in spirit, the expectation will not match the outcome.
Marina rang the bell today. Finally I caught her alone. She asked me for $50 pesos, she was restarting work today after a long illness and said that she would pay me soon. I told her not to worry, but that we had a pending conversation, and I asked if she had time right now. She said yes, and came in.
We sat down at the table. "Look", I said "The day after I withdrew the money that your brother sent, Óscar told me that you had a big fight, and I was afraid that the fight might have been about the money". She assured me that it was not about that, but that they had a big fight in which he had bloodied her nose, and even the neighborhood guard had to come.
His boyfriend had called the police on her denouncing that she was an illegal immigrant, but after her pleading he had called again to say it was no longer necessary. It was obvious to me that it had been a ruse, and that he was controlling her through fear. They had reached a fragile peace in which she had said that if he lay a hand on her again, she would be gone.
I told her that—as a fellow illegal immigrant in Spain, I understood that her options were limited, and that I felt a lot of empathy about her situation becase I had been living in a situation in which I didn't want to be, but because of my immigration status I had no choice. In truth this was a patent lie, I did feel the constraint of not being entirely free of choosing where I wanted to live, but my living arrangement was nothing short of privileged. But //feeling// the lack of alternatives was enough to make me feel a vague anxiety.
I told her I had researched options for her, and that I knew that she was very tough and that she could take care of herself—which she is, but that I could see that if she didn't want to live in the way that she was living, she had very few options, if any. So I had called an NGO that took care of women in vulnerable situations because of men's violence. I had called and they had told me that they could put her into a safe house where she would be given the basics, food and lodging, but that they had told me that she had to make that call by herself. I asked her if she wanted the number. She said yes.
I had written down the number on a scrap of paper, which I fetched, and after giving her the money she had asked for we bid farewell.
At night Óscar came for his nightly dinner and told me Marina's boyfriend was at home. He asked me to have dinner with them, that they had prepared soup and that I could take something to eat. My first inclination was to say no, but I overcame my aversion and prepared some quesadillas with chicken and took them to his house.
I had already conversed with the guy before, and he has a very formal way of being with me. His bulging eyes and full lips convey a sensuous character, which in tandem with his measuredness in conversation transmit a sense of dishonesty, as if his face wouldn't match his conversation. I don't want to write that I sensed that he was a //bad person//, but I will leave this description as a placeholder for sensing his negative energy.
Dinner with them left me exhausted. He asked me what I did for a living. I told him I was a designer, and that I worked from home. He told me that he was a broker, someone who facilitated businesses, and went into details about the businesses that he had helped make happen and I pretended to be interested, but I was bored senseless. I steered the conversation towards common ground: I knew his father was the owner of several small properties which housed businesses in a run down neighborhood, two of which sold very good food. He steered the conversation again in the direction of business, as a way of signaling the status of his family and the numerous properties that they had.
I sense this is not the end of the story with Marina. I know better than to involve myself in this storyline, I'm just a facilitator of things to happen. I do not hate her boyfriend, I just find him to be a throughly distasteful character.
I am too tired to continue writing.
It is 5am in the morning and I could barely sleep, and I'm not sure about the reason. I am not stressed, I did not nap yesterday, didn't drink coffee... and yet as I am writing this I am beginning to feel sleepy. Is this because I do not have enough energy for creation? And writing is creation? To a certain extent, only when I write with a purpose.
When I write like this, pouring out my stream of thought, it is supposed to be effortless. In fact, it is somewhat relaxing to be sleepy and and at the same time to be typing. What should I write about? I know.
Despite my constant complaints about being tired and in a bad mood when I write at the end of the day, this last week has felt incredibly meaningful. The way in which I gauge my wellbeing is by sensing my hope in the future, and I've found myself thinking that 2021 will be a breakout year. The "Store of virtue" of the Tao Te Ching resounds in this context:
> In caring for others and serving heaven,<br />
> There is nothing like using restraint.<br />
> Restraint depends on giving up one's own ideas.<br />
> This depends on Virtue gathered in the past.<br />
> If there is a good store of Virtue, then nothing is impossible.<br />
> If nothing is impossible, then there are no limits.<br />
> If a man knows no limits, then he is fit to be a ruler.<br />
> The mother principle of ruling holds good for a long time.<br />
> This is called having deep roots and a firm foundation,<br />
> The Tao of long life and eternal vision.
I truly feel sleepy now. It is time to sleep.
I am sitting in the living room of my friends' apartment in Mexico City. I came to visit, in part because I have pending business with them, in part because these are dear friends, and in other part because of "compromiso", it simply had to be done.
It will be impossible for me to write a good account of the day, or any insight, because when I am accompanied by people I cannot focus on the screen. I am reminded about the time I was trying to program the Color game in the morning, and María was telling me about some inane thing that someone said on Reddit. I felt anger at the interruption and I expressed it, and she was hurt. I see that in the matter of work, I should try to separate myself from people, for nobody knows the amount of concentration that is required when work is sacred.
Nobody will understand the sacredness of work.
When man transforms he will often find himself surrounded by people who know him pre-transformation, and they will expect him to be the same. I've long debated if one should evade pre-transformation environments, because one has a tendency to regress into immature states of being.
I have come to the conclusion that—while in the process of transformation, friends act as a sort of gravity to the former self. One should avoid old friends in this phase. It is only after many years that the transformed self becomes permanent enough that one is able to inhabit even when the friends make you gravitate towards the former self. But the lesson is being capable of remaining in the more mature version of the self in the presence of old friends.
Friends are a double edged sword in matters of self-development. They hold us accountable for things that we said in the past—if one says "I will never get married", the time will come when you grow more mature and decide to marry—your friend will come back and say "do you not remember that you said that you wouldn't marry?", and one should be aware enough when these transgressions of Word are made, because some of these are important promises to the self (such as not selling oneself out to banal incentives) or it can be the other way around, in which one is sold out to banal incentives and the friend chains your Word to this.
I'm on the bus on my way back to Puebla. The visit was really pleasant, but I was a bit anxious because I could barely work at all. We were able to advance, each on our own projects. Monse with the skin care soaps project, //Edrielle//, David with his job interview, and myself with the resolved bug in the Boolean Game.
We celebrated with a nice lunch consisting of barbacoa, Valdubón and a cava (Conde de Casalts?). We didn't want to part ways, but I must resume work.
Yesterday I had a zoom call with René in which we parted ways regarding blank.page. What was most amazing was that the decision was quite sudden, and yet it made a lot of sense to both of us. I was relieved, because underlying our partnership lies a meaningful friendship, and as work is sacred to me and friendship too, I would have expected ripping one from the other in a personal relationship would have yielded some degree of pain, as when you rip out a band-aid from the skin. But it was painless, as with every collaboration with René.
The underlying reason for parting ways could be explained in mundane or in transcending terms. The mundane is that—for the last few months—we've been working on a no-code stack, putting together things from web applications via zapier, and this has proved to be tremendously boring work to me. Not because it is easy, but because it does not allow me to focus and flow. This chips away at my well being, and I find myself displaying signs of stress—seborrheic dermatitis of the face, my personal indicator of too much cortisol running on my bloodstream.
The transcending terms, however, are more interesting. There seems to be a //new story// growing out of the hubris of the past seven years. A newfound sense of meaning. It is difficult to articulate, but it feels as if 2021 will be a very different year. I seem to have matured into a different kind of human being, and my perception of the world has become different.
What is most strange, is that I have seen more people are living the //new story//, the things that they are chasing are not the things that the world at large chases. It is not about the money, the prestige, the status and the women; even the deep spiritual yearning is not that, it is a sense that the ego is no longer at the driver's seat, that I wish to stop using //I// and begin using the word //you//, because I am everyone.
Es importante escribir en el idioma del lugar en el que vives. Aunque no lo hablaras bien, escribir en el idioma local te conecta con tu entorno. Escribir en un idioma distinto es una abstracción, te quita tus raíces y //flotas// por ahí. En la //nueva historia// el movimiento es el de la conexión con otros, el enraizamiento, la presencia.
La nueva historia aún están condensándose. Cada uno la percibe a su manera, y cada uno la tiene que materializar a su manera, porque es individual a cada persona, cada uno tiene su propia versión de la nueva historia. Sólo llega cuando el mundo se desmorona, pero cómo es que tarda tanto en materalizarse? porque para dar entrada hay que permitir que los //nafs//, los estados del ego, evolucionen a puntos más altos.
Dejar de escribir por impresionar, dejar de hacer por complacer a otros, renunciar a los frutos de la labor de uno, el mundo cuidará de ti si atiendes a tu llamado. Eso es, el llamado te obliga a dejar atrás todo lo que no es esencial para tu desarrollo, trabaja con todo tu ser, pero no te obligues a hacer nada, fluye.
Estos días, antes de que llegue 2021, la labor será encontrar de qué se trata esta //nueva historia//, materializarla, escribir acerca de ella. El mundo me dará las indicaciones necesarias.
Tengo veinte minutos para escribir antes de tener que acudir a mi cita al gimnasio, sin embargo, dentro de estos veinte minutos voy a tener que acomodar una ida al baño. De nuevo estoy enfermo del estómago, pareciera que desde que volví a México, mis movimientos intestinales no han sido normales. Recuerdo que cuando estaba en España pensaba "pero cómo era que podía vivir así, cagando entre cinco y diez veces al día, y me parecía lo más normal?". Es extraño porque mi dieta y mi alimentación es muy similar. No como en la calle y me cocino todo en casa. Es cierto que no desinfecto las verduras, y quizás soy un poco laxo en lo que se refiere a la conservación de alimentos, pero lo mismo hacía en España y andaba estupendamente del estómago.
Me están llegando notificaciones de whatsapp. Un buen amigo me pidió que le ayudara con la redacción de unas //user stories// para un trabajo al que está aplicando como //business analyst//. Ahora entiendo porqué hay tanto software mal hecho. Quiero a mi amigo como a nadie en el mundo, sin embargo, su visión de cómo deberían funcionar los sistemas me es completamente ajeno. Y no es que yo sea alguien centrado en el usuario, quizás soy centrado en mi mismo. Pondré el ejemplo en específico: cuando un usuario recibe una tarjeta de crédito en el correo, tiene que activar la tarjeta a través del portal del banco. ¿Qué es lo que pedía para activarla? Todos los datos de la tarjeta (número, expiración y CVV) ¿por qué? El sistema ya sabe qué tarjeta te envió, sólo tiene que asegurarse que sea la tarjeta correcta, con un sólo dato es suficiente. A menudo me topo con este tipo de cosas y me irrita de sobremanera—porqué me haces introducir información que ya tienes? Déjame en paz. Hacerle cambiar de opinión fue fácil, pero me extraña mucho que no le sea obvio.
Hay muchas otras cosas que me parecen obvias y que otras personas no lo experimentan de la misma manera, especialmente en cuestiones psicológicas. El otro día estaba platicando con Óscar, y me dice "me gusta mucho entender cómo piensa la gente" y le digo "eso se llama psicología Óscar, ¿Y porqué te gusta saber cómo piensa la gente?", "pues porque me gusta poder ayudar".
"Uy Óscar, saber ayudar a la gente es más complicado de lo que parece, no digo que necesites estudiarlo, pero sí se necesita cierto don".
"Nah es fácil, si alguien te cuenta un problema sólo tienes que hacerle ver que tú también sufres por lo mismo y por lo tanto entiendes".
"A ver Óscar, vamos a hacer un ejercicio. Cuéntame acerca de algo doloroso en tu vida".
"Cuando nací tuve muchos problemas, este labio (tiene labio leporino), y nací mal de la cadera, y un poco prematuro, y mi mamá no me quería por feo".
"Ahhh que mala onda. Cuando yo nací se me dislocó el hombro y mi mamá tuvo muchos problemas con el parto. Dice que fue horrible".
¿Lo notaste? ¿Qué sentiste con mi respuesta? "Que no me estabas escuchando, que quisiste superarme"—exactamente! para ayudar a la gente hay que aprender a callar y escuchar con mucha atención, y poca gente tiene esa cualidad. Yo no la tengo, pero a veces siento el impulso de interrumpir, de aportar mi experiencia, pero uno tiene que aprender a callarse y escuchar con mucha atención, porque para ayudar hay que entender sin ponerse enmedio.
Óscar me sorprende muchísimo, porque a pesar de su inteligencia bastante limitada tiene bastante capacidad de introspección, sabe que algunas acciones que ha hecho las hace desde otro estado mental, sabe "observarse" que es algo que mucha gente no tiene. Hace unos años alguien le enseño a meditar, y solito fue modificando su práctica.
Ups, si no voy al baño ahora, no me dará tiempo de ir al gimnasio.
Hoy fui a casa de mi hermana a comer con la familia—bueno, en realidad con mi madre y mi hermana, porque mi sobrino estaba con su padre, pues mi hermana y el padre de mi sobrino ya no son pareja, y mi padre y mi madre tampoco.
En realidad, estoy rodeado de "matrimonios fallidos", si se le puede llamar así. Tengo... 14 primos en primer grado en Puebla, de los cuales 12 tienen hijos, pero sólo dos siguen casados (casadas, porque son mujeres). Del resto, una prima estaba felizmente casada, pero enviudó—miento, el marido salió del clóset y se fue de la casa, pero eran amigos desde la infancia y más tarde volvieron a una relación poco convencional, pero eran felices. Él murió de una enfermedad rara (no era SIDA, tengo entendido).
A veces mis primos me cuestionan de la razón por la que no estoy en una relación. "Con todo lo que ustedes me cuentan, se me quitan las ganas", bromeo, y con eso me los quito de encima. Pero en realidad es una especie de misterio para mi también. Cuando dejé el trabajo me quedó la impresión que para disfrutar estar en pareja, también había que tener un presupuesto con el cual afrontar los gastos de viajecitos y regalitos y salidas, lo normal en una relación.
La gente me dice "no es para tanto, hay muchas cosas que puedes hacer con poco dinero", pero lo que no entiende esa gente es la vida asceta que llevo. Y no es que sea codo, es que verdaderamente vivo con unos 300 dólares al mes, lo cual alcanza para mi comida, mi gimnasio y mi yoga. Cuando entra un ingreso extra normalmente hay cuentas por pagar, o cosas qué reparar, y sí hay algún lujito que me doy, pero casi literalmente he estado viviendo como monje los últimos tres años—en el aspecto material, espiritual, y sí, sexual.
Al principio echas de menos muchísimo esa vida de antes. Se siente como un sacrificio muy grande tener esta independencia del espíritu. Pero eventualmente te acostumbras y lo que antes era un sacrificio se vuelve tu día a día. Comprar ropa, por ejemplo, no está en mi radar. No veo las cosas materiales con deseo. Bueno, miento, las mujeres son cosas materiales (además de espirituales e intelectuales, por supuesto), y quizás eso es lo único que aún me tienta a "hacer dinero", y la persona que lea esto pensará que veo el dinero como una forma de comprar mujeres, pero vuelvo a trazar el círculo: mi vida asceta está dictada por el presupuesto que tengo para financiar mi independencia.
A veces me cuestiono esta decisión, si no desperdicio demasiado de mi tiempo libre en hacer cosas que nadie ve, y si las vieran lo las entenderían. Esto mismo que estoy escribiendo es un ejemplo de ello, pero puede ser dedicar el tiempo al jardín, dar de comer a Óscar, pasear a Nina, ir a yoga y al gimnasio. Verdaderamente me gusta mucho mi vida, quizás es como si ya estuviera retirado. Si me estreso, claramente es porque así lo quiero, sólo tengo que sentarme a meditar para darme cuenta que todos mis problemas literalmente son creados por mi mismo, para incitarme a hacer y terminar mis proyectos.
Sí, debo de admitir que aunque tuviera mucho dinero, no quiero conceder un espacio en mi vida a otra persona, pero a la vez sé que—si conozco a alguien que valga la pena, ese espacio se lo voy a dar, porque voy a estar enamorado y eso es lo que hace el amor. Es más, no sólo voy a darle un espacio, voy a acomodarme en su vida también. Iré a sus reuniones familiares, celebraré sus logros, todo lo que se hace en una relación normal, pues.
Quizás es muy ruin de mi parte lamentar esto, pero es la concesión que uno debe hacer para estar en una relación. La mayor parte de las personas—hombres y mujeres—parecen estar en una pesadilla, y desean arrastrarte a ella, los conflictos que tienen en su trabajo, con sus amigos, con su familia, con el mundo, con la política, quieren que estés de su lado, que estés en su bando dentro de su guerra imaginaria. Y es por eso que muchas de las relaciones que tienen mis primos son fallidas, las dos relaciones exitosas que hay son porque están peleando la misma guerra: esa de criar a sus hijos de la mejor forma posible, y ahí es a donde orientan sus acciones. Inclusive mi hermana y su ex procuran armonía por el bien de su hijo.
Hace tiempo decidí que no quería estar en relaciones en las que no viera un futuro. Bueno, hay una excepción, una mujer que estaba ahí para enseñarme algo muy importante, la quise mucho, pero cuando sentí que la lección había terminado, se lo dije y nunca volví a añorar estar a su lado. Se extrañó mucho de mi desapego, pues era una mujer muy guapa y fogosa, y estaba acostumbrada a que los hombres comieran de la palma de su mano. Pero para entonces yo ya era lo suficientemente consciente como para saber que me estaba invitando a una pesadilla y que lo mejor era despedirnos con un buen sabor de boca.
Siento ya he podido renunciar a las cosas materiales, a las cosas intelectuales, pero a las cosas de pareja aún no. En el fondo añoro aún enamorarme una vez más, a pesar de que la última persona con la que estuve fue un gran desencuentro. Pero de igual manera, esta persona se presentó en mi vida para enseñarme algo: que a pesar de mi manifiesta neutralidad y desapego en muchos temas, hay uno que me toca en lo profundo: que se me ponga en el campo del enemigo, porque yo no estoy en el campo amigo. Si no estoy dispuesto a protestar por el cambio climático, significa que no me importa el planeta. Si no estoy dispuesto a dejar de comer carne, es porque no tengo compasión por los animales. Es como si no cargara una cruz, pues entonces estoy cargando la cruz invertida del anti-cristo. Lo que me sorprendió mucho de este suceso es que noté un apego enorme a cómo me percibía mi pareja. Esto es, tengo un ego que se cree muy desapegado, pero cuando se me cuestiona mi neutralidad, entonces me tocan las pelotas.
Parece que hay lecciones que sólo una pareja que puede dar, y esto se da por el enamoramiento. Al enamorarte abres la gran puerta de la muralla y entra el caballo de troya, del que salen cien soldados y hacen sus desmanes, pero si no permites este suceso te quedas como hermético, aislado completamente del mundo. Me gustaría, en lugar de ser como las murallas de Ávila, la ciudad Europea rodeada por un muro masivo, ser como las murallas de Cuauhtémoc, las murallas de la ciudad prehispánica, que eran nulas porque su forma de guerra no era militar, sino espiritual.
Se dice que los guerreros mesoamericanos consumían hongos alucinógenos antes de guerrear, y si bien es cierto que se protegían con escudos, su indumentaria era más bien ritual, con pieles de jaguar y cascos en forma de la cabeza de un águila, cascabeles en los tobillos, y una forma de pelear casi danzante. Para ellos, presenciar la forma de guerra románica, con escuadrones y hombres bien organizados, debe haber supuesto un insulto a los dioses. Se peleaba enteramente con el corazón, y no con la mente.
Es—quizás—esta la respuesta al acertijo del que vengo escribiendo, intento discernir una estrategia para obtener lo que pide el corazón mediante el uso de mi mente, debo de dejar al César lo que es del César, y a Dios lo que es de Dios.
No he escrito en algunos días, en parte porque estoy soñando mucho—registro mis sueños, y luego la necesidad de escribir se me desaparece. He estado jugando con muchas ideas para el 2021, voy a tener un poco más de tiempo, y fantaseo mucho con lo que haré este año. Me hace mucha ilusión, siento que habrá un //gran cambio de historia// y que lo tengo que aprovechar, pero no sé exactamente qué es ni cómo se manifestará.
Cuando me encuentro programando, lo hago con una concentración que hace mucho tiempo no experimentaba. Y también con un gozo que ya se me había olvidado que experimentaba. Me levanto en la mañana con ganas de todo. Soy un tanto bipolar y sé muy bien que esta manifestación tiene su contraparte, que no puedo confiar en que esta manifestación esté presente todo el 2021. Más bien es como una ola que se viene y que tengo que agarrar para surfearla.
Una de las cosas que medio he decidido es volver a escribir en español, pero luego pienso: dónde? y pienso que debería ser en duopixel. Y debería de escribir diario, o casi diario, como una rutina, y escribir para //el otro// en lugar de //mi mismo//. Pero aún mantener mis escritos personales en inner.observer, para poder //hablar// conmigo mismo, aclarar mis propias ideas.
De cierta forma, todo lo que escribo se podría tirar a la basura, ya ha hecho su trabajo cuando he terminado de escribir, pero luego reviso lo que he escrito en el pasado y me alegro mucho de haberlo registrado. Basta con una pequeña indicación del presente para sucitar una memoria del día. Puedo escribir "estoy en la piscina y acaba de pasar una señora gorda" y boom, se me viene a la memoria casi todo el día.
Hoy por ejemplo, estoy en la oficina de mi padre, esperando a que se terminen de escribir las memorias de mi tío, las cuales transcribí de muchas libretas que lleva escribiendo. Quizás el gusto por registrar nuestra experiencia vital nos viene de familia. Dentro de mi siento unas leves ganas de fumar, pues he dejado los vicios como preludio al 2021, con algún desliz ocasional, pero no me causa ninguna violencia interior, pues está pensado así: un desface de vicios gradual y gentil.
Entre más experimento con este fenómeno, el de dejar ir los vicios, más me doy cuenta que //arrancar// el vicio repentínamente viene a un costo tremendo para la psique, pues no se está reemplazando la causa del vicio. Es cierto que se requiero cierto grado de fuerza de voluntad, pero entre menos se use mejor. Yo opero como si no tuviera fuerza de voluntad, si tengo ganas de fumar sé que haciendo ejercicio desaparece, y así en lugar de apretar los puños y aguantar la carencia de eso que estoy deseando, encuentro algo que lo reemplace. Pero ahora no me puedo poner a hacer lagartijas, sería bueno tener un dulcecito o algo para distraerme. También sé que poner mi atención en el fenómeno del deseo a menudo lo aumenta, conforme escribo acerca de fumar, mis ganas de hacerlo suben. Hay otra forma de lidiar con este fenómeno, que es la meditación.
Es como decirle al demonio: ven, quiero verte, te acepto como eres, no quiero eliminarte, sólo quiero verte. Y entonces uno lo mira sin juzgar, de la misma forma en la que uno puede sentir algún dolor sin tener que sufrir. Sólo llega con la práctica constante de la atención y la mente. Eso hace que el demonio se disuelva casi por arte de magia.
Acabo de hacer algunas respiraciones poniendo mi atención sobre mi deseo, y me di cuenta de una cosa: son las 17:40 y no he comido. Mi cuerpo sabe que se me quita el hambre fumando, y como mis caminos neuronales están viciados, la señal no es "tengo hambre" sino "tengo ganas de fumar".
Otra forma de reducir la ansiedad causada por el deseo es símplemente cambiar el objeto de la atención. Yo pensaba que era muy difícil, hasta que observé la forma en la que lo puedes hacer con otras personas. Hace una semana comí con una tía lejana y su hijo. Ambos eran pequeños burócratas y su conversación era la cosa más aburrida del mundo: frustración porque el próximo año iba a cambiar la forma en la que se hacían los trámites en sus dependencias, y describían los trámites con lujo de detalle. A mi se me salían las lágrimas de aburrimiento.
Estaba a punto de pedir que ya no habláramos de ello, pero símplemente encontré el próximo camino de salida de la conversación, por ejemplo habrían mencionado una impresora, y pedí detalles de la impresora, y luego comenzamos a hablar de impresoras. Ahora bien, no soy tan aburrido (espero) como para encontrar interesante hablar de impresoras, símplemente es un ejemplo que se me ocurrió ahora, porque estoy mirando la impresora sacar las páginas del escrito de mi tío. Voy a mirar cómo va.
Y así me distraje un momento del fumar. Que extraño experimentar tanta energía vital. Inclusive mi forma de escribir cambia. Pero uno no debe estar apegado a esta experiencia tampoco, sólo percibo esta abundancia de energía vital en contraste de su carencia, si experimento esto de forma sostenida, será mi "nuevo normal", y desearé experimentar esto nuevamente.
Los empleados de mi padre están bromeando, felicitándose por navidad. Yo sigo escribiendo como si no escuchara nada, pues mi rol aquí es ser invisible. ¿O no? de cualquier forma, son chistes de Godinez. "El programa especial inicia con las mañanitas—no con las mañanitas a nuestro niño dios" — "no seas blasfemo" comenzaron a cantar las mañanitas a Jesus! Es momento de dejar de describir la experiencia del presente.
Creo que voy a resucitar Duopixel. Quiero volver a escribir en español, y un poco construyendo esos puentes entre lo que he aprendido entre los últimos años y el diseño, y el lugar natural para hacerlo sería mi casa de antaño. De la misma manera en la que he venido a vivir en la casa en la que crecí, ocuparé la casa en la que crecí profesionalmente.
Me gusta mucho este modelo de poner todo lo //meta// en inner.observer, y luego el meollo del asunto en duopixel. Habrá una cantidad considerable de trabajo más adelante, pero será trabajo placentero. Mi primera tarea es comenzar a escribir como si lo hiciera en duopixel. Y también me gustaría escribir diario, o casi diario. Quizás mi día comience con una reflexión acerca del día anterior, y así escoger un tema de la experiencia directa para luego plasmarla para [[el otro|The Other]].
Veamos las experiencias relacionadas con el diseño que tuve ayer:
"""
# El formato de video para las recetas.
# La sanitización de COVID en los gimnasios.
# Las llantas de bici que se ponchan.
# Cosas que se quedan en la estufa
# Es necesario ser neurótico para ser diseñador?
"""
Uy, en realidad tengo mucho de lo que puedo escribir!
---
Ayer mi hermana se quejaba de que era muy difícil seguir las recetas de navidad en YouTube: prácticamente tenía que poner el video en repeat para que no se le fuera a ir ningún ingrediente, o saltar algún paso.
Yo le contesté que—una vez que sabes cocinar—no tienes que memorizar las "unidades de instrucción", sino que ves que el autor está haciendo un sofrito de cebolla con tomate al estilo italiano, por ejemplo, al que añade un poco de vino de jérez (la excepción), luego prepara una pasta, y lo mezcla de una manera particular.
Creo que sucede con todo: uno entiende la sintaxis de un layout mediante un wireframe porque hay un conocimiento previo que te ayuda a inferir el aspecto interior de lo que habrá en las cajitas.
Mi hermana se acongojó un poco, había puesto la razón de su frustración en su ignorancia—aunque si tuviéramos quince años le hubiera dicho que se debía a su estupidez. Pero me dejó pensando un poco: debería ser posible hacer una especie de //metadescripción// de una receta en video de tal forma que pudieras saltar a lugares en específico a partes de esa sintaxis de la cocina, en lugar de ver el video de principio a fin.
---
Veo que esto requiere un prototipo, aunque sea visual, pero sería mejor hacerlo interactivo. Me llevaría medio día hacerlo, creo. Pero ahora tengo tiempo. Es como si volviera a ser estudiante. Y podría traducirlo al inglés y publicarlo en Method of Action. Me gusta. Dejé una idea semi-desarrollada para rescatar en el futuro. Mañana intentaré hacer lo mismo.
Como estoy esperando a que mi teléfono se cargue para navegar por internet, creo que registraré algunas impresiones random. Por momentos estoy muy contento, y por momentos medio miserable. No miserable como lo estaba en tiempos pasados, pero con cierta desazón. Me parece que cuando estoy haciendo lo que "se supone debería estar haciendo" o "alineado con mi propósito de vida" mi espíritu me da esa retroalimentación de que voy por el camino indicado. Cuando estoy haciendo cosas que son una distracción o una pérdida de tiempo, siento ese desazón. Es quizás un //self-serving opinion// pero, a manera de trabajo espiritual, voy a alinearme con esta hipótesis.
Aunque hay cosas imposibles de evadir. En la tarea estoica, uno aceptaría esto como un hecho de la vida, pero—pobres estoicos, esta es una filosofía para la gente que tiene que hacer cosas que no quiere hacer. Es momento de practicar el //wu wei//, no encontrar resistencia en mis acciones. Hay veces que la resistencia se tiene que trabajar, por ejemplo, mucha gente, aunque sea extrovertida, dice que siente algo de vergüenza al tener que llamar la atención sobre si misma, y eso requiere un poco de coraje, y como en ocasiones es indispensable hacerlo, lo que habría que hacer es ir más profundo y trabajar sobre la causa raíz, y no tener una relación violenta con uno mismo.
En muchos aspectos hay que tratarse a uno mismo como si se tratara a un niño. Si hay un niño tímido al que le da vergüenza acercarse a otros niños para jugar con ellos, no se le empuja si se le dice "ay ya niño no seas tan tímido", tampoco se intercede por él y le dice a los niños "ey niños, jueguen con este niño tímido". ¿Qué es lo que se haría? Imaginemos ese diálogo.
Un niño mira a otros niños jugar. Su añoranza es evidente. El adulto se acerca:
"""
–Por qué no juegas con ellos?
—Me da pena, me vayan a decir que no quieren que yo juegue con ellos.
—Porqué crees que te dirían que no quieren jugar contigo?
"""
Aquí puede haber varias contestaciones—porque el equipo ya está completo y el niño que quiere entrar es impar, porque el niño sabe que no juega bien futbol, porque no lo han invitado a jugar a pesar de que es evidente que quiere incorporarse... Pero todas estas son razones que el niño encuentra para justificar su //miedo al rechazo//.
Lo que yo percibo en esta situación, es que la mejor manera en la que el niño puede incorporarse es capturar un balón que sale del juego y luego negociar su entrada. El niño corre por un balón que salió de la chancha. Sigamos con el diálogo:
"""
—Gracias!
—Puedo jugar con ustedes?
—Es que ya estamos completos.
—Pero no sé jugar bien, pónganme de defensa con el equipo que va perdiendo.
—Buena idea!
"""
Es esto una //situación contextual?// Qué se puede extrapolar de esta situación a la vida adulta? El miedo al rechazo persiste. Ya hasta se me olvidó porqué comencé a escribir esto, me involucré demasiado en la historia, retrocedamos... La resistencia a la acción. El //wu wei// mal entendido le diría al niño: esa resistencia indica que no deben pedir jugar con los otros niños. Ah, ahora lo veo, hay un conflicto entre la añoranza de integrarse y el miedo al rechazo.
A veces, cuando estoy por lanzar algo, siento una resistencia enorme a hacerlo, me imagino a la gente escribiendo reseñas negativas sobre mi trabajo, y con justa razón, la cantidad de gente que te escribe para decirte que lo que hiciste está mal es considerable, entre más popular sea lo que haces, más //haters/// vas a tener. Pero esto sucede por un //bias// personal y en cierto grado universal también: todo aquello malo que dicen acerca de ti es mucho más sonoro que lo bueno que dicen acerca de ti.
Sin embargo, por medio el autoconocimiento sé que esta resistencia es ilusoria, para mí lanzar algo es más doloroso de lo que es placentero. es como si tuviera un hijo y tuviera miedo de que me dijeran que es feo. Pero obligarme a ignorar mis protestas interiores también conlleva un desgaste emocional. La solución no es empujar al niño y decirle "no pasa nada, sólo tienes que meterte a jugar y ya, son niños y si te dicen que no mándalos a la verga y ponte a jugar".
Ir a la raíz del problema en el caso del niño y en el caso del adulto... es el ego frágil que tiene miedo de ser lastimado. La raíz del problema es la existencia del ego, pero al ego no se le puede eliminar. ¿Cómo hacerlo anti-frágil? El ego debe alimentarse de una variedad de identidades. No me considero un chef, por lo tanto, si me sale una comida mala, me encojo de hombros. Pero como creativo, si creo algo y a la gente no le gusta, me siento herido.
Entonces, para alcanzar mayor libertad creativa, tengo que dejar de considerarme diseñador. Me gustaría, algún día, crear cosas deliberadamente feas, deliberadamente ridículas, como mi hermana que machacó el limón que se rostizó dentro del pavo con el gravy, y quedó un gravy amargo. Una especie de anti-dribble, para dejar de tomarse tan en serio y explorar cosas que son imposibles de explorar, porque no me atrevo a hacer el ridículo. Grandes tareas espirituales.
---
Que delicia poder escribir de forma tan terapéutica! Sólo dediqué una hora para acomodar tantas cosas personal y profesionalmente. Intentaré hacer esto todos los días a primera hora de la mañana. Si veo que va bien, resucitaré Duopixel y lo haré en público. Los días que no encuentre inspiración, puedo volver a las entradas de inner.observer y pulirlas para tener inspiración consistente.
---
Desayuné, me bañé, le di un paseo al perro, y mi móvil aún no revive. Me temo que la pila haya muerto completamente. No es demasiado problema, pues—como siempre tengo una suerte increíble—mi mejor amigo tenía un iPhone 6 arrumbado que me regaló. El problema fue que al colocarle mi chip, resultó que el equipo estaba atado a Iusacell. Luego de explorar opciones e intentar desbloquearlo por métodos tradicionales sin éxito, decidimos por contratar un servicio online.
Luego de 10 días de espera me informaron que no se pudo desbloquear por sus propios métodos, por lo que me enviarían una especie de chip que va montado por debajo de mi chip parar desbloquear el teléfono, esto tampoco funcionó. Esto me deja ante la disyuntiva: espero a resolver el problema con la empresa que proporciona el servicio de desbloqueo, o hago un chargeback con PayPal?
Estos son temas menores de los cuales quizás no debería estar escribiendo, pero me vinieron a la mente en lo que espero a que mi teléfono se cargue. Lo que he decidido es que voy a hacer un transplante de piezas, debido a mi increíble suerte mi equipo actual también es un iPhone 6, por lo tanto puedo llevar a cabo este plan. Pero me gustaría que me devolviesen el dinero que pagué por el debloqueo.
Lleva cerca de tres horas conectado al ordenador, y no revive. Tenía un kit con desarmadores para iPhone, y lo estaba buscando sin poder dar con él. Tuve una epifanía diseñística mientras lo buscaba. Escribiré acerca de ello, en lugar del teléfono.
---
Formas de ordenar las cosas
Cuando estaba buscando mis desarmadores para poder transplantar las pilas de mis iPhones, comencé buscando por el lugar más obvio: los cajones de mi escritorio. Como es mi sitio de trabajo, es aquí donde guardo las "cosas de computación" que más utilizo. Si bien estos desarmadores no los ocupo mucho, es donde hubiese guardado los desarmadores símplemente porque es el lugar donde los utilicé la última vez para poder instalar una pantalla nueva en mi teléfono, el cual tenía la pantalla rota.
Como no los encontré aquí, fui a mi recamara, donde tengo un cajón con más "cosas de computación" que no utilizo tanto. Una cámara digital viejita, unos cables de HDMI, cargadores con enchufe europeo, ese tipo de cosas. Y como no estaba ahí, pues abrí todo el resto de los cajones aprovechando que ya estaba ahí.
Luego fui a un armario en donde se supone que están las cosas de arte, pero mi mamá usa para guardar lo que se encuentre. Mi madre y mi hermana tienen una forma extraña de guardar cosas. A veces quiero ayudar a poner las cosas en su lugar cuando voy a su casa, y pregunto cual es lugar de algo, digamos, una cinta adhesiva, y me dicen "no lo sé", y ese es precisamente el origen del desorden, cuando las cosas no tienen un lugar, nunca están "fuera de lugar", y por lo tanto quedan flotando por ahí, gravitando sobre las superficies como lo hacen los asteroides alrededor del sol.
Todo objeto debe tener "un lugar", pero luego las formas en las que se eligen estos lugares son un poco raros. En ocasiones me he encontrado cocinas en las que los utensilios están organizdos por el //material//, hay un cajón con utensilios de madera, otro con metal, y otro con plástico. No me meto en la organización de los otros a menos que afecte mi propia organización, pero si vivo en esa casa, no puedo evitar reorganizar con métodos más sanos.
El que me conoce bien sabe que no soy ordenado ni fastidioso con la organización, pero en general tengo buena idea de dónde encontrar algo que estoy buscando. Pero la función de ordenar las cosas no sólo es para poder recuperarlas, es que estén a la mano para cuando las necesitas. El exceso de organización (o la intolerancia al caos) lleva a que se pierda demasiado tiempo acomodando y recuerando objetos. Necesitas tener las cosas que más utilizas a la mano.
Otl Aicher hace este punto muy fervientemente en //la cocina para cocinar// en donde aboga por una cocina que parece más un taller que una cocina, donde los instrumentos están colgados en la pared para ser utilizados. Y sin duda es lo correcto, en ningún otro lugar de la casa está tan escondido y es tan impáctico usar los utensilios. Uso mi sartén dos o tres veces por día, porqué debería estar dentro de un armario?
También hay que considerar que la organización no sólo sirve para tener la comodidad de tener a la mano lo que más utilizamos, sino de usar más lo que sabemos que estamos usando poco. He de confesar algo vergonzoso: el WC del baño de mi recamara se descompuso, por lo que comencé a usar otro baño. Como ya no entraba al baño de mi recamara, me lavaba los dientes con menos frecuencia, pues las necesidades naturales me llevaban a ese sitio y al ver mi cepillo de dientes me acordaba que me los tenía que lavar.
También, urgando entre los cajones de este escritorio, encontré el libro de los Colores de Goethe, que estaba subrayando para un proyecto. "Hmmm" pense "tiene mucho que he dejado este libro, tengo que dejarlo en un mejor lugar" y fui a dejarlo en la mesilla de noche junto a mi cama. Estoy llevándome mi teléfono a la cama por las noches, un hábito que me parece atroz, pero sí, a veces me da pereza meditar hasta empezar a cabezear y prefiero hacer la "meditación moderna" que es escrolear por Reddit o Twitter sin realmente pensar o recordar nada, hasta que siento que los ojos se me cierran, y entonces me duermo.
---
En realidad estoy esperando a que llegue mi hermana por mi, pues hoy vamos a ver a nuestro padre a su casa. Como no tengo internet estoy disfrutando escribir muchísimo, ya me he extendido demasiado, pero todo esto es material que voy a publicar después. Acaba de llegar! Me voy.
Son las 2:30 AM. Me acosté demasiado temprano—a las 10pm, y cuando esto sucede, normalmente tengo dos horas en las que tengo la opción de perder el tiempo escroleando en social media, o puedo meditar o hacer algo productivo. He decidido sentarme a adelantar el trabajo de "escribir para mi mismo". Siento que ayer no hubo lecciones relacionadas con el diseño, pero realmente no sé si eso es cierto, tengo que revisar mi experiencia para realmente darme cuenta de ello.
---
Estaba terminando de escribir mi "página del día" ayer cuando mi hermana llego con mil prisas. Teníamos que salir pronto por una serie de circunstancias que son irrelevantes para el lector. Me apresuré a salir y recuerdo perfectamente que mi madre gritó desde el coche "cierra bien mijito!".
Pues bien, cuando me pasaron a dejar, ya casi de noche, llegamos y estaba la puerta abierta! O abierta en el sentido de no-cerrada-con-llave, sino que la puerta corrediza que da directo a la calle estaba abierta metro y medio, y dentro se ve mi oficina en donde estaba mi bici, y mi computadora y mi teléfono que dejé cargando sobre el escritorio (afortunadamente revivió).
No faltaba nada. Símplemente, como salimos con tanta prisa, dejé la puerta abierta. Cuando vi la puerta abierta no sentí gran alarma. Vivo en un barrio cerrado con vigilancia, casi hasta el final de una calle cerrada, y la gente que había visto la puerta abierta habría pensado que era a propósito, y si alguien se habría asomado, hubiera pensado que simplemente me había ausentado de mi oficina por un momento.
A menudo me voy de mi casa sin cerrar con llave, dejando mi computadora aquí, aunque ahora lo hago más, porque me viene a buscar Óscar, el cual tiene muchas carencias económicas, y tiene ese hábito de "pequeño ladrón" en el que—si encuentra algo en la calle que sabe que pertenece a alguien más prefiere quedárselo que devolverlo. O "roba" plantas de las áreas comunes del fraccionamiento y las transplanta a su jardín. No lo quiero tentar si un día viene, toca, encuentra la puerta sin llave y se da cuenta que tomar mi ordenador es cosa de estirar la mano y llevársela.
No es que desconfíe de él, es que lo conozco, y por lo tanto, no lo quiero tentar. Y, a decir verdad, otro escenario es que montaría guardia afuera de mi casa para proteger mis cosas (y luego esperar una recompensa).
Esto me remonta a algo que he pensado y escrito en el pasado: cómo sería un mundo en donde nadie se metiera en donde no le corresponde meterse? Hay tantos inconvenientes asegurando nuestras cosas y nuestras identidades, aunque estamos tan acostumbrados a ello que lo hemos dejado de ver.
La arquitectura Mexicana refleja mucho la inseguridad de nuestro país: la mayor parte de las casas tienen cochera para guardar el coche dentro de la casa, barrotes en las ventanas que dan a la calle, y nuestra particular forma de poner vidrios de botella rota en el filo de los muros para disuadir a los intrusos. Es una arquitectura de la protección que hace que todo sea mucho más hermético.
Recuerdo la casa de Luis Barragán, ese increíble arquitecto modernista. Puedes visitar su casa en la CDMX con una cita, pero cuando llegas a la casa piensas que te equivocaste de dirección, pues ves un gran muro con unas ventanas super equis y una puerta. El exterior no podría ser más anónimo. Podría ser un taller de herrería. Y sin embargo el interior es mágico.
Otra diferencia con el resto de los países es que te atienden a través de ventanas de seguridad en los bancos. Fue muy extraño para mi ver cómo en España y Canadá los bancos eran completamente distintos. Su arquitectura no era esa barrera entre la amenaza y el amenazado.
La gente consciente de la seguridad se infarta cuando la gente sabe que uso mi teléfono sin medidas de seguridad para bloqueo automático. Perdemos tanto tiempo con nuestras llaves...
No me inspira escribir este artículo ahora. Ya está guardada la inspiración.
---
Ya son cinco para las 3am, y siento alguna insinuación de sueño. Seguiré escribiendo acerca de mi experiencia
---
Me puse a ver Twitter y me fui por un //rabbit hole//, encontré a Buster Benson, Dr. James Fox, John Vervaeke, y ya conocía a Charles Eisentein, todos hablan de significado (//meaning//), y a veces creo que debería de dejar de escribir acerca de diseño y escribir acerca de esto. Pero luego pienso: tengo una serie de cualidades que me hacen particularmente bueno en lo que soy, cómo puedo usar todas mis cualidades para hacer cosas que puedan conjuntar todos mis intereses?
De cierta forma, cómo puedo inyectar significado a lo que hago en Method of Action, o cómo puedo inyectar interacción a lo que haría en el otro lado.
Me había ido a dormir a las 4am y tuve un sueño muy intranquilo. Ahora vine a escribir otra vez, y siento un poco de sueño nuevamente. Me acordé de un sueño que tuve:
{{Gemelos escalan una pared}}
Ahora que describo el sueño, parece ser que los gemelos estaban intentando hacer lo mismo, y quizás lo que tenían que hacer era cooperar.
Me voy a dormir otro rato. Son las 7:50am y he dormido poco.
Ayer estuve todo el día intentando decidir qué hacer respecto a mis propiedades online. Pensé que ya lo tenía acomodado, que simplemente comenzaría a publicar en Duopixel, pero esto requiere algo de trabajo, porque el contenido que tengo ahí es estático y tengo que re-importarlo (o implementar, mejor dicho) un CMS para poder publicar.
Pero, cuando me disponía a hacerlo, invariablemente encontraba resistencia. No estaba seguro de porqué lo estaba haciendo. Luego sentía cierta contradicción—"No, debería de unificar todo lo que publico bajo Method of Action, no puedo llegar otra vez a la división". Y así me pasé el día, sufriendo por esta indecisión.
Me fui a dormir temprano con este problema en la cabeza, y como a menudo sucede, uno despierta sabiendo cuál es el siguiente paso: inner.observer es el lugar donde vengo a hablar conmigo mismo. Duopixel es el lugar donde hablo con mis amigos. Method of Action es el lugar donde hablo con mis colegas. Me queda exploration.work, me encanta el dominio, y quizás cuando resuma mi trabajo de exploración del mundo real, lo vaya a utilizar nuevamente.
La idea también es que funcione como una especie de filtro. Lo que escribo en inner.observer viene sin filtro. Puedo escribir en el idioma en el que yo quiera, como yo quiera, tener mi desmadre como me de la gana, saber que alguien lo //puede// leer, pero el modo en el que escribiré será como si nadie me leyera.
Luego, si veo que hay algo rescatable que quiera compartir con mis amigos, los publicaré en Duopixel, en español. Qué habrá pasado con mi cuenta de Duopixel en Twitter? La habré borrado? Voy a mirar... Sí, lo borré, pero está disponible. Hmmm pero eso sí, que hueva tener múltiples presencias en social media. Eso no lo voy a actualizar.
Podría hacer que Method of Action se volviera el Twitter de Mark MacKay... ayyyy que difícil es la identidad! El principal problema que veo con esto es que Inglés y Español son dos públicos distintos. Method of Action puede ser mi Twitter en Inglés y Mark MacKay puede ser mi Twitter en Español. Sólo voy a publicar en Inglés cosas "pulidas", y luego de siete años de escribir para mi mismo en Inglés, es hora de honrar mi proceso mental hispano-parlante.
Por mucho que haya integrado las voces en mi cabeza, siempre existirá esta dualidad nada: habrá una voz en español y otra en inglés, que tienen casi personalidades distintas. Pero si inner observer sirve para hablar conmigo mismo, then I can switch to whatever language is most convenient for the kind of thought I'm doing.
Spanish is the language of emotion, the baroque, the heart. English is the language of reason, of logic, the modern. Spirit goes beyond language. Eventually the duality will be transcended, and I will be able to access everything from within.
Let us resolve this conundrum in English then: inner.observer is for myself. It has no set language. Duopixel is really Mark MacKay, and I will write in the language of the country I'm currently living in. The purpose is to //connect with the land//. If I'm living in Spain, I shall write like a Spaniard. If I'm living in France, I shall write like an idiot, because I don't know French.
Que extraño es pasar de una lengua a otra, pareciera que tengo acceso a dos personas distintas, es casi como si cambiara mi estado de humor. El que escribe en español es más caótico, y el que escribe en inglés es más ordenado. Pero estoy divagando, let's resolve the issue.
Realmente quiero escribir acerca de las cosas de diseño? Repasemos la experiencia de ayer, arreglé mi bici y cociné por primera vez en mi slow cooker. Hay elementos diseñísticos ahí que podría retomar, pero que no quiero escribir hoy, pero que los anotaré aquí. Quizás deba de ir recolectando prompts. Hmmm... quizás no se pueda diseñar uno mismo, cuando uno se intenta diseñar a si mismo, está diseñando a una //persona//, es una //persona auténtica//, pero no soy yo, o mejor dicho, no soy yo enteramente.
Ya me dio sueño otra vez. Son las 5:38 AM e irme a dormir otra vez es mi forma de procrastinar, pero estoy a punto de resolverlo. Ya tengo un lugar para mostrar quién soy realmente, y es este lugar.
Luego tengo una //persona// que es duopixel. Duopixel tiene un logo? o Duopixel es Mark MacKay? Es medianamente irrelevante, pero quiero decidirlo. Nah, me voy a dormir otro ratito, a ver si cuando despierte lo tengo más claro.
---
He despertado y son las 8 de la mañana.
{{Clase de crítica de cine}}
---
Sin meditarlo mucho, siento en las tripas que lo que toca hacer es un acto de nigromancia. Reviviré Duopixel, luego de ahí veremos.
Ayer llegaron dos amigos de la infancia que solían ser vecinos a jugar nuestra //partida anual de Risk//. La partida la perdí yo, como siempre, pero en cada partida que jugamos entiendo algo nuevo. [[El año pasado|2019 12 28 learning from the shadow]] comprendí que no me quiero asociar con deshonesta, requiere una gran cantidad de vigilancia que no te hagan trampa. Quieres jugar el juego para disfrutarlo, no estar observando cada movimiento del contraincante para asegurarte que el juego sea justo.
El año pasado también estaba //fumado// y realmente no me importó el resultado del juego. Este año no, y me vi más involucrado. Si bien el resultado a final de cuentas //no importa//, lo que observo es que la marihuana interfiere en //el significado subjetivo del juego//. El efecto es el mismo en la vida en general, hace que nada realmente importe. Fumado, tanto como en el juego como en la vida real, puedo ser muy entusiasta en una batalla, pero no estoy jugando por mejorar mi posición en el tablero. Mis esfuerzos van a batallas poco importantes. Es mejor auto-regularse, entender la estrategia, calcular, estar involucrado en el tablero más que en las batallas.
Como el partido se prolongó demasiado, fuimos a comer unos tacos. Al terminar me vi sorpendido de que uno de ellos me invitara la cena. El otro protestó "ay cabrón, porqué a mi no!"—"Porque Mark siempre ha ayudado a mi mamá"—y me dio gusto, la verdad. Es una cosa bastante curiosa, viniendo de alguien como mi amigo, el gesto es mucho mas importante que de alguien que entiende de etiqueta.
Mi amigo quería pagar con la tarjeta, pero su terminal no servía. La terminal era uno de esos clips tipo square que se conectan al teléfono.
*Uy este puente está muy forzado. No lo voy a escribir ahora.
Qué placer es trabajar sobre cosas que te gustan, sin un límite de tiempo establecido. Estos días los he dedicado a pulir mis propiedades online, y he redescubierto el gozo de dedicar el tiempo a uno mismo. Pero también me han llamado otras responsabilidades. Ayudé a un primo a mudarse a su nuevo departamento, un espectacular penthouse. El piso me dejó fascinado, me dio mucho gusto por él, y le dije "casi me haces desear dejar mi vida hippie", y esta expresión se ha manifestado en los últimos días, pensando más acerca de cómo hacer dinero.
Hay una parte de mi que quisiera poder hacer lo que mi primo hace (comerciar), pero también veo que se la pasa pegado al teléfono. No, no cambiaría su vida por la mía. Pero al mismo tiempo veo este patrón repetirse en todas las industrias: a menudo la gente que más gana en una empresa son la gente de ventas (por comisión).
Cualquiera que haya trabajado en una empresa en donde haya un equipo de ventas sabrá que no la tienen fácil: normalmente son gente naturalmente competitiva que se someten a una gran cantidad de estrés. Es más "bonito" ser creativo. ¿Cómo reunir ambos frentes?
Sólo voy pintando esbozos, porque estoy rediseñando la home de Method of Action, y quiero "venderme" más, buscar más donativos, que mi pasión me dejé más dinero para que pueda dedicar más tiempo a Method. Lo que hago lo regalo y siempre me ha parecido importante hacerlo de esta manera, por una variedad de circunstancias que no me voy a repetir a mi mismo, pero creo que aporto suficiente valor al mundo como para dejar de vivir como un asceta—hmmm... entiendo, sólo yo sé el valor que aporto al mundo, tengo que hacer visible ese valor, hacer la venta, para que la gente esté dispuesta a pagarme un salario.
Me es necesario justificar mis acciones ante mi mismo, pues el tema del dinero siempre ha sido taboo para mi. Siento que esto que estoy escribiendo es extraordinariamente torpe, en parte porque tengo sueño, en otra parte porque inclusive escribir acerca de "ventas" me supone resistencia, y en otra parte porque tengo que ir a mercado a hacer mi compra de la semana.
Lo dejaré aquí, y veré si me apetece escribir más al rato.
Han sido algunos días desde la última vez que escribí, sin demasiada razón mas que no tener demasiado qué escribir, ni tampoco mucha inclinación de hacerlo. No me obligo a hacer nada, escribir a diario es algo que hago cuando lo necesito, no //necesito// escribir a diario.
Ahora que lo pienso, el lenguaje es algo truculento en este caso, cuando la gente dice //necesito ir al gimnasio diario// realmente quiere decir //tengo que ir al gimnasio diario// pero eso //tampoco// quiere decir lo que parece, si realmente fuésemos honestos escribiríamos //me obligo a ir al gimnasio diario//.
Esta mañana desperté demasiado temprano como para levantarme, así que me senté a meditar. Noté mi mente llena de diálogos tontos, yéndose a lugares banales (resentimientos porque todo lo que me regaló mi familia esta navidad salió mal, y luego un discurso victimizante de que no puedo depender de ellos). Es la cosa más peculiar, porque sé muy bien lo absurdo y tóxico de este diálogo, pero a la vez juzgarlo sólo hace que la crítica que estaba dirigida contra mi familia se torne en contra de mi mismo.
Comencé a fijar la atención al entrecejo y luego al corazón, pero en este estado de somnolencia no soy el dueño de mi atención, y al poco rato volvía el diálogo victimizante—¡pero porqué! Veo esta parte crítica en los demás, pero se expresa exteriormente. Gaby, mi vecina, nunca critica a su familia ni a ella misma. De hecho, la culpa de lo que sus numerosas desgracias siempre son debido a alguien fuera de su círculo cercano, su mala salud es culpa de su doctor, por ejemplo. Ayer dijo "yo nunca tomo azúcar" mientras sorbía coca cola, por ejemplo. Está en su sombra.
Hace tiempo leí que Tim Ferris recomendaba a una mujer que recomendaba una técnica parecida a CBT, en la que hiciera que cuestionaras el origen de estas críticas como algo interno, pero el caso no era interiorizar el ojo acusador, sino preguntarse: "qué es los que me está molestando del otro que no estoy viendo en mi mismo?", y en este caso, si invierto la situación, diría: mi familia no puede depender de mí. Pero no resuena con mi propio sentimiento, pero sí hay algo tangencialmente relacionado: no quiero que mi familia dependa de mí.
Esto es un nudo demasiado delicado como para desenredar en semi-público, lo haré en mi libreta.
El caso es que—como no podía reemplazar este discurso tóxico de mi cabeza—lo que decidí hacer fue pensar en algo más útil. Normalmente no logro //cambiar el tema de conversación//, pero curiosamente en este caso sí lo logré. Llegué a la conclusión que debo apostar por disolver Method of Action e integrarlo a mi propia presencia. Que method.ac sea mi página personal, los juegos mis proyectos, el twitter mi cuenta personal, etc. No tiene caso operar de manera fragmentada. Es el camino más directo a la unicidad y a la autenticidad.
Todo esto venía con una serie de razonamientos y proyectos, uno de los cuales era //pensar de forma temática durante varios días//, y quizás allí deba de establecer la dirección de mi pensamiento, para entender realmente lo que quiero hacer, porque mis intenciones de dividir mi presencia profesional y personal se han encontrado con resistencia característica de //estar yendo por el camino equivocado//.
Hoy [[tuve un sueño|The alternative pilgrimage]] que me indicó claramente que he de dejar de ser //contracultural// y subirme al tren del //metamodernismo//. No puedo negar que son un seguidor de la virtud, de todo aquello que es bueno, verdadero y bello. Cuando me siente a escribir, será en esta dirección.
Ayer tuve la intención de //pensar de forma temática// durante varios días, y el tema elegido era la forma en la que consolidaba todo mi ser bajo un solo techo. Lo he tenido vagamente presente, pensando cómo encaja todo, pero con poca inclinación a llevar a cabo acciones específicas para ello.
Lo que más conflicto me causa es: ¿en qué idioma debo escribir? Esta ecisión está dentro de mi misma alma y psique, soy muy anglo para unas cosas y muy latino para otras. Ahora que lo observo así, en mis expresiones más sanas tengo las características positivas de ambos (la puntualidad y diligencia anglosajonas con la flexibilidad y epicurianismo latinos), y en mis expresiones más enfermas, los defectos de ambos (la rigidez y falta de humor anglosajonas con la pereza latina).
He pensado que si vale la pena escribir algo en público, al contrario de lo que son estos escritos, entonces vale la pena traducirlo. El problema de este acercamiento es que—entre más trabajo es escrbir algo—menos probable es que lo haga. Como me he imaginado que escribo, es primero un draft largo en //stream of thought// como lo hago en inner.observer. Luego se edita y se traduce, y se publica en method.ac.
Me gustan los escritos de Derek Sivers, que son muy cortitos pero muy densos. Quizás es así como terminen. Para validar estas ideas que vengo pensando, tengo que llevarlo a la acción: voy a traducir y reducir esto a su expresión mínima, y leugo lo voy a regresar de nuevo a Español. Ay dios, siento que estoy escribiendo del nabo, pero ese es el propósito, símplemente destilar lo que estoy pensando, y tomar nota de mis decisiones.
---
Which language should I use to publish my thoughts? My inner-most self is culturally divided into latin and anglosaxon halves. Should I attend the needs of my readers, or my own needs for expression? This very venue is for self-expression, method.ac is for [[The Other]].
Let us choose the path of wholeness, but even then, I don't know if I should have two blogs, or one blog with translation for the same entries. But these are practical matters, they depend on the technology which I will use. It is needless to think about this now.
I set out with the intention of distilling and translating what I had written before, but thoughts drift into new and interesting directions, it is as I wrote earlier, my psyche is divided in two, and thus I have diffent thoughts in English and in Spanish. Let these two brainstorm on the same problem, //dos cabezas piensan mejor que una//, what is the English equivalent of that? //Two heads are better than one//.
Perhaps, if I allow the stream of thought to cascade down into the valley, they will find different paths, and thus cover more ground. This kind of writing is effortless, because I'm not thinking about what people will think about me, because I assume nobody is reading, and thus I will be able to make a synthesis of both streams, or that is the plan.
Enough meta-thinking.
I was listening to a podcast called "Men this way", where Charles Eisenstein was a guest. The host told a story about him being aimless, a bit how I feel now, and he was showering asking "God, please show me my purpose", to which Charles answered with an alternative: "God, please show me what I care about", and I was intriged, because I could not answer this question.
What do I really care about?
This is a question for tomorrow, and I will put this at the end.
Meanwhile, I have already found I ought to make two passes in my writing: one in English, the other in Spanish. To honor both of my sides, the synthesis ought to be translated in both languages.
---
Commitments:
"""
I will translate all posts on method.ac
Traduciré todos los posts en method.ac
"""
Questions to be answered tomorrow:
"""
What do I really care about?
¿Qué es lo que realmente me importa?
"""
What do I really care about?
I had this question in mind when I prepared for the one hour bike ride to reach my illegally opened yoga during quarantine. I left my phone behind, so instead of listening to music—I had been tempted by podcasts too—I deliberately set myself to think about this.
I recounted the times when I've felt most alive: doing biodanza, walking the camino de santiago, coding my way through difficult projects, and there seems to be no pattern or thread in common except that these are moments where I was discovering something new. I only get tired of writing down my days when they all feel the same.
---
En la mañana, antes de bañarme, recordé un ejercicio mental que a veces hago cuando intento resolver preguntas difíciles que me hago a mi mismo: si viviera en el paleolítico, ¿qué cosa haría? Esto quita todas las complicaciones de la vida moderna, y llega a la esencia de lo que es ser humano.
Hay una parte aspiracional de mi que diría... proveer para mi familia. Ser un gran cazador, ser admirado. O ser un shaman, o ser un artista que pintara las paredes de las cavernas. Pero no, eso no soy, aunque sería partícipe de todo: de las cacerías, de los rituales, y del arte. Lo que yo sería—sería un explorador. Sería el que se va una semana y regresa para contar lo que hay en los valles que nadie ha explorado antes. Sería el que se mete a la //cueva maldita// con una antorcha, el que sigue el curso del río hasta encontrar su fuente, el que escala las paredes de roca encontrando una gran fuente de nutrición en forma de nidos para nutrir con huevos a mi tribu.
Esto resonó mucho en mí, me gusta lo desconocido. Me gusta describir lo desconocido también. Pero esto no sólo se manifiesta en el mundo físico, también lo hace en el mundo mental. Si leo las exploraciones de otras personas, es para comprender las propias. A veces me siento débil de mente, porque las cosas abstractas las entiendo más bien poco, si no tengo experiencia directa previa.
---
I remembered a post a wrote a long time ago, "Lo bueno, lo malo y lo curioso de Madrid" which many people found interesting. I just re-read it now and I found it interesting. There is plenty of value in things that I am just understanding. My mind seems to zero-in on novelty, and my own well-being depends on the freshness of experience.
But—in these quarantine days—how I ought to bring freshness of experience into my life?
Today biking to yoga was drudgery. You know, when you bike using your trunk to push down on the pedal, and yet you seem not to advance. I decided that—since I was not taking advantage of the smooth road, I might as well get off the biking path and into the pueblo.
I had biked through this pueblo at night, and it was unpleasant. I was looking at google maps as to not get lost, and I had to be fast because I was already running late, and the pueblo was supposed to be a shortcut, but the pavement was //adoquín// which is not speed friendly, and it was full of bump stops and stray dogs which chased me.
I'm actually unsure of why I chose to do this, given this previous experience, I guess I saw the uphill path which I would have to ascent and said //fuck it//, the pueblo was more leveled and I had time for it. Yes, I recall now, this is what happened.
---
La experiencia de pedalear por el pueblo fue completamente distinta a la que había sido la otra vez: como era de día, podía ver a la gente, los negocios y las calles (que no son bonitas), pero había cierto estímulo en todo eso, y pensé: sí, esto me gusta no porque sea bonito ni placentero, me gusta porque estoy explorando.
Luego llegué a una parte del pueblo en la que había numerosos negocios con rótulos pintados a mano, con distintos niveles de habilidad, y pensé: "esto haría un gran post!" pero no tenía ni tiempo ni mi móvil para tomar fotos, supe que lo tenía que hacer antes de que se esfumara esta inclinación, registrar la experiencia nueva antes de que se vuelva cotidiana.
Pero la experiencia nueva no sólo es lo que sucede en el mundo físico, de mi trabajo he descubierto ciertas cosas nuevas: cómo cambiar el nombre de las fonts... me pregunto si estas cosas tan técnicas tienen interés para los demás... es mi experiencia de vida. Esto no es un //stream// con una temática, es un blog a la antigüita, un registro de mi experiencia que primero hago en esta forma tan burda, y luego destilo para compartir con el mundo. Sí, eso es.
Things have more or less settled on what I want to do for method.ac. But—what I see needs to be done, cannot be done with Moveable Type. I would like to do it with SvelteKit, but then comments and etc... I can't be sure. In fact, I'd say I shouldn't do it with SvelteKit, just use moveble type in a sane way.
What I most dislike about moveable type is the way in which you upload images, it is such a drag, and partly the reason why I never use images. Is there any way in which I can make this easier? I thought about an image uploader, or better said: a module uploader, so that I can become more agile when writing posts.
I should begin praciticing this, perhaps. Just to see how it works out. Indeed, I will make a quick illustration for this post.
<svg width="512" height="634" viewBox="0 0 512 634" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="256" cy="256" r="256" fill="var(--c10)"/>
<circle cx="256" cy="256" r="219" fill="var(--c8)"/>
<circle cx="256" cy="256" r="181" fill="var(--c6)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M407 296C407 324.184 399.227 350.553 385.707 373.08C404.623 386.271 417 408.19 417 433C417 445.032 414.089 456.384 408.933 466.39C396.516 510.52 372.59 573.7 341.515 607.167C332.648 623.168 315.589 634 296 634C281.777 634 268.888 628.29 259.5 619.037C250.112 628.29 237.223 634 223 634C199.801 634 180.15 618.808 173.453 597.829C148.496 565.818 126.609 515.958 112.615 476.827C103.438 464.622 98 449.446 98 433C98 408.498 110.071 386.815 128.591 373.575C114.888 350.94 107 324.391 107 296C107 213.157 174.157 146 257 146C339.843 146 407 213.157 407 296Z" fill="var(--b8)"/>
<path d="M238.5 371.933C238.5 378.56 217.234 367 191 367C164.766 367 143.5 378.56 143.5 371.933C143.5 365.306 164.766 347 191 347C217.234 347 238.5 365.306 238.5 371.933Z" fill="white"/>
<path d="M365 371.933C365 378.56 343.734 367 317.5 367C291.266 367 270 378.56 270 371.933C270 365.306 291.266 347 317.5 347C343.734 347 365 365.306 365 371.933Z" fill="white"/>
<ellipse cx="336" cy="356.5" rx="11" ry="9.5" fill="var(--b10)"/>
<ellipse cx="202" cy="356.5" rx="11" ry="9.5" fill="var(--b10)"/>
<ellipse cx="232" cy="457.5" rx="11" ry="9.5" fill="var(--b10)"/>
<ellipse cx="270" cy="457.5" rx="11" ry="9.5" fill="var(--b10)"/>
<path d="M270 490C263 491 264 506 250 506C234 506 238 495.333 231 490L187 511C188.667 522 201.2 544 250 544C298.8 544 320.333 522 325 511C309 503.667 275.6 489.2 270 490Z" fill="var(--a10)"/>
<ellipse cx="100.507" cy="474.919" rx="23" ry="41" transform="rotate(-25.7053 100.507 474.919)" fill="var(--b8)"/>
<ellipse rx="23" ry="41" transform="matrix(-0.901037 -0.433742 -0.433742 0.901037 414.507 474.919)" fill="var(--b8)"/>
<ellipse cx="414.507" cy="474.919" rx="8.78747" ry="15.6646" transform="rotate(25.7053 414.507 474.919)" fill="var(--b10)"/>
<ellipse rx="8.78747" ry="15.6646" transform="matrix(-0.901037 0.433742 0.433742 0.901037 101.712 476.926)" fill="var(--b10)"/>
</svg>
Ten minutes perhaps? most of the time was changing to Runge variables, I will need to modify Method Draw if I want to make this... Ah, I see how it plays out. But then I must prepare many pieces in advance so that my system works out, and that includes Inner observer, they ought to have the same Runge scheme as Method.ac if I want to make them work hand by hand.
I shall continue working.
Últimamente he adquirido un mal hábito, que es el de irme a dormir escuchando podcasts. Creo que es un mal hábito porque es algo que solía hacer con meditación—me quedaba "escuchando" mi propia respiración hasta que comenzaba a cabecear (a menudo menos de cinco minutos), luego me acostaba y me quedaba dormido con la mente "limpia".
Sinceramente, ahora que escribo acerca de ello, no entiendo porqué he caído en este mal hábito, siendo que me agita la mente, y a menudo despierto a la mitad de la noche con la mente llena de pensamientos, y además tardo más en dormir. En los círculos espirituales se dice que no despertamos porque estamos apegados al drama, y puede que sea este el origen de mi vicio, la mente no se quiere estar tranquila. Hoy haré intención de irme a la cama sin el teléfono.
Esto lo comencé a escribir con la intención de escribir acerca del podcast que escuché anoche, que era de una señora egresada del Harvard Divinity School que tenía una especie de organización/empresa llamada "Sacred Design Lab" (https://sacred.design) y me chirrió muchísimo, pues se mete en lo que ahora considero mis dos áreas de especialidad, en las que llevo intentando construir puentes desde hace varios años, pero que aún estoy buscando la integración de esta dualidad, pues la espiritualidad y el diseño a menudo parecen antítesis, la espiritualidad se lleva mucho mejor con el arte, así como la ingeniería se lleva mejor con el diseño.
Me dio la impresión que esta señora quiere "productificar" la espiritualidad a través del //design thinking//, ahora bien, antes de colgar a esta señora en la horca tengo que investigar muy bien sus métodos y sus productos, pues me estaba alebrestando de tal manera que decidí que sería muy mal contenido para dormir y lo quité, pero hoy me encontré pensando: "bueno, si el propósito del diseño es satisfacer una necesidad, y existe una necesidad tan grande de encontrar //significado en la vida//, porqué es tan malo hacer un producto que te apoye en esta tarea?". Mis exploraciones con [[The Virtuegraph]] iban en esta dirección, pero luego he sentido que todo esto viene de una necesidad de //cuantificar// que es diametralmente opuesta a la sensación espiritual.
Es un poco como la dieta: si lo que quieres es comer bien y sano, tienes que dejar de contar calorías y //comer con conciencia//, aunque saber contar calorías y macronutrientes te ayudan a comer con //aún más conciencia//.
El progreso espiritual es la cosa más peculiar, en numerosas ocasiones he sentido que—para seguir avanzando—es necesario destruir las escaleras que usaste para llegar a donde estás, y reconstruirlas en una manera enteramente distinta para llegar a un punto nuevo. En muchas ocasiones la sensación es la de andar en círculos, porque muchas de las conclusiones a las que llegas son las mismas que tenías antes de comenzar tu búsqueda.
Por ejemplo, alguien no iniciado dice "el ego no existe", porque no nota su ego. Alguien iniciado dice "el ego es quien creo que soy", porque lo ha notado. Alguien despierto dice "el ego no existe" otra vez, porque se da cuenta que es un producto de la imaginación. Y así hay infinidad de lecciones, en las que—como dice el Tao—el sabio parece un estúpido, porque se ha dado cuenta que todo conocimiento le es inútil.
Entonces, conforme avanzas en el desarrollo espiritual, te das cuenta de que mucho de lo hiciste es inútil, la única utilidad fue en haber descubierto su inutilidad. ¿Cómo puedes vender un producto cuyo objetivo es darte cuenta que sólo estás desarrollando al ego? Es como una mala broma, pero una mala broma necesaria para tu propio desarrollo espiritual. Son términos tan difíciles de describir que tengo que recurrir otra vez a la analogía: siempre he querido crear una app para registrar mi progreso en el gimnasio, pero ahora lo he dejado de hacer porque me doy cuenta que lo que quiero es mayor conciencia de mi propio cuerpo, no saber cuánto levando en bench press o en sentadillas.
Pero vuelvo a lo mismo, no pude haber llegado a este estado de conciencia sin antes haber sido muy escrupuloso llevando el registro de cuánto estaba levantando en cada sesión, y por lo tanto—si quiero ser honesto al vender un software para registrar tu progreso en el gimnasio—tengo que aclarar: //pero esto en realidad no sirve de nada, lo que realmente quieres hacer es cobrar conciencia de tu propio cuerpo//. ¿Crees que cultivas tu cuerpo al levantar más y más peso? ¿O cultivas tu cuerpo cuando te conectas con él, y lo usas eficientemente? La mente, el cuerpo y el corazón están conectados, idiota, deja de fragmentarte y déjales hacer música y danzar".
Pero en todas las teorías de psicología del desarrollo se especifica claramente: no puedes saltarte las etapas. O mejor dicho, si te saltas una etapa tendrás "deuda de desarrollo", y por lo tanto, aquel que no tiene fuerza resistencia o flexibilidad no puede profundizar en su cuerpo como lo hace alguien que sí. Aquel que no sabe de proteínas, grasas, carbohidratos y calorías, no puede profundizar en su propia nutrición como el que sí.
¿Pero cómo pedirle a un usuario que construya una escalera que luego tendrá que deshacer para escalar más alto? Estos serían los diez mandamientos de Moisés, una fórmula algoritimica para llevar una vida moral, que luego fue supercedida por la ley del nuevo testamento: trata a los demás como quieres que te traten, donde se requiere pensar como el otro para inferir una ley moral.
Como sea, bien he entendido que no debo construir puentes entre la espiritualidad y el diseño, lo que debo construir es una escalera que me permita ver a ambos desde un punto de vista más alto. Tengo miedo de no estar a la altura de lo que estoy buscando, pero yo soy el que exploro, y para explorar hay que renunciar al fruto de los descubrimientos. Voy recorriendo caminos que nadie ha caminado, y mi única labor será apuntar al potencial de estos productos platónicos, la tarea de //minar// este terreno ni me gusta ni me interesa, pero hay que hacer un esfuerzo para demostrar: "ey, aquí hay oro" y dejar que otros hagan ese trabajo. Mi virtud es ser tan ingenuo como para meterme en los berenjenales más espinosos y encontrar cosas que nadie hubiese encontrado.
I write this first thing in the morning, as I woke up after some seemingly random dreams (which I will write later) and then I sat down to meditate. Mentation went naturally to the issues I described yesterday: the combination of design thinking and spirituality to develop spiritual products, and I thought "if corporations are starting to do this shit, they will pollute the space, should I be doing this instead?" and visions of the product came about.
It is not an inspired product, it is simply claiming the platonic space where someone is planning to develop a "spiritual mall" and instead create a garden where people can roam, offering and receiving spiritual "services". The specifics of this will be worked out as time allows, but I would like to have a working product before 2021 ends.
I more or less know how to build an MVP, for I was a "user" of this product a couple of years ago: in the spiritual opening, one explores vehemently the space, and so I attended all and everything spiritual in a thirst which I couldn't quench: gestalt therapy, group meditation sessions, cults that believed aliens were communicating with their prophet, I insulted and was insulted in a group, I danced ecstatically, I walked thousands of kilometers of the camino, I attended an ayahuasca ceremony, I... the list goes on and on, and in the end here I am, I can't say if any better than before, but really appreciative at the work I did, and the intensity in which I explored this area.
This area is evergreen, and in possibility of commercial exploitation, but I wouldn't like it to be developed this way, I suppose the financial viability would make itself clear later, but for the time being I will think about the issue as a non-profit endeavor, because I do not want to shape the product according to financial concerns.
I am writing about this as if this were a decision I had really pondered and I am committed about, which is throughly alien to me, I normally second guess myself. I do have a certain resistance because I know this kind of project is not really creative, at least in the beginning, I have envisioned it more like a directory.
Spiritually the first thing I need to do is to free up my schedule so that I have time to begin working on this. Client work is the bane of all my creativity. Why is it so hard to find the space for what is spiritually meaningful? Because it is not as meaningful enough as to push away financial commitments. If I felt called by Jesus I would not wait. But I am called in a different way, this would be too early to begin work, I must put in the back of mind while I dilligently finish the projects which are already in my hands—and my hands are full—so that I can begin this spiritual quest.
Tiene tiempo que no escribo mis work logs, cosa extraña que no me hayan dado ganas de escribir aún, pero ahora mi teléfono se ha descargado, y como es mi conexión a internet, tengo que esperar a que termine de cargarse para ponerme a trabajar.
Supongo que—para ponerme al corriente—es necesario registrar la actividad de las últimas semanas. Pensé que había dejado de escribir hace un mes, pero sólo fueron dos semanas! Creo que la razón por la que he dejado de escribir es porque me he encontrado bastante concentrado en el trabajo, y la verdad es que inner.observer no es una bitácora de trabajo (aunque lo podría ser, no veo porqué no).
Mi mente sólo está soltando su verborrea actual antes de llegar a las cosas que son realmente escenciales.
El sábado salí por primera vez con M. Qué difícil es explicar quién es uno, qué es lo más importante que ha pasado en su vida, cuales son sus añoranzas para el futuro. Hablamos brevemente acerca de la intersección entre lo espiritual y lo laboral. Me impresionó mucho la descripción de su actividad laboral como una meditación en movimiento, todos tenemos esa facultad de "perdernos en la actividad"—a pesar que nuestras actividades son completamente distintas, y es aquí donde la intersección entre lo espritual y lo laboral suceden.
A menudo estamos buscando un puente muy evidente, queremos que lo que hacemos sea bueno para el mundo, queremos curar el cancer, dar de comer a la gente que tiene hambre, proteger al refugiado, salvar a los animales en peligro de exitinción, cerrar esa planta nuclear, pero lo que experimentamos colectivamente es el desdoblamiento del zeitgeist, y cuando nos logramos concentrar en lo que hacemos estamos asistiendo en este desdoblamiento.
El que realiza actividades "espirituales" desde el ego hace más daño que provecho, va en contra del desdoblamiento del universo, hace una guerra contra una ola contra la que no tiene capacidad alguna, lo recoge y luego lo revuelca, y si es que el revolcado logra reincorporarse echará maldiciones y culpará a la ola de sus desgracias, cuando él mismo las provoca.
La actividad espiritual-laboral se realiza cuando uno puede perderse de si mismo en la actividad que le da sustento. El trabajador de una planta nuclear cuyo ego está recedido mientras da mantenimiento a una máquina es más espiritual que el yogi que va a la naturaleza para una sesión de fotos en sus asanas más dominadas para Instagram.
El móvil se ha recargado, es momento de intentar perderme en la actividad laboral.
En muchos de mis sueños aparece como tema la dualidad, y esa parece ser la temática de esta década, sino es que de mi propia vida. Nací de padre y madre extraordinariamente diferentes, de culturas y nacionalidades diferentes, y me noto con elementos del alma de ambos, y el reto de mi vida parece ser realizar esta integración casi imposible de cumplir entre el caos y el orden, entre la intuición y la razón, entre lo material y lo espiritual, entre lo contemplativo y lo práctico. Pero creo que todos cargamos con esta dualidad, y el propósito de nuestra vida a menudo es elevarse por encima de estas dualidades a tal punto que logremos una perspectiva donde cese el conflicto interior, el deseo de una parte por exterminar a la otra, sino entenderlas como elementos sinergéticos de la psique.
Cuando las dualidades contenidas dentro encuentran una sinergia se impulsan la una a la otra a través de la tensión y la relajación, son como las dos culebras del cadeceo, el bastón de Hermes, el mensajero de los dioses, y ascienden a perspectivas divinas. Cuando uno va caminando por la ladera de un cerro y mira hacia arriba, no puede observar los caminos que hay arriba, y por lo tanto sólo puedo entender que hay caminos superiores, pero no sé como son, y aunque lo supiera, no sabría explicarlo a alguien que no ha estado allí. Sólo puedo escribir para expresarme de forma poética, pues a estos niveles ya hemos dejado a la razón muy por detrás.
Cuando hace frío, las culebras se resguardan en nidos con infinidad de sus semejantes, formando nudos amorfos y caóticos para resguardarse del frío, pero cuando llega la luz del sol emergen como cordones enroscándose la una a la otra, y podríamos describir las diez mil columnas que se forman del calentamiento de este nido posmodernista. La energía de la luz viene en forma de virtud: aquello que es bueno, aquello que es bello, y aquello que es verdadero es lo que alimenta al caos y lo convierte en orden.
Si escogemos una de estas dualidades que forman espirales dobles como el mismo ADN que compone nuestra genética, podríamos apuntar a la dualidad de la creatividad y la experiencia (o receptividad). El ser humano actualizado entiende muy bien la necesidad de los periodos de creación y los periodos de experiencia, el perpetuo viajero está fuera de sintonía con su parte creativa, y el alquimista encerrado en su laboratorio carece de la experiencia para saber que sus intentos por dar con la piedra filosofal son inútiles. Es sólo elevando la visión que uno puede entender la necesidad de la existencia de ambos.
En el intento de simplificar nuestra vida a veces entendemos este conflicto natural como algo anormal, como si el alma debiera estar enteramente inerte y serena, pero hasta el meditador más experimentado "avanza", y se avanza moviendo una pierna enfrente de la otra, alternadamente. Mantenerse estático es estancarse.
Todo lo contenido dentro de nosotros es natural, todo lo que somos es perfecto. Todo conflicto interior es ilusorio, es conflicto sólo porque queremos que una de nuestras partes aplaste a la otra. Si fijas la atención en la respiración verás el reflejo de todo esto que he escrito en tu propia respiración.
Casi siempre que me siento a escribir mis logs, no tengo idea de lo que saldrá, y mis logs comienzan así: es una forma de comenzar, aunque no sepa por dónde comenzar. Normalmente este párrafo lo borro, si es que voy a escribir en público, pero en privado lo puedo mantener. No es que haya nada importante en el primer párrafo, pero es una forma de darme cuenta de cómo fluye el río de la conciencia.
Cuando una mujer aparece en mi vida, no importa si me he liado con ella o no—reclama una cantidad desmedida de atención, entonces, si soy honesto al escribir esto, me he encontrado pensando mucho en M. Hay partes de mi que desean alejarse y otras que desean acercarse a ella. A la vez, no puedo escribir de forma completamente honesta en un espacio semi-público. Esto no es enteramente un diario, pero tampoco es un blog, pero como escribo para aclararme las cosas, tengo el impulso de resolver algo a través de la escritura.
Es imposible.
Acabo de recordar un sueño que no tiene nada que ver con esto, pero es muy vago. Estaba Javier Cañada. Un bar en España. Un insight... No recuerdo lo suficiente para armar una narrativa con el sueño. Lo dejaré ir.
Últimamente me encuentro frunciendo el ceño, como pensando demasiado. Cuando medito, alcanzar serenidad me cuesta más de lo normal. Hace tiempo que no visito [[el refugio|Inner Refuge]]. Mi proceso mental y emocional parece caótico. Seguramente es a causa de M. De nuevo estoy llegando a donde no quería escribir. Vamos a intentar discernir, sin exponernos demasiado públicamente.
Creo que todos contenemos multitudes. Cuando nos sentimos ambivalentes ante un estímulo, es porque fragmentos de nosotros quieren algo, y otros fragmentos lo rechazan. El caos interior viene de este conflicto, que puede llegar a ser muy violento si nuestros fragmentos también lo son, aunque en este caso es más como una discusión acalorada. Ambas partes tienen razón.
Hace unas semanas descubrí a Forrest Landry, y él tiene un aforismo que me intriga: "love is that which enables choice". En una psicología de fragmentos, hay una parte de mi que quiere lograr su objetivo a través de la represión. Hmmmm... lo entiendo ahora, no confío en que el corazón tenga la sabiduría de elegir aquello que le conviene o no le conviene. Hay una voluntad de dominación sobre la elección del corazón.
Creo que con esto ha sido suficiente para esclarecerme las cosas de tal manera que pueda trabajar conmigo mismo y resolver este desacuerdo interior a través de la meditación. No sé muy bien porqué hago esto en semi-público, me obliga a escribir en términos generales, de tal forma que las particularidades del caso receden para dar paso a aquello que //nos concierne a todos// en lugar de aquello que //sólo me concierne a mí//.
El trabajo interior nunca acaba.
Hoy fue la culminación de la gran saga de wallstreetbets, y a pesar de que esto aparentemente está lo más alejado de mis intereses, me veo sorprendido siguiendo los acontecimientos. Hay algo más profundo que unos chavales poniendo a los hedge funds entre la espada y la pared, es una especie de tirón a la cortina que cubre a la realidad, y revela el mecanismo de un juego en el que no somos partícipes. Somos las piezas de un juego de ajedrez que alguien más juega.
Muchos dirán que no es una revelación, que siempre lo hemos sabido, que los ricos y poderosos siempre han tirado de nosotros como títeres, pero nunca lo hemos experimentado como un fenómeno interpersonal. Recuerdo, cuando he trabajado para empresas grandes y pequeñas, lo ridículo que era pretender que hago mi trabajo para el usuario. No podía llamarme UX porque sería una farsa. Unos podrían argumentar que la empresa no aportaría suficiente valor si es que como UX tengo que desaconsejar al usuario de usar nuestro producto.
A la gente que le falta un poco de cordura habla de un consejo de gente poderosa que decide el futuro del mundo, y afirma que son gente vil y cruel que disfruta con el sufrimiento de los demás. Adoradores del diablo. Pero esto es la gestalt que se ha formado con el espíritu de los tiempo, los incentivos de la sociedad moderna son muy extraños: una ballena viva no vale nada, pero una ballena cazada vale un millón de dólares. Una hectárea de selva no vale nada, pero convertido en madera tiene valor. ¿Qué es el dinero? ¿Realmente la gente tiene la vida que se merece? Pareciera que las enseñanzas de Jesús son más vigentes que nunca: es más probable que pase un camello a través del ojo de una aguja de lo que un rico pueda entrar al cielo.
La exhortación de Jesús hacia la pobreza es lo que nos hace libres de las maquinaciones del "consejo del mal", pero el "consejo del mal" no es más que las sombras proyectadas de los incentivos biológicos de nuestra sociedad. Somos buscadores incansables de estatus, y confundimos el estatus con la virtud, la belleza física con la belleza espiritual, la venganza con la justicia. ¿Por qué se siente como si todo estuviera patas para arriba? Claramente nuestras prioridades están invertidas.
Recuerdo que antes de la pandemia me había encontrado con Gastón Soublette en YouTube. Me gustó mucho lo que habló, ni siquiera recuerdo el tema, pero pensé "soy fan de este viejito", y luego de un rato habló de que "el mundo como lo conocemos acabaría en menos de veinte años", y yo pensé "este viejito está chiflado, que pena, me pareció muy interesante lo que estaba contando". Pero luego se vino el coronavirus, BLM, wallstreetbets... el telón parece haberse caído, y la civilización que pensábamos que teníamos no existe. Está sucediendo una revolución muy distinta a la que hemos visto en épocas pasadas.
El mismo Gastón Soublette hablaba de Lola Hoffman, a quien no conozco y acabo de abrir en Wikipedia, qué historia tan fascinante. Lola Hoffman hablaba vehementemente de que esta época había estado llena de desaciertos, que vivimos en una época muy oscura, pero sabiendo acerca de la naturaleza del universo, necesariamente tenemos que conocer el lado opuesto: una época de luz, de la corrección de esta dirección tan extraña que ha tomado el mundo. Ahora tengo fe en ello, el mundo será mejor muy pronto.
Todo esto lo escribo enteramente sobrio y símplemente como un bosquejo de lo que voy percibiendo. Lo aclaro porque me parece que sería algo que escribiría en un estado alterado de conciencia, y porque conforme lo escribo me parece que voy saltando de un tema a otro, símplemente recogiendo lo que se canaliza a través de mi.
Si lo tuviera que resumir en una frase, sería la certidumbre de que la realidad consensuada se está desmoronando. No se va a caer todo de un día para otro, pero se está llevando a cabo una revolución no-kinética, en la que "las masas" están derrumbando instituciones. Ya nadie quiere ser una pieza de ajedrez en el tablero de otro. La gente reclama su propia soberanía.
Conocí a alguien y he sido lento en mover las cosas. Al principio fue por las dudas, más que lentitud fue una precaución, pues sabiendo cómo el amor lo pone todo boca arriba, no es insensato hacerlo. Es como los perros que se acercan a conocerse, no llegan directo a jugar o a agredirse, sino que se olisquean y miden para entender si son amigos o enemigos. Ambos tenemos una disposición amistosa, eso está establecido ya.
De acuerdo a convenciones sociales, hoy era el momento de pasar a un plano más físico. Y de cierta forma así fue, pero de una forma muy sutil: cuando me dijo que se lastimó el brazo, se lo toqué, y cuando fue momento de despedirnos, la tomé de la cintura para darle el beso en la mejilla. Me sorprendió que no hubiese premeditado nada de esto, mi cuerpo lo hizo en automático, y es muy peculiar, porque en ocasiones anteriores que nos hemos saludado o despedido de beso he sido torpe.
Y me regresé del yoga en la bici con una sensación muy agradable, como la de haber dado un pequeñísimo sorbo de un néctar muy rico pero embriagador. Son actos tan sutiles que en el plano material apenas se notan, pero mueven aguas profundas. Es demasiado pronto para especular acerca de esto, pero algo que ha permanecido adormecido en mi va despertando y recordando. Todas las [[protestas y defensas|2020 12 18 Al César lo que es del César]] que percibía antes van pareciendo irrelevantes.
Estado: alterado.
El fin del camino
Se dice que el regreso del viaje del héroe es volver a casa, pero este regreso no dejo de percibirlo como uno de los periodos más difíciles, persiguiendo no sé qué independencia de pensamiento que me permita vislumbrar de verdad de qué se trata esto de vivir. Esto es un paréntesis Quijotesco, pues ninguna conclusión a la que llegue sin que venga de una segunda experiencia de vida que realmente aproveche la sabiduría acumulada, sería pura chaqueta mental, o mejor dicho: una vida desperdiciada.
Es necesario vivir de buena voluntad por amor al prójimo, si uno no sabe cómo hacer esto quizás sea necesario seguir a un maestro, pero el arte es descubrirlo por uno mismo. Es necesario tomarse en serio y ejercitar su voluntad, e independencia de acción. Ser coherente en todos tus actos. Íntregro. No es necesario que el maestro le enseñe en vida, hay muchos textos a tu disposición para hacer tus neuronas vibrar en unísono del uno.
Psicológicamente uno se cura a uno mismo primero escuchando las distintas partes que tiene uno dentro, uno es un esquizofrénico con muchas partes las cuales tiran en direcciones contrarias y la paz interior siginifica hacer las paces son esto.
---
Me gusta por donde va esto, pero tengo que editarlo sobrio
---
Estado: sin alteración
Hacía mucho tiempo que no me fumaba un porrito. A veces, cuando regreso de Yoga, hay un chico en una esquina que está cojo y pide dinero a los coches que van pasando. A veces, cuando paso en la bici, huelo que anda fumando, y esta vez pasé y le dije "Oye, a veces pasado y huelo que fumas hierba, de casualidad tendrás tantita que me vendas?"
El chico se rió y me dijo "aguántame tantito", porque había una camioneta de la policía a metros de nosotros. Charlamos brevemente en lo que se iba: él la fumaba para lidiar con los dolores de su pierna, y que si era buena yerba y etc. Yo le dije que sólo quería un poquitito para relajarme cuando regresara a casa, no más, y me dijo que no me preocupara porque es todo lo que tenía, suficiente para un porrito.
Cuando la policiía se fue sacó una bolsita con una bolita verde a duras penas del tamaño de una canica, lo cual era perfecto, y yo saqué 35 pesos que tenía en cambio. El chico se persigno, y yo se lo agradecí encarecidamente, pues venía un poco cabizbajo porque se me ponchó la llanta mientras iba a yoga.
Debato si debo escribir la historia entera, quizás sí lo deba de hacer, pero sin ninguna pretensión estilística, esto es un registro de la experiencia para uno mismo, para entender lo que yace detrás de nuestras acciones.
---
Estado: alterado
Acabo de meter a Nina que estaba ladrando incansablemente, no sé porqué razón. Quizás debí investigar la causa de su agitación, pero me fumé lo que me sobró de lo que me dio el chico anoche y simplemente la he metido para que se esté tranquila.
Escuché a una escritora que dijo que tenías que aislarte para crear, y que en el proceso creativo, lo que más distrae es eso a quien amamos. Tendrías que ser Goethe para componer sonetos en la misma cama de la viuda italiana que le inspiró a escribir //Las Elegías//. O quizás no. Quizás sea posible escribir acerca del momento presente.
Percibo que escribir las experiencias actuales no servirán para resolverlas. Todo se hace de buena fe y en dirección hacia la virtud de Lo Bueno. Esa es nuestra primera responsabilidad, navegar en esa dirección nunca rendirá malos frutos. El gran peligro es olvidar la tarea, volver a dormirse, perder el interés, dejar que todo pase, no atreverse.
Por los lugares en los que uno se mete, uno se debe meter dispuesto a rasgarse la piel cruzando vallas de moreras para realizar las tareas necesarias para reestablecer Lo Bueno, aunque bajo una perspectiva Taoista "Lo Bueno" es la virtud natural. Ese tipo de virtud debe venir sin esfuerzo, y uno no se razga porque "los rinocerontes no pueden penetrar esa armadura", es la bondad que emerge naturalmente de un estado de conciencia superior, cuando uno está en sintonía con el uno.
Son las 12:40 y los ronquidos de Nina me indican que es hora de irnos a dormir. Concluiré mañana.
---
Estado: sin alterar
Todo parece ser el resultado de tormentas interiores. Aún no lo entiendo del todo, algo parece tirar de mi para realizar acciones que a veces me parecen equivocadas—es demasiado abstracto todo lo que escribo, pero lo escribo para mí, para recordar en el futuro. Es necesario interceder en el mundo? Interceder en los problemas que no te atañen?
Es necesario. No sé explicar porqué. Quizás porque somos agentes de una conciencia superior. Cuando es la conciencia inferior la que toma estas decisiones, uno puede sentirse culpable de sus propias acciones. Pero yo mismo he intercedido muy poco en mis propias acciones. Son cosas que tenían que suceder.
Ya he hecho mi parte.
Pensar sirve para lanzar una flecha y observar el recorrido. Nuestros pensamientos, cuando saltan de un lado a otro son inservibles. Una adicción al pensar. Seguir el recorrido del pensamiento productivo es una cualidad que debe cultivarse, y puede hacerse a través de la escritura automática.
Lo que defino como "pensamiento productivo" es una manera libre de pensar, sin jerarquías, sin fórmulas, sin juicios, acerca de lo que a uno le pasa en la cabeza en este preciso instante, y el argumento es que—al poder observar el pensamiento—es posible dirigir su curso, y poner la razón al servicio del espíritu.
La dirección en la que mi espíritu lanza su flecha es un lugar donde pueda escribir libremente, otra vez. Ya he visto en qué momento debe de ejecutarse esta tarea, pero habrá que empollar algunas ideas. Tenemos que hacerlo ahora? No lo creo. Esta es la incubación misma.
La mente se dispersa, volvamos a la tarea: el momento está dado, el cómo también, el qué es lo que sigue nebuloso.
¿Qué quiero crear? Un espacio de expresión creativa individual. Hacer una colección de las cosas que he creado a través de mi vida. Sencillamente escribir un diario otra vez. Quizás no haga falta tirar ninguna flecha, el camino es intuido. Si lo que quiero avanzar, la tarea es crear contenido para ese ente aún intexistente.
Eso haré.
Son las 4:10 de la mañana. Me he levantado a las 3am porque no podía seguir durmiendo ni meditando, aunque no era por alguna preocupación sino... a veces el cuerpo y la mente están inquietos y hace falta darles algo de actividad para poder descansar o aquietarse.
Por ejemplo, al no poder dormir me senté, y noté cómo mil pensamientos irrumpían mi silencio, "vuelve a la respiración" pero de inmediato se colaban pensamientos, la mente está aceleradísima últimamente, la causa es conocida, es una mujer, que como se han vuelto tan espaciadas en mi vida, parecen cobrar más significado del que debiera ser "comenzar a salir con alguien".
No sé si prestarle atención y escribir acerca de ello. Lo intentaré traduciendo lo que es personal a lo universal.
Una relación sentimental debe ser lo más sencilla posible dadas las circunstancias de los dos individuos. ¿Qué es una relación sencilla? Primero exploremos lo que es una relación compleja para llegar a la definición a través del contraste. ¿Qué es una relación complicada?
Parece haber dos términos a diferenciar: lo complejo de lo complicado. Hay cosas que necesitan ser complejas para funcionar, la complejidad es una característica de los sistemas y no es un defecto. Lo complicado es complejidad innecesaria, normalmente emerge del mal diseño, y sí es un defecto. Es una fórmula cuyas variables no han sido reducidas a su mínima expresión.
Si traducimos estos conceptos de los sistemas a las relaciones humanas (y me escucho protestar que esto no es posible, pero estoy escribiendo de forma exploratoria), una relación compleja es una de mucha interdependencia, podría ser—por ejemplo—una relación en la que hay niños, una persona provee y la otra persona cría, y luego hay necesidades interpersonales que son satisfechas en la dinámica familiar. Es necesario que una relación así sea compleja para funcionar bien.
Una relación complicada podría tener características de la relación compleja, pero la complejidad sería innecesaria. ¿Cómo se vería esto en una relación de pareja? Que—aún sin tener hijos—hubiera conflictos de dinero. Esto se daría por una interdependencia económica. Pienso en las parejas donde una persona es alcohólica y la otra es el "habilitador", esas siempre son relaciones complicadas. ¿Por qué?
Pareciera haber un aspecto del amor que es masoquista. Confundimos la reconciliación con la profundización en el otro. Tengo suficiente experiencia de vida como para saber cómo mantener a una persona enganchada a través del conflicto, pero estas son armas prohibidas para el caminante espiritual. Una relación complicada es un juego de ajedrez donde el amor se otorga estratégicamente.
¿Qué es entonces una relación sencilla? Creo que principalmente una donde el amor fluye indistintamente de si la persona lo "merece" o no. Hmmmm... en un sistema familiar esto también aplica, en las relaciones familiares complicadas siempre existe una retención del amor basada en "mérito". Sí, el amor parece ser un gran reductor de complejidad.
¿Es posible trasladar este principio a los sistemas no-interpersonales? Buckminster Fuller decía que el amor es gravedad metafísica, es una especie de principio de atracción, un deseo de fusión, creo que lo puedo entender como un deseo de simplificación, las cosas parecidas o complementarias se fusionan para crear un todo más sencillo, aunque la unidad resultante de la fusión sea más compleja.
Aunque he escrito poco, ya me ha esclarecido mucho cómo es una "relación sencilla". Todas las relaciones comienzan siendo sencillas, y vamos añadiendo complejidad conforme emergen interdependencias. El amor es lo que evita que lo complejo se vuelva complicado, es la energía vital del sistema, y //creo// que crece conforme a las necesidades de interdependencia en la relación.
Una relación no debería ser más compleja de lo que exigen las circunstancias. La sencillez es virtud. ¿Es deseable retener la sencillez del principio de una relación? Se añadirá complejidad conforme aumenten las interdependencias. Pero si lo que quieres es prolongar la parte "sencilla" de la relación—¿qué es lo que harías?
Respetar la soberanía del otro. Recibir con agradecimiento y no con expectativas. Dar desde el corazón, y entender que dar es un regalo que se da uno mismo. No intentar "arreglar" a la pareja. No introducir a la pareja a nuestra neurosis de control. Aceptación incondicional.
Pareciera que estos son principios eternos y no temporales de la parte sencilla de la relación, es decir, son principios que simplifican lo complicado.
Qué cosa tan curiosa sería intentar aplicar estos principios al diseño. Ojalá no me hubiera entrado sueño, seguiría explorando la relación de los principios inter-personales con los inter-sistémicos.
Mi primo vendió el escritorio que me había prestado, y ahora me siento en el comedor a trabajar. La ventana da a un patio interior por el que se proyectan sombras, las cuales funcionan como una especie de reloj natural. El sol comienza a pegar a las 8am y progresivamente va cambiando su ángulo hasta quedar vertical a medio día. Cuando llegué a esta casa me despertaba temprano en la mañana y pintaba con acuarelas esta escena, con el propósito de volverme mejor con la técnica.
Cuando pintas las cosas las observas con mucho más cuidado. Ahora no estoy pintando esta escena, pero como la he pintado antes, puedo ver cómo el sol que pega contra la pared blanca es un blanco cálido, y el color oscuro de la sombra tiene un tinte verdoso apenas perceptible. Y así, la luz llega y rebota por todas partes, creando un ambiente particular—no lo llamaría bello, simplemente es.
Creo que esa es la razón por la que también escribo, para capturar el ambiente de ciertos momentos, la luz es la experiencia y la sombra el aprendizaje, y con M. han sucedido unas cuantas cosas que apuntan a que el asunto no va a prosperar, extrañamente no me importa, dentro de mí sé que no es un rechazo, sino que he acomodado mi vida no a la convivencia sino a la //vida monástica//, y esto me hace un hombre un tanto extraño, super desarrollado en ciertos aspectos y subdesarrollado en otros. Los aspectos sub-desarrollados se pueden desarrollar, aunque es posible que sea muy tarde. No estoy apegado a la idea de que este encuentro deba de terminar en una relación, pero me hace notar que necesito crecer en ciertos aspectos para sostener una relación, especialmente mi faceta masculina.
Parte de esta faceta masculina es quitarme a mi mismo de mi propia experiencia. El hábito auto-referencial es femenino, y es necesario para dar sentido al mundo. Un hombre que no tiene ese marco es movido enteramente por las pasiones, pero uno dominado por él, como yo, se vuelve demasiado femenino. Esto es en un sentido espiritual, la orientación sexual es independiente de esto. Pero he intentado eliminar este marco auto-referencial en el pasado, a través de escribir sin referenciarme, pero sólo he logrado escribir mal.
Esto creo que es porque quería seguir escribiendo acerca de mi mismo, pero sin usar la primera persona. Además, en ese momento no tenía acerca de quién escribir, estaba solo en España. En ciertos momentos he percibido que es posible obtener experiencia a través de otras personas, es decir: no hace falta sufrir tanto para conseguir experiencia, si te tomara en serio las experiencias de los demás, serías capaz de usar su experiencia vital para enriquecer tu propia vida.
En la escena que se presenta frente a mi, puedo ver cómo el sol cae sobre las hojas del eucaplipto, y este a su vez ilumina la parte interior del puente, pintándolo de un verde-amarillo muy bonito. Si no hubiera esta interacción de la luz-experiencia, nuestras sombras serían tan oscuras como la noche y lo único iluminado sería aquello a lo que le pega directamente la luz del sol. Sería un contraste extremo. Experimentar la vida a través de los ojos del otros, eso parece ser la conclusión de lo que acabo de escribir. Pero esto definitivamente no se puede hacer en público, sería una violación importante de la privacidad. Voy a colocar mi libreta junto a mi computadora a fin de recordar este propósito mañana que vuelva a escribir.
Ayer asistí a un temazcal con mi hermana y con M. Fue un evento muy particular, pues yo iba con la intención explícita de renacer, que debe de interpretarse de forma muy figurativa, digamos que es otra forma de expresar el deseo de cambio (ver [[09 Espiral - Vida, muerte y renacimiento]] ).
El temazcal lo organizaron unos chicos muy sinceros y auténticos, pero también faltos de experiencia, y por más piedras que metían al temazcal, parecía no lograr calentarse. En las primeras dos puertas no sólo faltó calor, sino que experimentamos frío, y mi mente discutía si la sinceridad es suficiente bálsamo para cubrir la falta de capacidad de ejecución.
Este fenómeno parece repetirse en todos los entornos y en todos los niveles. Montamos guerras interiores sin ninguna estrategia y sin disciplina en nuestro ejército, elegimos gobiernos revolucionarios con buenas intenciones pero sin capacidad ejecutiva o legislativa, participamos en el activismo que quiere resolver aquellas cosas que más nos parece importante resolver, y lo único que se resuelve es un sentido de identidad y pertenencia, el problema permanece sin resolverse.
Y mientras me encontraba sentado en este temazcal frío entendí que esa actitud pasiva es lo que quería dejar morir, que era momento de impregnarse del principio activo del universo, y que ese renacimiento no llegaría sin mi propia participación activa en el proceso, y salí del temazcal para asistir en su realización. Entre los tres que estábamos afuera lo logramos calentar, y fue entonces que el proceso de renacimiento se completó con la participación activa sobre mi mismo.
!!! I Ching: 乾 (qián)
䷀ El principio creativo
Lo creativo conlleva el éxito sublime, incrementando a través de la perseverancia.
Cuando alguien obtiene este oráculo, significa que el éxito sublime vendrá a él a través de la profundidad del universo, y que todo lo que le viene lo obtendrá de una sola forma: a través de la perseverancia en lo correcto.
El carácter chino para //sublime// significa literalmente //cabeza//, //origen// o //grandioso//. Por esto, Confucio explica: "Grande es el poder generador de lo Creativo; todos los seres deben su existencia a ello. Este poder permea todo el cielo". El principio de todas las cosas subyace en el mundo platónico-ideal, reteniendo su potencial para convertirse en realidad. Lo Creativo tiene el poder de dar forma a estos arquetipos de las ideas.
Esto se indica en la palabra éxito, el cual se representa con una imagen de la naturaleza "Las nubes pasan y la lluvia cae. Las plantas entonces fluyen a su propia forma". Esto aplica al entorno humano cuando el Gran Hombre encuentra el camino del éxito sublime: "Porque observa con gran claridad las causas y los efectos, completa el sexto paso en el momento indicado, como si caminara sobre seis dragones". Los seis pasos son las seis lineas del hexagrama, representados en el símbolo del dragon. Es evidente que el camino del éxito yace en comprender y dar vida al camino del universo (Tao).
El Tao, siendo la madre del principio y el fin, dan nacimiento al tiempo, y por lo tanto cada paso del hexagrama es una preparación para el paso siguiente. El tiempo ya no es un impedimento, sino una forma de materializar aquello que todavía es potencia. El acto de creación, habiendo encontrado su expresión en los atributos de la subliminalidad y el éxito, se muestra como un acto continuo de diferenciación.
"El acto de lo Creativo altera y da forma a las cosas hasta llegar a su naturaleza verdadera, y lo mantienen en conformidad con la Gran Armonía". El el ámbito humano, esto muestra cómo el Gran Hombre trae paz y seguridad al mundo a través de su actividad ordenadora.
Tiene mucho que no escribo para mi mismo. El amor hace un torbellino de impresiones que son imposibles de registrar en público. Supongo que podría sentarme y describir los pensamientos que pasan por mi cabeza, las sensaciones del cuerpo, las emociones del corazón, pero no habré registrado nada más que un estado interno turbulento. Estoy esperando a que el viento deje de soplar tan fuerte, a que los mares se calmen, a que el polvo se asiente para poder seguir escribiendo como lo hacía antes.
Ayer saliendo de yoga le pregunté a una compañera alemana si le gustaba Goethe. Se encogió de hombros. Me reí, sabía que para ella la pregunta sería como si me preguntaran si me gusta Cervantes, es algo que aprendes en la escuela y ya está. La razón por la que le pregunté por el genio de Weimar fue porque él volaría como un cometa en estos vientos, uno sin embargo, intenta mantenerse estático como una piedra azotada por el mar.
¿De qué tenemos miedo cuando nos enamoramos? De que nos estrellemos fuerte por haber volado tan alto. De perder la autonomía e independencia que uno lleva tanto tiempo cultivando. Y entonces uno baila torpemente porque no se quiere entregar a la melodía del amor, y cuando uno escribe así también se tropieza sobre sus propias palabras, porque el corazón quiere escribir y la mente regular lo que las manos están tecleando.
Aquel que sólo entrega la mitad menos sensible de su corazón al amor, cosecha frutos amargos que le confirman que el amor no merece la pena. Aquel que lo entrega todo no cosecha frutos, sino que se vuelve fruto él mismo, para ser consumido por la vida para multiplicar la vida sobre esta tierra.
Supongo que si me saliera de mi mismo y lo viera todo desde fuera, me susurraría al oído: no seas cobarde, entrégate todo, y además me lo diría con una sonrisa traviesa. Cuando el mar tira muy fuerte hacia adentro es porque se está formando una ola muy grande. El consejo interior está en desacuerdo si esta es una ola que hay que evadir porque saldría revolcado, o si es una ola que puedo agarrar para deslizarme con ella.
No es una conclusión a la que llegaré escribiendo, esto es un paisaje interior que voy describiendo de un momento específico en el que observo mi miedo al confrontarme a cosas a las que no me enfrentado en años. Vamos a nadar.
Estoy trabajando con poca concentración, y he visto abierto blank page y pensé "mejor procrastinar escribiendo que leyendo cualquier porquería en internet", y como que hoy tengo ya calmado el corazón como para registrar otras experiencias distintas al amor. He leído lo que he escrito en mis últimas entradas. Todo tiene que ver con M. Es hora de registrar otro tipo de cosas. ¿Qué cosa es más importante que una mujer? La misión que uno tiene en la vida.
En el aspecto masculino interior existe una especie de propósito de vida, un //regalo que uno viene a dar al mundo//, el espíritu lo percibe, y si uno se mantiene alejado de esta misión vital pierde su vitalidad y su fuerza espiritual, se vuelve nihilista, cínico y seco. A veces, para percibir si voy por el camino indicado, respiro, y si mi respiración se percibe húmeda sé que el camino el correcto. No sé de dónde viene la humedad, o porqué se percibe así, y sospecho que cada persona experimenta el fenómeno de andar-sobre-el-camino-indicado de formas distintas.
Los Sufís tienen un concepto llamado //baraka//, que es la fuerza espiritual que tienen los santos y los profetas, que fluje desde Dios hasta sus emisarios, y los emisarios tienen la capacidad de dotársela a la gente //normal//, a través de su presencia. Al Cid Campeador los musulmanes le atribuían //baraka//, su sóla presencia en el campo de batalla hacía que todos pelearan mejor y con más fé.
En la antigüedad sólo el faraón iba al cielo, luego el cículo de la salvación después de la muerte se amplió a los nobles, y así sucesivamente hasta que Jesús democratizó la entrada al paraíso. De la misma manera, la //baraka// ya no pertenece a un héroe, a un santo o a un profeta, todos tenemos baraka, pero no tenemos fé en que estamos sobre esta tierra para dar un regalo al mundo. Vivimos nuestra vida de una forma increíblemente cobarde, malgastando nuestra vida en nuestra zona de confort, sometidos a rutinas absurdas, trabajando para personas ruines, adormecidos con drogas o pastillas, sin meditar sobre nuestra vida o nuestra muerte.
La única forma de escapar de este calabozo es teniendo fé que somos especiales, que vinimos al mundo a entregar ese regalo, que nadie creerá en nosotros si no creemos en nosotros mismos. ¿Cuál es el regalo que yo vengo a entregar al mundo? No puedo articularlo aún, pero sé cual es la dirección indicada. Par poder entregar ese regalo, el primer paso es hacer tiempo y espacio para ejecutarlo. Terminar los compromisos hechos. Tener fé. No perder más el tiempo. Mirar dentro.
¡Que enorme es el alma! ¡Que bríos tiene el espíritu! Y aún así la mente está estable y el corazón contento. Todo saldrá bien.
Me encuentro en un estado un tanto extraño, como cuando tienes sueño, pero sin la sensación de somnolencia. ¿Qué pasa cuando tenemos sueño? A mi al menos, me aparecen //fantasías// o quizás también podría llamarles //proto-sueños// en los que pareciera que estuviera apenas sintonizando un mundo distinto que no se puede percibir muy bien. Intento sintonizar, pero cuando el intento implica un esfuerzo y al hacer esfuerzo las fantasías desaparecen. Para hacer que emerja la fantasía, es necesario relajar, no contraer.
Pero ya que tengo la atención a mi disposición, voy a llevarla dentro del cuerpo. Mis hombros están encogidos. Uy que mala postura. Ya estoy erguido, con los pies plantados en la tierra. Me relajo y voy despertándome. Últimamente he estado escuchando mucho acerca del //despertar//, el cual no es mismo despertar que yo estoy intentando.
¿A dónde despertamos? Al mundo material. Pasamos del mundo onírico al material. Pero hay—por lo menos—un tercer mundo, el mundo interior que tiene dos caras: la del cuerpo y la de la psique. Pero el mundo onírico pertenece a la psique. Como es dentro es fuera, y si yo contengo esta dualidad, el mundo exterior lo posee también. El cuerpo del mundo es su expresión material, la psique del mundo son los contratos sociales que hacemos entre cada uno.
Si algunas personas envejecen para convertirse en vino, y otras envejecen para convertirse en vinagre, se debe asumir lo mismo de nuestra civilización. ¿Se puede hablar de una única civilización? ¿Somos una conglomeración de civilizaciones? Pareciera ser que la respuesta es "ya no", aunque esto sucedió recientemente. Nos hemos convertido en una sola civilización porque... no es necesario explicarlo.
Siendo una única civilización, ¿nos encontramos en la dirección de convertirnos en vino o en vinagre? Es demasiado temprano para decirlo. Pero la gente se está volviendo consciente a un ritmo acelerado. La sociedad parece un gran organismo y yo una célula. Qué tipo de célula sería? Por intuición me percibo una neurona, pero no podría ser de otra forma, mi acción en el mundo se da a través de la expresión psíquica, no la material.
Cierro los ojos, y estoy tecleando sin mirar el teclado. Busca el refuji, hay que detener la música... es posible teclear mientras uno medita? Siento el aire frío en mi nariz. Cómo se persigue la quietud? Repiro profundo. No, no lo sé hacer aún, pero quizás si soy persistente en esta tarea, la tarea de registrar lo que sucede mientras medito, quizás pueda registrarlo. Seguiré trabajando en ello.
Esta mañana desperté con una energía prácticamente desconocida para mí, la acumulación de energía sexual cultivada durante aproximadamente un mes, luego multiplicada por la retención en el acto sexual y me siento tan diferente que mis deseos de escribir acerca de ello superan mi pudor.
Hay una práctica espiritual promovida por A. H. Almaas llamada "The Diamond Approach", me viene a la mente porque siento energía sutil circular por todo mi cuerpo, especialmente en los dedos de las manos. Almaas dice que hay que cultivar esta sensación en las manos particularmente (no recuerdo la razón), pero cuando lo intenté hacer sin este estado energético me pareció aburrido, pero hoy siento que me salen chispas de los dedos de las manos.
Parece ser una fuerza creativa que se podría mal-encauzarse fácilmente. Hay una sensación de ambición o agresión con la que no estoy muy familizado. A veces he pensado: si una nación o grupo hiciera la guerra contra "los míos", ¿participaría en una guerra violenta? y mi respuesta siempre ha sido "no", pero me observo en este estado y aunque la respuesta sigue siendo no, el escenario se antoja casi tentador. Es como un deseo de expresar la energía acumulada en violencia, pero para justificar la violencia tendría que colocarlo en una "causa justa".
Esta parece ser la sombra del Yang. La justificación para la guerra que se ha repetido a lo largo de la historia de la humanidad, que pertenece a un estado menos desarrollado del ser humano.
¿Cómo se puede encauzar esta energía para propósitos más sublimes? Eso se descubre con la práctica. No me conozco en este estado, lo que se revela como un deseo de "defender a mi gente" es simplemente la expresión más primitiva de la energía masculina, y se revela de esta forma porque soy un principiante en esto. Habrá que hacer una batalla de otro tipo, quizás como la del Quijote contra los molinos de viento, absurda desde la realidad objetiva, pero sublime en la realidad subjetiva.
Voy a comenzar a escribir los writing prompts de philosopher.life.
> What is your interpretation of one of your recent dreams?
Este es el sueño:
> I woke up and walked from my room towards the hallway. The rock-tilled hallway floor was upturned, and as I approached the kitchen, I saw that mom was using the rocks to tile the kitchen floor. "What are you doing!" I exclaimed, somewhat rhetorically. Mom answered that the tiles of the kitchen floor were worn out, and that she used the rocks from the hallway to re-do it. I got incensed and exclaimed that it was the stupidest thing ever, the rocks would be impossible to clean, and I was immensely frustrated.
En mi vida personal percibo a mi madre como alguien que me desea todo el bien del mundo, pero también es el tipo de persona que—intentando hacer cosas con buena intención—termina perjudicando. Un ejemplo que ilustra eso es un día que mi hermana salió de la casa para ir a la universidad sin haber desayunado. Mi madre se quedó tan preocupada que decidió hacerle un lunch e ir a la universidad para que no se quedara en ayunas.
Como no sabía dónde estaba, se puso en el patio central a gritar a todo pulmón "Maaaargaret". Mi hermana estaba en clase, y lo escuchó. Salió al balcón y le dijo aviso que ahí estaba. Mi madre entonces le gritó "te traje un lunch porque te fuiste sin desayunar" y mi hermana murió de vergüenza.
Mis hermanos y yo tenemos innumerables anécdotas del tipo, que siguen sucediendo hoy en día. Mi madre a veces me dice que me va a venir a ayudar a limpiar mi casa, pero entonces invita a la vecina a comer y se comienza a complicar la cosa y termino haciendo mucho más trabajo del hogar de lo que si no hubiera venido.
Cuando esto sucede, percibo pensamientos de resentimiento porque son ecos de toda una vida lidiando con este tipo de situaciones. En los sueños también suceden ecos de estados afectivos, entonces la interpretación de este sueño lo entiendo como algo pendiente de trabajar y de perdonar, porque el resentimiento es un veneno que uno lleva dentro, y la tarea es purificarse de él.
---
19 de abril 2021
Releo este sueño y me parece que mi madre no es mi madre, sino //mi// madre. Bajo este esquema, estoy representando una parte ineficiente pero creativa de mi mismo, y luego la estoy suprimiendo violentamente. Esta interpretación me parece más veraz.
Hace tanto tiempo que no escribo... Y no siento ninguna culpa. Siempre he tenido como política personal no escribir en público cuando el amor se atraviesa en mi vida. Pero ninguna agitación puede perdurar tanto, y por fin siento mi mar interior calmarse a tal punto que me es posible notar los anhelos que habían quedado obstruidos por tal agitación.
Nina está debajo mío, moviendo la cola, queriendo que la acaricie. Bajé la mano para acariciarla, y no deja de rogarme mimos. Me gusta hacerlo, me da placer, pero también es una interrupción de lo que estoy escribiendo. Pareciera haber un paralelo que esclarezco intuitivamente.
Uno viene a dar un regalo al mundo. Uno también recibe regalos del mundo. El trabajar exclusivamente en dar tu regalo al mundo te hará ciego a los regalos que te da el mundo, y esos regalos—a pesar que parecen no tener nada que ver—ayudan a uno a dar ese regalo al mundo, a cumplir ese propósito para el cual estamos aquí.
Hay una diferencia entre el significado de la vida y el propósito de tu vida. El significado de la vida es un acertijo con dos caras opuestas que forman un todo. Cuando uno logra el silencio interior se percibe una vivacidad inherente, el significado de la vida no se piensa, se siente y está ahí en esas pulsaciones sutiles donde se conecta el cuerpo y el alma. Tanto las partes como las relaciones entre ellas (podríamos llamarles conexiones) forman parte de este significado. Es lo mismo que observamos cuando entramos en comunión con la naturaleza, o tenemos una experiencia estética: dejamos de pensar en el significado de la vida y experimentamos el //significado de la vida//.
La otra cara es más racional que espiritual, y es la conclusión que la vida no tiene significado. Esto nos libera para //elegir lo que queremos que signifique//, y nos hace co-creadores de nuestra realidad. La gestalt de todos los símbolos que aparecen en nuestra vida pintan una narrativa en la cual tejemos el significado de la vida de acuerdo a nuestras circunstancias. Nada nos viene dado, sino que tenemos que construirlo.
Ya he escrito acerca del significado, luego tenemos el tema del propósito de nuestra vida. A diferencia del significado, el propósito va cambiando a lo largo de nuestras vidas. Uno podría decir que hay un propósito de propósitos, una visión que abarca todas las pequeñas intenciones que tenemos en la vida. Creo que aún no descubro el propósito de propósitos de mi vida, aunque me llega una posibilidad: la eliminación de mi separación del mundo. Definitivamente nací y crecí con un sentido de individualidad y separación del resto de los seres humanos de forma pronunciada. Observo que el propósito de mi vida lo tengo mucho menos claro que el significado de mi vida, pero ese es el propósito de escribir, esclarecerme las ideas.
Para esclarecer ideas de este tipo conviene pensar en términos mitológicos. Estoy seguro que yo soy un explorador. La primera mitad de mi vida la he dedicado a explorar la separación. Ahora, creo que toca explorar la re-integración. Perder mi individualidad. Llegar a la personalidad genérica, como dice Jodorowsky. Si tardé 40 años en llegar a la persona auténtica e individualizada que soy hoy, tardaré otros 40 en llegar a ser una persona genérica y embedida en su entorno natural y social. La manera en la que esto se conecta con la exploración—es una exploración vital. Ya he aprendido todo lo que hay que aprender de mi mismo. Es hora de aprender a través de los demás. Hay que desmantelar todo lo construido en los últimos 40 años. Hay que dejar de pensar y escribir acerca de mi mismo, y esto no sucederá de la noche a la mañana, pero habría que despertar pudiendo articular ambos el propósito de mi vida completa, y el propósito de mi vida en este momento.
Trazando un círculo al inicio de mi razonamiento, quizás es el amor lo que me inclina a escribir de esta forma, el hecho de que haya una figura femenina en mi vida me permite practicar mi parte masculina, la parte que proyecta y pone propósitos. Quiero despertar cada día y saber cual es el propósito del día, de la semana, del año, de la década, y de la vida. Creo que, por el momento, tengo los extremos bien claros: el propósito de mi vida es explorar y compartir lo explorado. El propósito del día es cumplir con mis obligaciones laborales.
A comenzar la jornada.
Estoy escribiendo esto desde la cama. Tengo resistencia a trabajar. Quizás deba meditar. ¿Cómo se medita en este contexto, con un ordenador frente a mi? Sería inspeccionar la fuente de mi resistencia. Hice unas cuantas respiraciones haciendo introspección en el estado interno, y lo que veo es una serie de tareas pequeñas que tengo que hacer para arrancar, que en su conjunto parece una maraña complicada, pero que en realidad no lo es. Es cosa de comenzar. Lo primero, quizás, sea arrancar el servidor local.
Listo, no fue tan difícil. Pero, mientras lo hacía, recordé que tengo algunos correos sin responder que requieren de mi atención inmediata. ¿Debo quitármelos de encima antes de comenzar a trabajar? Si eso libera parte de mi atención, pues será una tarea que me ayude a realizar la tarea más importante, así pues, atenderé a aquello pequeño para quitármelo de encima.
Contesté el correo que requería atención inmediata. Luego me puse a ver esos correos que llegan a la bandeja de social y actualizaciones y etc. Normalmente en estas bandejas llega pura basura, pero estoy suscrito a un par de newsletters que traen buenas cosas que me pillan en mal momento, y luego nunca regreso a ellas. Hace poco me llegó un newsletter con unos tres videos o podcasts que realmente quería ver, y cuando llegó el momento de ponerme algo para entretenerme mientras cocinaba, recordé ese newsletter y disfruté mucho hacerlo.
Ahora, lo que he hecho es ponerme en la aplicación de notas una sección de cosas que quiero ver mientras hago una actividad que requiera poca concentración, así puedo guardar esas cosas que me pillan en mal momento. Espero que—como muchos de mis sistemas—no caiga en el olvido, y el momento en el que quiera ponerme algo para entretenerme tenga una buena lista de opciones. Me veo tentado a reflexionar más acerca de la inmediatez de la información que recibimos, pero sé que este no es el momento de hacerlo. Curioso, acabo de darme cuenta que necesito dos sistemas: uno para saber qué escribir, otro para saber qué consumir. Como de costumbre, lo que tenía que ser una forma de quitarme cosas de encima para llevar a cabo una tarea, se ha convertido en otra especie de tarea, pero así es como opero y me acepto como soy. Peor es procrastinar, leyendo información irrelevante, evadiendo la tarea principal. Listo, ahora tengo dos listas: "to consume" y "to produce", de tal forma que pueda canalizar mejor mi inspiración y mi consumo.
Ahora, ya que estoy dentro de mi correo, me gustaría finiquitarlo y quizás consultarlo sólo hasta el final del día.
Hay una tarea que me daría un perezón tremendo hacer ahora, está bien dejarlo para después, pero estoy seguro que lo evadiré. Haré una tercera lista: "to do". La tarea involucra presentar dos amigos queridos, y la razón por la que me da pereza es que este tipo de cosas son al mismo tiempo demasiado importantes y demasiado triviales. De nuevo, resistencia a hacer lo que uno tiene que hacer.
Ahora contesté a alguien que me preguntaba por un problema que tiene con Method Draw. ¡Qué difícil es mantener un proyecto open source! es como tener un hijo que requiere atención constante, que te da ciertas satisfacciones, pero también requiere mucha atención. La diferencia es que un proyecto no tiene esa facultad de ser inherentemente o genéticamente gratificante, sino que es una fuga de energía que no se ve recompensada. Para cambiar esto, si alguien tiene un problema específico con mi software, lo que hago es "cobrarle por adelantado", hago un estimado de cuánto tiempo me llevará arreglar o modificar lo que necesita. En este caso en específico, una persona de Italia me escribe que embedió mi software en un iframe, pero con este método no puede descargar nada por un cambio de Chrome en la forma en la que trata las descargas dentro de un iframe. Es un //edge case//, porque este no es el caso de uso primario, pero como sea, está hecho. Avancemos.
Me llamaron por teléfono desde la caseta de policía del fraccionamiento donde vivo, porque habían pedido un taxi. No lo sabía, pero mi madre lo había pedido. Salí de mi habitación, porque si ha pedido un taxi es porque querría llevarse muchas cosas a casa de mi hermana. Le he ayudado a subir del taxi, y luego he traído el ordenador al comedor para ponerme a trabajar erguido. A seguir la tarea de quitarme los pequeños pendientes...
El correo está terminado. Tengo una hambre medio vaga, como que no necesito comer en este momento, pero son las 12:30 y quizás no sea mal momento para comer, pues si me llegara a concentrar, en una hora tendría que interrumpir mi trabajo para comer. Hmmm voy a dedicar la próxima hora a hacer pequeños pendientes y a comer. Es la cosa más curiosa cómo hay que preparar el terreno para concentrarse, hace falta reclamarle al mundo un espacio mediante el trabajo mediante más trabajo.
Estoy escribiendo como escribía hace unos tres años, cuando intentaba encontrar la mejor forma de trabajar. Me gusta mucho escribir y trabajar, y tras el huracán que sucede en mi vida interior cuando el amor se presenta en mi vida hay una calma bendita. El amor se ha consolidado en algo de suficiente estabilidad como para volver a mis actividades cotidianas con un sentimiento de plenitud.
Me puse el video que había guardado para ver luego, pero sólo vi 37 minutos de la hora y media que dura. Siento que mucho de lo que consumo me entra por una oreja y me sale por otra, en parte porque consumo tanta información al día que no me doy tiempo a procesarla, y por otra parte porque tampoco me doy el tiempo de reflexionar en mis propios términos lo que estoy percibiendo.
En este caso estuve viendo un video de Roman Krznaric acerca de "long term thinking", ¿cómo se podría traducir? la mejor traducción no-literal sería "proyección de largo plazo", y mientras lo escuchaba me preguntaba: ¿de verdad me es útil estar escuchando esto, cuando mi vida inmediata no está resuelta? pero también estoy notando cómo este tipo de conocimiento me está resultando más atractivo de lo que me resultaban mis constantes introspecciones anteriormente. De cierta forma ya me siento //resuelto//, pero al mismo tiempo con el hábito de sólo pensar en mi mismo. Dicen que los hijos te sacan de este tipo de pensamiento, el enamoramiento sin duda también lo hace, pero este fenómeno es temporal... percibo que estoy enredando varias cosas y necesito hacer una pausa para poder desenredarlo.
Krznaric tiene un libro llamado "The Good Ancestor"—Esto es, //el buen ancestro//, y me llevó a pensar en mi padre, y no puedo sino aceptar que ha sido un buen ancestro a pesar de todas las protestas que percibo de mi niño interior, y al trazar la flecha que lanzaron mis padres cuando he nacido, y que con el amor este deseo biológico de reproducción se hace presente y me lleva a pensar en la flecha que yo lanzaré, cambia radicalmente la forma de pensar y el deseo de acomodar tu propia vida para hacer espacio para formar una familia.
Krznaric propone un ejercicio para ilustrar la importancia de proyectar al futuro distante, dice: imagina un niño al que quieras mucho, nacido o por nacer. Imagina su cara. Ahora, imagínalo viejo, y le ponen en brazos a un recién nacido. Es su bisnieto. Ahora imagina su contexto: sus relaciones sociales, su entorno, sus amistades, su sociedad. De cierta forma, nosotros somos responsables no sólo de nuestra descendencia, sino del //entorno de nuestra descendencia//, y por lo tanto no podemos solamente //cuidar de los nuestros// porque //los nuestros// se encuentran inmersos en //el futuro// y por lo tanto tenemos que cuidar //del futuro//.
Luego ilustra el ejemplo con el proceso de toma de decisiones de los nativo americanos: cuando el consejo de ancianos se reúne para tomar una decisión importante, piensan en el impacto para la //séptima generación//, y me pareció un concepto enormemente provocador, pues bajo esta perspectiva mucho de lo que estamos haciendo ahora no lo haríamos, cambiaría nuestra forma de habitar el mundo de una forma radical.
La última vez que escribí, escribí acerca del propósito del día, de la semana, de la vida. Pero me caga la palabra //propósito//, el tener esta visión de //tener objetivos// es una //estrechez de consciencia// en la cual perdemos amplitud para que sucedan cosas espontáneas. Krznaric mencionó otra palabra que me gusta más //telos//. La vida tiene un //telos//, la humanidad tiene un telos, las personas tienen un telos. Más que un propósito es una dirección, y podemos ganar foco y clairdad al mismo tiempo que ganamos perspectiva y amplitud de visión.
El águila tiene una visión especial en la que el centro de su visión actúa como una especie de telescopio, pero al mismo tiempo su ojo permite una visión periférica. A fin de poder cazar a sus presas, necesita estar consciente tanto del bosque como del árbol, tener una percepción tanto holística como atomística, entender el detalle así como la relación entre sus partes. Para conectar este //insight// con mi persona es necesario conectarlo a nivel mitológico: Cuauhtémoc significa //aguila que cae//, y escribir esto me ayuda a conectar los aspectos paradójicos de la existencia donde necesito una consciencia tanto amplia como estrecha.
En mi forma de pensar, todas las dualidades han de ser trascendidas en la búsqueda de la unión y la integración. Se pueden habitar temporalmente para comprenderlas mejor, pues no hay integración sin entendimiento, y el //proyectar a largo plazo// no está peleado con el //proyectar a corto plazo// ni en //habitar el presente//.
Me entró un poco de sueño, voy a dormir un rato y vuelvo a trabajar en lo que me propuse en la mañana, ahora sí.
Son las 15:17, así que dormí cerca de una hora con veinte minutos. Soñé que estaba viendo junto con mi madre una especie de ataque de un tigre contra un chico vestido de spiderman. El tigre agarraba al spiderman de las piernas y comenzaba a arrastrarlo. En una ocasión el spiderman vio su cabeza dentro de las fauces del tigre, pero logró escaparse. Este estrago se repitió varias veces, sin que hubiera una conclusión a la escena.
Hace unas semanas, un chico me escribió reportando unos bugs de Method Draw, es muy buen //bug reporter// porque los bugs que reporta no son //cosas que necesita de Method Draw como producto// sino cosas que necesita para usar Method Draw en la escuela, entonces me ayuda a encontrar bugs en el funcionamiento normal de la aplicación. Me reportó un par de cosas que me gustaría atajar antes de comenzar la customización para mi cliente, ya que uno se soporta en lo otro. Todavía tengo sueño, antes de comenzar tengo que sacar el café del microondas.
Saqué el café y corregí lo que me reportaron. Hay una mala sensación cuando le reportan problemas a uno que no existían antes, y que corrige con una especie de parche. Hubo un cambio dentro del codebase que hizo que algo más se rompiera, pero no sé qué es lo que cambié como para que provocara este cambio. Puedo omitir este error fácilmente, pero no saber qué lo provocó causa un desconcierto, a sabiendas que estoy controlando un efecto no-deseado sin saber qué causó el efecto. Si fuese doctor, estaría tratando el síntoma y no la causa, pero esto es lo que hacen todos los doctores. No vale la pena ahondar en esto.
Cuando programo uso la misma canción el //loop//, desde hace varios años. Yo pensé que estaba loco por hacer esto, pero luego, en uno de mis newsletters que mencioné anteriormente, alguien decía que usaba una canción de cantos monásticos para lograr el mismo efecto al escribir, y que cuando escucha esa canción siente un impulso a escribir. Yo percibo lo mismo con esta canción, que es solamente un demo que encargaron a un músico que ni conozco ni me gusta el resto de su música (DJ Sasha) de Ableton Push https://www.youtube.com/watch?v=5obV0TAADhE. Como el performance me dejaba hipnotizado, usé una aplicación para descargar audio de YouTube y lo tengo en mi iTunes desde entonces. Parece bueno tener canciones que uno escucha repetitivamente de forma local, pues ahora que "rentamos" nuestras colecciones a Spotify o a otras plataformas, pues perdemos la capacidad de concentrarnos si no estamos online, o si no pagamos por el servicio.
Por eso sólo debería checar el correo una vez al día, el correo urgente que respondí en la mañana ahora tuvo un follow-up que no pude resistirme a hacer de rápido para evadir la tarea importante. A pesar de hacer muchas otras cosas, estoy cansado de evadir lo realmente importante. A partir de mañana comenzaré por lo importante y dejaré el resto para el final, pero al mismo tiempo necesito permanecer fiel a mis convicciones. quizás es momento de hacer otro virtuegraph. Me he propuesto dos tareas, quizás tres si incluyo mi //telos// global...
# Keystones: nombrar mi telos diario, semanal, anual, vital
# Comenzar el día por lo importante: Fujikohsan
# Listas: To-do, To-consume, To-create
# Ejercicio y rehabilitación
# Disminución de azúcar
Pero habrá que comenzar esto mañana. Voy a reservar mi hora en el gimnasio... Claro, el gimnasio está cerrado hoy por la pandemia. Miré un diagnóstico que tenía pendiente de mi hombro lastimado, tengo unos diez días con dolor pero no he dejado de ir a yoga, porque considero que el ejercicio que hago en yoga no es lo suficientemente intenso como para lastimarlo más, pero parece que no he permitido que mi hombro se recupere.
He procrastinado tanto que me he cansado de ello, ese era mi objetivo desde el principio. 2303 palabras escritas, las cuatro y media de la tarde, y nada de lo que tenía que hacer está hecho (aunque sí mucho de lo que no tenía que estar hecho). Es hora de confrontar lo inevitable.
Y cuando escribí esto vi que Nina se me quedaba viendo, le hablé y no sé qué señas vio en mi lenguaje corporal que pensó que le iba a dar un paseo. Cuando esto sucede, comienza a brincotear de un lado a otro, y no tuve el corazón para negarle la vuelta.
Conforme caminaba por el fraccionamiento, pensaba: ¿cómo es que si hice la determinación de ponerme a trabajar en lo importante, aún lo evado? y llegué a la conclusión que no necesito obligarme a trabajar, sino a comenzar a trabajar para entender qué es lo que me disgusta de ello, entonces, haré una división en este largo proceso de pensamiento, y veré qué es lo que evita que trabaje.
***
Arranqué el proyecto, y ya andaba cazando la causa del problema cuando sonó el teléfono: Gaby. Se le había terminado el gas y quería freir dos bisteces, ahora. Le dije que me esperara hasta las 8pm, que es cuando estimo que termine mi primer sprint de trabajo, pero la interrupción me llevó a dispersarme y contesté otro correo. El patrón que veo es que no sé corregir lo que quiero corregir, y por lo tanto fluyo por el lado fácil. Inclusive este acto de escribir tanto es un acto de pérdida de atención de cierta forma, aunque la atención vuelve sobre el tema mismo, de tal forma que estoy consciente de estar perdiendo el tiempo, en lugar de terminar el día y pensar "cómo carajos se me fue el día sin hacer nada?" ahora sé en qué he perdido el tiempo. Si reprimo mi procrastinación, la sombra se vuelve más oscura, el acto de aceptarme me permite observarme en este estado. Volvamos a la tarea.
Una pausa luego de una hora de trabajo. ¡Qué reparador es el trabajo concentrado! Una maravilla, ¿cómo es que cuesta tanto entrar en este estado? Podría escribir un millón de poemas a la fluidez, al estado de la unión con lo divino, al olvido de uno mismo cuando el //telos// está aunado a la actividad. Lograr esto me hace constantemente feliz, ¿cómo es que titubeo tanto ante la entrada del paraíso? Cantar de los cantares, la tarea—por muy banal que sea—cuando uno sabe que tiene que hacerla, hay que hacerla con amor, como si lo hiciéramos para nuestra amada. Me pierdo en lo que hago, y no lo hago para mi ni para nadie, el universo pide de mi participación en el mundo dar forma a esto. ¡Maravilla de maravillas! No hay sanación más grande que perderse en la actividad, y no hay mentira más falsa que pretender estar perdido en la actividad cuando en realidad uno piensa en si mismo. La creación, por muy banal que sea, es un reflejo de la creación del universo mismo, sumergidos en la actividad somos la sal de esta tierra, escapamos de nuestra jaula, rompemos nuestras cadenas, nos liberamos de nosotros mismos, danzamos al son de la creación. Me zambulliré nuevamente.
Terminé lo que tenía que hacer para el día, me tomó hora y media de trabajo concentrado, y muchas horas de procrastinación. Yo no entiendo lo que sucede cuando trabajo, es como si me diera miedo disfrutar. Además, mi cliente había escrito:
> Hello. Sakura(cherry blossoms) has begun to bloom in Tokyo and people started to feel the spring is just around the corner. Maybe the cherry blossoms will be in full bloom by the middle of next week. The cherry blossoms are very beautiful when they are in full bloom, but they are also very beautiful when they are scattered. It is called Sakura Fubuki. Fubuki means snowstorm. Because it looks similar. I don't think there are any cherry blossoms in Mexico because of the climate, but I will send you a picture of the cherry blossoms in full bloom next week. Please look forward to it.
A lo que yo contesté:
> How wonderful to hear about the Sakura blossoms in Japan. I haven't seen a single cherry tree in Mexico, but once while walking the camino in Spain precisely at this time of the year, someone told me "the valley over those hills is called "Valle del Jerte" and is full of cherry trees that blossom at this time of the year, and it is entirely white". The hills looked small so I decided to hike over them to see the valley, but when I climbed up I saw that the height was an illusion, I had to climb more and more. Finally I ascended some 1,200m and got to see the valley in full white, but by now it was too late to go back, so I descended into the valley to find a hotel or a place to sleep, but it happens that at this time of the year everything is booked precisely because the blossoming is a beautiful event that attracts a lot of tourists. Finally, late at night, I knocked at the door of a church where they lent me a bed and the next day I climbed back over the hills to continue walking, it was a wonderful adventure. Please do send pictures of the cherry blossoming.
Que maravilla es el mundo.
***
Hice de cenar, hice los bisteces de Gaby y se los llevé. Estoy cansado. Es hora de terminar el día de trabajo. Fue muy interesante escribir el proceso.
Llego a sentarme a escribir unos 30 minutos después de haber despertado, pero la sensación es que aún no he despertado completamente. Hace mucho que no depierto con esta sensación... me vino a la mente trozos de un sueño... intentaré describir imágenes...
Trabajaba para una empresa y nos enviaban a un viaje. Eran todos programadores. En la maleta traía un mejurge de arginina con otra sustancia, la cual se coagulaba en trozos de grasa. Creo que el mejurge era para mejorar mi desempeño sexual y mi capacidad física. Me tomaba el mejurge, pero dejaba los trozos de grasa.
Una mujer muy inteligente y muy guapa hablaba conmigo, pero también era muy pretenciosa. Se las daba de muy selectiva, pero yo sabía que era una cualquiera. Sostenía su conversación de forma satisfactoria y me daba a entender que se liaría conmigo porque los dos éramos inteligentes. La desprecié.
Diana me buscaba y coqueteaba conmigo. Me acerqué a darle un beso y me rechazó. Me encogí de hombros y me fui a otro lado. Me metió en un salón de clases y me sedujo ahí adentro. "Tonto"—me dijo, "no nos deben ver". Nos dimos un fajecito.
---
Nina se acerca para que la acaricie, seguramente quiere pasear. Quizás es momento de retomar mi ritual de pasearla en la mañana, así pienso en mis pendientes. Tengo que mirar lo que me propuse ayer para meditarlo.
# Nombrar mi telos diario, semanal, anual, vital
# Comenzar el día por lo importante: Fujikohsan
# Listas: To-do, To-consume, To-create
# Ejercicio y rehabilitación
# Disminución de azúcar
He vuelto. Sí sirve, lo voy a incorporar a mi virtuelist—esto no es un virtuegraph todavía.
# Nombrar mi telos diario, semanal, anual, vital
# Pasear a nina
# Comenzar el día de trabajo por lo importante
# Hacer, consumir, crear
# Cuidado del cuerpo
# Expansión de capacidades
Voy a comenzar por describir cada una de estas tareas a mi mismo, a fin de afianzar mis propios procesos.
!! Nombrar mi telos
Ahora comencé por escribir el día, pero me di cuenta que hay que hacerlo al revés: el telos de la vida determina el telos diario, de tal forma que uno entiende las razones de las pequeñas acciones diarias. Por lo tanto, tengo que determinar el telos de la vida. El telos parece ser //ponerse al servicio de la vida//, pero en mi estado egocéntrico algo parece protestar, como que esto no es motivación suficiente para actuar. Además, es algo acuñado por Charles Eisenstein, no es propio, pero quizás sirva como //placeholder// de algo que descubriré en el futuro. Tampoco es //telos// no es dirección. Hmmm... lo pensaré en el baño.
!!! Telos vital
La unión, la [[2021 01 26 Conflictos en las dualidades interiores|trascendencia de toda dualidad]]. Llevar el mito de la separación a su curso.
!!! Telos anual
La prosperidad. La exteriorización del trabajo interior.
!!! Telos semanal
La preparación del viaje. El completar mis proyectos profesionales.
!!! Telos diario
Aplicar a repl.it. Resolver textPath en Illustrator.
!! Pasear a nina
Parece raro poner "pasear a Nina" aquí, pero el propósito es comenzar el día despertando con la luz directa del sol, pensar en mi telos, y por supuesto darle un gusto a un ser tan querido para mi. Hoy experimenté los beneficios.
!! Comenzar el día de trabajo por lo importante
Hoy hay dos tareas principales, quizás haya que comenzar por la grande (repl.it) porque lo otro sólo será visible al final del día.
# Hacer, consumir, crear
Ya me puse estas tareas, que van por encima de mi //telos//.
!! Cuidado del cuerpo
Hoy voy al gimnasio, tengo que sentir mi hombro
!! Expansión de capacidades
No voy a consumir azucar.
---
Iba a comenzar a armar mi CV y perdí media hora en una estúpida cuenta de Twitter llamada "cosas de mamadores", https://twitter.com/EsDeMamador/status/1243276576159961088 pero no podía dejar de mirar... las cosas que hace el ego. Curiosamente sentí simpatía por las dos personas mencionadas en el thread que leí, //la mamá de wolverine// contra //el candidato preferido//. Si los conociera en persona, me causarían una curiosidad inconmesurable, asumiría que lo que me dicen es verdad, y estaría indagando con honestidad. Seguramente, a través de mis preguntas, llegaría a la conclusión de que están inflando sus capacidades, o de cierta forma es un deseo proyectado, su propio //telos// realizado.
Esto parece estar relacionado con la elaboración de mi CV, siento una aversión terrible a describir mis capacidades, si //el candidato preferido// y //la mamá de wolverine//
---
Llamó mi tío que venía a comer con su familia. Los recibí, invité a Mar, y ya no trabajé más. Fui al gimnasio y de regreso me encontré al chavo que vende flores de palma y a veces le compro un porrito. Le compré uno. Pude charlar y empatizar con Óscar muy bien luego de esto. Fuimos a ver a Gaby para ver si necesitaba algo del Oxxo, le dio mucho gusto. Aún después de todo este tiempo hay cosas que no puedo hacer ni ver si no estoy fumado, el peligro está en pensar que esta es la forma correcta de ver las cosas. Fue interesante observarlo.
Hoy en Puebla hubo un calorón que me recordó a Madrid. Uno sale al jardín y se pregunta cómo soportan las plantas este sol. No sólo es que el sol quema, el aire mismo se ha calentado y por lo tanto uno no encuentra alivio en la sombra.
Afortunadamente mi casa es muy fresca, lo cual es un alivio en los meses de verano, pero un castigo en los meses de invierno. Ahora mismo son casi las ocho de la noche y aquí estoy; sin playera, escribiendo lo que me viene a la mente.
Hoy sentí deseos de escribir otra vez, luego de mucho tiempo. Cuando he escrito en los últimos días, ha sido para organizarme, para poner en orden mis tareas, que siente que luego se me acumulan, pero hoy he sentido deseos de simplemente sentarme a escribir sin un propósito.
Leí un thread en Twitter donde James Clear, de //atomic habits// hacía un //pregúntame lo que quieras// y le preguntaban de dónde encontraba inspiración para escribir tanto. Dijo que su inspiración la encontraba de //leer//, y pensé //quizás no siento inclinaciones para escribir porque no he leído nada//, pero luego reflexioné un poco más, y me di cuenta que en realidad siento impulsos de escribir cuando tengo experiencias vitales novedosas que no sean demasiado íntimas.
No es que no sienta deseos por describir experiencias íntimas (las cuales a menudo no son sexuales, sino experiencias emocionales de carácter privado) sino que siento que no hago justicia a la experiencia al ponerla por escrito. Pero quizás debería trabajar más en esto, encontrar mi voz poética para expresar mejor lo que experimenta o añora el corazón.
Hoy, por ejemplo, me eché una siesta, y soñé que Mar me contaba de forma indiferente que había ganado un premio de arte interactivo, el premio "Rufino Tamayo". Yo la veía incrédulo, ¿cómo podía ser tan indiferente? así que me levanté y le di un abrazo para felicitarla. Pero dentro de mi sentí envidia—quizás pude haber sido yo el que partipara y se llevara el premio. "Bueno, saqué tercer lugar", me dijo. "¿Tercer lugar? Bueno, eso está muy bien", y sentí alivio, la abracé con más fuerza y me dio mucho gusto por ella, porque en el fondo sentía que el primer lugar hubiera sido mío si hubiera participado, y así la envidia había desaparecido.
¡Qué cosas tan insensatas sueña uno! Ya escrito, me veo obligado a explicar su significado: los personajes con los que uno sueña no representan a sus referentes. No existe competencia creativa entre mi novia y yo, pero hay una parte de mi que desea expresarse y usa al personaje de Mar ("mi Mar") para transmitir una historia del subconsciente.
Tengo una actitud bastante imparcial respecto a las cosas buenas y malas que pasan en mi vida. No sabemos si las cosas suceden para bien o para mal, lo que hoy fue un beneficio mañana puede ser un perjuicio. El hombre que hoy se rompe una pierna puede evadir participar en la guerra el día de mañana. Observado desde fuera parece una indiferencia ante la vida, un letargo del cual otra parte más emocional de mí parece querer despertar, y esa es la parte emocional, cuya parte oscura se revela como envidia.
Hay dos dualidades: la de los personajes de la historia, que además están invertidos en sus roles de género (el hombre es demasiado emocional mientras que la mujer es indiferente), y la de las emociones del hombre, que son alegría y envidia. El sueño se manifiesta como un nudo, el cual a veces se deshace en el sueño mismo, pero la mayor parte de las veces nos deja una tarea por resolver.
Mediante la imaginación, volvemos al sueño y hacemos que los personajes tengan un diálogo. Sabiendo que estos son facetas interiores de mi mismo, sólo pondré un M para la parte masculina y una F para la parte femenina.
"""
F. "Hoy me dieron la noticia de que gané un premio de arte interactivo".
M. "¿En serio? ¡Muchas felicidades! Déjame darte un abrazo"
M. "Te siento indiferente al premio y a mi abrazo también, ¿qué pasa?"
F. "Creo que tus felicitaciones no son sinceras. Creo que tienes envidia"
M. "Sí, algo hay de eso. Creo que si hubiese participado, yo podría haber ganado ese premio".
F. "¿Estás seguro que hubieras participado de haberte enterado?"
M. "Estoy seguro de que //no// hubiese participado".
F. "¿Entonces cómo es que sientes envidia?".
M. "Creo que mi envidia no tiene tanto que ver con el premio, tiene que ver con la capacidad de //crear//".
F. "¿Estás seguro que no te importa el reconocimiento?"
M. "Honestamente, creo que sí me importa. Asumiendo que tú eres yo, entiendo que mi capacidad de creación está enteramente puesta en mi parte femenina, pero a mi parte femenina no le podría importar menos el reconocimiento. Creo que yo, mi parte masculina, está de cierta forma castrada a la creación, porque ha sido doloroso descubirme no ser el mejor, y por lo tanto sólo puedo crear desde el desapego.
F. "Esto que llamas //castración// sólo ha sido una rama podrida que ha caído. ¿Es posible que haya un retoño?
M. "Mi vida parece girar sobre una espiral, esta es la tercera vuelta de la misma historia, pero no estoy viviendo la misma historia, lo veo todo desde un punto de vista más elevado. Creo que sé qué es lo que me está pasando.
F. "¿Recuerdas el sueño del dragón que giraba alrededor de la montaña?"
M. "Sí, ¿es este el momento?"
F. "No soy yo quien responde a esa pregunta"
M. "Entiendo, déjame proponerte algo: felicítame por haberme ganado el primer premio".
F. "Mi amor, eres el mejor, felicidades".
M. "No fue nada".
F. "Siempre tan modesto, anda, vamos a celebrar".
"""
Lo que está desacomodado dentro de mi son mis propias energías. Recurro a mis energías femeninas para hacer cosas masculinas, y a las energías masculinas para hacer cosas femeninas. Cuando era muy pequeño, tendría unos cuatro años, soñé que entraba a una especie de gran máquina, y cuando salí del otro lado, salí convertido en mujer. Ahora que conozco un poco mejor mi psique sé que esto representa la capacidad de operar bajo el yin y el yang, y que hay inversiones temprales, costumbres y estrategias que uso de cada polo para confrontarme a la vida. Así como comencé por este camino-del-pensamiento, me doy cuenta de que esto es una bendición o una maldición, dependiendo de cómo lo use. Para convertirlo en bendición, tengo que actuar desde mi parte masculina cuando el mundo exija esto de mí, y viceversa por supuesto, y que quizás he reprimido mi parte masculina principalmente porque esto fue lo que me llevó a la más miserable de las estaciones de mi vida.
Hoy decido reivindicar esta parte de mi.
Son las siete y media de la mañana. Tengo la espalda baja rígida, porque ayer levanté peso muerto. Fueron 45 kilos de cada lado, más la barra... 110 kilos. Levantar peso muerto es de los ejercicios más completos pero también más devastadores. Bien hechos, es poco probable que uno se lastime, el ego es el que lleva al cuerpo a intentar levantar más de lo que puede, y este parece ser mi límite.
Anoche me fui a la cama escuchando un podcast de mitos. Hablaba de sueños, de una tribu en el amazonas en donde—al despertar—la tribu relata los sueños que tuvo por medio del canto. El sueño se considera de relevancia colectiva. Cada uno de nosotros está conectado a la fuente, y al dormir, nos acercamos a la fuente. Viéndolo así, no es mas que lógico que los sueños tengan relevancia para el que no lo sueña. También dijo algo que me había resonado con algo que había dicho mi psicóloga hace muchos años: todo lo que no se dice se actúa. La variante de este señor era: todo lo que no se confronta interiormente, se actúa en la sociedad. El psicópata, el narcisista, el abusador es alguien que no se ha confrontado interiormente, y tiene toda la lógica del mundo. No creo que haya alguien quien—observándose con cuidado a través de la meditación y la introspección—pueda seguir haciendo daño a los demás a través de su inconsciencia. La tarea de observarse y conocerse a uno mismo debe ser constante.
> Anoche soñé que estaba en una especie de reunión de unas cincuenta personas. Hacíamos una fila larga en un bucle, como si fuera una liga, y charlábamos con la persona de enfrente hasta que pasaba cierto tiempo y la fila se recorría para poder así hablar con todo el mundo. Unas cinco personas más adelante estaba Ana María Garza, la abuela de René—la abuela sabia en arquetipo y en la vida real, y me tocaría hablar pronto con ella.
> Justo cuando estaba por suceder esa interacción se interrumpió la dinámica para un descanso, y yo—por alguna razón—salí escabulliéndome aliviado de no tener que hablar con ella. Afuera del salón había alguien fumando, le pedí un cigarro pero me lo negó amablemente, diciendo que había un puesto en donde venían cigarros sueltos ahí cerca.
> Fui al puesto para el comprar el cigarro, y cuando saqué el dinero estaba todo mugroso, el chico que me negó el cigarro apareció junto a mi y le pagué el cigarro que no me dio (en el momento me pareció que tenía sentido), encendí mi cigarro y se acercó a mí el ligue con el que me había enrollado en este taller.
> "Veme a buscar al café Mocambo" me dijo, "quiero verte una última vez antes de que te vayas a Oaxaca a ver a tu novia". Me dio algo de pereza ir, pues ni estaba tan guapa pero mi ego se pavoneaba del hecho de poseer dos mujeres. Le dije que eso haría, que la alcanzaría ahí.
> Salí del taller a tomar el autobús. Llegué a mi casa y me encontré a Óscar en la caseta. Le dije que viniera a cenar a la casa. Llegué a casa y me acosté en la cama "mierda!" pensé, "dejé plantada a mi ligue en el café Mocambo. Bueno, vale madres, al fin que estaba fea, que nunca más sepa de mi y listo". Luego tocaba Óscar a la puerta y me daba pereza cenar con él.
Lo que considero aparece aquí es la //sombra del animus//, la sombra de la parte masculina. Los defectos que se observan son:
# La evasión del contacto con la sabiduría profunda
# El ceder a la adicción
# El uso de dinero //sucio//, y el mal uso de él.
# El vivir una doble vida con mi pareja
# El olvidar mi propia palabra
# El resolver mis problemas personales despareciendo
# El hastío de ayudar a los demás
Aunque en el sueño aparecen muy exaltados, puedo decir que he sentido estas cosas recientemente en mi vida. Al igual que ayer, parece necesario hacer uso de la imaginación para reescribir el sueño.
> Anoche soñé que estaba en una especie de reunión de unas cincuenta personas. Hacíamos una fila larga en un bucle, como si fuera una liga, y charlábamos con la persona de enfrente hasta que pasaba cierto tiempo y la fila se recorría para poder así hablar con todo el mundo. Unas cinco personas más adelante estaba Ana María Garza, la abuela de René—la abuela sabia en arquetipo y en la vida real, y me tocaría hablar pronto con ella.
> Justo cuando estaba por suceder esa interacción se interrumpió la dinámica para un descanso, y yo—por alguna razón—deseando hablar con ella, la saludé efusivamente le propuse charlar afuera durante el receso. Hablábamos de la segunda versión de espiral, la cual iba muy bien, pero me distraía alguien que estaba fumando, tenía muchas ganas de fumar y quería pedirle un cigarro.
> "Ana María", le decía "siente que he aprendido a relacionarme con mis adicciones de una forma mucho más saludable que antes. Al hacerme indiferente al "recaer" ya no hay una narrativa de que "he fallado" y por lo tanto no tengo episodios de completo abandono y completa abstinencia, sino que me fumo un cigarrito por aquí, un porrito por allá, y así voy satisfaciendo mis pasiones sin identificarme como usuario o no-usuario de tal sustancia. Lo que me pregunto es: ¿hay otro estadío más sano que este en relación a la adicción?"
> "Mark, es muy admirable que hayas podido elevarte más allá de la polarización en la adicción. Has sintetizado los polos y ahora eres capaz de ver la abstinencia total y el abandono total y encontraste el camino medio, que en realidad es el camino de la síntesis. Pero dentro de esta síntesis hay una nueva polarización: ¿cuál es?"
> "Creo que lo que percibo es un potencial no-realizado, como una facilidad para ser seducido por los placeres de la vida. Si esto fuera una polarización, sería entre ceder al placer o retenerme para cosechar mejores frutos en el futuro."
> "Parece que lo que buscas es incrementar tu soberanía. No necesitas de ninguna sustancia para permanecer en tu centro. ¿Es así?"
> "Me parece muy correcto"
> "Bien, pues el proceso de incrementar tu soberanía es como el segundo capítulo del proceso de la independencia de las adicciones. No se hace de un día para otro, se logra diciendo "no voy a pedir un cigarro hoy porque prefiero ejercer mi soberanía. No soy dependiente de eso para estar contento y relajado. Puedes respirar profundamente para reconectar con el refugio interior en donde uno está resguardado de todo. Es una declaración de soberanía y libertad".
> Le di un gran abrazo a Ana María y me despedí. Recorrí los puestos, más para perder el tiempo que para comprar algo, cuando se me acercó la chica con la que había ligado. "Veme a buscar al café Mocambo" me dijo, "quiero verte una última vez antes de que te vayas a Oaxaca a ver a tu novia".
> "Tengo algo que decirte: no sé muy bien cómo es que llegamos a involucrarnos, no es algo que haga normalmente. Mi compromiso más grande es con la verdad y la integridad, y esto me va a ser muy difícil de explicar. Si nos hemos involucrado, y no sé ni cómo, es porque ha pasado mientras estaba dormido, ahora que he despertado me es imposible verte nuevamente. Es mejor que nos despidamos aquí y ahora."
> Así lo hicimos, y tomé el autobús de regreso a casa. En la caseta me encontré a Óscar, que me acompañó a cenar a casa. Le conté lo que había pasado en el taller, y él me contó lo último en su vida.
Segundo sueño reescrito. Parece ser periodo relevante.
Son las seis y media de la mañana, me desayauné un gran cuenco de avena con semillas, porque el huevo se me ha terminado. Aunque está hecho, no he tomado café aún, pues sospecho que el gran cuenco hará que me de sueño y vuelva a la cama. Si tomo café, no podré aprovechar bien el sueño.
Hoy fue el tercer día consecutivo con sueño temático. El subconsciente se comunica claramente conmigo, lo cual no había hecho hace años, indicando una dirección clara: cómo habitar la masculinidad. El sueño fue el siguiente:
> Estaba de vacaciones con Mar y conocíamos a unas personas. Yo establecía buen //rapport// con un chico y charlábamos entusiasmadamente. De reojo, veía a Mar que estaba cansada, pero pensé "ya me dirá cuándo se quiere ir".
> Pasaba un día entero y yo seguía en la fiesta, cuando una chica se me acercaba y me decía que mi novia se había ido a dormir enojadísima la noche anterior, que quizás debía ir a ver qué había pasado. Hice un gesto de "qué importa" y seguí hablando hasta que llegó Mar, con cara de no haber dormido.
> Me reclamó que no tuve ninguna consideración con su cansancio, que me estuvo esperando hasta que pudo, que no pudo dormir bien porque no había llegado a dormir, y que si iba a andar por libre pues tal vez era mejor terminar y andar ambos por libre. Me enojé y estuve a punto de decirle "sí, tienes razón, que cada quien haga lo que le de la gana" pero entendí que esta era la trampa de mi propia psicología, que tenía que llevarla a un lugar privado y estar presente con ella en su deshago emocional.
Me está ganando el sueño después de comer ese gran bowl de avena, será necesario dormir, y observar si se presentan más sueños.
No se presentaron más sueños.
Pero el sueño acaba de tener una resonancia con la vida real. Salí a pasear a Nina y me encontré a Óscar, que llevaba unos documentos en la mano. Se los quería dejar al esposo de una señora que le ayuda, pero el esposo comenzó a hacer preguntas: "¿qué documentos son? ¿a nombre de quién están?" lo cual lo irritó y comenzó a insultarlo diciéndole pendejo y se fue haciendo un berrinche. Le pregunté qué había pasado, "me molesta que me hagan preguntas, ¿cómo que qué documentos son? ¡Pues mis recibos obviamente! ¿cómo que de quién son? ¡pues míos tarado!"—"El no tenía manera de saber Óscar"—"Pues qué le importa, son para Brenda", y me di cuenta que estaba intentando razonar con alguien que estaba en un estado alterado de consciencia, la ira, y que no iba a poder persuadirlo de que no había razón para enojarse ni un poquito.
Intenté mantenerme presente con él, sin darle la razón ni contrariarlo. Luego de un rato llegó a calmarse y me dijo "Sólo tú y el Johnny me tranquilizan", y la tormenta pasó sin más.
Si yo fuese el objeto de su ira seguramente no tendría tanta paciencia, pero es así como hay que entender muchas circunstancias, las personas no se enfadan con //nosotros// vienen enfadadas buscando una razón para justificar su enojo. Uno a menudo lo experimenta como niño cuando un padre sobre-reacciona a una cosa menor, o cuando explotamos contra el burócrata porque llegamos de malas a hacer un trámite. El momento de la ira es cuando salen mil flechas y estar presente es dejar que las flechas lo atraviesen a uno, pero no encuentran carne. El Tao Te Ching lo dice:
> Aquel que sabe vivir puede viajar por la tierra
> Sin temor al rinoceronte o al tigre.
> Puesto que no será herido en batalla.
> Porque en él, el rinoceronte no encontrará lugar para lanzar su cuerno,
> El tigre no encontrará lugar para usar sus garras,
> Las armas sin lugar para lastimar.
> ¿A qué se debe esto?
> En el sabio no hay lugar para que entre la muerte.
¿Cómo poner en orden mis ideas, si no es escribiendo? Podría hablarme a mi mismo, y lo he hecho grabándome, pero creo que me sale un poco mejor con el teclado. Prefiero escribir que hablar, no sé muy bien porqué, siento que canalizo mejor lo que pienso a través de usar mis manos, porque no se me dio el don del habla.
No me gusta hablar en público, sin embargo no puedo dejar de escribir rastros de mi vida que supongo, cuando sea más grande, sabré catalogar y organizar de forma comprensiva, mi única obligación en este momento es capturar el momento presente.
Esto ha sido repetido hasta el cansancio, pero la división cartesiana entre cuerpo y mente vale la pena repasar: son uno mismo. Descartes murío por descuidarse una pneumonía. Ser cartesiano es estar separado del mundo. Se requiere un nuevo paradigma que resuelva numerosas dualidades dentro de uno mismo, al darse cuenta que lo que aplica para adentro también aplica para afuera.
Hay demasiado que desempacar en estas afirmaciones, pero sigamos el curso del pensamiento: si no es cuerpo y mente, ¿qué es? el ambiente. Somos de quién nos rodeamos, y la salud de mi vecino es mi propia salud. Es dejar de definirse en términos de uno mismo. Es necesario darse cuenta que casi todo lo que uno cree nos viene dado, y que conocemos tan poco del mundo que nos reimos de la gente que cree que la tierra es plana, sin haber obtenido experiencia de este fenómeno, sino que lo hemos consumido a través de terceras personas.
Aunque leas, aunque veas cómo se hace en YouTube, aunque repitas información, no sabrás nada hasta no hacerlo y verificarlo con tus propios sentidos. ¡Pero no quiero verificar que la tierra es redonda, si tengo fé en mis autoridades! Digo, mientras me burlo de los que creen que la tierra es plana.
¿Qué es lo más fácil que podría hacer para verificarlo mediante un experimento? Uy, creo que las varitas de Eratóstenes son lo más fácil, especialmente ahora que existen los coches. Si alguna vez voy al norte, hago intención de repetir este experimento.
A veces miro al cielo y me da una pena experimentarlo como un tapiz de fondo, detrás de los astros hay ritmo, pero como buen habitante de ciudad sólo los entiendo burdamente. Estoy dentro de casa. Deberé mirar los astros, e intentar describirlos? Ya habrá tiempo, y la vida se me fue sin poder describir los astros.
Vivir la vida desde la experiencia es, sin duda, la forma correcta de percibir la realidad. Son las 10:20 y me pregunto si no fue suficiente filosofar, me llama un poco la cama, y puede que venga Óscar, supongo que podré seguir escribiendo hasta las 11pm.
¿Y si no quiero escribir? Shhhh eso no viene al caso.
Nina quiere su paseo. Se lo daré y volveré a escribir.
Busqué a Óscar en el camino. Salió quejándose de mil achaques. Nos fumaríamos el cigarrito obligado de la noche. Nina quiere pasear, le dije, porque sugirió fumarlo en su porche. Pasó un vecino, Óscar le grita "ahi le dices a Brenda que ya encontré los documentos, que no se preocupe".
—"Ah Cabrón, los documentos por los que venías furioso que te los habían robado?".
Cambió el tema a que una chica pandillera que conoce ahora se dedica a la prostitución. Le expliqué que no creería nada hasta verlo con mis propios ojos, y que ya una vez le rompieron la madre por andar contando chismes y que creí que ya había aprendido la lección.
Se metió en un personaje de viejito, actuándo y hablando de forma convincente, evadiendose por un momento. Se quejó de un dolor en su costilla. Indagué asumiendo veracidad. Cómo se lo había causado, cuando le dolía, si había empeorado. No había nada alarmante, le dije que se cuidara de no hacer grandes esfuerzos, y que mi novia se había roto la costilla también y se quejaba menos que él.
Ya es hora de irme a dormir.
It is 20:30 and Óscar has not arrived for our weekly dinner. Two weeks ago I proposed to him that instead of having dinner every week day, we'd just have one long dinner on Sunday evenings and I would buy a certain amount of groceries for him every week, on the condition that he made a promise, any promise as easy as he wanted to do, and notice if he had accomplished it.
The next Sunday, I was left waiting for him. On Monday he came very apologetic. I told him that I had expected him and that for today I would make an exception, but if he misses a Sunday dinner with me, there will not be another dinner until next Sunday. In times of work, one must respect the creative impulse, so if I am finding flow at dinner time, I do not need to interrupt work to attend to his hunger.
It is time for him to bear his own responsibility, but the truth is, his disgrace lies on the fact that he lies on the brink of normality, thus he does not receive assistance from the government, and earns his living odd jobs like sweeping the stairs.
The long list of physical and mental ailments that Óscar suffers are long to list, and he doesn't like talking about it, so we will put that aside.
Right now, I am waiting for Óscar to have dinner, and I am supposed to be mad at him because I told him: the earlier we meet, the more time we can hang out and it is getting late, but he has not arrived. Am I mad at the situation: un truth, no, I would welcome him on arrival, it is still reasonable time at 21:00.
But it is possible that he does not come today either, would that matter? I would feel it is necessary to tell his story only when he wants to tell it, and if he does not come, so be it.
Today I feel like writing for myself, but I feel my habit of journaling by handwriting has fallen into disuse, the pen now feels awkward on my hand, which I interpret this to mean that I ought to write on the keyboard. Why English? Why do I always think about this? For what matters to me most, the next sentence could be en español.
Ah, the feeling that you are not being read, it is fresh air for writing creative juices, the intellect can go wherever it pleases, how come it often arrives to pitiful places? This night I walked with Nina, and I thought: I can do something with KernType in order to rebrand it into the letterspacing game, add languages and hopefully sponsors.
Ought I write about this? Perhaps a few paragraphs to put forth my conclusions: it will be necessary to connect with foundries, to make this a labor of seeking people and companies interested in promoting their work, and to see how we could benefit from a win-win situation.
A flash of inspiration came: as individuals, stages are added for free, as companies, there would be a fee to pay. Now I know how to register clicks via Netlify Functions, and thus I could even count the number of clicks and assign a competitive price to it, instead of relying on the unsuccessful pricing model used on the Boolean Game.
I wanted to reach out to my former classmates now working at Enigma, because there seems to be a good overlap for generating mutually beneficial arrangements, in which I can offer... I browsed their website. They have nice work. Good things will come out by reaching out, but I must settle down on what I am going to pitch.
Come back to the center.
Is it time to go to sleep? It is 23:20, I feel disincentivized to continue writing, I brought business to bed. But business is life, at least on workdays. I'm liking this arrangement, it brings a lot of productivity, and I'm afraid I may like it too much for the tastes of Mar. But it is necessary to make space for creative endeavors, otherwise the self gets lost in the myriad of things that need to be accomplished every day.
Three weeks ago my gas powered water heater begun emitting flames from places it was not supposed to. I turned it off, and have been enjoying cold showers since then. Well, "enjoying". It gets progressively less painful. I usally shower with scalding water, "para pelar pollos", as we say in Mexico.
This is something I have been putting off for years. I've wanted to have consistent cold showers, but I just couldn't bring myself to turn off the water heater completely. I could only complete the challenge because I live like a hobo, I guess.
But the situation pushed me into new territory. How else was I going to discover the benefits of cold showers? Well, the only thing I can claim is that Mar warned me that I could get sick, because she shared a lot of time with kids who are sick. I think Mar is healthy, and if she gets sick, well, then we'll see if I get sick too. But now that I think about it, if I get sick I won't want to have cold showers anymore, and I will have to fix the water heater! I will worry about this when the time comes.
And so I lay in bed, conversing with myself. The mind is thinking that I no longer think about self-improvement, and I felt glad about it. The yearning leads us towards it naturally. It is the way of the Tao. I think I have written enough for tonight. Good night.
State: altered
I wish to come to understand myself when I come to think after smoking a joint. Today I told Mar that it helps me put my ideas in order, and that I see some benefits of introspection with it. This last, I did not tell her, because at the same time I with not to put an altered state in a pedestal, I have access to this through a state of relaxation, so that I can enjoy any activity I'm doing.
I would say that smoking one evening a week would be a mark of improvement. A whole project came to mind regarding regulating my own consumption and have a healthy relationship with pleasure. Because I notice I am constantly tense, I learn to relax only in the altered state, and so I have no pretension at what I am writing, I simply allow my words to flow out.
The time has come in which having a sacred sense of duty is what helps me deal with it. It is tremendously difficult for me to do things which I do not like to do, because I was never forced to do so. A strange kind of discipline arises from this, which is to... I am tired. I am rambling in my head. Let us focus the breath, and come to some kind of keyboard meditation, to exist and inhabit my being through breath first, and to allow my hands to transcribe what happens in my head.
I feel waves of relaxation throughout my frontal lobe, as if something was massaging it. There is not need to plan, all future is futile, everything is taken care of for today. The groceries are in the fridge.
I can relax.
I must close the door so that the homework for the day must be completed. I must connect the mosquito repellent, I should brush my teeth. Can this wait? Ah, the fallacy of the future, I have lost at my own game, allow us to come back into the present moment.
I am in bed, covered by a leopard print _frazada_ which was not of my choosing. This life is not of my own choosing, but I do what I can given what I have. I am free where I need to be free. I have earned my inner freedom, and my way of exercising it in the world. I have paid my dues. Do I have the courage necessary to express my freedom? I have already done it, in fact, I am doing it at this very moment. The employee dares not to make an embarrassment of his employer, and thus does not give himself permission to fully expose yourself to the world as you are: an profoundly imperfect being who is wiling to work on himself.
I doze off into fantasy, I fall asleep. How do I remain awake? It is our task to wake up indeed. To come back, to become aware of our centers and ways of being that reside within us. To examine the different bodies that compose our being and our ways of perception, because we possess inner centers that many traditions write about. It is not our task to examine the relevant literature, but to look directly at the issue within ourselves, to experiment with our ways of being to understand that our personality can reside at different places, and thus one cannot deny a sexual being... Would I dare to write what it feels to do a sexual meditation? No, this is not the time.
Let us go into the heart, where the Tao Te Ching recommends going, where Christ is found, and open it. Crack the heart open. It is painful, but kinda sweet. I taste drips down from my throat, the one taste. My innards are vibrating. They are connected with my breath, it goes down all the way down to the coil. I am awake, now I know for sure. I feel all the way down to my toes. The keyboard seem unimportant now. I could put the laptop apart and continue exploring the full sensations, because then I could put myself into a state of deeper relaxation, and go to bed knowing... It is 10pm, I am dealing with myself to put myself to sleep, to be lazy on my weekly smoke, no, in ritual, something must be made, so allow myself to come home Sunday nights and to put my worries into order.
Do I really have worries? No, because I trust my own process. When I give to life, life gives me back. If I worry about anything it is about my own lack of courage, the knowledge that I put a cage for myself is for my own containment, because... I'm falling deeper into relaxation. The place where souls meet. Can the speechless make its way through my fingers? Of course not, not when I think of "my fingers", look at the great fractal and understand you are a small repetition of it. The laws that codify the universe are rules that one must abide, to have knowledge about the universe you must have a strong commitment to the truth, because as Feynman used to say: the easiest person to lie to is yourself.
But the skeptic mindset is a poor tool for the kind of introspection we are trying to accomplish here, I cannot examine myself and judge the experience at the same time. If I describe it, I cease feeling it. I this true? Indeed, I became awake again.
It is time to truly prepare myself for bed now. Good night.
You know those days when the soul and the body both feel battered for no good reason? Half an hour ago I was wondering if I should go to the gym to shake off this sensation, I know well this brings up my mood. And if not, at least I would get a warm shower, because my water heater broke down some weeks ago and I've been having mildly cold showers, because at this latitude Wim Hoff would hoff at my weakness under the stream of water in Puebla's weather.
But I do feel it is beneficial. I always shower at 2pm, when the weather is at its warmest, 20-24ºC. It is possible, however, that it is best to shower in the evening, when the sun has heated the water all afternoon.
Right now, however, it is raining, and this is the reason why I cancelled the reservation of my gym time, as we're still on quarantine measures. So, if I cannot shake off my gloomy feelings by exercising, I shall do it as self therapy. I listened a long time to Charles Eisenstein again, and I find he articulates things I know in my heart in a wonderful way. It stirs up the same kind of sentiments in me.
I debate wether to write about it, because I am in an altered state from half a joint of mild marijuana I smoked 20 minutes ago. There was this one time on the camino when I met an Italian guy with whom I could communicate in broken Spanish, he was walking because he was an alcoholic, and he wanted to tame his apetite for alcohol. I told him with skepticism that I have never heard of an alcoholic who had tamed his inner beast. He said that it was possible.
In the next town we got beers, and then his mouth caught fire and he downed a couple of //chupitos// to extinguish his thirst. Next leg of the walk the pleasant and humble person became a boisterous singer of Pavarotti and a fake but enthusiastic admirer of nature. "Do not approach God if you are drunk", paraphrasing the Quoran, is good advice. Will anything be resolved in the altered state? If this were true, then everything would have been resolved, so no.
I've been experiencing desires to quit once again. It has creeped up on me, I confess to myself. I find myself coasting. But I look at it all with compassion. What is it that I need that pot is providing? Inspiration. But this inspiration does not carry over to the sober state.
The day before yesterday, on Tuesday, I went to see my provider. He excused himself saying that the police had confiscated his merchandising and even extorted him from some money, and even asked me to loan more money than what I had already given him on Sunday, when he asked me for money because his child was sick. There is no resentment in this, I immediately understood this was meant to be, and I turned on my back saying I would come the next day.
That night I could not sleep, it was 12:30 and I was mindlessly scrolling the internets, feeling no trace of sleepiness but also "burned out" in a way which makes it impossible to fill time with useful or meaningful tasks. We burn time as if it were nothing, filling our lives with drama that does not belong to us.
I was also making frequent trips to the fridge to quench what was a hunger arising from boredom. When I smoke I have the opposite of munchies, I forget all hunger. As I scroll the feed of endless information, which is a well curated Twitter and Hacker News, and I snack on what I got to the fridge, feeling no inclination to put myself to bed, I came into a meditative state all of the sudden, and I knew it was time to close my computer and come into the state of sleep with meditation as an intermediary.
Propped by some cushions, I sat down with my back against the wall and I inhabitated my body, and my mind found the "refuge". It was not a trivial task, it took me perhaps 45 minutes to let go of all the junk information I had put in my mind and to make the sound of my thought subside to that which is the song of eternal peace that emanates from within.
Pretty soon I got into a profound and peaceful sleep. In the morning I arose with a very clear mind, and I remember the walk I gave Nina because it was pure lightness. Should I describe the entire day? I had a nap with Marce that afternoon, before she went to the dentist, and we embraced and everything felt so intimate. It was wonderful.
But then, when she left, I could not help but go see my provider again, and this time he had a little ball of low grade marijuana, which I ask him to sell by minimum quantities so that I do not abuse it. Back I came and I made myself a joint and worked on KernType. I will not satanize this state, because sometimes I do it sober, but when I see my awkwardness at work while high, I tend to castigate myself a lot, and this is absurd. I cannot ask of myself to work while high, there is no divine connection when that happens, "do not seek God while drunk" indeed.
I write and I understand, this is why I write, to explain myself these riddles. I sometimes hope that the sober Mark can come back and read these conclusions, because I feel they are valid, but Mark seldom goes back to what he writes while he is high, not that it does not make sense, but since there is a vague recollection of what was written, what is felt is that "this is something that I have already vomited out of my being, by writing it I burn it", and so—if I need to learn the lesson because it was only learned by the high version of myself, then so be it. I will receive the lesson as many times as I need.
That was an interjection to say: put attention, the high Mark seems to abhor being high, the sober Mark seems to abhor being sober. How strange is all of this, I seem to simply want to escape from myself. But I found way out of all of this: put yourself to sleep in meditation, wake up in meditation. It is easy. It can be done as a couple.
How is it that I was unaware that the sober night and morning was so much rewarding that this hazy day? I see the paradox, if I castigate myself for doing this I will only need more "medicine", in fact, I was already eyeing the remaining joint. I am already smoking it. Something tells me this will be my last in a while. This comes not from will but by intuition. Is there an added sense of pleasure in knowing it is the last? I would say no. But I'm glad about falling into alignment. I will crave my vice, but it has all been consumed. No more cigarrettes or joints for a while, can I promise myself that, in this state?
No, I distrust myself in this state, if one ought to make deals with oneself, one should not be in an altered state, the only way in which this can be integrated is by observing the validity of the facts from experience: if I am in a more happy and relaxed state when I meditate, why should I recur to pot? To find inspiration, that is what is sometimes lacking, but that will come through meditation. It is 18:30 and I could still go to the gym at 19:30, then I would put myself to meditate. But it will be very wet. It is fine.
I know what I will do, I will clean up the house to have lunch here with Marce after the gym. To celebrate new periods it will be necessary to clean myself up in all ways.
Yesterday a women's strike took place in Mexico. It was called "a day without women", to bring awareness to the murders of women in the country. The intention is that--by removing themselves from daily life--it is possible to understand the effect of their absence. When I was asked if I supported the strike I answered: mostly yes, with some reservations. When asked what were my reservations I couldn't express myself clearly, so I set out to write an essay about it.
***
When I was in high school student in Mexico I worked selling scratch lottery tickets for the Red Cross at a nearby supermarket. I met a girl who worked there too and we started dating. She was a bit older (she lied about her age even though I couldn't care less) and had just entered university in her early twenties.
At university she met another freshwoman about her age and they quickly became best friends. She was a very pleasant, attentive and shy woman, very much into her studies, which complemented my girlfriends outgoing personality.
Some months went by, and one night the mother of her friend called and asked if she was there, because she hadn't arrived home yet and it was late in the night. My girlfriend's intuition told her something very bad had happened, and after spending a sleepless night she raised early in the morning to search for her at the city's morgue.
She described her friend to the attendant. Yes, he said, a woman with that description arrived last night. Would you like to identify her? Yes. It will not be pretty. Her face was disfigured from a blow with a hydraulic jack. I need to know if it's her, show me.
She recognized the body laying on the stretcher as her friend's.
Her friend lived far away and was left alone in the bus with the bus driver and his _chafirete_ (assistant). They raped and murdered her. The police caught them disposing of the body but they couldn't recover her handbag which had her id, so she was a Jane Doe.
Though I only experienced the funeral, it was harrowing. A terrible sadness was felt in the air, with ocasional screams: _how could you have done this to her, bastards!_. The experience of trauma is collective, and I found myself deeply affected by the event.
A week later my girlfriend told me that we should split up: a group of evil people had set a curse upon her, and all the people close to her would die. She had already lost another friend, and her intuition told her I was next.
I understood the complexity of the situation was beyond my meager experience at the time. I was in high school, with little understanding about life, and it seemed my girlfriend had gone crazy. Our relationship was already unstable as it was, and I took the easy exit. I told her that I wasn't sure but I trusted her intuition and that it was best that we parted ways and not communicate with each other, for my own safety.
I dealt with the situation as cowards do: escape from the messy situation. But you have to be a strong swimmer to drag someone out of turbulent waters. I was not that person, and her outcome in life was positive, so I do not regret it. It had to happen that way.
However, the _coward's way_ could also be called _psychological debt_ in honor of the _technical debt_ found in complex codebases. Consistently not dealing with the situation will lead to an immature life, a form that does not want to crack open from his or her comfortable shell.
But life has its way of cracking shells open.
Two years ago I had notice of a female passenger had gone missing in a Cabify (the company I worked for) in Puebla (my hometown). I didn't have to see the journey or gain any additional information: I _knew_ what had happened. The driver had raped and murdered her, as I had experienced in the past. As my emotions cooled down I decided on some sanity, and not to pass judgement until I obtained further evidence.
The next day her body was found, proving my intuitions correct. She was raped and killed by one of our drivers, in my hometown. The event struck me like a lightning which nobody else saw, leaving me curled up in a corner reeling with pain. I felt echoes of my girlfriend's psychotic break: I was tainted and carrying disgrace in my spirit. It was not _her_ who was cursed, it was _me_.
The company seemed lethargic responding to the situation. In cases like this, the company's priority is containing damage to their reputation, and the reaction is defensive rather than offensive. The attitude is not one of "how are we going to fix this?" it is "How are we going to minimize the effect of this tragedy".
But nothing could contain what came next. Certain traumatic events seems to happen at a time when society is ripe to face them. Where decades earlier the murder had gone practically unnoticed by local media, this time the murder blew up at a national level, stirring demonstrations throughout the country.
I considered heading a charge to modify the containment attitude, and even sent an email stating my intention, but again, backed in cowardice at the moment of truth: I had to admit the circumstances were beyond my capabilities, and as things cooled down I hunkered back into day-to-day work.
The price: slipping into depression, coasted for a while, received bad peer reviews, tried changing teams to see if things went better (they didn't) and finally admitted to myself and to the company that it was time to part ways in good terms.
I'm still living through the ripples of this event. Like the opening move on a billiard table, the white ball hits the rack of balls and sends off balls in all directions, the momentum of a single event cascades into a chaotic chain reaction in which the white ball is no longer moving, but other balls are in movement because of that first hit.
The mind seeks prescriptions in cases like this: what should I do so that this doesn't happen again? How do I deal with this irrational guilt? How do I protect those close to me from these threats? In the thousands of kilometers I walked after I quit my job I came to the conclusion this kind of thinking is folly. I cannot save the world, or even those close to me. Restoring life is impossible, and anything I can do about this event pales in comparison with the loss. But then again, inaction seems to be the _cowardly way_.
I understood this one day while I was riding the subway in Madrid. An attractive young lady with a generous cleavage was in the semi-crowded car, distractedly checking on instagram. I observed a man oogling at her breasts, inching closer and closer for a better look as his peeping went unnoticed. I debated what to do: the situation was ambiguous enough so that raising a scene was out of place, yet I felt that if I allowed more time to pass, the scene would happen anyway.
What happened next was not out of my own will, thinking or courage, for I was not the doer of my actions: in a moment I found myself between the lady and the man, looking at the man into the eye, sternly. The man hunkered down, turned around and left. No other passenger witnessed the event that took place, not even the lady who was still very absorbed in her social media account.
The understanding was that I did not have to be a paladin of the cause to have a positive impact in this aspect of the world. In fact, in all the guilt-wrangling and inner conflict for being part of a company that allowed a tragedy to happen had been useless. We give ourselves impossible, gargantuan tasks because we dare not to address the immediate problems. Thinking big when it's impossible to act big is also the _coward's way_, because the responsibility of action is transferred to the government and then the solution becomes "the government should do this or that".
This is the equivalent of the sports spectator, shouting at the coach to follow this or that strategy to produce a desired outcome. Wether his advice is sound or folly is irrelevant, because no amount of shouting will change the outcome. But we are not spectators of the world, we are players, and when the ball lands on our feet we must be swift and clear minded in our actions.
One must read the situation and act accordingly. Pretending the problem does not exist makes it resurface in different expressions. Blowing up the problem to proportions where one feels helpless about contributing to it leads to inaction. Rather than escaping through the excuse of immaturity or ineffectiveness, it's better to take responsibility for fellow human beings, men and women, in whatever form and scale our current circumstance allows.
> Surrender yourself humbly; then you can be trusted to care for all things.
> Love the world as your own self; then you can truly care for all things.
[Chapter 13](https://www.wussu.com/laotzu/laotzu13.html) of the Tao Te Ching
I come to write sitting in dull pain, whimpering and humiliated. [[The rope I tied to a tree|2019 12 12 Tying a rope to a tree]] came loose. It is around 8 meters high and, being on a ledge with a 3 meter drop, you accomplish considerable speed.
The reason why I come down to write about it is because I can focus on nothing else than my tailbone, but I am waiting for the pain to subside to decide if I should seek medical attention. I can walk fine but I feel an impulse to walk on my toes, as if my ass were afraid of the ground.
Pain is unpleasant, isn't it? As I was swinging, I thought "oh this is a beautiful day of spring, the birds louder than ever, courting each other, the sun is shining but the shade is right on top of me, as I'm swinging on a rope. I almost feel guilty about it". And then I grew ambitious.
Let's see how far I can get! And, standing on the concrete ledge, I bent my knees and did a vertical leap, catching the seat between my legs, surging forward. And up I went! I repeated a couple of times until I reached maximum height. But I knew I had just reached a local maxima, if I tried other methods of jumping I was likely to reach newer heights.
So, instead of jumping vertically, I tried jumping backwards, diagonally. I could put my feet on a ledge and following the pendulum motion of the rope, I would try to maximize the incoming motion so the outcoming motion would match it. And so I soared yet again new heights.
On my second try with the new technique it happened: I reached my maximum height thinking "I am the king of this new sport which has no name or followers, so I only have myself to challenge!" and as I was coming back celebrating my record, the rope slipped from my amateurish knot, and I only had time to think "I'm loose" when I landed on the concrete ledge with my lower-lowerback (right where the butt cheeks meet).
You know when people hurt themselves, and there's a period of time that they take to assess themselves, like, first of all, where am I? The pendulum's force had sent me flying, so while I landed on the ledge I skidded towards a hill of dirt where I laid motionless for some seconds or minutes, I don't know. Nina, the dog, came to check on me. I rolled over and put myself on four, and then slowly and carefully came to erect myself. Then I walked like a duck into the living room where is my office, and I wrote this account.
I have no idea how long ago that was, probably 15 minutes? The pain is much more tolerable now. It feels like when you are a kid and you land from a fall on your ass. That's it, it's most likely just a bruised tailbone.
And a bruised [[ego|Ego]] too.
> I was in a bowling alley with an adventurous friend from my childhood. We headed to the front desk, where an old man attended us. "I already have shoes" my friend said. "I'll need shoes" I said, but he handed me an unclosed ziplock bag with two small screws and a screwdriver. I considered it unthoughtful of him not to close the ziplock back because the screws might get lost. Besides, I didn't know why I would need them, but I took the bag anyways.
I was attending a wedding at a fancy restaurant in the penthouse of a tower with spectacular views. I was ill dressed for the ocassion, with jeans and a jacket, while everyone else was hipster-elegant. Valeria, who was at my table, reassured me it was fine, while she pointed out some dresses which were designer-labeled and costed hundreds of thousands of dollars. My designer friends from university were there: Marcela, Moni, Armando, Hugo, and a redhead whom I didn't know but found very attractive, but I was not confident about myself because of my shabiness.
At some point a waitress came and said that some kids from the party had rented cars and speeded off with them, and that the party could not go on without us paying them, and that they would charge us per table. I was alarmed that I couldn't pay for it, but then relieved when I saw that we could split it up easily and it would be 200 pesos per person. I was somewhat relieved by this incident, as the "fancy wedding" turned out to be shabby too, who would dare to ask their guests to pay a fine of sorts?
We lined up to pay and after my turn I went back to look for my friends, but I found the table empty, and the party looked like it was ending. I went outside the restaurant, and at a different level mezannine I saw the redhead that I liked, but I didn't know her name as to call her attention. She went out of sight and I couldn't find my way down to reach her, but I saw that directly beneath me was a child's playground and even though the drop was three or four meters, I threw a bag I was carrying and hung from the ledge, dropping myself like two extra meters to the soft ground.
Two parents who where taking care of their kids were surprised at my brashness—"Don't worry, I'm the cousin of Pedro Prieto"—I said, and they were like "Oh! That's why. No wonder you are so brave", Pedro Prieto being a tequila brand with the name of my cousin. So I ran to catch up with the redhead and asked her where my friends where.
"""
—"Oh, they already headed back home", she said
—"Where are you going?"
—"Back home too"
—"Ok... good bye then, I guess..."
—"Bye..."
"""
And then I woke up regretting not inviting her somewhere.
I was biking at night behind a chubby guy who was riding an EcoBici on a dirt road. His bike bounced in a depression on the road, and he was thrown off the bike and into a ditch to the side of the road. He got up quickly and looked back at me, obviously embarrassed at this fall.
I asked if he was OK, but he didn't respond, instead he seemed to get on his bike as quickly as possible, but in the process he tripped and while trying to recover, went head first against a wall on the other side of the road. He seemed stunned but quickly recovered and went back to his bike stumbling.
I was concerned and got off my bike to soothe him. I said "hey don't worry, calm down, let's make sure everything is OK", but he assured everything was fine. I looked at him closely and saw a gash on the side of his head, from which he was bleeding. I patted myself down to see if I had anything to cover his wound, but I didn't.
About me
About me's have always intrigued me. When I come across a thought provoking article or blog post, I wish not as much as to put a face unto who's writing as to understand where the ideas come from, and so I usually try to find out a bit more about the author. This is why I begin my blog by taking a stab towards describing myself.
Trouble is, as I have observed my own descriptions of myself on my online presence, I see myself describing a different aspect of who I am to different audiences. My Couchsurfing profile looks different from my LinkedIn profile—which is natural, of course—but I wish to consolidate my identity in a way that is honest and appealing to all audiences.
Identity, I have observed, is somewhat fluid. What I think about myself changes in accordance with my mood, and so what I think about myself changes with the seasons of the soul. As one observes this phenomena one starts identifying more with the observer who sees the seasons. But that would leave little room for describing myself, other than that I'm awareness. Describing myself in this way is throughly accurate, but would also leave the reader unsatisfied as to know where my ideas come from.
Then, I see there are certain descriptors which remain true despite the passage of time. I will list what comes to mind as to put some boundries unto the question: "who am I?". But I think of identity as fluid, so what I think of myself today will change in the future. As such, I will describe myself once per year, as to observe my own change of identity.
About me 2018
I was born in 1980. I am 37 years old. I had an early introduction to technology, so I'm wedged between Generation X and the Millenials. Though I used to deny all of this generation non-sense applied to me (or to anyone), I now see that indeed I have characteristics of both. I still resent the labelling and I find myself proactively shooting down my presumptions based on age, because I've met both wise kids and old brats.
I was born in Canada, and I grew up in Mexico. I've lived for long periods in Spain. I have a deep appreciation for all three countries, and I sometimes bow down to kiss the land where I live. Even then, I think the concept of countries is posterous, nature has different expressions which causes the patterns we observe in nationalities. The boundries which humankind paints on the land are illusory, but convenient to our current state of development.
I was trained as an Information Designer. I used to identify myself a lot with my profession, but then I had a creative block which forced myself to reevaluate my identity without my profession. Though it was tremendously challenging, it left me with invaluable lessons about life. You are not what you do, or what you think, or what you have. Once this resolves, the creative block resolves too. I design for a living, but the success of what I create is not tied to what I think about myself.
I am single, heterosexual, and I'm not in a romantic relationship. I'm happy with it at this time, and it's been a while. Though the heart yearns for romantic relationship, I think it's better to be patient and to have a meaningful relationship than to seek company out of the feeling of solitude. I expect to eventually get married and have children, but don't yearn for it, I simply know it will happen with time, with the right person.
I'm a spiritual person, though for most of my life I was an atheist. The shift is one of the challenging things I've gone through (and I'm still going through it). I still retain a strong rational approach to life, but I've learned to stop justifying my decisions through rationality. Following my intuition has yielded sweet fruit, and I see that I've always moved in this way, except that in former times I used look back and explain it from the rational standpoint. Now it seems unnecessary to look back, simply have faith that the universe will provide what is necessary to keep on the way. I identify myself with no religion, though the Tao Te Ching is the sacred book which has most proved to be according to my nature.
I am the second child of three children. I have a younger sister and an older brother. My father is an engineer, and my mother is an artist. I like to think of myself as embodying the qualities of both my parents, and thus I have both an efficient, organized and rational mindset as well as a creative, mystical and artistic mindset. Sometimes these inner patterns find themselves in conflict, and I'm still learning how to express them in harmony.
It's been a more than a year since I quit my job for a sabbatical period. This isn't my first attempt, I had tried it before but it was an unproductive disaster. So, shortly after quitting I felt a spontaneous urge to write down advice to myself based on my first experience.
I hadn't come back to it since then, but today I was unpacking a box and came across my old journals. I remembered about this list and found it. I've seemingly carried the advice unconsciously, because I've followed most of it better than if it were pinned to the wall, and one year later I can vouch for it from experience.
I'm the first one to roll my eyes when someone pretends to give advice. This is highly specific to myself, but I suspect there are people of similar circumstance and character who may find it useful. It's presented as-found, with only the lightest editing for clarity.
**LESSONS FROM LAST SABBATICAL**
# Associate with good people, seek them.
# Publish what you are doing, actions are better than thoughts.
# Waste no time in establishing a good routine.
# Keep close to nature, it is healing.
# Wage no war against yourself, it will only debilitate you.
# Making money is a priority, there is no shame in it.
# The way of isolation is a dead end.
# The inner world has been throughly explored, it is time to come out and do the same in the outer world.
# Be frugal from the very beginning.
# Pot infused ideas lack the momentum necessary to execute them.
# Home is not a good place to accomplish work. Not to say that it shouldn't be done, but that it should be complemented with a variety of settings.
# Do no attach to project outcomes, enjoy the work done. This is enough reward.
# Have a general plan, do not wander aimlessly. Be ready to throw away the plan.
# Be willing to collaborate with others.
# It is useless to ban all distractions. Instead, seek more healthy distractions.
# Do not think of yourself as a subject in a setting, consciousness is within, and your setting is reality.
# Make time count. Squandering it is no different from wasting food or money.
# Sleep as much as necessary. Not more, not less.
# Do not resort to cognitive enhancers, be it nootropics or psychedelics, these are unsustainable boosters. Train your mind instead.
# Praise yourself for your efforts, not for your intelligence or your cleverness.
# Hangovers are a sure sign of regression.
# It is better to seek sex than porn, but it is best to remain celibate and open to meaningful romantic relationships.
# Be gentle but persistent with yourself. Change is always gradual.
# Reserve your energies for the last leg of work. It is better to finish and rest than to release immediately.
# Have a healthy relationship with perfectionism. Be practical, put your efforts where perfection is most visible to others and not just to yourself.
# Be expedient in knitting the symbols that appear in your life, but to not dwell on the pattern that emerges.
# Exercise and meditate. Eat healthy. Sleep soundly. Pray.
# Do not think about yourself as superior or inferior to others. Don't think you have all the answers.
# Be grateful for what you have.
# Live life as poetry.
The word aesthetic is derived from the Greek αἰσθητικός (aisthetikos, meaning "aesthetic, sensitive, sentient, pertaining to sense perception"), which in turn was derived from αἰσθάνομαι (aisthanomai, meaning "I perceive, feel, sense" and related to αἴσθησις (aisthēsis, "sensation")
A memory from almost a year ago came to mind: I was beginning my sabbatical, and I had the opposite problem that I have now: I wasn't getting attached enough to my projects as to bring them to conception (let alone gestation and birth). The enthusiasm for my ideas would fizzle out as soon as I began working on them. So I decided I needed a break, and I head to Alicante to explore some caves.
Though I accomplished what I planned, I didn't really feel connected to my adventure. It was exhausting and it felt pointless. I was coming back home dejected, and when I arrived to the bus station in Alicante City I saw that I had lost my bus, and the next one was leaving in three hours. Unenthusiastcially, but with nothing else to do, I left my backpack in a locker and head out to explore. In the middle of the city there's a high hill with a fort called Castell de Santa Bàrbara, I approched the hill through the city streets, trying to find a way up, but everything seemed closed off.
After sorting through some narrow pedestrian corridors I came across a sun bathed patio full of flowers, and a beautiful young woman was helping a young toddler take her first steps. I asked her if this was the way up, pointing to the narrow alley up ahead.
She looked up and smiled "Well, yes, you _could_ go up that way, but I wouldn't recommend it. It's steep and a bit dangerous. But if you head back in the direction you were coming from, eventually you will find a staircase, and on the way up you will find a very nice viewpoint shaded by trees where you can rest a bit".
In an instant the heavy clouds that sorrounded me were dispelled, the beauty and the kindness of the moment unthawed my heart and I smiled for the first time in weeks. I thanked her profusely, turning around just in time so that she could not see my eyes filling with tears.
On my way up I sat down at the viewpoint she had recommended. The setting and the view were indeed beautiful. My photo makes no justice to the effect it caused upon the soul, but I was glad to find it in my library. The entire trip had become worthy just for that moment of kindness.
<img alt="IMG_3165.jpg" src="https://method.ac/writing/uploads/IMG_3165.jpg" width="100%" />
Sometimes the task seems to be above one's skill, this causes frustration.
Sometimes the task seems to be below one's skill, this causes boredom.
Sometimes the task seems to be against one's principles, this causes resistance.
Sometimes the task seems to be too dear to one's heart, this causes attachment.
Sometimes the task involves changing our nature, this causes confusion.
Sometimes the task involves violating our principles, this causes suffering.
Sometimes the task wastes work, this causes exhaustion.
Sometimes the task is making work more efficient, this causes distraction.
Emotions have no hierarchy. It is the same to be sad as it is to be happy.
Thus, the only sacred thing is the task.
The way of alignment is to complete your tasks, and your tasks only.
Without observance of benefit or loss.
Without ulterior motive or pretentious humility.
To thank whatever lesson comes in your way.
The universe provides, but we stray from the path.
The way of the sage is effortless.
It’s possible to make your own all-purpose cleaner, Ms. Fierman said: “Add half a cup of white vinegar, one pint of rubbing alcohol, one teaspoon of dish soap and enough water to make a gallon.” Then pour the mixture into an empty spray bottle.
I dreamed about a friend rolling a joint, and I was exasperated because I wanted it _right now_. Finally I had a smoke and I felt myself relax and the world begun spinning around me, all worries left behind. After a while I remembered I wasn't supposed to smoke, because this stress serves a purpose, and I became concerned about completing the project. I woke up feeling relaxed and I didn't want to get out of bed, so I enjoyed this elusive state until the urge to work became too great.
I was at the Alpha 2 pool in Puebla. I explored the grounds and it was massive, with lots of trees and nature. "I can't believe this is in the middle of the city", I thought. I found a secluded spot and sat down, but then remembered I needed to fetch something from outside the club.
Outside I encountered Javier Cañada by chance, he was excited and very enthusiastic in conversation. I, by contrast, felt dull and boring. He told me there was a wonderful place where a lady sold the best quesadillas. I told him I would try them, knowing I was lying because I could not afford them.
I went back to the club and noticed I had forgotten or lost my entrance ticket, and I became concerned that I would have to pay for my ticket again, because I left my backpack inside. I felt too tired to persuade the attendant to let me in, but I rummaged through the bag I was carrying and found the key to my locker inside the club, and knew this would be enough for the attendant to let me in.
Altered state is an externally induced state of consciousness.
The exogenous nature of this state makes the conclusions suspect.
In my case it generally means weed, unless specified otherwise.
> I was frantically finishing the game in front of the computer, finally I thought _fuck it_ and put it out on Hacker News. I began receiving bug reports, and I desperately tried to address them, but I was being distracted by mom. I looked up and I realized I was back in my hometown in Puebla, Mexico. _I can't work here, too many distractions_, I thought, so I packed up and took the bus to my former university.
>
> The bus was an ancient diesel fuming DINA (the same bus I used to get to university) and it was exasperatingly slow. At some point it broke down, and the passengers as well as the driver went out. The keys were left on the ignition, so I jumped on the driver seat and turned the key. The bus rumbled and I resumed the journey. While crossing a bridge a pedestrian stepped into the road and I swerved to avoid hitting him. I was relieved yet I knew I wouldn't have stopped if I had run over him.
>
> Finally I arrived to the campus, and I encountered some friends from that time (whom are still great friends and I haven't seen in years), and I thought _I must hang out for at least a couple of minutes, it would just be so rude after so much time_. They were on a tour through the new campus buildings and I was following along but utterly exasperated and thought the whole thing was pointless. I broke away without saying goodbye and went to the computer lab. I opened my laptop and begun working frantically... On the _about me_ page.
When we look into the animal kingdom, we don't think about animals as "working" when they graze or hunt, but we do think of bees and ants working when they nurse their larva and collect their food. It seems work happens when there is an interdependent relation to the society you live in. In a hunter-gatherer tribe, some people would hunt, others would collect fruit, others would rear children, and then they would share the resources of their activity.
Arena y Espuma
Aforismos de Kahlil Gibran
Soy ignorante de la verdad absoluta. Pero soy humilde ante mi ignorancia, y es ahí es donde yace mi honor y mi recompensa.
Una sola vez me he quedado sin palabras. Fue cuando un hombre me preguntó "¿quién eres?"
Siete veces he despreciado mi alma:<br />
La primera, cuando la vi tímida ante las alturas que podía alcanzar.<br />
La segunda, cuando la vi cojear ante los minusválidos.<br />
La tercera, cuando al escoger entre lo fácil y lo difícil, escogió lo fácil.<br />
La cuarta, cuando hizo mal y se reconfortó con que otros también hacen mal.<br />
La cuarta, cuando hizo mal y se reconfortó con que otros también hacen mal.<br />
La quinta, cuando se abstuvo por debilidad, y se atribuyó la abstinencia a su virtud.<br />
La sexta, cuando se abstuvo por debilidad, y se atribuyó la abstinencia a su fortaleza.<br />
Y la séptima, cuando cantó una canción de alabanza, y creyó que venía de su propia virtud.<br />
El primer pensamiento de Dios fue un ángel.
La primera palabra de Dios fue un hombre.
La Esfinge habló sólo una vez, dijo, "Un grano de arena es un desierto, y un desierto es un grano de arena; ahora mantengamos el silencio de nuevo". Escuché a la Esfinge, pero no entendí.
Recordar es una forma de encontrar.
Olvidar es una forma de libertad.
Nosotros medimos el tiempo de acuerdo al movimiento de incontables soles; ellos lo miden con pequeños artilugios que guardan en sus bolsillos. Ahora dime, ¿cómo es que nos vamos a encontrar en el mismo lugar, a la misma hora?
No hay distancia entre la tierra y el sol para aquel que mira desde las ventanas de la vía láctea.
La humanidad es un río de luz que fluye de la ex-eternidad a la eternidad.
En mi camino a la Ciudad Sagrada me encontré con otro peregrino, le pregunté "es este el camino a la Ciudad Sagrada? Me dijo "Sígueme, llegarmeos ahí en un día y una noche". Y lo seguí. Caminamos muchos días y muchas noches, pero no llegamos a la Ciudad Sagrada. Cual sería mi sorpresa cuando que enfadó conmigo porque me guió mal.
No se llega al amanecer sin pasar por el camino de la noche.
Mi casa me dice "no me dejes, aquí yace tu pasado". El camino me dice "Ven y sígueme, yo soy tu futuro". Le digo a ambos, "no tengo pasado ni tengo futuro. Si me quedo aquí, hay un andar en mi quedar; y si me voy, hay un quedar en mi andar. Sólo el amor y la muerte cambian las cosas".
Hay un trecho entre la imaginación y la consecución del hombre que sólo puede ser atravesada por su añoranza.
Tú eres ciego y yo soy sordo y tonto, así que toquémonos las manos y entendamos.
Cuando mi copa está vacía me resigno, pero cuando está a medio llenar me molesta que esté incompleta.
When my cup is empty I resign myself to its emptiness; but when it is half full I resent its half-fulness.
The reality of the other person is not in what he reveals to you, but in what he cannot reveal to you.
Therefore, if you would understand him, listen not to what he says but rather to what he does not say.
Half of what I say is meaningless; but I say it so that the other half may reach you.
A sense of humour is a sense of proportion.
My loneliness was born when men praised my talkative faults and blamed my silent virtues.
When Life does not find a singer to sing her heart she produces a philosopher to speak her mind.
A truth is to be known always, to be uttered sometimes.
The real in us is silent; the acquired is talkative.
The voice of life in me cannot reach the ear of life in you; but let us talk that we may not feel lonely.
When two women talk they say nothing; when one woman speaks she reveals all of life.
Frogs may bellow louder than bulls, but they cannot drag the plough in the field not turn the wheel of the winepress, and of their skins you cannot make shoes.
Only the dumb envy the talkative.
If winter should say, "Spring is in my heart," who would believe winter?
Every seed is a longing.
Should you really open your eyes and see, you would behold your image in all images.
And should you open your ears and listen, you would hear your own voice in all voices.
It takes two of us to discover truth: one to utter it and one to understand it.
Though the wave of words is forever upon us, yet our depth is forever silent.
Many a doctrine is like a window pane. We see truth through it but it divides us from truth.
Now let us play hide and seek. Should you hide in my heart it would not be difficult to find you. But should you hide behind your own shell, then it would be useless for anyone to seek you. A woman may veil her face with a smile.
How noble is the sad heart who would sing a joyous song with joyous hearts.
He who would understand a woman, or dissect genius, or solve the mystery of silence is the very man who would wake from a beautiful dream to sit at a breakfast table.
I would walk with all those who walk. I would not stand still to watch the procession passing by.
You owe more than gold to him who serves you. Give him of your heart or serve him.
Nay, we have not lived in vain. Have they not built towers of our bones?
Let us not be particular and sectional. The poet's mind and the scorpion's tail rise in glory from the same earth.
Every dragon gives birth to a St. George who slays it.
Trees are poems that the earth writes upon the sky. We fell them down and turn them into paper that we may record our emptiness.
Should you care to write (and only the saints know why you should) you must needs have knowledge and art and music -- the knowledge of the music of words, the art of being artless, and the magic of loving your readers.
They dip their pens in our hearts and think they are inspired.
Should a tree write its autobiography it would not be unlike the history of a race.
If I were to choose between the power of writing a poem and the ecstasy of a poem unwritten, I would choose the ecstasy. It is better poetry.
But you and all my neighbors agree that I always choose badly.
Poetry is not an opinion expressed. It is a song that rises from a bleeding wound or a smiling mouth.
Words are timeless. You should utter them or write them with a knowledge of their timelessness.
A POET IS a dethroned king sitting among the ashes of his palace trying to fashion an image out of the ashes.
Poetry is a deal of joy and pain and wonder, with a dash of the dictionary.
In vain shall a poet seek the mother of the songs of his heart.
Once I said to a poet, "We shall not know your worth until you die."
And he answered saying, "Yes, death is always the revealer. And if indeed you would know my worth it is that I have more in my heart than upon my tongue, and more in my desire than in my hand."
If you sing of beauty though alone in the heart of the desert you will have an audience.
Poetry is wisdom that enchants the heart.
Wisdom is poetry that sings in the mind.
If we could enchant man's heart and at the same time sing in his mind,
Then in truth he would live in the shadow of God.
Inspiration will always sing; inspiration will never explain.
We often sing lullabies to our children that we ourselves may sleep.
All our words are but crumbs that fall down from the feast of the mind.
Thinking is always the stumbling stone to poetry.
A great singer is he who sings our silences.
How can you sing if your mouth be filled with food?
How shall your hand be raised in blessing if it is filled with gold?
They say the nightingale pierces his bosom with a thorn when he sings his love song.
So do we all. How else should we sing?
Genius is but a robin's song at the beginning of a slow spring.
Even the most winged spirit cannot escape physical necessity.
A madman is not less a musician than you or myself; only the instrument on which he plays is a little out of tune.
The song that lies silent in the heart of a mother sings upon the lips of her child.
No longing remains unfulfilled.
I have never agreed with my other self wholly. The truth of the matter seems to lie between us.
Your other self is always sorry for you. But your other self grows on sorrow; so all is well.
There is no struggle of soul and body save in the minds of those whose souls are asleep and whose bodies are out of tune.
When you reach the heart of life you shall find beauty in all things, even in the eyes that are blind to beauty.
We live only to discover beauty. All else is a form of waiting.
Sow a seed and the earth will yield you a flower. Dream your dream to the sky and it will bring you your beloved.
The devil died the very day you were born.
Now you do not have to go through hell to meet an angel.
Many a woman borrows a man's heart; very few could possess it.
If you would possess you must not claim.
When a man's hand touches the hand of a woman they both touch the heart of eternity.
Love is the veil between lover and lover.
Every man loves two women; the one is the creation of his imagination, and the other is not yet born.
Men who do not forgive women their little faults will never enjoy their great virtues.
Love that does not renew itself every day becomes a habit and in turn a slavery.
Lovers embrace that which is between them rather than each other.
Love and doubt have never been on speaking terms.
Love is a word of light, written by a hand of light, upon a page of light.
Friendship is always a sweet responsibility, never an opportunity.
If you do not understand your friend under all conditions you will never understand him.
Your most radiant garment is of the other person's weaving;
You most savory meal is that which you eat at the other person's table;
Your most comfortable bed is in the other person's house.
Now tell me, how can you separate yourself from the other person?
Your mind and my heart will never agree until your mind ceases to live in numbers and my heart in the mist.
We shall never understand one another until we reduce the language to seven words.
HOW SHALL MY heart be unsealed unless it be broken?
Only great sorrow or great joy can reveal your truth.
If you would be revealed you must either dance naked in the sun, or carry your cross.
Should nature heed what we say of contentment no river would seek the sea, and no winter would turn to Spring. Should she heed all we say of thrift, how many of us would be breathing this air?
You see but your shadow when you turn your back to the sun.
You are free before the sun of the day, and free before the stars of the night;
And you are free when there is no sun and no moon and no star.
You are even free when you close your eyes upon all there is.
But you are a slave to him whom you love because you love him,
And a slave to him who loves you because he loves you.
We are all beggars at the gate of the temple, and each one of us receives his share of the bounty of the King when he enters the temple, and when he goes out.
But we are all jealous of one another, which is another way of belittling the King.
You cannot consume beyond your appetite. The other half of the loaf belongs to the other person, and there should remain a little bread for the chance guest.
If it were not for your guests all houses would be graves.
Said a gracious wolf to a simple sheep, "Will you not honor our house with a visit?"
And the sheep answered, "We would have been honored to visit your house if it were not in your stomach."
I stopped my guest on the threshold and said, "Nay, wipe not your feet as you enter, but as you go out."
Generosity is not in giving me that which I need more than you do, but it is in giving me that which you need more than I do.
You are indeed charitable when you give, and while giving, turn your face away so that you may not see the shyness of the receiver.
The difference between the richest man and the poorest is but a day of hunger and an hour of thirst.
We often borrow from our tomorrows to pay our debts to our yesterdays.
I too am visited by angels and devils, but I get rid of them.
When it is an angel I pray an old prayer, and he is bored;
When it is a devil I commit an old sin, and he passes me by.
After all this is not a bad prison; but I do not like this wall between my cell and the next prisoner's cell;
Yet I assure you that I do not wish to reproach the warder not the Builder of the prison.
Those who give you a serpent when you ask for a fish, may have nothing but serpents to give. It is then generosity on their part.
Trickery succeeds sometimes, but it always commits suicide.
You are truly a forgiver when you forgive murderers who never spill blood, thieves who never steal, and liars who utter no falsehood.
He who can put his finger upon that which divides good from evil is he who can touch the very hem of the garment of God.
If your heart is a volcano how shall you expect flowers to bloom in your hands?
A strange form of self-indulgence! There are times when I would be wronged and cheated, that I may laugh at the expense of those who think I do not know I am being wronged and cheated.
What shall I say of him who is the pursuer playing the part of the pursued?
Let him who wipes his soiled hands with your garment take your garment. He may need it again; surely you would not.
It is a pity that money-changers cannot be good gardeners.
Please do not whitewash your inherent faults with your acquired virtues. I would have the faults; they are like mine own.
How often have I attributed to myself crimes I have never committed, so that the other person may feel comfortable in my presence.
Even the masks of life are masks of deeper mystery.
You may judge others only according to your knowledge of yourself.
Tell me now, who among us is guilty and who is unguilty?
The truly just is he who feels half guilty of your misdeeds.
Only an idiot and a genius break man-made laws; and they are the nearest to the heart of God.
It is only when you are pursued that you become swift.
I have no enemies, O God, but if I am to have an enemy
Let his strength be equal to mine,
That truth alone may be the victor.
You will be quite friendly with your enemy when you both die.
Perhaps a man may commit suicide in self-defense.
Long ago there lived a Man who was crucified for being too loving and too lovable.
And strange to relate I met him thrice yesterday.
The first time He was asking a policeman not to take a prostitute to prison; the second time He was drinking wine with an outcast; and the third time He was having a fist-fight with a promoter inside a church.
If all they say of good and evil were true, then my life is but one long crime.
Pity is but half justice.
THE ONLY ONE who has been unjust to me is the one to whose brother I have been unjust.
When you see a man led to prison say in your heart, "Mayhap he is escaping from a narrower prison."
And when you see a man drunken say in your heart, "Mayhap he sought escape from something still more unbeautiful."
Oftentimes I have hated in self-defense; but if I were stronger I would not have used such a weapon.
How stupid is he who would patch the hatred in his eyes with the smile of his lips.
Only those beneath me can envy or hate me.
I have never been envied nor hated; I am above no one.
Only those above me can praise or belittle me.
I have never been praised nor belittled; I am below no one.
Your saying to me, "I do not understand you," is praise beyond my worth, and an insult you do not deserve. How mean am I when life gives me gold and I give you silver, and yet I deem myself generous.
When you reach the heart of life you will find yourself not higher than the felon, and not lower than the prophet.
Strange that you should pity the slow-footed and not the slow-minded,
And the blind-eyed rather than the blind-hearted.
It is wiser for the lame not to break his crutches upon the head of his enemy.
How blind is he who gives you out of his pocket that he may take out of your heart.
Life is a procession. The slow of foot finds it too swift and he steps out;
And the swift of foot finds it too slow and he too steps out.
If there is such a thing as sin some of us commit it backward following our forefathers' footsteps;
And some of us commit it forward by overruling our children.
The truly good is he who is one with all those who are deemed bad.
We are all prisoners but some of us are in cells with windows and some without.
Strange that we all defend our wrongs with more vigor than we do our rights.
Should we all confess our sins to one another we would all laugh at one another for our lack of originality.
Should we all reveal our virtues we would also laugh for the same cause.
An individual is above man-made laws until he commits a crime against man-made conventions; After that he is neither above anyone nor lower than anyone.
Government is an agreement between you and myself. You and myself are often wrong.
Crime is either another name of need or an aspect of a disease.
Is there a greater fault than being conscious of the other person's faults?
If the other person laughs at you, you can pity him; but if you laugh at him you may never forgive yourself.
If the other person injures you, you may forget the injury; but if you injure him you will always remember.
In truth the other person is your most sensitive self given another body.
How heedless you are when you would have men fly with your wings and you cannot even give them a feather.
Once a man sat at my board and ate my bread and drank my wine and went away laughing at me.
Then he came again for bread and wine, and I spurned him;
And the angels laughed at me.
Hate is a dead thing. Who of you would be a tomb?
It is the honor of the murdered that he is not the murderer.
The tribune of humanity is in its silent heart, never its talkative mind.
They deem me mad because I will not sell my days for gold;
And I deem them mad because they think my days have a price.
They spread before us their riches of gold and silver, of ivory and ebony, and we spread before them our hearts and our spirits.;
And yet they deem themselves the hosts and us the guests.
I would not be the least among men with dreams and the desire to fulfill them, rather than the greatest with no dreams and no desires.
The most pitiful among men is he who turns his dreams into silver and gold.
We are all climbing toward the summit of our hearts' desire. Should the other climber steal your sack and your purse and wax fat on the one and heavy on the other, you should pity him;
The climbing will be harder for his flesh, and the burden will make his way longer.
And should you in your leanness see his flesh puffing upward, help him a step; it will add to your swiftness.
You cannot judge any man beyond your knowledge of him, and how small is your knowledge.
I would not listen to a conqueror preaching to the conquered.
The truly free man is he who bears the load of the bond slave patiently.
A thousand years ago my neighbor said to me, "I hate life, for it is naught but a thing of pain."
And yesterday I passed by a cemetery and saw life dancing upon his grave.
Strife in nature is but disorder longing for order.
Solitude is a silent storm that breaks down all our dead branches;
Yet it sends our living roots deeper into the living heart of the living earth.
Once I spoke of the sea to a brook, and the brook thought me but an imaginative exaggerator;
And once I spoke of a brook to the sea, and the sea thought me but a depreciative defamer.
How narrow is the vision that exalts the busyness of the ant above the singing of the grasshopper.
The highest virtue here may be the least in another world.
The deep and the high go to the depth or to the height in a straight line; only the spacious can move in circles.
IF IT WERE not for our conception of weights and measures we would stand in awe of the firefly as we do before the sun.
A scientist without imagination is a butcher with dull knives and out-worn scales.
But what would you, since we are not all vegetarians?
When you sing the hungry hears you with his stomach.
Death is not nearer to the aged than to the new-born; neither is life.
If indeed you must be candid, be candid beautifully; otherwise keep silent, for there is a man in our neighborhood who is dying.
Mayhap a funeral among men is a wedding feast among the angels.
A forgotten reality may die and leave in its will seven thousand actualities and facts to be spent in its funeral and the building of a tomb.
In truth we talk only to ourselves, but sometimes we talk loud enough that others may hear us.
The obvious is that which is never seen until someone expresses it simply.
If the Milky Way were not within me how should I have seen it or known it?
Unless I am a physician among physicians they would not believe that I am an astronomer.
Perhaps the sea's definition of a shell is the pearl.
Perhaps time's definition of coal is the diamond.
Fame is the shadow of passion standing in the light.
A root is a flower that disdains fame.
There is neither religion nor science beyond beauty.
Every great man I have known had something small in his make-up; and it was that small something which prevented inactivity or madness or suicide.
The truly great man is he who would master no one, and who would be mastered by none.
I would not believe that a man is mediocre simply because he kills the criminals and the prophets.
Tolerance is love sick with the sickness of haughtiness.
Worms will turn; but is it not strange that even elephants will yield?
A disagreement may be the shortest cut between two minds.
I am the flame and I am the dry bush, and one part of me consumes the other part.
We are all seeking the summit of the holy moutain; but shall not our road be shorter if we consider the past a chart and not a guide?
Wisdom ceases to be wisdom when it becomes too proud to weep, too grave to laugh, and too self-ful to seek other than itself.
Had I filled myself with all that you know what room should I have for all that you do not know?
I have learned silence from the talkative, toleration from the intolerant, and kindness from the unkind; yet strange, I am ungrateful to these teachers.
A bigot is a stone-leaf orator.
The silence of the envious is too noisy.
When you reach the end of what you should know, you will be at the beginning of what you should sense.
An exaggeration is a truth that has lost its temper.
If you can see only what light reveals and hear only what sound announces,
Then in truth you do not see nor do you hear.
A fact is a truth unsexed.
You cannot laugh and be unkind at the same time.
The nearest to my heart are a king without a kingdom and a poor man who does not know how to beg.
A shy failure is nobler than an immodest success.
Dig anywhere in the earth and you will find a treasure, only you must dig with the faith of a peasant.
Said a hunted fox followed by twenty horsemen and a pack of twenty hounds, "Of course they will kill me. But how poor and how stupid they must be. Surely it would not be worth while for twenty foxes riding on twenty asses and accompanied by twenty wolves to chase and kill one man."
It is the mind in us that yields to the laws made by us, but never the spirit in us.
A traveler am I and a navigator, and every day I discover a new region within my soul.
A woman protested saying, "Of course it was a righteous war. My son fell in it."
I said to Life, "I would hear Death speak."
And Life raised her voice a little higher and said, "You hear him now."
When you have solved all the mysteries of life you long for death, for it is but another mystery of life.
Birth and death are the two noblest expressions of bravery.
My friend, you and I shall remain strangers unto life,
And unto one another, and each unto himself,
Until the day when you shall speak and I shall listen
Deeming your voice my own voice;
And when I shall stand before you
Thinking myself standing before a mirror.
They say to me, "Should you know yourself you would know all men."
And I say, "Only when I seek all men shall I know myself."
MAN IS TWO men; one is awake in darkness, the other is asleep in light.
A hermit is one who renounces the world of fragments that he may enjoy the world wholly and without interruption.
There lies a green field between the scholar and the poet; should the scholar cross it he becomes a wise man; should the poet cross it, he becomes a prophet.
Yestereve I saw philosophers in the market-place carrying their heads in baskets, and crying aloud, "Wisdom! Wisdom for sale!"
Poor philosophers! They must needs sell their heads to feed their hearts. Said a philosopher to a street sweeper, "I pity you. Yours is a hard and dirty task."
And the street sweeper said, "Thank you, sir. But tell me what is your task?"
And the philosopher answered saying, "I study man's mind, his deeds and his desires."
Then the street sweeper went on with his sweeping and said with a smile, "I pity you too."
He who listens to truth is not less than he who utters truth.
No man can draw the line between necessities and luxuries. Only the angels can do that, and the angels are wise and wistful.
Perhaps the angels are our better thought in space.
He is the true prince who finds his throne in the heart of the dervish.
Generosity is giving more than you can, and pride is taking less than you need.
In truth you owe naught to any man. You owe all to all men.
All those who have lived in the past live with us now. Surely none of us would be an ungracious host.
He who longs the most lives the longest.
They say to me, "A bird in the hand is worth ten in the bush."
But I say, "A bird and a feather in the bush is worth more than ten birds in the hand."
Your seeking after that feather is life with winged feet; nay, it is life itself.
There are only two elements here, beauty and truth; beauty in the hearts of lovers, and truth in the arms of the tillers of the soil.
Great beauty captures me, but a beauty still greater frees me even from itself.
Beauty shines brighter in the heart of him who longs for it than in the eyes of him who sees it.
I admire him who reveals his mind to me; I honor him who unveils his dreams. But why am I shy, and even a little ashamed before him who serves me?
The gifted were once proud in serving princes.
Now they claim honor in serving paupers.
The angels know that too many practical men eat their bread with the sweat of the dreamer's brow.
Wit is often a mask. If you could tear it you would find either a genius irritated or cleverness juggling.
The understanding attributes to me understanding and the dull, dullness. I think they are both right.
Only those with secrets in their hearts could divine the secrets in our hearts.
He who would share your pleasure but not your pain shall lose the key to one of the seven gates of Paradise.
Yes, there is a Nirvanah; it is in leading your sheep to a green pasture, and in putting your child to sleep, and in writing the last line of your poem.
We choose our joys and our sorrows long before we experience them.
Sadness is but a wall between two gardens.
When either your joy or your sorrow becomes great the world becomes small.
Desire is half of life; idifference is half of death.
The bitterest thing in our today's sorrow is the memory of our yesterday's joy.
They say to me, "You must needs choose between the pleasures of this world and the peace of the next world."
And I say to them, "I have chosen both the delights of this world and the peace of the next. For I know in my heart that the Supreme Poet wrote but one poem, and it scans perfectly, and it also rhymes perfectly."
Faith is an oasis in the heart which will never be reached by the caravan of thinking.
When you reach your height you shall desire but only for desire; and you shall hunger, for hunger; and you shall thirst for greater thirst.
If you reveal your secrets to the wind you should not blame the wind for revealing them to the trees.
The flowers of spring are winter's dreams related at the breakfast table of the angels.
Said a skunk to a tube-rose, "See how swiftly I run, while you cannot walk nor even creep."
Said the tube-rose to the skunk, "Oh, most noble swift runner, please run swiftly!"
Turtles can tell more about roads than hares.
Strange that creatures without backbones have the hardest shells.
The most talkative is the least intelligent, and there is hardly a difference between an orator and an auctioneer.
Be grateful that you do not have to live down the renown of a father nor the wealth of an uncle.
But above all be grateful that no one will have to live down either your renown or your wealth.
Only when a juggler misses catching his ball does he appeal to me.
The envious praises me unknowingly.
Long were you a dream in your mother's sleep, and then she woke to give you birth.
The germ of the race is in your mother's longing.
My father and mother desired a child and they begot me.
And I wanted a mother and a father and I begot night and the sea.
Some of our children are our justifications and some are but our regrets.
When night comes and you too are dark, lie down and be dark with a will.
And when morning comes and you are still dark stand up and say to the day with a will, "I am still dark."
It is stupid to play a role with the night and the day.
They would both laugh at you.
The mountain veiled in mist is not a hill; an oak tree in the rain is not a weeping willow.
Behold here is a paradox; the deep and high are nearer to one another than the mid-level to either.
When I stood a clear mirror before you, you gazed into me and saw your image.
Then you said, "I love you."
But in truth you loved yourself in me.
When you enjoy loving your neighbor it ceases to be a virtue.
Love which is not always springing is always dying.
You cannot have youth and the knowledge of it at the same time;
For youth is too busy living to know, and knowledge is too busy seeking itself to live. You may sit at your window watching the passersby. And watching you may see a nun walking toward your right hand, and a prostitute toward your left hand.
And you may say in your innocence, "How noble is the one and how ignoble is the other."
But should you close your eyes and listen awhile you would hear a voice whispering in the ether, "One seeks me in prayer, and the other in pain. And in the spirit of each there is a bower for my spirit."
Once every hundred years Jesus of Nazareth meets Jesus of the Christian in a garden among the hills of Lebanon. And they talk long; and each time Jesus of Nazareth goes away saying to Jesus of the Christian, "My friend, I fear we shall never, never agree."
May God feed the over-abundant!
A great man has two hearts; one bleeds and the other forbears.
Should one tell a lie which does not hurt you nor anyone else, why not say in your heart that the house of his facts is too small for his fancies, and he had to leave it for larger space?
Behind every closed door is a mystery sealed with seven seals.
Waiting is the hoofs of time.
What if trouble should be a new window in the Eastern wall of your house?
You may forget the one with whom you have laughed, but never the one with whom you have wept.
There must be something strangely sacred in salt. It is in our tears and in the sea.
Our God in His gracious thirst will drink us all, the dewdrop and the tear.
You are but a fragment of your giant self, a mouth that seeks bread, and a blind hand that holds the cup for a thirsty mouth.
If you would rise but a cubit above race and country and self you would indeed become godlike.
If I were you I would not find fault with the sea at low tide.
It is a good ship and our Captain is able; it is only your stomach that is in disorder.
Should you sit upon a cloud you would not see the boundary line between one country and another, nor the boundary stone between a farm and a farm.
It is a pity you cannot sit upon a cloud.
Seven centuries ago seven white doves rose from a deep valley flying to the snow-white summit of the mountain. One of the seven men who watched the flight said, "I see a black spot on the wing of the seventh dove."
Today the people in that valley tell of seven black doves who flew to the summit of the snowy mountain.
In the autumn I gathered all my sorrows and buried them in my garden.
And when April returned and spring came to wed the earth, there grew in my garden beautiful flowers unlike all other flowers.
And my neighbors came to behold them, and they all said to me, "When autumn comes again, at seeding time, will you not give us of the seeds of these flowers that we may have them in our gardens?"
It is indeed misery if I stretch an empty hand to men and receive nothing; but it is hopelessness if I stretch a full hand and find none to receive.
I long for eternity because there I shall meet my unwritten poems and my unpainted pictures.
Art is a step from nature toward the Infinite.
A work of art is a mist carved into an image.
Even the hands that make crowns of thorns are better than idle hands.
Our most sacred tears never seek our eyes.
Every man is the descendant of every king and every slave that ever lived.
If the great-grandfather of Jesus had known what was hidden within him, would he not have stood in awe of himself?
Was the love of Judas' mother of her son less than the love of Mary for Jesus?
There are three miracles of our Brother Jesus not yet recorded in the Book: the first that He was a man like you and me, the second that He had a sense of humour, and the third that He knew He was a conqueror though conquered.
Crucified One, you are crucified upon my heart; and the nails that pierce your hands pierce the walls of my heart.
And tomorrow when a stranger passes by this Golgotha he will not know that two bled here.
He will deem it the blood of one man.
You may have heard of the Blessed Mountain.
It is the highest mountain in our world.
Should you reach the summit you would have only one desire, and that to descend and be with those who dwell in the deepest valley.
That is why it is called the Blessed Mountain.
Every thought I have imprisoned in expression I must free by my deeds.
I was about the enter a narrow street with Nina on a leash. There was a police blockade up ahead, and a young man ahead of me was patted down. A police man approached me and apologized saying that this street had become very dangerous, so many security measures were being applied, yet I was let through without a patdown.
I felt somewhat offended that it was obvious I was not a dangerous person, but then a rock came flying and hit the guy who just moments ago was in front of me. Nina freed herself from the leash, I whistled at her to come back, but she was startled by the crowd of people on the street and ran into a store.
I went into the store and saw it was a really fancy art gallery and antique store, brimming with beautiful objects. Nina jumped on an employee desk with papers strewn about, and begun rolling on herself as she does on the grass. Nobody had seen her yet, so I quickly approached and carried her off the desk.
An older lady with spectacles was sitting at their own desk noticed my presence, and asked me if I needed help. I told her I was just looking, hoping that she hadn't seen the mischief of my dog. If she did, she was oblivious to it, and gave me a brief tour of the store, and in the end gifted me a postcard with some of their art.
I went out of the store, and instead of the previous chaotic and dangerous street, I found a sunny beautiful street with people calmly strolling.
<video width="100%" controls>
<source src="https://method.ac/blog-images/artistboxt.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
I was sitting in the subway. Someone sat in front of me sat down holding a hand painted wooden box.
--"How beautiful!", I exclaimed. <br />
--"Would you like to purchase it?". <br />
--"I'm afraid I'm only carrying five euros". <br />
--"Sold", he said with a smile. <br />
Impulse purchases like these are a rarity in me. It was a nice box, but what use would I give it? I looked closely at the painting: it is signed by Esther, who shares my mother's name, and is also an artist. And she also paints flowers on random objects. I knew then it was meant to store my art tools.
I thought I had inherited my father's engineering inclinations, but since having this box I've felt my mother's artistic side too. It simply represents a formerly unacknowledged artistic heritage, which was meant to be explored.
It's still an ongoing process. My intention is to eventually draw something every day with my log, but it depends on the availability of time. Meanwhile, I'm grabbing things which I have drawn before.
<img alt="IMG_4886t.jpg" src="https://method.ac/writing/uploads/IMG_4886t.jpg" class="mt-image-none" style="width: 50%" />
My birthday is today.
I have the strangest sensation,
I don't care,
and I care too much.
I'm turning 40, a decade.
When I was in my teens I thought I wanted to die at this age.
"There is no life after your thirties", thought a naive teenager.
When I reached my twenties this milestone moved to my fifties. There was no life worth living after 50.
When I reached my thirties I realized that this game would continue be played, and that it was not worth setting an expiry date on my life.
As I come into the noon of life, I realize: It is good to think that one's life is going to end in twenty years. Death's humid breath is felt on the side of the neck, and you springs into natural action, doing what is necessary at the time.
"What is life after the chase for women and success?", thought the teenager. I'm grateful to him, because he built the foundation of my professional career and gave me my first experiences of love.
"What is life after I reach my full potential?", thought the twenty something. I'm grateful to him, because he provided me with a great skillset that has accompanied me during my career.
"What is life?", this question begun in my thirties and I'm grateful to him, because he, Mark of 2014-2019 throughly explored this question. All those roads walked, all the paths taken, all that tremendous solitude that I lived in Madrid. The discovery of one's soul and one's spirit takes time. It was all worth it.
I don't know what questions I will ask to myself in my forties, but as I step into this new book I already perceive the direction: stop trying to accomplish anything. Stop trying to be good. Stop telling yourself stories about yourself. Reduce your existential footprint to make way for creative expressions of the soul.
What I realize is: There are no questions left to answer. All idle thought is a waste of life. And yet, this essay itself is idle thought. Should I be liberated, I wouldn't be writing this (at least not in this way). But the creative expression (of writing, of creating design games, of painting, of building a table, of tending for a garden) expands in such a way that no space is left for idle thought.
In psychological matters it never pays off to wage a war against any aspect of the self, and this includes idle thought. Should I try to banish idle thought, idle thought simply becomes the shadow. It is necessary to _expand_ something so that idle thought reduces its grasp on existence.
But now I'm wanting to expand something in order to contract something. This is not the way. I look inside and observe: if every stage of my life has provided what I needed at that moment, it follows that idle thought is also needed at this moment. Expending effort in inward matters is folly.
I'm twelve hours into my forties and I'm already trying to resolve the problem of the decade. Patience.
The person who pretends to be happy is the one who most often cries him or herself to sleep.
If a person needs to be an impostor amongst his or her family, it is best that they remove themselves from the situation, because this has greatly damaging effects in the long term. As this is often imposible, the stranded person must make small steps towards his or her real authenticity, no matter how small, so that the impostor’s personality does not become imprinted in one’s spirit.
Avicenna often used psychological methods to treat his patients.[7]:366 One such example is when a Persian prince had melancholia, suffering from the delusion that he is a cow he who would moo and cry out, "Kill me so that a good stew may be made of my flesh," and would never eat anything. Avicenna was persuaded to the case and sent a message to the patient, asking him to be happy as the butcher was coming to slaughter him, and the sick man rejoiced. When Avicenna approached the prince with a knife in his hand, he asked "where is the cow so I may kill it." The patient then mooed like a cow to indicate where he was. "By order of the butcher, the patient was also laid on the ground for slaughter." When Avicenna approached the patient pretending to slaughter him, he said, "the cow is too lean and not ready to be killed. He must be fed properly and I will kill it when it becomes healthy and fat." The patient was then offered food which he ate eagerly, and gradually "gained strength, got rid of his delusion, and was completely cured."[7]:376
That which give [[pleasure|Pleasure]] through the senses
Blank Page is a course platform and editor for creative writing done in collaboration with [[René Galindo]]. https://blank.page
I am not as spiritually advanced as to make public all my vices. I would rather work on them in private, and so I can only write in the most general terms the kind of tricks that they mind plays on the addicted person.
The addicted person wants to quit or stop doing X. Let us question the term "addicted". It would seem "compulsive" is a better term. The compulsive person wants to stop a behavior but finds himself unable to do so. The person may find himself victim of impulses which seem to surpass his own will, and in its most severe form it becomes subconscious, the next thing you know you are already typing reddit.com.
Let us take this as an example: let us say I block myself. What I was seeking was distraction. Before blocking myself, I must know what should I distract myself with.
Here is the secret of transcendence of vice.
The work the body does cannot be expressed in words. The body has a language of its own. I do not dialogue with my body. I try to listen, it expresses itself in very primitive an honest terms: pain and pleasure. Paradoxically, in body work the indulgence in pleasure leads to involuntary pain, and the voluntary exposure to pain leads to unexpected pleasure.
The [[Polarity|Polarities]] is present in the symmetrical body. One ought to seek balance between the left and the right. [[The Moon]] and [[The Sun|Sun shower]]
I was sleeping in my bedroom and I was awoken by some noises. I saw half a dozen or children, all siting down on the ledge outside my window. I asked them what they were doing, one of them answered that they were bored. I told him to light a fire, I had already collected the wood. He answered that they didn't want to do that, and then dispersed.
[Bougainvillea on Wikipedia](https://en.wikipedia.org/wiki/Bougainvillea)
<img alt="IMG_5407.jpg" src="https://method.ac/writing/uploads/IMG_5407.jpg" style="width: 100%" />
> I was a primitive homo species; half ape, half human. A shaman doctor offered me the possibility of transplanting my brain (and thus my consciousness) to another body, but for this I would need to kill one of my fellow apes with a blow to the head.
> I climbed a rocky hill and lifted a large rock, which I dropped on an unsuspecting ape below me. I killed him instantly, and went down to retrieve the body. As I came near the corpse I looked up, and saw another ape hurling a boulder in my direction. For a split second I understood the shaman had offered the same deal to this ape, and I would be the victim of the very same desire that I was seeking to satisfy. The blow hit me squarely in the head and I fell to the ground. I brought myself up, but soon slumped into unconsciousness.
> The next scene was an amphitheater. On the floor were two large marble blocks, each with the silhouette of an ape carved in. The shaman carried each body, mine and my killer, and placed them on the marble blocks. He incanted a ceremony and performed the surgery.
> When I woke up I was surprised to find myself alive. I had another's ape brain inside my skull, yet my consciousness was distinctly mine. I looked at myself and saw that I was wearing a suit. I no longer acted like an ape and was capable of civilized behavior.
I visited a small town in Spain with my mother. We saw a large church in the city center, something had broken in the plumbing, and water was leaking everywhere.
We then went to a restaurant, and from the window I saw that the church had caught fire. "Must have been a short circuit", I thought. I saw flames coming out of the church, and I could feel the heat through the window of the restaurant.
We went outside to see the scene. People were trying to flee from the burning church, but the gates were closed. From the top of the gates a 15 year old boy had climbed, and he jumped from a height of about 10 meters. My mother approached to see what had happened to him. He grabbed the body by the feet and declared it dead, she was going to throw it into the trash. "Wait" I said "we don't know if he's still alive", but I looked closely at the body and it looked inhuman, like a Yahoo of Jonathan Swifts Guilliver's Travels.
The next thing I remember from the dream I was trying to make my way back to Madrid with train connections, but I was unfamiliar with the area. I saw a map in my imagination, and I couldn't recognize any of the stops. I boarded a random train.
I was on a bus going from Madrid to the south of Spain. We passed through Córdoba and in a restaurant in a resting area I grabbed something to eat. The waitress served a coffee from which I took a sip, but then realized I hadn't paid for it, and when the owner came and asked where was his coffee, I apologized and said I thought it had been mine. "But you didn't even pay for it!" replied the waitress, "I know, I just thought it was mine". She rolled here eyes and berated me in front of everyone.
<<list-links "[tag[camino]]">>
<video width="50%" controls style="margin: 0 auto; display: block;">
<source src="https://method.ac/blog-images/ichingt.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
This Chinese box was a gift from a dear friend who went to China. It contains art tools for calligraphy, later I added three coins to it. Originally I hadn't found much use for it, but then I encountered its soulmate: the [I Ching](https://en.wikipedia.org/wiki/I_Ching), or the _Book of Changes_.
I found it by chance, walking towards Chapultepec park in Mexico City. At the entrance to the park, a book seller had laid it out on a blanket on the floor. "Cuánto?", "Veinte pesos jóven". Little did he know that I would have paid any price. Earlier in the day I had been reading about it, and I knew it was meant for me.
<img alt="Plate2_Fig1_Hexagrams_FuHsi.gif" src="https://method.ac/writing/uploads/Plate2_Fig1_Hexagrams_FuHsi.gif" style="width: 100%" />
I entered the park and sat under a tree and read the introduction, by Carl Jung. He spoke towards my skepticism:
> Why not venture a dialogue with an ancient book that purports to be animated? There can be no harm in it, and the reader may watch a psychological procedure that has been carried out time and again throughout the millennia of Chinese civilization, representing to a Confucius or a Lao-tse, both a supreme expression of spiritual authority and a philosophical enigma.
The question I would ask was as clear as the sky: how could I regain my creative prowess! I was blocked to the point of clinical depression. For a person whom primarily identified himself as a designer, this was the equivalent of becoming a bird without wings.
I head back home, and on the way made a stop at a shop for the occult. How strange to find myself at a store which I was sure sold useless trinkets to gullible fools! I asked if they had stalks or coins for I Ching divination. No stalks, but they had the coins. I bought them.
When I got home I went to fetch pen and paper to write down the results of my coin casting, and in my art utensils lay this largely forgotten gift. "How appropriate", I thought, "this is a good moment to make use of it". I sat down meditate my question, "how do I recover my creative capacity?", and then tossed the coins:
Frist toss: - - yin (feminine)<br>
Second toss: - - yin (feminine)<br>
Third toss: - - yin (feminine)<br>
Fourth toss: - - yin (feminine)<br>
Fifth toss: - - yin (feminine)<br>
Sixth toss: - - yin (feminine)<br>
The hexagram was ䷁ (kūn, the receptive).
**The reading**
> This hexagram is made up of broken lines only. The broken lines represents the dark, yielding, receptive primal power of yin. The attribute of the hexagram is devotion; its image is the earth. It is the perfect complement of THE CREATIVE--the complement, not the opposite, for the Receptive does not combat the Creative but completes it . It represents nature in contrast to spirit, earth in contrast to heaven, space as against time, the female-maternal as against the male-paternal. However, as applied to human affairs, the principle of this complementary relationship is found not only in the relation between man and woman, but also in that between prince and minister and between father and son. Indeed, even in the individual this duality appears in the coexistence of the spiritual world and the world of the senses. But strictly speaking there is no real dualism here, because there is a clearly defined hierarchic relationship between the two principles. In itself of course the Receptive is just as important as the Creative, but the attribute of devotion defines the place occupied by this primal power in relation to the Creative. For the Receptive must be activated and led by the Creative; then it is productive of good. Only when it abandons this position and tries to stand as an equal side by side with the Creative, does it become evil. The result then is opposition to and struggle against the Creative, which is productive of evil to both.
**The judgment**
> THE RECEPTIVE brings about sublime success,<br>
> Furthering through the perseverance of a mare.<br>
> If the superior man undertakes something and tries to lead,<br>
> He goes astray;<br>
> But if he follows, he finds guidance.<br>
> It is favorable to find friends in the west and south,<br>
> To forego friends in the east and north.<br>
> Quiet perseverance brings good fortune.<br>
The I Ching is purposely vague, like clouds in the sky, you see what you're familiar with. But some of its advice is unequivocal, and what I read here was "Stop trying to speak, listen. Stop trying to lead, follow. Stop trying to change, accept". I closed the book tremendously annoyed at the answer, and put myself in bed.
The next day I tried working, without success. And the day after, and the day after, and so on, until I had to admit that perhaps the advice of the I Ching was on spot. But, I've never followed, I've never listened, I've never accepted my condition, what I ought to do?
I remained still until I was bored. Then, naturally, a creative urge came to me, but it had nothing to do with what I would consider "work". [I wanted to design furniture for my home](https://medium.com/@duopixel/the-pleasure-of-designing-your-own-furniture-2b093e64c88). Curiously, at the time I felt very guilty about not "working", but looking back it was one of the most productive moments of my sabbatical, and the satisfaction it gave me was beyond measure.
After this guidance the I Ching stopped speaking to me. I tried it for further divination, but its answers seemed too vague to put into use. Jung himself says you build most of the meaning through means of synchronicity, the things that are happening in your life seem related to the text, and so I suppose that no question I would pose to the I Ching was important enough so that my subconscious would see shapes in the vague contours of the I Ching.
But I'm very grateful for the one piece of advice I got from the whole endeavor.
There are several species of <a href="https://en.wikipedia.org/wiki/Lime_(fruit)">citrus trees</a> whose fruits are called limes, including the Key lime (Citrus aurantifolia), Persian lime, kaffir lime, and desert lime. Limes are a rich source of vitamin C, are sour, and are often used to accent the flavours of foods and beverages. They are grown year-round.[3] Plants with fruit called "limes" have diverse genetic origins; limes do not form a monophyletic group.
<img alt="IMG_5403.jpg" src="https://method.ac/writing/uploads/IMG_5403.jpg" style="margin: 0 auto; display: block; width: 70%;" />
Soñé que estaba en clase y le tocaba presentar a §. Teníamos que hacer una presentación de una película que hubiéramos visto, y § hacía una presentación que parecía una parodia de crítica de cine, todos sus insights estaban equivocados, y además lo hacía con una pretensión insufrible.
Al terminar la clase el profesor hizo un par de comentarios sarcásticos, como habiendo entendido que § lo había hecho a propósito, pero cuando vio que no entendía, hizo una pregunta para discernir la honestidad de la presentación, pero § pareció no enterarse de que le estaban preguntando algo y salió del salón de clases.
Luego era mi turno. Yo no sabía que teníamos que hacer esto, pero pasé de todas formas al frente y expliqué algunas cosas de Inception. Me iba mal porque mis memorias de la película eran muy vagas y me percibía a mi mismo bastante simplón, como que todo lo que dije en mi presentación era obvio y no estaba aportando nada. Al terminar me fui a sentar y el profesor me regaló un gesto de meh.
Luego regresó § del baño y me quería seducir. Le pedí que se me quitara de encima, pero no cedía, así que lo hice físicamente. Le preguntaba si estaba borracha. Luego le decía que había hecho el ridículo con su presentación, que se sentía la gran mierda pero que tenía la profundidad de un charco, y que pusiera su vida en orden. Vi cómo se acongojó y traté de suavizar el asunto. Al ver que no llegaba a ningún lado, traté de hacerme menos y decir que mi presentación también había sido basura.
Luego me di cuenta que yo no tenía ninguna responsabilidad de enmendar lo dicho, que sólo me había involucrado en una avalancha de mierda. Mi error fue querer desquitarme de sus avances.
At noon I had a nap, and I dreamed that I was at my former job at Cabify. I was working on my desk, and I peeked through the side of my monitor to see what my coworkers were up to: they had the Boolean Game open and were discussing among them how to solve a stage. I gasped in horror, and I felt my face contort to the point of disfigurement, much like Edward Munch's The Scream painting. I woke up and noticed with much relief that my mouth was not open and much less my face disfigured.
''Brain Intellectualization:'' using reason & intellect to avoid feeling our emotions. Intellectualizers are more comfortable with logic & rationality than emotionality and are good at speaking through things without actually feeling them. This can be a strength but also a problem
''Fear of Breakdown'': the things we fear the most are things that have already happened to us but were too painful to consciously experience at the time. Ex: my fear of bad things happening is a fear of facing the bad things I've already experienced
''Sublimation'': one of the healthier defense mechanisms - taking socially unacceptable impulses or desires and channeling them into socially acceptable actions or behaviors. Ex: taking a boxing class to deal with anger and aggression
''Acting Out'': when we are unable to voice repressed thoughts or feelings, we sometimes act them out through behavior. Ex: showing up late to therapy or forgetting payment instead of realizing and telling the therapist that we're upset with the treatment
''Survivor Guilt'': a feeling we sometimes have when we survive or thrive in ways that loved ones are not surviving or thriving. We might unconsciously avoid or sabotage success to get rid of this guilt. Ex: not going after a promotion because your partner just got fired
''True Empathy'': allowing yourself to actually feel what someone else is feeling in order to understand them. If you intellectually understand what someone is feeling but don’t feel it yourself, that's not empathy - it's sympathy. True empathy can be uncomfortable and difficult
''Capacity to Be Alone'': a paradoxical ability to be alone while someone else is present. This is a developmental achievement that not everyone reaches. Imagine the child who can self-entertain while parents are nearby vs. the one who needs to be entertained in every moment
''True Self / False Self'': when we’re young, we borrow our identity from others (our false self). If given the freedom to explore, we get rid of false parts as we discover our true self - but, we often hold onto false parts (w/out realizing it) out of fear of disappointing others
''Psychosomatization'': physical manifestations of emotional states - often happens because we’re unable to feel things emotionally. Ex: feeling nauseous when what you really are is anxious. “We store our issues in our tissues.”
''Complex trauma'': when something traumatic happens before we’ve had the time, resources, & support to recover from a previous traumatic experience (ad infinitum). Becomes increasingly difficult to heal (think of a repeatedly injured muscle that is never given any recovery time)
''Repetition Compulsion'': our tendency to recreate things over & over until we understand them. Ex: finding yourself in the same kind of relationship again & again but not understanding why / being unintentionally attracted to work environments that mirror your family dynamic
''Parapraxis'': also known as a Freudian Slip. A parapraxis is an unintended action that might seem like a simple accident or coincidence but actually points to a repressed or uncomfortable truth that we are avoiding
''Flight into Health'': occurs when we seem to make a “spontaneous recovery” when faced with addressing particular issues in therapy. Ex: I've been talking about something painful when suddenly I feel “totally better” & decide that therapy has worked and I'm ready to stop going
''Gaslighting'': a manipulation technique in which we use psychological means to trick someone into questioning their own sanity. While gaslighting is sociopathic in its extreme form, we all engage in subtle forms (Ex: saying, “I don’t know what you’re talking about” when you do)
''The Good Enough Parent'': a “perfect” parent does not prepare their child for an imperfect world. The “good enough” parent meets their child’s needs enough of the time that the child feels safe, but not so often that the child never learns to adapt to unfavorable circumstances
''Autoplastic vs. Alloplastic Adaptation'': appropriately & advantageously adapting our own self to our environment (meditating so we can handle stress) vs. appropriately & advantageously adapting our environment to meet our needs (choosing a job that complements our work style)
''Reaction Formation'': a defense mechanism where we worry that our true feelings or desires are unacceptable, so we attempt to convince ourselves or others that we feel the opposite way, often in a very exaggerated performance
''Bastion'': when a therapist doesn't see an unhealthy dynamic with a patient because they're invested in it continuing. Ex: patient is being excessively complimentary to avoid facing their anger toward the therapist (see 'reaction formation'), but the therapist doesn't realize
''The Frame'': anything that provides reliable structure in therapy. Ex: starting & ending on time, being in the same room every week. If we can trust the stability of the frame, we are more likely to “come apart” in therapy & thus access messy but important parts of who we are
''Nameless Dread'': the dreadful feeling of emptiness and non-understandable anxiety that we face as infants (because we don’t understand our environment) but that we also face periodically throughout life
''Manifest vs. Latent Dream Content'': the literal subject matter of a dream vs. the underlying meaning being symbolized. Ex: I dream of a motorcycle (manifest) to represent my desire to escape (latent)
''Healthy Narcissism'': narcissism has a bad rap but we all need a bit of it. Healthy narcissism is believing in yourself while maintaining an ability to enjoy the success of others. Kids whose belief in themself is not supported seek validation in unhealthy ways throughout life
''Extreme Envy'': envy that leads to a desire to destroy something another person has that you want, not because you don’t want the other person to have it, but because them having it forces you to confront your feelings about not having it
''Evenly Suspended Attention:'' the therapist’s attitude of not directing their attention to any one thing in particular while listening to the patient. This prevents them from prematurely foreclosing the possibility of surprise and discovery of other important things
''Omnipotent Fantasy'': the belief (which at its core, is really a wish) that we have more power over something than we actually do. Ex: Believing we can save people in our life from their pain, believing that if we worry enough bad things won’t happen
''Transitional Object'': an object that represents a parent, which allows a child to transition from being totally dependent to somewhat independent. Ex: teddy bear or blanket. Adults have them too. Ex: keeping a memento from a loved one so you feel close to them in their absence
''Free Association'': a technique in therapy where you freely share any thoughts going through your mind without censoring yourself - your words don't need to be coherent or "relevant." This allows you to access deeper unconscious material & discover unexpected thoughts
''Splitting'': putting all of our good feelings in one place and our bad feelings in another, because it’s difficult to hold them at the same time. Ex: being very angry with one of your parents while being very forgiving of the other, even though neither is terrible or perfect
''The Depressive Position'': when we can stop splitting (see above) & tolerate the fact that nothing is all good or all bad. Called the depressive position because it’s depressing! Holding both at the same time requires maturity and compassion
''Reality Testing'': the process of helping someone distinguish their thoughts, feelings, & fears from what’s objectively true in reality. Ex: If a patient says everyone hates them, a therapist might point out external evidence that suggests otherwise
''Reverie'': daydreams that serve the purpose of helping us to realize a desire. Therapists who pay attention to their reverie during session will gain important information about what is happening in the room for themself and their patient
''Corrective Experience'': a familiar situation that results in a more positive outcome than past experiences, which shifts our self-perception. Ex: a teacher who gives a fidgety student an interesting project instead of disciplining them might increase their scholastic confidence
''Enactment'': when something that a patient is trying to understand in their life gets played out in session with the therapist. Ex: a patient is exploring the possibility of leaving their partner and suddenly feels the urge to stop going to therapy
''Id, Ego, Superego'': the three parts of our psyche as described by Freud. The Id speaks our primitive impulses and desires (I want). The Superego is the center of morality (I should). And the Ego (the “self”) balances the two so that we can function in society (I am)
''Ego Syntonic vs. Ego Dystonic'': instincts or ideas that are acceptable to the self & are compatible with your values and ways of thinking vs. thoughts, impulses, & behaviors that are felt to be distressing, unacceptable, or inconsistent with the way you think about yourself
''Psychic Determinism'': the idea that nothing in the mind is random or arbitrary; all psychological events have causes & meanings and can be understood in the context of events that preceded them. The opposite of “sometimes a cigar is just a cigar"
''Transference'': a common process in therapy where the patient unknowingly redirects feelings about people in their life toward the therapist. This can be used to understand the patient’s relationships. Ex: A patient with judgmental parents assumes their therapist is judging them
''Erotic Transference'': a common type of transference (see above) where the patient has romantic or sexual feelings for their therapist. These feelings are layered & symbolic and can be explored to understand other parts of the patient’s life
''Projection'': a common defense mechanism where we attribute characteristics we find unacceptable in ourself to another person to avoid facing them. Ex: the person who is cheating on their spouse becomes very paranoid that their spouse is cheating on them
''Projective Identification'': projection taken a step further, where we unknowingly take on projected feelings as our own. Ex: you're angry but don't want to face it. You unconsciously find a way to make me angry. The anger is yours, but you've made me feel it as though it’s mine
Mi tío está escribiendo sus memorias, yo las estoy transcribiendo.
<<list-links "[tag[Cone]]">>
At the time I noticed I was consuming information in the same way people watch TV. Upon shutting my laptop, I'd think "what do I remember from the last two hours of browsing?" barely anything registered, and what registered wasn't even relevant or useful. A detox was in order, and I blocked anything that I deemed a distraction.
Though I yearn the old times when we crafted our own timeline through indie blogs and feed readers, I admit this age is different. With cautious steps I come back to social media, and I see that by default it's laced with nicotine, which in low doses is sticky, but in large doses is toxic. Be inequivocal to the algorithm: block and unfollow anything and anyone that doesn't add to your life, and pour into it things which are authentically you, not echoes of other people's thoughts and actions.
Some might say this is unwise in the light of Facebook's privacy misshaps, and they wouldn't be wrong. It is useful to imagine a shady character without morality or ethics stalking you 24/7, willing to sell whatever they can dig from you to the highest bidder. This wouldn't be too far off from the actual algorithm, but people construe it as an evil comitee headed by Mark Zuckerberg, when it's simply the shadow of capitalism.
''On etiquette''
Goethe saying goodbye to Eckermann in a letter:
> I hope you find yourself immersed in silent activity. From here is where experience and knowledge of the world emerge confidently in purity. Farewell.
Goethe presented all the plates, carving roasted poultry with the greatest skill, attentive that we wouldn’t run dry on wine.
> In life, a well extended name and an elevated position are positive things. Yet, still with all that I’m renown about, the only thing I’ve learned is to keep quiet when I listen to others opinions so that I may not result offensive. Of course, this would be tremendously boring if I wouldn’t count with the advantage of finding what others think without them knowing what I think.
> When I have spoken to someone 15 minutes, I’m willing to listen to him two hours.
''On great projects:''
> Save yourself from all great artistic creation. This evil is suffered by the greatest among us, precisely those whom are blessed with the highest talents and resolute persistence. I have also suffered from this, and I know how much it as affected me. How many things have not remained in the inkwell because of this fault! One hundred volumes wouldn’t be enough to harbor it.
The present moment reclaims its right. The ideas and sensations that arise daily to the poet are what really want and need to be expressed. But when there’s a greater creation in mind, nothing may grow in its shadow: It will reject any other idea and you will waste the most pleasant moments of life. How much effort and mental energy are necessary to round and order a great unity in our inner world!
The universe is so large and rich, and life so varied, that we will never cease to experience moments to compose poetry. But they must always be poetry of circumstance, it’s reality what should give us the setting and subject at hand.
Let’s not say that reality lacks poetic interest, for it is her precisely where the poet is put on trial, demonstrating enough ingenuity to find an interesting face in an ordinary subject.
The elevation of spirit and poetic capacity is something that can’t be denied to new tragic poets. However, the majority of them lack the capacity to accomplish a representation that is both light and full of life. They aspire to something which is beyond their strength, and from this perspective I call them _forced talent_.
''On ambition''
Above all, be careful about _your own_ inventions, with these we try to transmit a point of view that has seldom matured in youth.
It is time to open yourself to the joys of life, and the best way is precisely to work on minor subjects.
''On nature''
He who has inquired into the secret inner life of plants, in the agitation of it’s forces, and the way in which a flower slowly develops, will see it in a very different way, and he will know what he’s looking at.
Goethe spoke at length about the increases and decreases of the barometer, which he denominated “affirmation of water” and “negation of water. He spoke about an inspiration and expiration of earth in function of eternal law.
What use is our cultural education if not to overcome our natural tendencies? Asking people to harmonize with us is a great folly. I’ve never done this. I’ve always seen others as autonomous individuals whom I’ve tried to probe and I’ve wanted to know with all their peculiarities, without seeking additional sympathy. In this way I’ve been capable of treating anyone, and only in this way we might gain understanding of different personalities and obtain the confidence necessary in life. It’s precisely natures different to our that require the necessary containment to interact with them, and thanks to this we stimulate any kind of relationship.
''On feedback''
[after showing a poem to Eckermann] “Isn’t it good? In a couple of days you may tell me what you think”.
''On fractals''
Any character, no matter how peculiar, and anything we wish to represent, from a stone to a man, have a universal character. Everything repeats itself, and there is nothing in the world which exists only _once_.
''How to create''
Under every poem, write the day in which it was composed. In this way it will serve as a journal for your own virtual circumstances. And that’s not something trivial. I’ve done it for years, and I know what it means.
There are excellent people who don’t know how to improve, or do anything superficially. Their nature requires them to seek depth and calm in each of their endeavors. This kind of talent tends to impatient us, since it seldom satisfies our immediate need. However, it is by this path that the highest peaks are reached.
''On solitude''
Should I have kept myself away from official and public appearances, I would have been able to spend more time in solitude, being more happy and I would have yielded more fruit as a poet
''On generalists''
In universities too many things are done, and many of them are useless. Teachers over extend their discipline, taking them well beyond the needs of their students […] No good can come from this. Teaching one thing implies that we neglect another. A smart person will reject all pretensions that distract from him, he will limit himself to one discipline and be efficient in one.
''On taste''
[Goethe shows only the best engravings to Eckermann] This is how _taste_ is formed. Taste cannot be formed starting from mediocre work, only from the most perfect forms.
''On human relations''
Goethe spoke about an Englishman who was passing by through Weimar, and pretended to get a divorce as soon as he went back to England. Such nonsense made him laugh, and he mentioned many cases of divorce that had happened because they hadn’t learned to live with each other. “Reinhard of Dresde would frequently be surprised by my stiffness in this matter, when my ideas are much more lax in the rest of matters.
I don’t know how to get along with Wolf if I don’t counter him like a Mefistofeles. On the other hand, if I didn’t do this, I wouldn’t uncover the treasures he carries inside.
''On writing''
In general, the style of a writer is a faithful imprint of his interior. If somebody want to be a _clear_ writer, let his soul be clear, if someone wants to write in a _grandiose_ style, his personality must be it as well.
''On enemies''
Enemies from stupidity: they don’t understand and criticize from ignorance. Boring.
Enemies from jealousy: people who don’t accept happiness and honorability coming from talent. “If I were unhappy and suffering, they’d leave me alone”.
Enemies from lack of success: writers, some talented, who think it’s unfair that they live under his shadow.
Enemies with reason: those who have criticized him with justification. He is a human being, not without mistakes. However, sometimes they him for things that have been left in the past.
Enemies from diverging opinions: it’s impossible to harmonize with all the variety of tastes and opinions.
''On sprituality''
At 75 years of age it is inevitable to think about death now and then. To me these thoughts don’t generate any kind of concern: I have the firm conviction that our spirit is completely indestructible, and that it will remain active in eternity. It’s like the sun, which only sets for our earthly eyes, but in reality it never does, because it doesn’t cease irradiating light.
Then [No-Truth] enters a being and wreaks havoc by flipping one's structures of [[Truth]].
Course Description
Introspective Writing is a technique to register introspection, where we define introspection as "inward observation". First learn to observe inwardly, and then we learn how to register the sensations and observations while sustaining attention at will.
Who is Introspective Writing for?
I make no claim about the virtues of introspective writing: you get to register what you feel and what you think. Is this useful in itself? What do *you* think?
As you can see, there is little if any guidance given. The reader is asked to think for themselves.
It is not necessary but it is desired to have a regular meditation practice. If meditation has been _scary_ to you in the past
The course is composed of ten practical writing exercises, you can purchase the entire course for just $200 on Podia.
You can do them for free.
Learn how to dump what you think about what you're going to say:
Introspective writing is especially insightful for people with verbal dispositions
feel that a spiritual calling and purpose are emerging in
their lives, but who need a new approach to fully comprehend
what this means. Often these individuals have felt this pull for
a long time. Steps provides a foundation upon which they can
begin to respond to this calling. The only entrance requirement
is the determination to know one’s purpose, meaning and
direction.
In order extract wisdom from experience, it is necessary to review experience the
course on the _art of writing what one observes inside_. We
It is completely experiential, in the sense that writing about certain topics with honesty,
What is exactly, _inside_? Well, it's complicated.
An almost pre-requisite of this course is to have a regular meditation
We must see and feel for ourselves, nobody can explain us what is inside of ourselves!
That the point of this course.
I went to an all-inclusive resort with good friends from high school. We had some fishing canes with us, and I captured a small tropical fish, but on my second attempt the hook came back flying towards me and it embedded on my chest, near the heart.
We went out the hotel room and into a party with a lot of people. I was protecting myself from people bumping against me, as they would rip off the hook with all the skill. I didn't want to take it out because I would lose the hook, but finally it came loose on its own. I encountered a tall classmate from high school, and asked him to place it on a shelf high up, where nobody would be able to get ahold of it.
I made my round and saw it was an old hotel. When I came back I couldn't find my friends, so I kept on walking around looking for them. I entered various rooms where there were different kinds of people, one, for example, was composed exclusively of students, and the food was chilaquiles and chalupas. I was hungry, but I didn't dare to eat, because none of the people seemed to be like me, so I thought I wasn't allowed to eat their food.
Finally, tired of looking for my friends, I sat next to a large crowded table headed by someone who seemed to be very important. He told everyone one the table that he wanted to get everyone tested for COVID. A nurse came in drew a small amount of blood of each of the guests fingers. The man had said that the test would be free, but one of the guests drew out a large amount of cash, which the nurse accepted with gratitude.
The nurse turned towards me and said hello effusively, I knew her from a previous dream in which we were in another hotel and she got drunk and was crying a lot. I consoled her at the time [it is unclear to me if this is something I had dreamed a bit earlier, or if this memory was made on the fly, but I have visual memories of this dream alternate dream].
She wanted to go with me outside the hotel. We went outside to be greeted by a spectacular scene: naked snow-capped fractal mountains made a very stimulating scenery which I immediately wanted to explore, but she directed me towards the sidewalk to the side of the hotel. A beaten off dirt road went up a hill in what appeared to be a mining operation. She took me to a small rock shelter on the side of this road and sat me down. She wanted to make out with me, but I reasoned that if her aesthetic sensibilities were so off-target as to bring me to this ugly place, then she must not be a follower of virtue, and so I refused to kiss her and went back into the hotel.
I went back looking for my friends, this time to the terrace which was very different than the floor I had explored at first: this was a posh rooftop terrace with a pool in the middle surrounded by exotic vegetation. Beautiful women in tiny bikinis and muscular men were everywhere. Even though they were my age I felt out of place here too, and went searching for my friends in the bars and posh restaurants around the pool. I was hungry and wanted to eat, but I was too ashamed to ask if I was allowed to eat because they would think I was a bum.
Someone recognized me and said hello, I didn't recognize her, but she said that she knew where my friends were and she would lead me there. I followed her, only to be lead to a table with numerous people, the nurse among them.
I stormed away, this time trying to find a concierge who would call my room to find my friends, and I was about to reach it when something vibrated in my pocket: it was the key to my room. I looked closely and there was a button to answer. I pressed it.
On the other side, the nurse told me she was in my suite with my friends. I was angry at her, her antics were getting creepy. Even though there was a part of me that wanted to fuck her, I knew I shouldn't stick my dick in crazy.
/* ䷀ */
/* MIN RUNGE (?) https://runge.method.ac */
/* To generate a new color scheme, follow this link */
/* https://runge.method.ac/import/z-#f7fafc-#030507/a-#f56e6e/b-#f56e6e; */
/* method.ac/donate */
:root {
--z0: #f7fafc; --a0: #faeced; --b0: #f9efeb; --c0: #f7f3ea; --d0: #e9f4ee;
--z1: #e7eaec; --a1: #f9dadb; --b1: #f7e1d3; --c1: #f3eacd; --d1: #d4ecdf;
--z2: #d6d9db; --a2: #f9c8c9; --b2: #f6d4ba; --c2: #f0e1b1; --d2: #bee5cf;
--z3: #c6c9cb; --a3: #f8b6b7; --b3: #f4c6a2; --c3: #ecd894; --d3: #a9ddbf;
--z4: #b6b9bb; --a4: #f7a4a4; --b4: #f3b88a; --c4: #e8cf77; --d4: #93d6af;
--z5: #a6a8aa; --a5: #f79292; --b5: #f1ab72; --c5: #e5c65b; --d5: #7ece9f;
--z6: #95989a; --a6: #f68080; --b6: #ef9d5a; --c6: #e1bd3e; --d6: #68c690;
--z7: #85888a; --a7: #f56e6e; --b7: #ee9042; --c7: #deb421; --d7: #53bf80;
--z8: #757779; --a8: #eb6161; --b8: #e38334; --c8: #d3a912; --d8: #45b373;
--z9: #656769; --a9: #d75959; --b9: #d0782f; --c9: #c19a11; --d9: #3fa469;
--z10: #545759; --a10: #c35050; --b10: #bd6d2b; --c10: #af8c10; --d10: #399560;
--z11: #444648; --a11: #af4848; --b11: #a96227; --c11: #9d7e0e; --d11: #338656;
--z12: #343638; --a12: #9b4040; --b12: #965722; --c12: #8b6f0d; --d12: #2e764c;
--z13: #242628; --a13: #873838; --b13: #834c1e; --c13: #79610b; --d13: #286742;
--z14: #131517; --a14: #732f30; --b14: #6f401a; --c14: #67530a; --d14: #225838;
--z15: #030507; --a15: #5f2727; --b15: #5c3515; --c15: #554409; --d15: #1c482f;
--e0: #e8f3f3; --f0: #e9f0f9; --g0: #ebeefb; --h0: #efeefb; --i0: #f9ecf2;
--e1: #d1eaea; --f1: #d3e5f6; --g1: #d9dff8; --h1: #e5def8; --i1: #f7dae8;
--e2: #b9e2e0; --f2: #bcd9f3; --g2: #c7d0f6; --h2: #dacff6; --i2: #f6c8de;
--e3: #a2d9d7; --f3: #a6cdf0; --g3: #b6c1f4; --h3: #cfbff4; --i3: #f4b6d4;
--e4: #8ad0cd; --f4: #90c2ec; --g4: #a4b2f2; --h4: #c5b0f2; --i4: #f3a3ca;
--e5: #73c8c4; --f5: #7ab6e9; --g5: #92a3f0; --h5: #baa1f0; --i5: #f191bf;
--e6: #5bbfba; --f6: #63aae6; --g6: #8194ed; --h6: #af91ed; --i6: #ef7fb5;
--e7: #44b6b1; --f7: #4d9fe3; --g7: #6f85eb; --h7: #a482eb; --i7: #ee6dab;
--e8: #36aba5; --f8: #3f93d8; --g8: #6279e0; --h8: #9975e0; --i8: #e3609f;
--e9: #319c97; --f9: #3a86c5; --g9: #5a6fcd; --h9: #8c6bcd; --i9: #d05892;
--e10: #2d8e89; --f10: #357ab3; --g10: #5164ba; --h10: #7f61ba; --i10: #bd5084;
--e11: #287f7b; --f11: #2f6da1; --g11: #495aa7; --h11: #7257a7; --i11: #a94777;
--e12: #23716d; --f12: #2a618e; --g12: #415094; --h12: #654d94; --i12: #963f69;
--e13: #1f625f; --f13: #24547c; --g13: #384581; --h13: #584381; --i13: #83375c;
--e14: #1a5451; --f14: #1f486a; --g14: #303b6e; --h14: #4b396e; --i14: #6f2f4e;
--e15: #164543; --f15: #1a3b57; --g15: #28315b; --h15: #3e2f5b; --i15: #5c2740;
--x0: 0; --y0: 0; /* ☯️ The Dao */
--x1: 8px; --y1: 6px; /* The Dao gave birth to one */
--x2: 16px; --y2: 12px; /* One gave birth to two */
--x3: 24px; --y3: 18px; /* Two gave birth to three */
--x4: 32px; --y4: 24px; /* and Three gave birth to the ䷁ */
--x5: 40px; --y5: 30px;
--x6: 48px; --y6: 36px;
--x7: 56px; --y7: 42px;
--x8: 64px; --y8: 48px;
--x9: 72px; --y9: 54px;
--x10: 80px; --y10: 60px;
--x11: 88px; --y12: 66px;
--x12: 92px;
--x13: 104px;
--x14: 112px;
--x15: 120px;
--x16: 128px;
--halfx: 4px; --halfy: 3px;
}
html, body {
-webkit-font-smoothing: antialiased;
}
body.tc-body {
background-color: var(--z15);
}
img.thumb {
width: 33%;
float: left;
margin: 0 var(--x3) var(--x3) 0;
}
embed {
max-width: 100%;
width: 100%;
height: 50vh;
}
h1, h2, h3, h4, h5, h6 {
line-height: 1.2;
font-weight: 600;
}
kbd,
html button,
.tc-btn-boxed {
padding: var(--x1) var(--x2);
font-weight: 500;
font-size: var(--y2);
line-height: 1.2;
color: var(--z3);
vertical-align: middle;
}
.tc-btn-boxed {
padding: var(--x1);
font-weight: 500;
font-size: var(--y2);
line-height: 1.2;
color: var(--z3);
vertical-align: middle;
border: none;
cursor: pointer;
}
.tc-btn-boxed:hover {
background-color: var(--z13) !important
}
.tc-btn-boxed:hover svg {
fill: var(--z3) !important;
}
html button {
font-size: var(--y2);
padding: var(--y1) var(--x1);
border-radius: calc(var(--x1)/2);
}
.tc-tiddler-frame {
background-color: var(--z14);
margin: 0 0 var(--x4) 0;
padding: 0 var(--x4) var(--x4);
border-radius: var(--y1);
border: none;
}
.tc-tiddler-title {
background: var(--z14);
margin: 0 calc( var(--x4)*-1 );
padding: var(--x1) var(--x4);
border-radius: var(--y1) var(--y1) 0 0;
font-size: var(--x2);
letter-spacing: -0.5px;
}
.tc-titlebar h2 {
font-size: 1em;
display: inline;
position: relative;
top: var(--halfx);
font-weight: 700;
}
i.tc-muted {
font-style: normal;
color: var(--z10);
font-size: var(--y2);
}
.tc-advanced-search input {
color: var(--z1);
background: var(--z12);
border: none;
box-shadow:
calc(var(--halfx) * -1) calc(var(--halfx) * -1) var(--y1) var(--z11),
var(--y1) var(--y1) var(--y1) var(--z13);
border-radius: var(--x4);
padding: 0 var(--y2);
line-height: var(--x4);
}
.tc-sidebar-lists input {
border: none;
border-radius: 30px;
}
a.tc-tiddlylink-resolves {
color: var(--d7);
}
span.tc-tag-label {
background-color: var(--z13);
color: var(--z4);
}
@media (min-width: 960px) {
.tc-story-river {
padding: var(--x4);
}
.tc-tiddler-info {
margin: var(--x1) calc(var(--x4)*-1) 0 calc(var(--x4)*-1)
}
.tc-tiddler-frame {
border-radius: var(--y1);
}
}
I was at Chandra Calli with Margaret and Mar. Margaret told me dad had fallen out with a business parter of his because he was not committed enough, the guy spoke with Portuguese mannerisms because he spent too much leisure time in Brazil, and thus was not focused on the business.
Then I appeared in a mall with dad. He told me he saw me without direction or interests, and that perhaps I ought to find my passion or purpose. I told him this perception arose out of his lack of knowledge about my person, that he couldn't make this assessment because he was not interested in me. I felt compelled to tell him we should spend more time together, but instead lashed back and criticized his lack of parenting in my life.
We were walking towards the bathroom when the discussion turned heated and we said hurtful things to each other. As he entered the bathroom we were about to part ways, but he turned around and said I had such a lack of self control I'd surely eat a piece of meat that was on exhibition outside of a steak grill. I dismissed him spoke briefly with Mar, who reassured me we held different values and thus were speaking past each other because our definitions of success were different. I felt some relief, then went downstairs, where I heard mom calling me and I called back. She was delighted to find me.
After lunch I had a nap and dreamed that I was in a water park. I was in the wave pool, and had a boogie board with me. I was having fun, but suddenly the waves became quite violent and I got out of the pool. I saw the waves swell and many of the people inside where struggling to keep afloat. At the end of the pool a huge swell formed, and I felt ambiguous: I wanted to surf the waves, but this was too challenging for me and I didn't have to courage to do it. I kept myself out of the pool and simply observed the scene.
Task 1: Say hello to everyone you see in the eye
I was chatting with a gray haired middle-aged man who was to be interviewed by the same company that David E. was applying for. I wanted to hate him because he was competing for the same position as my best friend, but as I was chatting with him he was intensely asking me questions, being very present. I couldn't help but like him. I made a mental note of telling David that he should ask many questions and allow his curiosity to drive the interview (which I did the next day).
I was at the rooftop of a tall building with my mother. From there I could see the tops of several trees, and some branches which were dead. I wanted to knock down the dead branches, my mother was nervous and didn't want me to try, but I grabbed a blanket and threw it towards the threes.
The blanket landed on a couple of flimsy branches which effectively gave out, but this caused a cascading reaction and a massive dead branch ripped from the trunk and fell. My mother shrieked hoping that there was nobody below, on the street. I waited for the crash against the ground, but it took much longer than I anticipated. If the drop was 10 meters, the time it took to touch ground was twice that. And when it happened it sounded like a car crash, and a car alarm went off. I had hit a car it seemed, but it was beyond my field of view.
I went downstairs to find that the branch had hit Margaret's car, but she seemed unconcerned about it. I felt vaguely guilty about the accident. I walked with Margaret out of this neighborhood and came across a large gate which announced it was the zoo of delegación Cuauhtémoc. A sign at the entrance had a map of various exotic or fantastical birds, such as the Quetzal and the Phoenix.
**Exercise**: write your day as if you were a devout person<br>
**Purpose**: to be discovered
By God's grace I opened my eyes in the morning. The first minutes of the day must be dedicated to the lord, so I incorporated into my seated praying position, to which I confess is more pleasure than penitence.
_Lord Jesus Christ, Son of God, have mercy on me_
_Lord Jesus Christ, Son of God, have mercy on me_
_Lord Jesus Christ, Son of God, have mercy on me_
I say as I perceive the all encompassing compassion behind the veils. Should I be able to remove the one hundred veils detailed by [Attar of Nishapur](https://en.wikipedia.org/wiki/Attar_of_Nishapur) I should go blind. In his infinite wisdom he put enough homework for a lifetime. It is a long journey, is it not?
_Lord Jesus Christ, Son of God, have mercy on me_
_Lord Jesus Christ, Son of God, have mercy on me_
_Lord Jesus Christ, Son of God, have mercy on me_
I feel power between my legs, at the root chakra. My body seems confused: this is a contemplative and not taoistic practice. And sexual energy sensing is not something I would feel comfortable writing about. Would I?
Ahhh the ego made it's presence. Come back to prayer. Open your eyes. Observe the perfection of creation. God in his infinite mercy made this just for us. Allow us to begin the day...
***
I just realized the foolishness of the endeavor: though I actually enjoy writing like this, any attempt at devotional writing that does not come from the heart is foolishness.
If you are one of those rare ones who sings songs of devotion from the heart, know that you are a treasure to this world.
[Edit minutes later: Quoting Wikipedia]
> Practicing the Jesus Prayer is strongly linked to mastering passions of both soul and body, e.g. by fasting. For the Eastern Orthodox not the body is wicked, but "the bodily way of thinking" is; therefore salvation also regards the body.
I've been harboring a zit behind my ear which refuses to squeeze out and got infected. Last night I attempted to preform... ahem... self-surgery with a paper cutter but I was unable to extract anything meaningful. Instead, this morning I was met with my right ear and nearby nodules inflamed. The infection had spread.
I decided to take my case to the doctor. Here in Mexico there are private doctor practices next to each pharmacy, and it costs only $2 USD per consultation. The quality of the doctors varies, but for simple cases or when you know exactly what you need it's even better than Spain's lauded healthcare. So if you have that pesky throat infection and you already know you need antibiotics you can get the prescription in five minutes by simply asking for it.
The doctor who attended me was a wonderful lady. I was straightforward with my case. She shook her head. I said _I know, I just can't help trying to fix things on my own. When I mess up I come to the experts_. She seemed satisfied. Experts love their clients come to them with their tail between their legs when they try to prescind from them. She prescribed antibiotics and after a long chit chat about matters of health (ceasing smoking, exercise and such) I was sent home.
As I walked home I wondered if the antibiotics were less healthy than putting a knife to the ear. One will kill the microbiome in my gut which I painstakingly collected from the numerous streams of the camino. Should I interrupt the treatment, the bacteria might gain resistance and become more difficult to eradicate.
Then I remembered my roosters. Their feet still look scaly and inflamed, but they no longer peck at their feet in desperation of the mites that are wreaking havoc under their skin. The recommended course of treatment was to rub their feet with an ointment, but after an incident in which one of the roosters put a claw to a vein on my leg I'm no longer willing to meddle physically with them. So I put a grinded anti-parasitic pill into their water and allow the drug to act from the inside.
And so I subject myself more or less to the same treatment: when the direct course of action proves to be too painful, you take the next best option, drinking a bit of poison to do away with something that is undesirable within you.
Is not all life like this?
I was in the upper floor of a clinic, about to assist my uncle in an operation. I was to bring a tray with needles and medicines, which I grabbed but then saw that the vial were leaking. I was unsure if this would be adequate for the operation, but I grabbed the tray anyways and made my way downstairs, but the access door was closed.
I reasoned that I could get out through the rooftop and reenter the clinic from the outside, so I went out a window and into the rooftop. The building was donut shaped, like a stadium, and very old. The rooftop collapsed as I stepped on it, so I had to be quick and strategic with my steps. I fell down in one of the sections and found myself in a small lobby with some soldiers who were guarding access. I scurried out but found myself out of the building instead of inside, and saw a long line of UN Peacekeeping soldiers coming into the building.
I said I had an appointment with my uncle, and they asked me what was his name. "Dr. Hernández" I answered, unsure it was actually his last name. "There's only Dr. Gutiérrez, Dr. Domínguez, and Dr. Hernández" the guard answered. "That's a security faux pas" I thought, "I already said Dr. Hernández" I responded, and I was let in again.
[Dracaena fragrans on wikipedia](https://en.wikipedia.org/wiki/Dracaena_fragrans)
<img alt="IMG_5402.jpg" src="https://method.ac/writing/uploads/IMG_5402.jpg" style="width: 100%" />
I'm currently translating Hernán Cortés' letters to Charles V into modern English. The reason for this is that I would like to re-trace his footsteps through Mexico by foot. I will update this page as time allows.
Sent to your majesty, by the Captain general of the New Spain, don Fernando Cortés, in which he describes the unparalleled lands and provinces that he has rediscovered in Yucatán, year 1519, which have been subjugated to your majesty.
This letter tells about an enormous and rich province called _Culúa_, in which there are very large cities with marvelous buildings, abundant commerce, and many riches. Among these, Tenochtitlán is the most prosperous. By amazing arts, it is built over a large lake. The ruler of these lands is a great lord called Motecuzoma. In this region horrible things happened to the captain and our Spaniards. The letter also tells about the enormous kingdom of Motecuzoma, of their rites, ceremonies and customs. Oh my king:
"""
Leap into the psychology of @dremilyanhalt
I organized and distilled her last 3,000 tweets into a summary of her big ideas, in two parts...
Part 1⃣: Emotional Fitness and Human Behavior
First things first, learn to feel…
🔷Your emotions are healthy and important
🔷Feel them, even the messy ones
🔷Try not to stuff them down into your body
🔷You’re allowed to have complicated feelings about simple things
🔷Create the space for the full range of feeling
Face your tough experiences and dig into them…
🔷Unearth what you’ve turned away from
🔷Discover what you need to talk about and gain conviction in your resilience and strength
🔷It’s next to impossible to change things without facing them
What we do to avoid suffering is often worse than the suffering itself…
🔷Suffering is normal, and normal people suffer
🔷Healthy pain isn’t a pathology and normal suffering isn’t a stigma
🔷Sometimes we thrive; other times all we can do is barely make it through
Remind yourself, we all work hard NOT to know things…
🔷We hide ourselves from ourselves better than we hide ourselves from others
🔷We store our experiences and emotions in places we have no conscious access to
Build the safety, ability, and strength to know things you’ve worked hard not to know…
🔷In other words, walk the path to self-awareness
🔷What you want is waiting along the way
🔷Switch from "how is this happening to me?" to "how am I happening to this?"
Get comfortable being uncomfortable…
🔷Not all pain comes to harm you
🔷Know the only way out is through
🔷Your job is to understand and manage your own discomfort
🔷You already know what to do, you just need help understanding why you’re not doing it
Understand pain, trauma – and healing – are passed down from generation to generation
🔷Give others more compassion than you were given
🔷It puts you in touch with an alternate reality you never had
🔷Everyone who comes after you will benefit
Turn your compassion inward…
🔷Talk back to your inner critic (without dismissing it)
🔷Be careful how you talk to yourself (you’re listening)
🔷Don’t be cruel (you wouldn’t be cruel to your best friend)
🔷Name the things you love (and don’t take too long to name yourself)
Grieve small losses in your everyday life…
🔷Growth and grief are intertwined
🔷With every choice we make, we must mourn the loss of all we didn't choose
🔷Honor that process for even the smallest day-to-day losses
🔷Grieving small losses prevents big pain
Don’t suffer future pain…
🔷We sometimes believe the worrying itself keeps bad things from happening
🔷We worry if we stop worrying, our greatest fears will come true
🔷Instead of preoccupying yourself about something that might happen, master the art of optimistic rationalism
Keep going…
🔷If you’re not asking for support, ask for it
🔷If you’re not forgiving yourself, forgive yourself
🔷If you’re not thanking other people, thank them
🔷Epiphanies are almost always a result of many seemingly unproductive hours of work
See the full person in yourself and others…
🔷Goodness and badness exist within each of us
🔷Cancel culture is an inability to hold the two together
🔷Weaponized shame does not tend to help people
🔷We must educate instead of shame ourselves, and learn not to think in extremes
Set boundaries…
🔷Figure out what your needs are and communicate them
🔷Free up space for productive pursuits, even if you’re still hurt
🔷Put some emotional distance between you and people who need to do their own work
🔷You don’t have to rebuild a relationship with everyone
To understand yourself and others, listen…
🔷Listen quietly
🔷Listen intently
🔷Listen empathetically
🔷Talk less, be present more, and allow for pauses…
🔷Don’t give advice
🔷Don’t feel compelled to fix
🔷And don’t think of what to say next
Ask deepening questions and add empathy to your judgments…
🔷Show you’re present with nods not words
🔷Practice getting comfortable with silence, and become fluent in the language of silence
🔷Every time you feel disdain for someone else, you reveal an unhealed part of yourself
Help people move toward who they want to be…
🔷Assume best intentions
🔷Meet others where they are
🔷Approach your interactions with openness
🔷Don’t ask. Just help. Think of something that would be helpful, and then do it
🔷As you elevate others, others will carry you up
Improve your conversations…
🔷When you don’t know what to say, don’t say anything
🔷When you don’t know how to support someone, say, “How can I support you?”
🔷When you don’t know how someone is feeling, say, “How are you feeling about this?”
Improve your conversations…
🔷Don’t say, “You never”
🔷Don’t say, “You always”
🔷Don’t say, “This is your fault”
🔷Don’t say, “It’s fine (if it’s not)”
🔷Don’t say, “That’s your problem”
🔷Don’t say, “You’re being too sensitive”
🔷Don’t say, “I told you this would happen”
Improve your conversations…
🔷Say, “I hear you, and I’m here with you”
🔷Ask, “Can you say more about that?”
🔷Say, “What I think I’m hearing is...”
🔷Ask, “Does that resonate with you?”
🔷Say, “I imagine you might be feeling...”
🔷Say, “You’re not alone in this"
Practice the lost art of accepting a compliment…
🔷Don’t deny it
🔷Don’t minimize it
🔷Don’t throw it right back
🔷Instead, feel it
🔷Let it settle
🔷And be grateful for it
In sum, get some…
🔷Emotional fitness
🔷Self-awareness
🔷Boundaries
🔷And therapy!
Therapy works (and it’s not a court of law)…
🔷It’s a time to process
🔷It’s a space to be heard
🔷It’s an opportunity to create tracks in the snow
🔷It lets you try on thoughts & feelings
🔷It lets you decide whether they’re right
🔷It lets you completely change your mind
Remember: holy shit, you’re alive!
🔷Take a breath, open a window, and move around
🔷Be grateful, be present, and thank someone who’s helped you
🔷Enjoy your day, you don’t have an unlimited number left!
If you realized how beautiful you are,
you would fall at your own feet.
-Byron Katie
If the unexamined life is not worth living, is the unlived life worth examining?
- Paul Kalanithi, When Breath Becomes Air
Adulthood, for many people, has become a long hangover created by childhood.
-Adam Phillips
Do I contradict myself? Very well, then I contradict myself. I am large, I contain multitudes.
-Walt Whitman
We have art in order not to die of the truth.
-Friedrich Nietzsche
Blessed are they who can laugh at themselves for they shall never cease to be amused.
-Unknown
The great irony inherent in our efforts to make love safer is that those efforts always make it more dangerous.
-Stephen Mitchell
Allow yourself the uncomfortable luxury of changing your mind.
-Maria Popova
It is the role of the artist to make the revolution irresistible.
-Toni Cade Cambarayou
If the only prayer you say throughout your life is "Thank You," then that will be enough.
-Elie Wiesel
To recognize one's own insanity is, of course, the arising of sanity, the beginning of healing and transcendence.
-Eckhart Tolle
The most neglected fact in business is that we are all human.
-Chip Conley
Love is blind; friendship closes its eyes.
-Nietzsche
Beware the ceaseless frenzy of always thinking we should be doing something else.
-William James
Watch carefully the magic that occurs when you give a person just enough comfort to be themselves.
-Atticus Finch
Although the wish for solitude can be a denial of dependence, a capacity for solitude may be its fullest acknowledgement.
-Adam Phillips
The great lesson of 'Beauty and the Beast,' is that a thing must be loved before it is lovable.
- Chesterton
You do not have to be good. You do not have to walk on your knees for a hundred miles through the desert, repenting...
...You only have to let the soft animal of your body love what it loves.
-Mary Oliver
Learn the rules like a pro so you can break them like an artist.
-Picasso
No phenomenon contains so much destructive feeling as moral indignation, which permits hate to be acted out under the guise of virtue.
-Fromm
Everything worth fighting for unbalances your life.
-Alain de Botton
When you can’t look on the bright side I will sit with you in the dark.
-Alice in Wonderland
Psychology is such a complicated chapter of human knowledge that those who deal with it should have some philosophical preparation.
-Carl Jung
Do you seek satisfaction? Then you must embrace frustration, for they are joined as sure as night follows day.
-James Woodward
...but the line dividing good and evil cuts through the heart of every human being. And who is willing to destroy a piece of his own heart?
-Solzhenitsyn
I happen to believe that America is dying of loneliness, that we, as a people, have bought into the false dream of convenience and turned away from a deep engagement with our internal lives.
-Steve Almond
The future has an ancient heart.
-Carlo Levi
And because all things have contributed to your advancement, you should include all things in your gratitude.
-Ralph Waldo Emerson
Although I am a typical loner in my daily life, my awareness of belonging to the invisible community of those who strive for truth, beauty, and justice has prevented me from feelings of isolation.
-Albert Einstein
One day, in retrospect, the years of struggle will strike you as the most beautiful.
-Freud
Well, everyone can master grief. Except he that has it.
-Shakespeare
All conspiracy theories are based on the wishful fantasy that humans are hugely competent and can keep secrets and someone is actually in charge.
-Gilbert Liz
The child who is not embraced by the village will burn it down to feel its warmth.
- African Proverb
Our task as a person is to be defeated by ever larger things.
-Rilke
If I had a nickel for every time an empiricist confirmed something Freudian without giving the devil his due...I’d still be massively in debt but you know there would be more spending money.
-Dr. David Gatta
My mind is a bad neighborhood I try not to go into alone.
-Anne Lamott
The question is not why the addiction, but why the pain.
-Gabor Maté
You don’t think in depression that you’ve put on a gray veil and are seeing the world through the haze of a bad mood. You think that the veil has been taken away, the veil of happiness, and that now you’re seeing truly.
-Andrew Solomon
We wouldn't ask why a rose that grew from concrete had damaged petals. We would celebrate its tenacity & love its will to reach the sun. Well, we are the roses - this is the concrete - and these are my damaged petals. Don't ask me why, ask me how!
-Tupac Shakur
Anyone can become angry - that is easy. But to be angry with the right person, to the right degree, at the right time, for the right purpose, and in the right way, this is not easy.
-Aristotle
There are situations in which it is more dangerous to keep your balance than to lose it.
-Adam Phillips
The only normal people are the ones you don't know very well.
-Alfred Adler
I think everybody should get rich and famous and do everything they ever dreamed of so they can see that it's not the answer.
-Jim Carrey
Pain gets passed down through families until someone is ready to feel it.
-Steph Wagner
The basic thing about therapy is that people finally realize that they’ve been talking nonsense at full volume for years.
-Lacan
If there is meaning in life at all, then there must be meaning in suffering.
-Viktor E. Frankl
If a psychotherapist is lifeless or their technique too technical, their efforts to help may be worthless. Therapy, in this case, is not a relationship but a poor excuse for scientific experimentation. The mechanisms of some therapies undermine their therapeutic value.
-B. Edwards
It is the mothers, not the warriors, who create a people and guide their destiny.
-Luther Standing Bear
Love may seem to be enough when one does not possess it, but when one has, it will always be insufficient.
-Svendsen
Therapy is a leap into the dark. An effort to reconsider the unacceptable in ourselves and in others.
-Adam Phillips
For every complex problem, there is an answer that is clear, simple, and wrong.
-H.L. Mencken
The creative adult is the child who survived.
-Ursula Le Guin
Only the person who somewhere feels safe can take risks.
-Adam Phillips
How bold one gets when one is sure of being loved.
-Freud
No matter how open and loving you attempt to be, people can only meet you as deeply as they've met themselves.
-Kahn
The child who does not feel embraced by the village will burn it down to feel its warmth.
-African Proverb
Our current mental-hygiene philosophy is that people ought to be happy, that unhappiness is a symptom of maladjustment. Such a value system might be responsible for the fact that the burden of unavoidable unhappiness is increased by unhappiness about being unhappy.
-Viktor Frankl
You have to understand that no one puts their children in a boat unless the water is safer than the land.
- Warsan Shire, Love in a Time of Refugees
Psychoanalysis is often about turning ghosts into ancestors, even for patients who haven’t lost loved ones to death.
-Doidge
Advice is what we ask for when we already know the answer but wish we didn’t.
-Eric Jong
It isn't normal to know what we want. It is a rare and difficult psychological achievement.
-Abraham Maslow
You cannot save people. You can only love them.
-Anais Nin
Sibling relationships outlast marriages, survive the death of parents, and resurface after quarrels that would sink any friendship. They flourish in a thousand incarnations of closeness and distance, warmth, loyalty and distrust.
-Erica E Goode
Do not give in to your need to act helpfully. Remain flexible, fallible, and uncertain.
-Peter Buirski
If we are not regularly deeply embarrassed by who we are, the journey to self-knowledge hasn’t begun.
-Alain de Botton
Psychoanalysis is like music lessons; for five years you do not notice any progress and suddenly you can play the piano.
-Woody Allen
Better ever than never.
-Croatian proverb
Pain travels through families until someone is ready to feel it.
-Stephi Wagner
When two people get together they make a relationship whether they like it or not.
-Bion
I'm not a mess, I'm a deeply feeling person in a messy world. I explain that now, when someone asks me why I cry so often, I say, 'for the same reason I laugh so often - because I'm paying attention.'
-Glennon Doyle Melton
People often think therapy is chiefly about removing something "bad" from, or gaining something "good" for, one's self, when it is much more about generating a certain quality of internal space in which the good & bad come together in a kind of family of the self.
-James Barnes
When you don’t know what to say, don’t say anything. Or say, “I hear you, and I’m here with you.”
-Abraham Maslow
Let me fall if I must fall. The one I will become will catch me.
-Baal Shem Tov
The trouble is, you think you have time.
-Buddha
The feeling that cannot find its expression in tears may cause other organs to weep.
-Marisa Peer
You will sometimes find that it is necessary to let things go simply for the reason that they are heavy.
-C. Joy Bell
Never give up on a dream just because of the time it will take to accomplish it. The time will pass anyway.
-Earl Nightingale
No one ever told me that grief felt so like fear.
-C.S. Lewis
Happiness is beneficial for the body, but it is grief that develops the powers of the mind.
-Marcel Proust
Sometimes the most empathic response is silence. Respectful, patient silence. When a person is thinking, let them think.
-J. Robertson
As psychoanalysts, we know that only when trauma is spoken about & truly heard, can it be healed. The current protests & unrest are communicating a denied pain stemming from centuries of racism which has never been properly listened to or addressed.
-W. Glover
Forgive yourself for not knowing what you didn’t know before you learned it.
-Maya Angelou
"""
The concept of _ego_ has made a sudden splash into contemporary culture, and with it came a great misunderstanding. The popular conception is that someone with a _large ego_ is tyrannical, opinionated, difficult to negotiate with. We don't usually speak about people with _small egos_, but by the dualist nature of scale, we'd picture someone timid and insecure.
We think the healthy state of the ego is somewhere in the middle, someone who is assertive but still listens to the opinions of others, someone who is both able to lead and to follow depending on circumstance.
This conception of the ego is shallow. It would be better to replace these terms with their psychological equivalents: the person with a large ego has <a href="https://en.wikipedia.org/wiki/Narcissistic_personality_disorder">narcissistic personality disorder</a>, the person with a small ego has <a href="https://en.wikipedia.org/wiki/Avoidant_personality_disorder">avoidant personality disorder</a>, and the medium ego is simply a sane human being.
But the concept of ego //is// useful when used accurately. Yes, there are big and small egos, but the true meaning isn't even close to popular parlance. The ego has many more attributes other than scale. An ego can be flexible or rigid, broad or narrow, brittle or sturdy, and surely many others that escape me at this moment, but for the time being, let's deal with large and small egos.
We are born without egos. Ask a four year old "Who are you? Tell me your story". He will respond with his name, and if you're lucky you might get a bedtime story. Now, repeat the exercise with a lucid 70 year old. It is likely that our egos build up with experience, a good proxy for the size of the ego is the amount of content in //your story//.
Having a large or small ego isn't good or bad _per se_. Each one of them comes with advantages and disadvantages. Say the four year old witnesses a murder, suddenly _his story_ is largely traumatic. The 70 year old, with his large ego, is able to better contain the experience.
However, in the matter of changing your life course, it's better to have a small ego than a large one. The large ego has a lot invested in his self-image: changing careers, getting a divorce, losing all fortune are tremendously costly to the large ego. The small ego doesn't identify with these aspects of life, when you ask him "who are you?" he will not respond "I'm a successful entrepreneur who is married and father of three". He will respond "I'm just a regular dude" and shrug his shoulders.
It is possible to grow old and still have a small ego, specially because ego purges are part of life. It is rare that life plays out in the archetypical form: you're born, you study, you have a career, you get married, you have children, you grow old and you die. It is very likely that, in this arch, something unexpected will happen that will require you to shift how and what you think about yourself.
When you observe older people carefully, they seem to age in polar opposites: they either turn wise, kind and understanding; or childish, sour and cranky. It's the people who hold on to their identity during the ego purge that turn into vinegar, while those who accept the purge become wine.
The old wise person has had his ego trimmed, and is capable of changing opinion, of feeling curiosity for what these times can offer. His or her former life is left behind, and redirects the newfound energy into a new role in life (affording this change in retirement). Despite their age, they keep blossoming.
The old cranky person wants to tell the kids just how better the world used to be //in the old days//. He or she retells stories of their battles and exploits, not to entertain people, but to try to retain what little they have left from their "great ego" which vanishes by the day. They wither away slowly, only rarely showing a blossom which they inevitably compare to the golden days.
Coming to terms with what has been written: ego size has nothing to do with narcissism or avoidance, these personality disorders can be viewed from the spiritual angle as //fragile egos//, which I hope to write about in the future. There seems to be an appropriate size for the ego according to age and experience, Traumatic life events might lead us to purge the ego in mid-life. The ego must culminate with a final contraction which allows the person to settle into the golden age with grace.
I was sitting in front of a store in Prados Agua Azul. They had given me two chocolate cakes for me to try and review, they were the same brand, but looked completely different. I sat down on a ledge at the side of the store, with Nina to my side, and tasted the one that looked more appetizing, but it tasted like cardboard.
A young man looked at us and became excited, I think because he thought I was a foreigner. He appeared to want to approach me, but then turned around and begun speaking fake English as he walked away. I was irritated that he thought I was a foreigner, and that he would make fun of me, and I briefly considered confronting him, but then reasoned that he may be mentally handicapped. I continued eating my cake.
As the man went further away he became louder and louder in his fake English blabbering, so I silently approached him from the back, and threw the chocolate cake at him. I missed and it hit the wall of another convenience store, and the young man saw what had happened and scurried away. I was satisfied that he would be afraid of me, but I felt guilty because I had stained the wall of an innocent party.
Nina came and sniffed the chocolate as I was walking back to my ledge, and when I arrived there she came back trotting in her peculiar way. I saw her teeth and they were full of chocolate, and I became worried because it's toxic to dogs.
Estaba de viaje con amigos de MeetUp en Madrid. Estaba Vicky, Ángel, Ineke, Javier, y otros más que no recuerdo. Estábamos caminando por un pueblo, y comenzaban a suceder cosas extrañas, inexplicables. Yo agudizaba la percepción, veía mis propias manos y veía más detalle del normal en las lineas de la piel. Me volteé y en voz alta les dije "chicos, un momento por favor, les tengo que decir que estamos soñando!". Vicky se río, y Ángel, con raciocinio esperado, pensó un momento y dijo "Pero eso no puede ser, en todo caso tú estás soñando con nosotros".
"Tienes razón", le dije a Ángel, "y si ustedes son fragmentos de mi imaginación, tal vez los pueda juntar en una sola unidad que se convierta en mi mismo", les dije. Extendí los brazos como dando un gran abrazo para juntarlos a todos, pero no se colapsaron en uno como yo esperaba. En lugar de ello me vieron como si estuviera loco. "Ehhh, parece que me equivoqué, no estaba soñando". Sentí el ridículo y seguimos caminando como si nada hubiera pasado.
Llegamos a al hotel, que era una pensión en bastante malas condiciones, y me quedé en una habitación pintada de azul con pintura de aceite, yo solo. Aún estaba dudoso de estar soñando. Me dormí y comencé a soñar que estaba en el fondo de una especie de alberca muy profunda, vacía. Miraba hacia arriba y veía un hombre/sombra, muy musculoso. Decidí que era el momento de eliminiarlo y nos confrontamos en una encarnizada lucha.
Desperté y vi que mi almohada estaba salpicada de sangre, como si me hubiera sangrado la nariz en el sueño, pero miraba a mi alrededor y veía que todas las paredes estaban manchadas de sangre. Me preocupaba porque sería difícil explicar la sangre por todas partes. Y luego cuestioné la sabiduría de haber matado a mi sombra.
Estaba en una especie de relación con un hombre homosexual, del arquetipo bien educado, elegante y manipulador. Yo ya no lo quería en mi vida y le pedía que se fuera, pero me decía las cosas de tal manera que lograba convencerme de quedarse por más tiempo.
Finalmente decidí que era suficiente, si quería que se fuera tendría que echarle por la fuerza. Estábamos en mi recamara y cuando intenté agarrarlo se escondió en el armario y sacó una metralleta, disparando hacia todas partes sin ver.
Me escondí detrás de la cama y vi una bolsa con granadas, tomé una y la aventé. Pero luego me di cuenta que había olvidado quitarle el pin para que explotara, pero el suceso fue suficiente para distraer al personaje y me le fui encima. En el armario encontré un cinturón y con él lo ahorqué. Me decía cosas que me hacían dudar si matarlo, como que se iba a ir por su propia voluntad, que lo que había hecho no era para tanto, y por un momento lo dudé, pero recordé que este era su modus operandi de siempre, y que tenía que eliminarlo.
Apreté tan fuerte como pude, y en el estrago él quedó detrás mío, yo todavía sosteniendo el cinturón. Con todas mis fuerzas tiré de tal manera que salió volando hacia el frente y cayó unos metros adelante. Creí haberlo matado, y estaba por verificarlo cuando sonó el teléfono, que era un fijo pegado a la pared.
"""
—"Hola"
—"Hola buenas tardes, ¿ya llegó el mensajero con la joya?"
—"No sé de qué me habla, es la segunda vez que me hablan al respecto"
—"Ah, disculpe, me equivoqué de número", dijo una chica del otro lado del teléfono.
"""
Sabía que la llamada estaba relacionada con este suceso, pero no sabía cómo. Fui a buscar al manipulador, pero en ese momento entró un chico a la recamara para buscar su teléfono. No quería que viera que había matado a alguien, y fingí estar ahí como si nada. El chico estaba como distraído, absorto, encontó su teléfono y salió del cuarto.
En ese momento me encontré en el pasado, caminando por un parque con otros amigos y el manipulador. "¿Qué tiene que ver la llamada contigo?" le pregunté. "Es mi hermana, cuando sabe que algo malo me ha pasado, me llama para confirmar que esté bien". Entonces supe que no había manera de contestar correctamente a esa llamada, el hecho de que contestase yo era la indicación de que había un problema.
Me desperté con la sensación de que el manipulador aún no había sido eliminado.
“No one can make you feel inferior without your consent.”
“Do one thing every day that scares you.”
“Do what you feel in your heart to be right – for you’ll be criticized anyway.”
“You gain strength, courage and confidence by every experience in which you really stop to look fear in the face. You are able to say to yourself, 'I have lived through this horror. I can take the next thing that comes along.' You must do the thing you think you cannot do.”
“The future belongs to those who believe in the beauty of their dreams.”
“The purpose of life is to live it, to taste experience to the utmost, to reach out eagerly and without fear for newer and richer experience.”
“It takes courage to love, but pain through love is the purifying fire which those who love generously know. We all know people who are so much afraid of pain that they shut themselves up like clams in a shell and, giving out nothing, receive nothing and therefore shrink until life is a mere living death.”
“No matter how plain a woman may be, if truth and honesty are written across her face, she will be beautiful.”
“We are afraid to care too much, for fear that the other person does not care at all.”
“To handle yourself, use your head; to handle others, use your heart.”
“Beautiful young people are accidents of nature, but beautiful old people are works of art. ”
“If someone betrays you once, it’s their fault; if they betray you twice, it’s your fault.”
“Do not stop thinking of life as an adventure. You have no security unless you can live bravely, excitingly, imaginatively; unless you can choose a challenge instead of competence.”
“Happiness is not a goal...it's a by-product of a life well lived.”
“It is not fair to ask of others what you are not willing to do yourself.”
“You have to accept whatever comes, and the only important thing is that you meet it with the best you have to give.”
“A mature person is one who does not think only in absolutes, who is able to be objective even when deeply stirred emotionally, who has learned that there is both good and bad in all people and in all things, and who walks humbly and deals charitably with the circumstances of life, knowing that in this world no one is all knowing and therefore all of us need both love and charity.”
“Never mistake knowledge for wisdom. One helps you make a living; the other helps you make a life. ”
Mark, it sounds like you're honing in on "alignment" which is something that I think is one of the most important aspects of individual development. The tracker you described in your article is interesting not for the data itself, but because it demonstrates your own "humanness" if that makes sense. If I am reading into it correctly it seems that even when all the boxes were marked, it still felt like there was something missing, the "higher level" you mentioned.
I'm curious to know in each of the states you described, let's call them function (conscientious-dilligent-consistent) and flow (flowing-spontaneous-intuitive), where you feel like you are drawing the energy from? What part of yourself is fueling each of these states of being?
On Mon, Jun 22, 2020 at 7:23 PM Squarespace <no-reply@squarespace.info> wrote:
Name: Mark MacKay
Email: mark@method.ac
Subject: Improve
Message: Hi Keith, I came across the /improve link at the bottom of your newsletter. I'm most definitely interested in having this conversation, as I've been on this life track for about seven years by now and I feel we are on common ground.
This is something I wrote five years ago https://medium.com/@duopixel/the-qualified-self-7f69c6b23623 but my approach now has evolved (oriented towards maximizing flow rather than holistic development and task completion), but this was necessary at that time.
I feel I've mastered both approaches separately, I'm a functional "human appliance" who can complete tasks without attachment, and I'm also a functional "human with a soul" who moves through flow and intuition, but I have not been able to transcend this duality. There must be a higher level, where one can be both flowing-spontaneous-intuitive as well as conscientious-dilligent-consistent, and here is where I would like to begin the conversation, if you are willing.
Peace,
(Sent via Intellect Optional)
---
> If I am reading into it correctly it seems that even when all the boxes were marked, it still felt like there was something missing, the "higher level" you mentioned.
Yes, during this time I was healthy but unhappy. Then I discovered my sense of lacking and satisfaction, represented from red to green, was folly, so begun registering action and flow, and that was much more aligned with my intuition of truth.
The latest one I finished a couple of days ago, and is more a work of naive art. I drew a mandala with 32 divisions representing days, and on each day painted four or five scenes or symbols representing actions. So you may find a logo of a project I worked on, a nice dinner I had with my family, an incident that caused a significant impression, and such. Then, in small polygons, there's codified information representing information from my environment and my home (water/water, gas/fire, electricity/air, land/earth).
I tried incorporating functions (exercise, chores, etc) but I sensed a violent contraction in the nature of what I was doing, and stopped trying to "do" things. It was throughly enjoyable but there's an undenaible decline in function when I pursue the more meaningful aspects of life.
{{image.png}}
I didn't begin this response with the intention of placing the conversation around the virtuegraph, but your questions help me gain clarity as to what I am discovering in myself through these works of art, which is how I see them now.
When I finished this one, I felt the impulse to put "my life back on track" with a virtuegraph oriented towards function. But I had to admit to myself: I do not know how to tackle function without the sense of lacking yet.
I boil down this stream of thought to a single question: how do you tackle function without a sense of lacking?
> where you feel like you are drawing the energy from? What part of yourself is fueling each of these states of being?
Inspiration, curiosity, alignment of intention and action are what fuel flow. What fuels function? Good question. The inner judge, the one who thinks dropping exercise for the duration of the quarantine is not satisfactory, while the other side says "fuck that, that was an inspiring month!"
I think your second question helped me answer the first.
If I'm not mistaken I have arrived to the crux of the issue:
What is the energy source for function which does not cause a sense of lacking?
---
Keith,
I pondered upon the question and I find that I no longer need an answer. I have forgotten what I already knew (a common pattern in personal development, I don't understand well why, but it seems we have a regression in order to live through a progression).
The source of function comes from embodiment of The One. I must resume contemplation in order to manifest function. The judge is the ego, and it is folly to let him whip you for not being functional.
This appears to be true, but will be experienced in practice. This I will do on my next virtuegraph cycle.
If you are interested in keeping the conversation flowing, I will write to you at the end of july with my experiences.
If you feel the reason for us to have this conversation has run its course, I am equally grateful to the liberation you help accomplish, which I do not understand very well yet, but I can't help but admire.
Peace,
--
Keith Walkiewicz
6:41 PM (2 hours ago)
to Mark
Mark, first of all, that mandala is beautiful. A very creative and artistic way to map out one's experiences. I'm not sure if you share your artwork widely, but you should.
Second, I'm glad that you rediscovered an answer that you had already known, perhaps with slightly new eyes this time. Funny how that works sometimes, we can become sidetracked by ourselves and forget the powerful, obvious answers we have already developed. I can't say that I really helped haha, it seems that the answer you've been looking for was already right under your nose.
Let me know how July goes and if you come upon a greater alignment between flow and function. I'm curious to find out how well you are able to keep the two intertwined, as this is something I have trouble with as well.
All the best,
Keith
Hola José Luis,
Mi nombre es Mark, nos conocimos hace algunos meses en el ascensor de Reforma 369, yo trabajo en Cabify, dos pisos más arriba. Para refrescar la memoria: en el elevador te pregunté si tú practicabas meditación, te dije que te conocía de ahí y te disculpaste por no reconocerme.
No esperaba que me reconocieras, pues sólo te vi una vez (hace alrededor de un año) en el Centro Budista de la Roma, yo no voy ahí regularmente pero ese día tu persona se me quedó muy grabada. Luego de mucho tiempo te vi en el ascensor con un libro de Richard Feynman, y luego que me enteré que trabajas en Nihao te encontré en LinkedIn y vi que has trabajado desarrollando software en Microsoft.
He buscado la ocasión de charlar nuevamente contigo pero no he encontrado la oportunidad. Para ser completamente abierto y honesto contigo, es una intuición que entender tu camino me ayudará a caminar el mío. La búsqueda espiritual con una mente racional ha sido, en mi experiencia, muy doloroso. Sé que no hay respuestas fáciles y que mucho del progreso implica trabajo, pero escucharlo de alguien que lo ha hecho antes me sería de mucha ayuda en este momento.
May I close my eyes once again
Take a deep breath,
I look inside myself,
Emptiness, Openness, serenity?
Or
Despair, boredom, loneliness?
In English [[Interview with John Laing]]
<img alt="laing.jpg" src="https://method.ac/writing/uploads/laing.jpg" width="200" height="267" class="mt-image-none" style="float: left; margin: 0 16px 16px 0;" />Hace un par de años tuve la fortuna de llevar una clase con uno de los mejores maestros que he tenido: John Laing. De esas pocas personas que tienen tanto vocación como talento para la docencia. Le hice una entrevista que nunca saqué de mi computadora, así que allí tienen, material nuevo (aunque no tan fresco).
John Laing es maestro en Ravensbourne School of Design and Communication en Londres. Es autor de tres libros, incluyendo "Do-It-Yourself Graphic Design" y es co-autor de "Encyclopedia of Signs and Symbols", aunque modestamente afirma que no está muy orgulloso de ellos. En esta entrevista nos habla de sus opiniones respecto a la educación, al diseño gráfico y de información, a la cultura y a la sociedad. Ésta se llevo a cabo en la Universidad de las Américas-Puebla donde tuvimos el honor de tener al profesor Laing como maestro invitado para el curso de "Historia del diseño de información" durante el mes de marzo (2002).
''John, encuentras alguna diferencia significativa entre los estudiantes mexicanos y los estudiantes ingleses?''
No. Es curioso que lo preguntes, porque Alejandro [Brizuela, Jefe de Departamento] me lo preguntó el otro día, y le respondí que encontraba a los estudiantes irlandeses más difíciles que a los estudiantes mexicanos o a los estudiantes ingleses. No lo encontré -además del idioma- difícil en lo absoluto! Pero hay algo en los irlandeses que es muy difícil. Te lleva bastante tiempo entender cómo ven el mundo y su lugar en el mundo. Así que la primera vez que fui a enseñar a Irlanda fue un desastre total! No pude "leer" a los estudiantes hasta después de un tiempo. Así que la segunda vez que fui estuvo mejor, pero me llevó una visita antes de que comenzará a entender. No he encontrado el mismo problema aquí.
Encuentro a los estudiantes de aquí bien, buenas personas. El lenguaje da un poco de problemas, pero esa es mi culpa porque yo no hablo español. Bueno, todos hablan inglés razonablemente bien.
''Te consideras maestro o diseñador?''
Me considero maestro, sí. Mucho. Digo, era diseñador gráfico, pero por serios accidentes en la vida me encontré trabajando en el sector educativo. A diferencia de cualquier otra cosa, toma mucho tiempo aprender y hacerlo. Los primeros dos o tres años pensé en regresar al diseño gráfico, pero seguía en la educación. Es entonces que el "gusanito" me llega y encuentras algo muy valioso en la educación. Así que decidí quedarme. He hecho algunas cosas (quiero decir, hago). A través de los años he hecho trabajos de diseño así como enseñar, pero ahora me dedico más que nada a enseñar.
''Y siendo el diseño una disciplina tan diferente a otros campos del saber (como las matemáticas o las leyes), enseñar diseño es diferente a enseñar otras disciplinas?''
Creo que hay algo muy especial en la enseñanza del diseño que no se aplica realmente a las matemáticas, a la química, a la ingeniería y me va a llevar un rato explicártelo.
Creo que el diseño gráfico usualmente se enseña bastante mal, creo que se trata más de enseñar a vivir. He encontrado difícil llevarme con mis colegas, porque yo tengo una visión del diseño que ellos no tienen. La mayor parte de la gente que enseña diseño gráfico piensa que se trata sólo de enseñar diseño gráfico: enseñar tipografía, enseñar in poquito de esto y de lo otro. Fin del tema. Pero creo que hay mucho más -existe más potencial- en el diseño gráfico que la mayor parte de los cursos alguna vez han enseñado.
Permíteme explicar lo que quiero decir. Si tú y yo hubiéramos vivido en Grecia la Grecia Antigua digamos... 500 años antes de Cristo. La base del pensamiento- no la educación, en esa sociedad -la sociedad griega- hubiera estado basada en las matemáticas, la filosofía (digamos). Así que todo lo que recordamos de esa sociedad en la Grecia antigua proviene de los filósofos y de los matemáticos. Ellos construyeron los cimientos de todo lo que sucedió en Europa, Europa Central. Esto por supuesto se detiene. Por un periodo largo de tiempo la sociedad no estuvo condicionada por la filosofía o las matemáticas, sino por la religión.
Es sólo con el Renacimiento en Europa que en el siglo XIIV y XIV que el conocimiento griego, la enseñanza griega, el aprendizaje griego se redescubre y la sociedad europea mira hacia el frente. En Inglaterra, los años entre los 1500's y el 2000, o digamos los 1900's podríamos decir que la cultura prevaleciente era la literatura. Para muchas otras personas Inglaterra es renombrada por sus escritores. Para Alemania podríamos decir que era la música, tenemos a Bach, Mozart.
Pero creo que con el advenimiento del siglo XX sucede el cambio, creo que la gente no lo ha comprendido, o no lo ha comprendido lo suficiente. Dos cosas sucedieron: una es la explosión de la ciencia. En medio de esto está la segunda cosa, que es el nacimiento de la comunicación en masa. Esto me regresa al diseño del diseño gráfico. En el pasado, el pasado lejano, dije que la educación estaba basada en la filosofía y las matemáticas. En el pasado menos lejano estuvo basada en la literatura y la filosofía.
Pero creo que en el siglo XX todo ha girado. De verdad, el lenguaje de nuestro tiempo es la ciencia y la tecnología, y no creo que hayamos entendido esto bien. Recuerdo haber enseñado, hace veinte años. Mis estudiantes de diseño, en su primer trabajo les pedí estudiar el trabajo de Albert Einstein. Algunas veces les pregunto quién creen que sea el artista más grande del siglo XX. Dirán Picasso, o Matisse, o algo similar. Yo creo que el artista más grande del siglo XX fue Albert Einstein. Si defines a un artista como alguien que amplía el entendimiento humano (no es que Picasso no sea buen pintor, es un pintor grandioso), pero en comparación con Einstein, Picasso es una figura menor porque Einstein engrandeció enormemente el entendimiento del mundo en el que vivimos.
Podría haber otra persona cuyo nombre no sale muy seguido, aunque lo utilizamos muy a menudo, y ese hombre es Edwin Hubble. Recordamos a Edwin Hubble por el telescopio Hubble. Fue Hubble quién notó por primera vez que la Vía Láctea es sólo una galaxia entre millones, billones. Esto engrandece nuestra visión del mundo, casi sobrepasando nuestro entendimiento. Ahora bien, me parece que no hay nada hoy en día que un pintor pueda hacer, que si quiera comience a compararse con la enorme gracia que hay en la ciencia.
''Pero entonces tendrías que definir arte como la expansión del entendimiento humano...''
Bueno, continúa expandiendo el entendimiento humano. Podríamos decir que las artes visuales se remontan a 50,000 años atrás. Había pinturas en las paredes de las cavernas, y ves esas pintura y reconoces las cosas que aquellas personas estaban pintando. Puedes reconocer paralelos entre eso y las cosas que ves hoy. Probablemente no tanto que ver con pintar personas como pintar animales. Y ciertamente a través de toda la historia del ser humano, la pintura siempre ha estado allí. Pero la teoría de la relatividad no siempre ha estado allí. La teoría de la relatividad tiene menos de cien años, y ha venido a cambiar el mundo. No es que quiera denigrar la importancia de la pintura, no lo hago, todavía es importante. La literatura todavía es importante, la música todavía es importante. Pero lo que ha cambiado nuestras vidas ha sido la física, y en la segunda mitad del siglo XX podría decir que lo que ha cambiado nuestras vidas y la sigue cambiado hoy es la biología.
Comenzó en los 50's cuando Francis Crick y James Watson descubrieron el ADN. Esto es incomparablemente más importante que la pintura de Picasso, Guernica. Una gran pintura, un gran mensaje. Pero el descubrimiento de la estructura del ADN es masivamente más importante, y va a afectar a todos aquellos que viven el planeta. Ya afecta a muchas personas que viven el planeta.
Así que mi visión del diseño gráfico y la educación del diseño gráfico es que los diseñadores gráficos son lo suficientemente afortunados -regresamos a los que habíamos hablado hace unos minutos: el nacimiento de la ciencia y la tecnología y la comunicación en masa- ahora, a los diseñadores gráficos se nos ha dado, de alguna manera, la oportunidad de moldear la comunicación en masa. Este es un regalo sorprendente. Se nos da la oportunidad de ser responsables por la comunicación en el mundo. Pero que es lo que los diseñadores gráficos piensan de ello? Sólo piensan en el diseño gráfico, no piensan lo suficiente respecto a la responsabilidad a la que podrían tener acceso: comunicar.
Así que estamos en la posición de comunicar gente, especialmente en los países pobres del mundo; información esencial acerca de medicina y salud. Ese es sólo un ejemplo, probablemente uno obvio. Pero nunca he conocido a un diseñador gráfico al que le pregunte "Qué es lo que haces?" y no me conteste, "Soy un diseñador gráfico". Nunca me dice "Bueno, mi pasión es mejorar el entendimiento de la gente respecto a la salud y a la medicina". Siempre me dicen "Bueno, estoy enamorado de la tipografía" o "No es la Apple Macintosh una computadora maravillosa?" o "Has usado el Photoshop 6?". Como ves, no existe atención suficiente la verdadera razón de ser del diseño.
Lo interesante de un auto no es si es un Ferrari o un Volkswagen. Lo interesante es que te lleva de A a B muy eficientemente, muy rápido y con múltiples opciones de destino. No es como un tren en el que llegas a A y luego llegas a B. Con el automóvil tienes libertad. Pero por supuesto, la mayor parte de la gente piensa en los autos no de esa manera, sino en "Oh, quiero un Ferrari, no un Volkswagen". Están más interesados en el auto que en lo que el auto puede hacer por ellos. Y pienso que lo mismo sucede con el diseño gráfico, están más interesados en el diseño gráfico que lo que el diseño pueda hacer -no por ellos- si no por millones y millones de personas.
Así que creo que los diseñadores gráficos deberían de comenzar a pensar qué es lo que pueden hacer por la gente. Deberían de pensar en lo que podrían hacer por nosotros en lugar de estar fascinados por la tecnología, digamos. O no sólo la tecnología, pero la técnica. Digo, la tipografía es una cosa hermosa. Hay muchas cosas que leer, por supuesto, y siempre es mejor leer un libro bien diseñado a un libro mal diseñado. Pero cuantos diseñadores de verdad leen el libro? Sólo lo diseñan.
Antes de que la computadora llegara, antes de que la Apple Macintosh llegara, la cual me apresuro a notar es un pequeño milagro; las Apple Mac son tan maravillosas. Pero antes de eso, lo cual es qué... Diez, quince años, digamos. Antes de ese tiempo los estudiantes a los cuales yo enseñaba no tenían acceso al texto y a la composición tipográfica. Tenías que dibujar líneas paralelas para indicar dónde se supone que el texto iba a ir. Los estudiantes no pensaban en el texto que conformaría esas líneas, así que nunca pensaban en el mensaje. Veían una revista o un libro y veían las áreas de texto como áreas de gris, sin identidad. Cuando enseño tipografía, siempre digo que la cosa más importante de la tipografía es el lenguaje. La tipografía existe para hacer al lenguaje funcionar mejor, no lo contrario. Esto esta muy de moda, al menos muchas personas lo encuentran muy de moda. En América algunas personas no tienen interés alguno en la legibilidad...
''Carson y Brody...''
Si, exáctamente. Te sabes los nombres. Para mí no es tipografía, es una manera de pintar. Pero ciertamente no es comunicación gráfica. La tipografía en el contexto de la comunicación gráfica es comunicación, no arte. Esa es la diferencia.
Retomando el tema de los diseñadores gráficos siendo manipuladores de la comunicación en masa, no es un poco destructivo que tengamos el poder de manipular la comunicación en masa, en específico la publicidad?
No estoy hablando de diseñadores gráficos manipulando. Estoy hablando de diseñadores gráficos afectándola. Pero, en una suerte de analogía, se da el caso en el que vemos el staff de una revista y la persona más importante es el editor. Nunca es el diseñador. Ahora, porqué no? Si los diseñadores, no los art editors, fueran -no inteligentes- sino lo suficientemente educados, lo suficientemente responsables, serían personas calificadas para ser editores. El editor es consciente de las palabras. El editor es consciente del significado. Pero sólo el diseñador es consciente de la interacción entre la información verbal y la información pictórica. Por lo tanto, el diseñador tiene un mejor concepto que el editor en cuanto a lo que contiene la revista.
Pero la mayor parte de los diseñadores no quieren esa responsabilidad. En parte porque -No sé como sea la educación secundaria aquí en México- pero se que en Inglaterra, si quieres hacer una carrera en artes, generalmente es la gente no tan brillante las que estudian artes. Así que crecen con este sentimiento de inferioridad. Me gustaría ver a los niños conscientes de que las artes visuales son muy importantes. Claro que conozco músicos que dirían que en música es aún peor! Nadie piensa que enseñar música (en Inglaterra, aquí en México podrían estar mas iluminados), pero en Inglaterra es muy difícil encontrar música como parte de los cursos de educación secundaria. Y es sólo a manera de disculpa es que podemos encontrar allí a las artes visuales.
Así que tenemos una tendencia de recibir en las artes visuales a los menos capaces intelectualmente, y siempre se les ha hecho sentir los segundos mejores. Así que el uno o dos por ciento de esos niño que tal vez quieran estudiar diseño gráfico todavía tienen ese complejo de inferioridad y vacilan en aceptar grandes responsabilidades. Creo que es allí donde tenemos problemas. El sistema educativo no opera en nuestro favor. Ya deshierba a la gente para cuando tienen trece o catorce años, y creo que es una gran pena. Creo que todo maestro debería de ser un diseñador gráfico. En el sentido del título con una d minúscula y una g minúscula, porque transmitir imformación pictóricamente en enormemente importante, al igual que hacerlo verbalmente. Digo, niños pequeños, niño de cinco años, dibujan naturalmente. Para cuando tienen doce, trece o catorce lo han perdio porque la educación ha favorecido en lenguaje verbal, no el lenguaje visual. Así que realmente perdemos una oportunidad maravillosa.
''Los diseñadores son responsables de ampliar las oportunidades cognitivas de la gente?''
Sí, creo que los diseñadores gráficos deberirían estar preparados para aceptar más responsabilidades. Si lo hicieran sus vidas serían enriquecidas enormemente. Digo, los presidentes de las naciones se pondrían en contacto con los diseñadores gráficos y dirían "Oye, que es lo que debería hacer aquí?". Lo cual al momento es impensable! Los presidentes de las naciones obviamente tienen a sus consejeros, pero los consejeros probablemente están educados en filosofía, literatura o historia. Pero la simple idea que la eduación de alguien pueda ser reconocida por el presidente como "el sabio" o "la persona sabia", "esa es la persona con la que quiero hablar". Quiero decir, tu y yo nos reímos de esto, porque dista tanto de la realidad. Pero no veo razón alguna por la que no deba ser. Pero los diseñadores gráficos tienen que hacer la movida, nadie más lo va a hacer.
La razón por la que los historiadores son tan importantes es porque hablan acerca de los grandes eventos en el mundo. Deben de ser importantes. La razón por la cual Shakespeare es importante se debe a que hace un planteamiento muy profundo acerca de la condición humana. Podría ser lo mismo para el diseño gráfico.
''Y retomando todos estos conceptos acerca del rol del diseñador gráfico. Piensas que el término diseño gráfico todavía es apropiado para lo que hacermos?''
No, probablemente no. Otra vez, acabo de mencionar las cualidades que un diseñador gráfico debería de tener. Y ciertamente, a los estudiantes con los que he trabajado, siempre les digo que escribir es tan importante como dibujar. Si estás diseñando algo que explica, como explicar cómo las aves emigran desde el Ártico hasta México, digamos; es tan importante saber como escribir una historia como saber dibujar una historia. No, no los llamaría diseñadores gráficos, los llamaría diseñadores de información. Pero no en la manera en la que los diseñadores de información piensan acerca de sí mismos. Un diseñador de información realmente deberá de tener la información en su totalidad. Así que no, no pienso que se debería llamar diseño gráfico, debería llamarse diseño de la información o diseño de la comunicación. Mensajeros de la información, realmente, lo cual es un prospecto muy bonito, una posición muy poderosa.
La profesión del diseño gráfico no hace mucho por ayudarse a sí misma. Conozco a muchas personas que "chismean", de la manera en la que yo lo estoy haciendo en este momento -No estoy siendo presuntuoso, es sólo que no están viendo- Sabes, hay un escritor inglés llamado Thomas Carlyle, quien dijo que el estudio apriopiado de la humanidad es el hombre. Es algo fácil de decir pero también es algo profundamente cierto.
Creo que cuando estás tratando con la comunicación, ya sea comunicación gráfica o de cualquier otro tipo, esa comunicación es entre un ser humano y otro ser humano, por lo tanto, una comparación fundamental debe de ser cómo el hombre funciona. Los estudiantes de diseño gráfico no tienen la menor idea de cómo trabajan nuestros ojos, o cómo los ojos se conectan al cerebro y cómo se lleva a cabo el proceso visual en el cerebro. No saben nada acerca de antropología, ni de la historia lejana de su propia especie!
Ni se diga de la antropología social o cultural. Estos son los cimientos apropiados del diseño gráfico, no la tipografía ni la composición visual. Estas son importantes, pero deberían de estar puestas encima de los cimientos, los cuales son mucho más fundamentales. Por lo tanto necesitamos saber cómo funciona nuestro cerebro, lo cual es la escala más grande para la historia del ser humano. Necesitamos saber acerca de la sociedad humana y cómo funcionan las sociedades, la diferencia entre un tipo de sociedad y otro tipo de sociedad, y si el capitalismo es en realidad un sistema lo suficientemente satisfactorio.
Sabemos que el capitalismo es un sistema imperfecto, y sabemos el comunismo es un sistema profundamente imperfecto. Por otro lado, sabemos que hay algunas buenas cosas del comunismo porque se interesa mucho más por el individuo promedio que el sistema capitalista. Así que debería de haber un estudio de los diferentes modelos de la sociedad.
Un deseñador debería de ser un consejero además de ser simplemente un mensajero pasivo. Debería de estar más activo respecto a la dirección que toma la sociedad. La mayor parte de los diseñadores gráficos en Inglaterra -Supongo que lo mismo sucede aquí- se vuelven diseñadores gráficos de profesión.No veo razón por la cual, como les dije a mis estudiantes, no se debieran de volver ministros del gobierno, o tal vez el Primer Ministro.
Por qué no? Probablemente a él se le educó en historia inglesa antigua! Probablemente sabe acerca del lenguaje Anglo-Sajón antiguo. Pero sabe algo acerca de la comunicación? Probablemente muy poco. Probablemente no sabe nada acerca de Albert Einstein o la ciencia. En otras palabras, estas personas saben muy poco acerca de lo que es relevante a nuestros días. Así que pienso que hay un camino a través del diseño gráfico, no necesariamente en diseño gráfico. Pienso que la educación en diseño gráfico le debería de dar a alguien la suficiente educación de hacer lo que sea.
Me encontré con un estudiante hace ya algunos años, pasaba por la parada del autobús. Vi a esta persona y le dije "Jared, súbete", y me dijo "No me llamo Jared, mi nombre es Dunstan" - "Pero de qué estás hablando" le dije, "Te llamas Jared". Me dijo "No, me cambie el nombre, me llamo Dunstan", y le dije "Por qué?" - "Porqué me volví monje". Y lo había hecho. Bueno, sólo era un trainee en ese momento, pero lo volví a ver unos cuantos años después y estaba completamente vestido como monje, se había vuelto monje. Y pensé "Que maravilloso!", que una persona haya sido educada en diseño gráfico, que la educación que recibió haya sido un trapolín para vivir su vida en una comunidad religiosa. Porqué no? Y me gustaría ver mucho más de eso. De alguna manera la mayor parte de los estudiantes de Alejandro se van a dedicar al diseño gráfico, sí. Pero debe de haber oportunidad para el que quiera hacer algo diferente. "Creo que he tenido la sufiente educación aquí como para hacer algo diferente", por que no.
La otra cosa que dije fue que el mayor problema con el diseño gráfico son los diseñadores gráficos. Es realmente difícil para nosotros avanzar, porque tenemos una visión muy restringida, este horizonte de esperanzas muy bajo. Pienso que debería de ser tan alto como la montaña en el horizonte [John señala al Popocatéptl a través de la ventana], no una montaña a dos o tres millas de distancia. Deberiá de estar muy lejos, en lo alto del cielo.
''Piensas que este movimiento, el diseño de información, o como le llamas tú: diseño gráfico más allá del diseño gráfico, está ganando terreno?''
No lo sé. Ese es otro problema de nuestros tiempo. Como lo dije antes. Los canales de comunicación están llenos de pura basura. Sin querer ser melodramáticos, sí pienso que la gente, los niños, están siendo moldeados por las grandes empresas. Tú sabes, McDonalds, Coca-Cola o General Motors, las multinacionales. Obviamente tienen la intención de que la gente compre sus productos. La televisión y los medios siendo controlados por CNN, Sky y todo eso. Es difícil ver como los niños van a recibir la variedad de oportunidades, la variedad de productos, sólo van a tener tres o cuatro productos y no van a saber acerca del vasto número de productos que tienen.
Así que este no es un problema de la educación en el diseño gráfico, es un problema global de educación social. Vemos las señales de desorden cada vez que se reunen los líderes de las naciones de los siete grandes en varias partes del mundo. Pienso que la violencia no es el camino correcto, pero probablemente es lo que estas personas quieren, una voz diferente, una actitud diferente.
Hay un debate muy importante ahora en Inglaterra, de Monsanto, la cual está involucrada en la manipulación genética de alimentos. No sé suceda lo mismo en México, vi algo en las noticias el otro día. Monsanto es una multinacional, la cual no se va a quedar con los brazos cruzados para obtener una ganancia de los alimentos modificados geneticamente. Ahora bien, no lo están haciendo por el beneficio de la humanidad, lo están haciendo por el beneficio de sus accionistas. Pienso que los alimentos genéticamente modificados le van a hacer un gran beneficio a la humanidad. Las cosechas que antes fallaban no van a fallar en el futuro. Pero no creo que Monsanto lo esté haciendo por razones altruístas, sino por razones económicas, y creo que hoy eso es lo que dirige la mayor parte de la actividad en el planeta. Así que no hay suficiente dinero para las obras de Shakespeare en el radio, así que recibes música pop, aunque Shakespeare es infinitamente más importante. Pero, esto es el progreso.
''Entonces cómo podemos cambiar esta faceta de la sociedad? Hay algo que podamos hacer?''
Pienso que lo podemos cambiar a través de la educación. Por eso trabajo en la educación. La gente me dice "A qué te dedicas John?" y yo les respondo dos cosas: "Trato de hacer pensar a la gente" y la otra cosa que digo es que trato de motivar a la gente a ser ellos mismos. Y pienso que a es a través del proceso, la misma idea de liderazgo político, con la cual tengo muchas objeciones. No se escogen figuras para manejar la sociedad. De alguna manera tienes que educar al máximo para que compartan objetivos comunos.
Ninguno de ellos se tiene que volver mártir. Es mejor vivir humildemente por una buena causa que morir noblemente por la causa incorrecta. Así que la educación problablemente sea la cosa más importante en este mundo. Probablemente sea más importante que la ciencia médica, por el principio que acabo de mencionar. Sólo ve a Estados Unidos, todo mundo quiere parecer de veinticinco, y todos son tan infelices, porque no tienen control. No tienen influencia sobre el mundo. Así que pienso que la educación es la cosa más importante del mundo, y para que la educación funcione correctamente necesitas una hoja en blanco. La mente de la persona a la que vasa educar necesita estar limpia. Su maestro probablemente necesite hacer las primeras marcas, pero enctonces se les da el papel y ellos escriben su propia vida.
''Estás de acuerdo con la educación temprana?''
Quieres decir niños pequeños?
''Sí, niños pequeños.''
Pienso que la educación de niños pequeños es la más eficiente del sector educativo. Probablemente por las razones equivocadas. La mayor parte de los maestros de educación primaria son mujeres. La mayor parte son madres. La mayor parte de las mujeres aman a sus bebes y niños pequeños. Probablemente lleven sus instintos de madres a la enseñanza, lo cual es grandioso. Como hombre, debería de ser en parte un padre para mis estudiantes, como alguien que les enseña habilidades, lo cual debería ser algo que yo pudiera dar, lo cual proteja, por que soy más viejo. Así que pienso que una gran parte de la educación primaria es maternal, lo cual es muy propio, en cierto sentido. Así que pienso que la educación primaria es la mejor, por una especie de accidente.
Pero la educación secundaria es un pantano. Detestaría trabajar en la educación secundaria. Simplemente no sería lo suficientemente fuerte. Me siento con tanta suerte por trabajar en la educación superior, porque hablando relativamente, es fácil. La mayor parte de la gente a la que enseño está en la universidad porque quiere estarlo. La mayor parte de los niños de la eduación secundaria odian la escuela, muchos de ellos. Así que estás peleando con ellos todo el tiempo, es espantoso. En la educación primaria los niños son demasiado chicos como aprender a rebelarse. Aunque mi esposa es una educador de educación primaria, me dice que hay bastantes niños de siete años que son bastante rebeldes, pero no es lo mismo que econtrarte con un quinceañero frustrado y enojado. Hay muchos de ellos. Y existe otra faceta. Donde vivo en Londres hay mucha gente negra, el nivel de educación entre los negros es muy bajo, y hay una enorme cantidad de frustración. Hay mucho crimen.
La educación es de nuevo la clave; si vas a bajar el nivel de crímenes necesitas incrementar el prospecto de que la gente tenga la llave a una mejor educación. La población siempre crece, tienes a millones de personas creciendo. No todos podemos ser directores de arte. Alguien tiene que barrer las calles, alguien tiene que servir las haburguesas en los restaurantes. No creo que haya una solución fácil a este problema. No todos pueden ser muy ricos. Podría ser que la raza humana está destinada a la extinción. Así que si tú y yo viajáramos al futuro 50,000 años probablemente no encontraríamos más humanos. Quién sabe.
''Extendiendo el tema de la educación, cuantos años has enseñado?''
Cuantos años he enseñado? 30 aproximadamente.
''Has notado alguna diferencia entre todas estas generaciones que has educado?''
Sí.
''Cuál es la tendencia actual de los estudiantes?''
La tendencia más notoria es que su nivel de educación ha bajado.
''Bajado?''
Absolutamente.
''Me sorprende.''
No es sorprendente en lo absoluto. Bueno, no lo encuentro sorprendente en Inglaterra. Existe una tendencia de ofrecerle educación a todo el mundo, de deshacerse de la competencia, para que todo sea políticamente correcto. Terminas con una educación muy diluída. Yo creo que si un niño es muy inteligente, entonces le tienes que dar una educación que empate con su inteligencia, y si un niño no está dotado de una gran inteligencia, le tienes que dar a ese niño una educación cumpla con sus necesidades. Nunca van a ser filósofos, así que para qué tratarlos como filósofos. Es absurdo! Así que más gente está recibiendo educación, pero la riqueza de ella se ha perdido, se ha desplomado. Así que encuentro a mis estudiantes de ahora con un nivel mucho más bajo de educación de los que enseñé hace años. Me quejo de que yo tengo que hacer mucha de su educación secundaria; la tengo que hacer con ellos porque no saben nada! Son tan ignorantes! Y no son ignorantes porque sean estúpidos, son buenas personas. Son ignorantes porque el sistema no funciona de manera inteligente, está funcionado a través de un sistema de pago por habla. Están pagando por hablar de filosofía teórica foraml. Asi que, sí, es decepcionante, poruqe cuando se dan cuenta de que su educación ha sido limitada, deben sentirse frustrados. Si le preguntara a un estudiante hoy quién es Albert Einstein probablemente me respondería que nunca ha escuchado de él, mientras que hace veinte años hubieran sabido un poco de él, probablemente hubieran mencionado la teoría de la relatividad.
''¿Pero acaso la educación no es en parte algo que aprendes por ti mismo, te gusta algo y lo aprendes?''
Sí, pero hay algo que le digo a mis estudiantes, y eso es que es su trabajo hacerme redundante. Es su trabajo hacerme completamente innecesario, para que puedan hacer las cosas por sí mismos. Absolutamente. Pero si vienes de un ambiente de escuela secundaria, la cual es de muy baja calidad, la cual es muy ineficiente para lograr que los jóvenes se den cuenta de que pueden controlar sus propias vidas. Encuentro muy difícil lograr que se den cuenta de ello, no es que les falte voluntad: es sólo que no saben cómo lograrlo.
''Por último, ¿Se te ha hecho interesante México?''
Oh, fascinante, me asusta [se ríe]. Me asusta un poco, porque la mezcla social es tan extrema entre la pobreza y la riqueza extrema. Así que hay rareza, lo cual resulta ser absolutamente caótico [se ríe]. Una mezcla de riqueza y pobreza, la cual ha sido muy difícil, porque en Inglaterra los polos están mucho más cercanos entre sí, mientras que en México están mucho más separados. Pero la cultura mexicana me ha parecido fasicnante, y todas las persona que he conocido han sido muy agradables.
Aquí realmente no finaliza la entrevista, hubo una última pregunta. Le pregunté "Que opinas del departamento de diseño de la UDLA-P" y me contestó "Te digo pero apaga esa grabadora".
Espiral de la consciencia was a writing course given by [[Ana María González Garza|https://www.gonzalezgarza.com/]]
<<list-links "[tag[espiral]]">>
Yesterday a women’s strike took place in Mexico. It was called “a day without women”, to bring awareness to the murders of women in the country. The intention is that—by removing themselves from daily life—it is possible to understand the effect of their absence. When I was asked if I supported the strike I answered: mostly yes, with some reservations. When asked what were my reservations I couldn’t express myself clearly, so I set out to write an essay about it.
When I was in high school student in Mexico I worked selling scratch lottery tickets for the Red Cross at a nearby supermarket. I met a girl who worked there too and we started dating. She was a bit older (she lied about her age even though I couldn’t care less) and had just entered university in her early twenties.
At university she met another freshwoman about her age and they quickly became best friends. She was a very pleasant, attentive and shy woman, very much into her studies, which complemented my girlfriends outgoing personality.
Some months went by, and one night the mother of her friend called and asked if she was there, because she hadn’t arrived home yet and it was late in the night. My girlfriend’s intuition told her something very bad had happened, and after spending a sleepless night she raised early in the morning to search for her at the city’s morgue.
She described her friend to the attendant. Yes, he said, a woman with that description arrived last night. Would you like to identify her? Yes. It will not be pretty. Her face was disfigured from a blow with a hydraulic jack. I need to know if it’s her, show me.
She recognized the body laying on the stretcher as her friend’s.
Her friend lived far away and was left alone in the bus with the bus driver and his chafirete (assistant). They raped and murdered her. The police caught them disposing of the body but they couldn’t recover her handbag which had her id, so she was a Jane Doe.
Though I only experienced the funeral, it was harrowing. A terrible sadness was felt in the air, with ocasional screams: how could you have done this to her, bastards!. The experience of trauma is collective, and I found myself deeply affected by the event.
A week later my girlfriend told me that we should split up: a group of evil people had set a curse upon her, and all the people close to her would die. She had already lost another friend, and her intuition told her I was next.
I understood the complexity of the situation was beyond my meager experience at the time. I was in high school, with little understanding about life, and it seemed my girlfriend had gone crazy. Our relationship was already unstable as it was, and I took the easy exit. I told her that I wasn’t sure but I trusted her intuition and that it was best that we parted ways and not communicate with each other, for my own safety.
I dealt with the situation as cowards do: escape from the messy situation. But you have to be a strong swimmer to drag someone out of turbulent waters. I was not that person, and her outcome in life was positive, so I do not regret it. It had to happen that way.
However, the coward’s way could also be called psychological debt in honor of the technical debt found in complex codebases. Consistently not dealing with the situation will lead to an immature life, a form that does not want to crack open from his or her comfortable shell.
But life has its way of cracking shells open.
Two years ago I had notice of a female passenger had gone missing in a Cabify (the company I worked for) in Puebla (my hometown). I didn’t have to see the journey or gain any additional information: I knew what had happened. The driver had raped and murdered her, as I had experienced in the past. As my emotions cooled down I decided on some sanity, and not to pass judgement until I obtained further evidence.
The next day her body was found, proving my intuitions correct. She was raped and killed by one of our drivers, in my hometown. The event struck me like a lightning which nobody else saw, leaving me curled up in a corner reeling with pain. I felt echoes of my girlfriend’s psychotic break: I was tainted and carrying disgrace in my spirit. It was not her who was cursed, it was me.
The company seemed lethargic responding to the situation. In cases like this, the company’s priority is containing damage to their reputation, and the reaction is defensive rather than offensive. The attitude is not one of “how are we going to fix this?” it is “How are we going to minimize the effect of this tragedy”.
But nothing could contain what came next. Certain traumatic events seems to happen at a time when society is ripe to face them. Where decades earlier the murder had gone practically unnoticed by local media, this time the murder blew up at a national level, stirring demonstrations throughout the country.
I considered heading a charge to modify the containment attitude, and even sent an email stating my intention, but again, backed in cowardice at the moment of truth: I had to admit the circumstances were beyond my capabilities, and as things cooled down I hunkered back into day-to-day work.
The price: slipping into depression, coasted for a while, received bad peer reviews, tried changing teams to see if things went better (they didn’t) and finally admitted to myself and to the company that it was time to part ways in good terms.
I’m still living through the ripples of this event. Like the opening move on a billiard table, the white ball hits the rack of balls and sends off balls in all directions, the momentum of a single event cascades into a chaotic chain reaction in which the white ball is no longer moving, but other balls are in movement because of that first hit.
The mind seeks prescriptions in cases like this: what should I do so that this doesn’t happen again? How do I deal with this irrational guilt? How do I protect those close to me from these threats? In the thousands of kilometers I walked after I quit my job I came to the conclusion this kind of thinking is folly. I cannot save the world, or even those close to me. Restoring life is impossible, and anything I can do about this event pales in comparison with the loss. But then again, inaction seems to be the cowardly way.
I understood this one day while I was riding the subway in Madrid. An attractive young lady with a generous cleavage was in the semi-crowded car, distractedly checking on instagram. I observed a man oogling at her breasts, inching closer and closer for a better look as his peeping went unnoticed. I debated what to do: the situation was ambiguous enough so that raising a scene was out of place, yet I felt that if I allowed more time to pass, the scene would happen anyway.
What happened next was not out of my own will, thinking or courage, for I was not the doer of my actions: in a moment I found myself between the lady and the man, looking at the man into the eye, sternly. The man hunkered down, turned around and left. No other passenger witnessed the event that took place, not even the lady who was still very absorbed in her social media account.
The understanding was that I did not have to be a paladin of the cause to have a positive impact in this aspect of the world. In fact, in all the guilt-wrangling and inner conflict for being part of a company that allowed a tragedy to happen had been useless. We give ourselves impossible, gargantuan tasks because we dare not to address the immediate problems. Thinking big when it’s impossible to act big is also the coward’s way, because the responsibility of action is transferred to the government and then the solution becomes “the government should do this or that”.
This is the equivalent of the sports spectator, shouting at the coach to follow this or that strategy to produce a desired outcome. Wether his advice is sound or folly is irrelevant, because no amount of shouting will change the outcome. But we are not spectators of the world, we are players, and when the ball lands on our feet we must be swift and clear minded in our actions.
One must read the situation and act accordingly. Pretending the problem does not exist makes it resurface in different expressions. Blowing up the problem to proportions where one feels helpless about contributing to it leads to inaction. Rather than escaping through the excuse of immaturity or ineffectiveness, it’s better to take responsibility for fellow human beings, men and women, in whatever form and scale our current circumstance allows.
Surrender yourself humbly;<br />
then you can be trusted to care for all things.;<br />
Love the world as your own self; ;<br />
then you can truly care for all things.;<br />
Chapter 13 of the Tao Te Ching
My birthday is today.
I have the strangest sensation,
I don’t care,
and I care too much.
I’m turning 40, a decade.
When I was in my teens I thought I wanted to die at this age.
“There is no life after your thirties”, thought a naive teenager.
When I reached my twenties this milestone moved to my fifties. There was no life worth living after 50.
When I reached my thirties I realized that this game would continue be played, and that it was not worth setting an expiry date on my life.
As I come into the noon of life, I realize: It is good to think that one’s life is going to end in twenty years. Death’s humid breath is felt on the side of the neck, and you springs into natural action, doing what is necessary at the time.
“What is life after the chase for women and success?”, thought the teenager. I’m grateful to him, because he built the foundation of my professional career and gave me my first experiences of love.
“What is life after I reach my full potential?”, thought the twenty something. I’m grateful to him, because he provided me with a great skillset that has accompanied me during my career.
“What is life?”, this question begun in my thirties and I’m grateful to him, because he, Mark of 2014-2019 throughly explored this question. All those roads walked, all the paths taken, all that tremendous solitude that I lived in Madrid. The discovery of one’s soul and one’s spirit takes time. It was all worth it.
I don’t know what questions I will ask to myself in my forties, but as I step into this new book I already perceive the direction: stop trying to accomplish anything. Stop trying to be good. Stop telling yourself stories about yourself. Reduce your existential footprint to make way for creative expressions of the soul.
What I realize is: There are no questions left to answer. All idle thought is a waste of life. And yet, this essay itself is idle thought. Should I be liberated, I wouldn’t be writing this (at least not in this way). But the creative expression (of writing, of creating design games, of painting, of building a table, of tending for a garden) expands in such a way that no space is left for idle thought.
In psychological matters it never pays off to wage a war against any aspect of the self, and this includes idle thought. Should I try to banish idle thought, idle thought simply becomes the shadow. It is necessary to expand something so that idle thought reduces its grasp on existence.
But now I’m wanting to expand something in order to contract something. This is not the way. I look inside and observe: if every stage of my life has provided what I needed at that moment, it follows that idle thought is also needed at this moment. Expending effort in inward matters is folly.
I’m twelve hours into my forties and I’m already trying to resolve the problem of the decade. Patience.
En mis años adolescentes me subí al microbus de regreso de la escuela. Iba en los asientos del frente mirando por la ventana cuando un chico comenzó a cantar tocando la guitarra para pedir unas monedas. Cantaba bien, y luego de un rato de escucharlo cantar me volteé para verlo, pero lo que vi alarmó:
Estaba tocando la guitarra muy cerca de una chica en uniforme escolar que iba sentada, haciéndola visiblemente incómoda. Y no sólo eso! La miraba descaradamente y le cantaba:
"Te quero tanto tanto tanto tanto,
cada día un poco maaaaaaas",
La chica movía los pies de nervios y miraba por la ventana, evitando los avances del chico, pero esto sólo parecía incitarlo más, redoblando su apuesta romántica. Vi al resto de los pasajeros en la indiferencia o en el estupor cotidiano.
Apreté los puños, esperando al momento en que inevitablemente el chico pasaría de la raya, tocándola o diciendo algo inapropiado, pero el momento no llegó. El chico terminó su canción y pasó a recolectar monedas. Inmediatamente la chica se escabulló y bajó rápidamente del micro, el chico volteó y vio su huida, y fue tras de ella.
Ese era el momento! Me paré y corrí a detenerlo, pero me ganó bajándose del micro y yo tras de él, pero lo que vi me dejó con un pie al aire y el otro en el barandal: el chico llegó por detrás, tomándola de los hombros, ella volteó y lo empujó, pero juguetonamente, riéndose. Él la tomó de la cintura y le dio un beso. Ella la tomó de la cintura y él puso su brazo sobre su hombro, y se marcharon caminando abrazados.
Quedé estupefacto, no entendí cómo la pudo conquistar mediante ese descarado acoso. El microbus arrancó y subí a sentarme, confundido. Me tomó unos minutos entenderlo:
Eran novios!
Subieron juntos al microbus. No lo vi, pero daba igual, no lo hubiera notado. A la chica le daba pena que su novio cantara en el transporte público. Probablemente no se dedicaba a ello, sólo era un chico romántico molestón con su novia. Ella aguantó la vergüenza todo lo que pudo, luego intentó escaparse, y él salió tras de ella. Estaban jugando!
Este es un ensayo que escribí en el curso de escritura para el autoconocimiento, <a href="https://courses.blank.page/espiral-de-la-consciencia">Espiral de la consciencia</a>, impartido por la gran abuela, <a href="https://www.gonzalezgarza.com/">Ana María González Garza</a>.
El propósito del ejercicio era escribir nuestro credo personal acerca de la muerte.
---
Fui a Valencia un fin de semana, yo solo. Tenía poco de haberme mudado a España, por segunda vez. Alquilé una suite en la playa, pero era invierno y todo estaba vacío, a excepción de unas chicas guapísimas que estaban haciendo surf en el mar. Me acerqué sin mucha intención de hablarles, pero supongo que uno se acerca a ver si es bien recibido.
Me desvestí y cuando metí los pies al mar sentí que estaba congelado. Yo no sabía nada de surf y que sus trajes de neopreno las protegían del frío. Habrán pensado "que chico tan raro que se mete así", pero sólo era ignorante de las condiciones del mediterráneo en invierno.
Como no quería parecer cobarde, seguí avanzando y luego me sumergí hasta el cuello, y nadé un ratito haciendo como si nada, para que al menos pensaran "bueno, es raro pero sí que aguanta el frío", pero desistí a los diez segundos. El mar estaba demasiado frío para ocultar mi sufrimiento. Regresé a la suite humillado a descongelarme en la bañera, y luego resolví visitar la Ciudad de las Artes y las Ciencias.
Como quería conocer el casco antiguo, di el largo paseo entre la suite en la que me estaba quedando y la famosa obra de Calatrava. Las calles eran muy bonitas, comenzó a pegar el sol de medio día y por fin se me estaba calentando el alma. Las calles de Valencia están decoradas de naranjos que ofrecen sus frutos impecables a los transeúntes. ¿Pero cómo puede ser que nadie las haya recogido todavía, habrá multa?
En una privada discreta "robé" una naranja de apariencia perfecta. Ah, naranja valenciana. La pelé entera y saqué un gajo grande para saciar mi sed. Mi rostro se arrugó, era amarguísima! Se podía comer, pero no era placentero.
Creo que si cambiara la frase por "Se podía vivir, pero no era placentero" resumiría mi estado de ánimo en ese periodo. Había dejado atrás a la familia y amigos en México, y moverme a España había causado el rompimiento con mi pareja al darnos cuenta que no funcionaba a distancia, me sentía cansado de que la vida otra vez me agarrara de un lugar para colocarme en otro, pues me he movido mucho en mi vida y percibo cómo soy arrancado de raíz, y tardo un poco en pegar en tierra nueva. Como cualquier persona supongo. Estaba pasando por un duelo distinto al de la muerte.
Para aliviar mi dolor existencial, la semana anterior había asistido puntualmente a un grupo de biodanza avanzado en Madrid. Como regalo de cumpleaños a una de sus alumnas, el maestro le hizo una ceremonia de renacimiento. Me acordé de mi ceremonia de Minotauro que experimenté en Biodanza en México, hacía tan solo tres meses. Pensé: se supone que renací en ese Minotauro para escapar de esta nube negra, cómo es que la nube negra me encuentra renacido? El renacimiento tiene que pertenecer al género de la superstición, porque he vivido en carne propia un convencimiento de haber renacido, y luego parece que el ser renacido desvaneció poco a poco, y aquí me encuentro en la misma situación que antes.
Decidí poner mi mente en otro lado. Paseando por la obra de Calatrava vi un edificio en forma de casco que despertó mi curiosidad. Qué es eso! Ah, un planetario! Proyectarán las estrellas espero! Ehhh un documental de la mariposa monarca? Bueno, pues es lo que hay. Pedí unos nachos que sorprendentemente eran peores que los de Cinépolis en México, y me senté a ver la película.
Comenzó con la historia un niño que jugaba con mariposas en el campo los veranos, en Ontario, Canadá. Al crecer se empieza a intrigar por los ritmos de las mariposas, cómo es que llegan siempre en la misma época del año? y se da cuenta que realmente no saben ni de dónde vienen, ni a dónde van. Llegan a Canadá, se mueren, nace una generación nueva, y se van. Saben que tienen que tener un destino, pero dónde?
Con la ayuda de voluntarios comienza a poner etiquetas pequeñísimas en las alas de las mariposas, y logran convencer a la TV que presentaran su idea: cuanto te encuentres una mariposa con esta etiqueta, mándanos una carta y con el remitente sabremos dónde la encontraste! Y así la idea se expandió de forma viral, mucha gente se involucró ayudando a rastrear dónde habían encontrado las mariposas con etiqueta.
El chico emprende una investigación de varios años, en los que va recolectando ubicaciones de dónde le han enviado cartas. Algo sorprendente sucede: sobre el mapa se traza una línea entre Ontario y el sur de Texas, "tienen que seguir a México, sólo que no hemos pedido ayuda a los mexicanos y por eso no recibimos cartas de ellos", piensa.
Viaja a México para pedir ayuda a los Mexicanos, y como sucede con tantos Canadienses que vienen a visitar este país (como mi padre), no sólo se enamora del país, sino que ese enamora de una mujer mexicana naturalista guapísima y en su jeep se van a explorar los montes de México en busca del mítico lugar donde llegan las mariposas a hibernar, y aunque no encuentran pistas, no parece importarles demasiado, pareciera que el viaje es más una excusa para vivir un intenso romance que una expedición botánica.
Hasta que en una de esas exploraciones, recorriendo los montes boscosos de Morelia Michoacán, comienza a caer un aguacero que les deja el parabrisas lleno de... mariposas monarca! Su lugar de hibernación tendría que estar muy cerca! Se bajan del jeep y comienzan a ver los árboles. Ahí están! Parecen árboles de mariposa! Se abrazan emocionados.
La película termina en que son mayores y están casados. Las mariposas fueron una pasión de por vida, y todo eso que nos enseñan en Hollywood. La película me pareció cursi, pero agradecí poder poner mi atención en otra parte durante dos horas. Me levanté para irme. Salieron las escenas post-créditos, y aparecieron fotos de los personas reales detrás de los personajes de la película.
"Meh, seguro es una interpretación muy amplia de _basada en hechos reales_", pensé. Los nachos estuvieron tan malos que ni me los terminé. Resolví mejor buscar la mejor paella de Valencia, eso seguro me alegraría el ánimo.
Busqué en Google Maps y caí en un lugar acogedor.
"Viene a probar la paella?" me pregunta el mesero. "Sí!" respondo entusiasmado. "Espera a alguien?", "No, sólo soy yo", "Lo lamento, pero sólo tenemos paella para dos personas en adelante". "No importa, traigo hambre". "No se lo va a poder acabar". "Con todo el respeto, usted no me conoce", respondo con un guiño. "Bueno, si se lo acaba, el chupito va por mi cuenta", se ríe. "Hecho, y además tráigame esta botella" dije señalando al tinto más barato del menú.
La verdad es que el tamaño de la paella me decepcionó un poco. Llegué con hambre, y apenas tomé vino en lo que comía. Eché de menos el chorizo que le ponemos a la paella de mariscos en México, en España eso es tabú. Como me quedaba tiempo para terminar la botella busqué la historia que acababa de ver en el planetario. Pues resulta que sí eran hechos reales, seguramente endulzadas para el público, pero sí que la historia fue basada en hechos reales! Anda, que buena aventura se aventó ese chico! El viaje el héroe que había realizado ese hombre había culminado de una forma tan arquetípica que lo confundí con ficción! Ya han pasado a mejor vida, pero sus nombres son <a href="https://en.wikipedia.org/wiki/Fred_Urquhart">Frederick Albert Urquhart y Norah Roden Urquhart</a>.
"Pero si toda la historia no era una telenovela, tengo que reconsiderar y reinterpretar lo que vi en la película" pensé. Y la cosa más curiosa sucedió: repasando mis memorias de la película, vi una alegoría muy clara: la mariposa que emprende su viaje a México no es la que llega a Canadá. Emprende su viaje con un instinto de salir al norte, ni siquiera sabe su destino. Si tiene suerte, no se la comerán o morirá en el camino y llegará el momento en que tenga que detenerse para reproducirse y morir, sin lamentar no haber llegado a Canadá. El buscador que muere y renace psicológicamente lo hace para seguir su camino. El buscador renacido cuenta con nuevas herramientas y nuevos aprendizajes para continuar otro tramo, pero para llegar hasta el final de su vida? Eso sería cargar equipaje innecesario, o no?
Y sin embargo, la mariposa monarca, cuando llega a Canadá, se reproduce una última vez antes de morir. De esta última generación nace una "super mariposa" bastante más grande, fuerte y resistente que sus predecesoras, y esta vuela literalmente por encima nubes evitando los aguaceros que llevaron a su propio descubrimiento. Lo que llevó cinco generaciones recorrer a sus ancestros, esta lo recorre de un jalón. Y además: al llegar tiene que hibernar para madurar sexualmente.
Lo entendí: el renacimiento que había experimentado en biodanza era una mariposa muy bonita pero de las pequeñitas. Me transportó de México a España, y estaba muy bien equipada para ello, pero no está bien equipada para arraigarse aquí. Las mujeres españolas le parecen incomprensibles, carga una botellita de habanero en la bola que le echa a la tortilla española, y no sólo es ignorante de las costumbres y usos de este país, sino que le parecen ridículos. ¿Qué estaban pensando cuando colocaron naranjos de fruto amargo en la capital de la naranja?
Ya había leído (y entendido) que una vez que sufres depresión y te recuperas, es muy probable experimentar un episodio de nuevo más adelante. Racionalmente percibía que este cambio de país había hecho brotar nuevamente mi depresión, y que poco podía hacer mas que auto-contenerme y resistir, pero la comprensión de esta alegoría me permitió acomodarlo en el mundo interior como un proceso constante de renovación, y mi "lucha contra la depresión" se convirtió en un proceso más bien de duelo, de aceptación de las circunstancias y las emociones.
Desde esta alegoría entendí que moriría y renacería muchas veces más con un destino que no conozco, e intuí que en algún momento nacería una "súper mariposa" que haría el trabajo espiritual de cinco generaciones, y casi me alegré de estar deprimido. Significaba que el momento de morir se estaba acercando, y que este nuevo ser que emergería de mi muerte estaría mejor adaptado para lidiar con este cambio de ecosistema. Y luego esta moriría también, y el renacido continuaría el trabajo hasta cumplir su ciclo y así sucesivamente.
Volví algo borracho a la suite, y al siguiente día tomé el autobús a Madrid. No había cambiado mi estado de ánimo, pero sí había cambiado mi perspectiva. Me tomó semanas integrar este evento en apariencia tan sencillo, pero cuando terminé de hacer el trabajo interior, entendí que mi composición psicológica se desmoronaría cíclicamente provocando una especie de renacimiento o recomposición distinta a lo que era antes, pues con cada depresión hay una re-evaluación interior y de eso emerge una nueva forma mejor adaptada para lidiar con el mundo, y _esto_ era lo que estaba experimentando.
Y más allá de esto, entendí que mis muertes metafóricas no son sino ecos lejanos de la muerte que voy a experimentar, y si bien sigo teniendo un ego solipsista que perdura a través de estas muertes, cada vez que sucede distingo mejor lo que es eterno de lo que es temporal en mi. Este ego no se necesita una vez que que hayamos llegado a nuestro destino, y por lo tanto quedará esencia pura, la misma esencia de la que nos originamos, y nos reintegraremos con el todo.
> I was in therapy, and I was explaining my therapist the details of the issues I was working through. I paused, I took a deep breath, and said "you know what? I think all this is bullshit, I'm fine, I've done my work. All is resolved. Thank you for your help". The therapist stood up from her chair and walked to me, reclining until her face was in front of my face. She kissed me on the lips and said "Yes, you are right".
[[exploration.work|https://exploration.work]] will be the place where I post WIP. This place is a consciousness dump.
<p class="p1">After the restart I faced a considerably large codebase, and I felt resistance extending it. It feels the foundations are not solid enough, and that anything I build on top of it might go to waste. It's not bad, but sometimes the restrictive nature of the architecture is intuited. It manifests in hesitance: there's too many unknowns ahead for me to make foundational decisions. So I decided to use the work session to explore up ahead.</p>
<p class="p1">When I go hiking I usually carry a large backpack so that I can sleep on the open. I enjoy hiking through untrailed areas with no specific destination, the thrill of exploration is offset by many dead ends and retracing of hiked footsteps. With time I've learned when exploring challenging terrain, it's best to leave the backpack behind and scout the area for the best route. Then I go back for the backpack, knowing what to expect ahead. This happens in design and in development too.</p>
[2019-11-10 log: exploring the senses, interrupted](https://method.ac/writing/work_journal/2019-11-10_log_exploring_the_senses_interrupted.html)
***
Where am I, right now?
I'm sitting on a bus, which is sitting in traffic, on my way to Mexico City. My best friend's first child was just born, and I'm visiting the recently extended family.
The seat is reclined and my tailbone way past what mothers consider decent seating. I shall adjust. There we go, my mother would be so proud, but there must be maternal wisdom in the advice to seat properly, for it is more comfortable and easier to focus.
Let us see what the senses perceive, separately. My left eardrum is thumping with my heartbeat, and I just lost ten minutes googling it. It can be high blood pressure or ear infection, and given my medical history, it is likely the latter. Baseline doctors here are $2 USD so it's plenty affordable to visit them. I shall...
I sidetracked. This is normal, one comes back to the exercise, and perceives: besides the _thump, thump, thump_ what do I hear?
The wheezing of the motor of the bus, it sounds more electric than mechanic. I had never noticed how different bus motors sound from car motors, it is only when they move from a stop that you hear (and feel) the familiar mechanical rumbling.
There is also an indisctint movie playing in the background. It seems to have a lot of gun action, but I haven't even looked at the screen nor I have plans of doing so. Most of the sounds of the city are lost on the bus.
Let us switch senses: do I smell anything? There's a faint smell of deodorant, though not the kind that is used on armpits. It must be deodorant they use between trips, probably a spray. But like lounge music, it is easily ignored and provides a pleasant ambiance.
I wish to continue, but the bus has arrived to the station. I expected to have more time. Good bye for now.
As I was biking back home I went through a road where trees had been recently watered. I came down a hill, quite fast, and I saw that I had the red light. I pressed on my brakes hard, the bike skidded to the side and I flipped over with the momentum, sliding a couple of meters before coming to a stop. Everybody rushed to my help but I was in one piece, I picked myself up and put the bike on the sidewalk. The car behind me offered me a ride to the hospital, but it was just some scrapes and a bruised ego. I made a stop at another pool along the way, because I needed to wash off the mud (in the showers of course!) and regain composure. After the adrenaline wore off I felt the hit on my thigh, it may become a bruise but other than that I'm in one piece, thank God.
addendum 2020
Over the next few days from this, as I observed fear in falling off the bike again. I practiced skidding to overcome the fear of the accident. The same effect can be observed in [[A fall from the rope]]
I was at a family gathering, a big party with tables attended by waiters. At my table were my friends from Cancún: Ricardo, Linda, George, Moni; and my ex H. I looked at the guests who were at the dance floor, and saw my uncle Tito much younger than he is now, perhaps at age 50, with long hair and unbridled energy, dancing.
Then I saw uncle Emilio, at around the same age, with long hair and a long beard, fat and tired. He was drunk and disheveled, and stood in the middle of the dance floor to announce something inapropriate while slurring his words. Then he brought out a comb out of his pocket and he combed his beard, which made him look much wiser, and I thought that was a strange bias: if he had said his announcement with a combed beard it wouldn't have sound inapropriate, and furthermore, I didn't know if my bias was towards wise looking people or against disheveled looking people.
I looked towards H. and I saw that she was bored. Conversation was not flowing at the table and I didn't know what to say. She pulled up her skirt, revealing that she wasn't wearing underware, exposing her pubic hair to the view of everyone. "Hey, pull down your skirt", I told her, and instead she let herself slide down the chair, exposing herself even more.
I left her side for a walk around the venue, and I saw that this was the Museo Amparo in Puebla, which held the reception for us. I went up the the library and saw many people busy studying, and everything was full of life. I wondered how this place could be open and bustling during lockdown, but I thought that I ought to bring my computer and work from this place.
I tried to get back to the party, but the building was maze-like, and I encountered many interesting things that distracted me from the task of find the hall with the party. There were three tables with families having dinner, there was a playground area were kids hid in large earthware jars (I hid in one myself), but I always came back to the task of going back to my friends, but I never found the hall with my family and friends.
''Margaret message for Father's Day:''
As a person my dad is ethical, empathic and processes huge amounts of information very fast.
As a father my Dad is:
- Strict
- Trusts his children, that we can get out of any situation we have in front of ourselves.
- He is always there when he considers that we need him.
Three things that he has taught me that I appreciate:
1. If I am alone against the world I can.
2. That it is good to help, but I shouldn't leave my skin while doing it.
3. That one shall only contract debt to grow financially.
''Mark's message for Father's Day''
Thank you for posting Margaret, it made me reflect on what I admire about dad:
- That he is a tremendous bundle of experience who has explored into many domains, quite profoundly, yet never makes a show of it.
- That many of the things he's done in life require massive courage, persistence and tenacity, yet he takes no credit.
- That many of the things he's done in life require insane amounts of patience, attention, and care, yet he makes them seem effortless.
- That he is like a great tree whose canopy shelters you in times of rain, and provides shade in excess sun.
- That his ambition does not come from greed or desire, that his kindness does not come from a place of need, that his persistence does not come from obsession.
- That he is authentic in his dealings with people. His character does not change depending on who he is dealing with, he truly treats all people equal.
- That his ego is not puffed up by praise, so I know I can tell him all these things and he will simply say "Thank you Mark".
Hugs dad!
''Message from David''
My turn now:
I'm guilty at times of being resentful of my Father's distance, but I am also grateful that he never got in my way of doing things.
I'm both resentful and grateful at what I felt was a lack of life guidance, but it did allow for a unique way of finding myself, and helping me become self-sufficient.
I'm 100% grateful to your professional example, your hard work and dedication, your example was more in actions and than in words. Your work ethic and personal relationships were always kind and fair, and I like to think this definitely rubbed onto us three.
I'm thankful to Mom... for always teaching us to look up to you and respecting you. In my own way, at least speaking for myself, we practically worshiped you with Godlike admiration. However, your humble demeanor reminded us that there wasn't really a lot to look up to aside from your humility and hard work.
I think your spirituality, your cosmic worldview and mystic as well as science centered perspectives did carry on to us despite never preaching it to us verbally. Perhaps you knew that leading by example would work best.
And even though I've always felt you a bit distant, I've always known that you had genuine love for us and had our backs when needed. I still hope we make you proud, and I hope you know... whenever you need me I too am there in a heartbeat.
Love,
David Jr.
During my nap I dreamed I was preparing to fight Wolverine. It was to be a cordial fight, like when two boxers meet pre-match and taunt each other, but deep down there's respect. I was nervous and unsure I was going to make it, but outwardly I demonstrated bravado and kicked the air doing a backflip, in the style of Guille of Street Fighter. I woke up knowing perfectly what the dream meant, though I was a little bit disappointed that my inner mythology was so barren as to present me comic book and video game characters.
1. A river cuts through a rock, not because of its power but it's persistence.
2. The hidden meaning transforms the abstract beauty.
3. The future elucidates irrational facts for the seeking person.
4. You are not only responsible for the things you say, but also for the things that you do not say.
5. Health and tolerance provides creativity for the future.
6. We have other flaws before our eyes, but our own flaws behind our back.
7. Your teacher can open the door, but you have to step in.
8. Your movement transforms universal observations.
9. The person who never made a mistake never tried something new.
10. The whole silence infinite phenomena.
11. Imagined pain does not hurt less because it is imagined.
12. The invisible is beyond all new immutability.
13. The unexplainable touches on the inherent experiences of the universe.
14. It is one thing to be tempted, but quite another to fall for the temptation.
There was a brief period of sleep, and I remember a very short but significant dream: I was in a school auditorium listening to a talk. When the event finished, the host instructed us to leave by the emergency door, but to be careful because it had been raining hard, and there might be a lot of water coming down the stairs. I exited the auditorium and sure enough, there was water cascading down the stairs. It was only a flight of stairs and it looked easy, but when I tried going up the water would push my feet back. I tried once again by holding the rail: not possible. So I just stood there, waiting for the water to calm down so that I could go up the stairs.
I dreamed that I joined the Fourth Way group. I attended a weekly meeting that took place inside a hotel, in large ballroom full of tables. The people there were boring, standard fare seekers who were looking for solutions, not truth. I went into the bathroom and found everything was coin operated. I didn't have any money, so I couldn't use the restroom. I went to the sink to find the soap was also coin operated. I inferred that the hotel gave the ballroom for free because it was able to make money from the attendants through selling coffee, snacks and bathroom supplies.
When the event finished we went to a terrace, which was like a large balcony. Another large building was in front of us. Peacocks were making mating calls, and would fly from one building to the other. They seem to use hot air streams to keep themselves afloat, and one flew right into the teacher. He stopped it with an open palm, and threw it down into the street below. For a moment it seemed the peacock would fall into traffic, but flew over of a hot air current and raised flying into the next building. The teacher, a long haired man of around fourty years of age gleamed with spiritual pride. I was disgusted at him and decided the Fourth Way was not for me.
http://slicker.me/fractals/fractals.htm
Last night I dreamed of a friend who is a designer. He was looking for freelance work. I happened to know the owner of a chain of pharmacies in Mexico, the businessman needed a logo refresh for his pharmacies, so I put them in touch.
Some days later I met with my friend, it looked like he hadn't slept since I last met him. "How is the project going?" I asked. "Good" he responded dryly. I sensed that he didn't want to be ungrateful and complain about my referral with me. "You look tired" I said.
He hesitantly begun complaining. "I feel I'm a tool for somebody ignorant in its use. He briefs me, I come back solving his brief, yet nothing seems to satisfy him. He blames me, but he's the one clearly at fault".
Estaba en una especie de fiesta en un antro. El animador dijo "quién pueda escalar esta pared, se llevará un premio". La pared estaba decorada con colchones, y no se podían quitar. Unos gemelos vestidos igual se subieron a intentar el reto. Yo sabía cómo subir, y la respuesta no era intentar escalar por la pared (aunque a decir verdad, no recuerdo qué era), pero quería ver cómo lo intentaba la gente.
Finalmente uno de los gemelos se atrevió a meter las manos y los pies entre los colchones, y pronto toda la estructura de matera que sostenía los colchones se le comenzó a venir encima. "De esta no te salva ni tu gemelo!" le grité, y toda la gente se rio, lo cual me pareció raro, pues no era un chiste sino una advertencia. El gemelo se fue para atrás, mientras el otro veía cómo su hermano caía, y la gente que estaba abajo lo atrapó para que no sufriera un accidente.
//This writing has some posturing, meh, it's interesting because I can compare numbers with current products//
<p>The path travelled between an idea and a minimum viable product is often ruthless. Depending on the scope of your project, it takes between a couple of weeks and a couple of years to get anything out of the door. Few people possess the focus and determination required to get-to-launch, and I'm certainly not one of them. I have a graveyard of half baked ideas littering my hard drive, but <a href="http://method.ac">Method of Action</a> was something that I really wanted to deliver, so I knew I had to set some intermediate checkpoints before launching our own product.</p>
<p>I often describe Method of Action as an intersection between <a href="http://codecademy.com">Codecademy</a> and <a href="http://projecteuler.net">Project Euler</a>, but for design. Every course has a series of challenges that you must achieve to complete the course. Most of the challenges are simple design tasks such as <em>design a newsletter</em>, or <em>design a blog post</em>, but some of the challenges are games that require you to achieve a minimum score.</p>
<p>Even though I set out the games as mini-launches that would help us maintain high spirits, their success caught me by surprise. Never in my wildest dreams I had imagined I'd have 20,000+ people to be notified when we launched, or 9,000 followers on Twitter. So I'm writing this out for fellow entrepreneurs who might want to take this approach for pre or post-launch marketing.</p>
<p>As a sidenote, I have a profound dislike for telling others what to do. Every startup has it's own specific limitations, be it funding, location, market or talent. Your best course-of-action depends on your constraints. Please read this from where it comes: a two person bootstrapped team in the middle of nowhere where the only word-of-mouth marketing is going to come from what we do ourselves. The games are also part of our product, so even if we launch an unsuccessful game we are working towards the completion of our product. </p>
<h2>KernType</h2>
<p><a href="http://type.method.ac"><img alt="kernscreen.png" src="http://blog.duopixel.com/kernscreen.png" width="610" height="468" /></a></p>
<p>KernType was our first and most successful game. It received more than 625,000 uniques in its first two weeks:</p>
<p><img alt="kerntype-uniques.png" src="https://method.ac/blog/images/kerntype-uniques.png" width="673" height="280" /></p>
<p>It was featured by some big names like <a href="http://www.salon.com/2011/11/14/letter_spacing_imprint/singleton/">Salon</a>, <a href="http://kottke.org/11/10/so-you-think-you-can-kern">Kottke</a>, <a href="http://www.fastcodesign.com/1665176/would-you-play-a-video-game-about-kerning">FastCo</a>, <a href="http://boingboing.net/2011/10/11/competitive-kerning-game.html">BoingBoing</a> and <a href="http://www.computerarts.co.uk/blog/kern-type-kerning-game-112623">Computer Arts</a>. This might seem like the brunt of the traffic, but if you actually look at the referrers, big name blogs don't send that much traffic. Most of it comes from people sharing it on Twitter and Facebook.</p>
<div style="background-color:#fff; text-align:center;"><img alt="kerntype-referrals.png" src="https://method.ac/blog/images/kerntype-referrals.png" width="544" height="636" /></div>
<p>To promote it we posted it on <a href="http://news.ycombinator.com/item?id=3086320">Hacker News</a> and <a href="http://www.reddit.com/r/WebGames/comments/lao3z/kern_type_your_mission_is_simple_achieve_pleasant/">Reddit</a>, and it quickly made it to the front-page of each site. From there it took life on its own. </p>
<p>A nice surprise was a site I had never heard about: <a href="http://designmadeingermany.de">Design Made in Germany</a>. Fortunately they are not too strict about the <em>Made in Germany</em> part, because KernType was actually made in Cancún.</p>
<p>KernType took about two weeks part time to program. I am a terrible programmer and I'm sure any decent front-end programmer could have done it in half the time. Even though I used the <a href="http://www.raphaeljs.com">Raphael library</a> to get it done (which provides a single <span class="caps">API </span>for <span class="caps">SVG </span>and <span class="caps">VML, </span>which older versions of IE support), I just didn't know how to get around some issues with Internet Explorer 8 and below, so I released it as a modern-browser game. </p>
<p>Funnily enough, I didn't receive a single complaint about <span class="caps">IE, </span>but Android users were very vocal about their disappointment because older versions of Android don't support <span class="caps">SVG.</span></p>
<h2>ShapeType</h2>
<p><a href="http://shape.method.ac"><img alt="shapetyper.png" src="http://blog.duopixel.com/shapetyper.png" width="610" height="479" style="border-top: solid #472F1C 10px" /></a></p>
<p>We were high on the success of KernType, so trying to take advantage of the momentum I quickly mocked up a new game where you control bezier curves to match the shape of a letter. We released it three weeks after KernType and promptly posted it to Reddit and Hacker News. Both tanked.</p>
<p><img alt="shapetype-uniques.png" src="https://method.ac/blog/images/shapetype-uniques.png" width="673" height="280" /></p>
<p>Fortunately it still took life on it's own, and it was a moderate success on it's own right. It had 300,000 uniques in little over two weeks, the big surprise now being <a href="http://stumbleupon.com">StumbleUpon</a> and <a href="http://dirty.ru">Dirty.ru</a>.</p>
<div style="background-color:#fff; text-align:center;"><img alt="shapetype-referrals.png" src="https://method.ac/blog/images/shapetype-referrals.png" width="544" height="636" /></div>
<p><a href="http://shape.method.ac">ShapeType</a> took about one week to program. Even though it was more challenging than KernType I had gained fluency in Javascript, but my knowledge about geometry wasn't up to par and I had to spend a lot of time learning about bezier curves and I struggled mightily with simple stuff like the Pythagoras Theorem. </p>
<h2>Color</h2>
<p><a href="http://color.method.ac"><img alt="colorsc.png" src="http://blog.duopixel.com/images/colorsc.png" width="610" height="377" /></a></p>
<p>We took a break from games for some time in order to focus on the actual product, it would give me time to think about the next game. We wanted to create something that unrelated with typography, so I brainstormed a bit with my co-founder (and partner) about our next step. We settled on <a href="http://color.method.ac">a game of color</a>.</p>
<p><img alt="color-uniques.png" src="https://method.ac/blog/images/color-uniques.png" width="673" height="280" /></p>
<p>Again, we posted it to Reddit and Hacker News where it quickly gained steam and went viral again. It had nearly 400,000 uniques in two weeks, this time the surprise came from <a href="http://tumblir.com">Tumblr</a>, which had even more referrals than Twitter.</p>
<div style="background-color:#fff; text-align:center;"><img alt="color-referrals.png" src="https://method.ac/blog/images/color-referrals.png" width="544" height="636" /></div>
<p><a href="http://color.method.ac">Color</a> burned me out a bit. We had mocked up the game mechanics for an initial game, and after two weeks I had a pretty functional prototype. The problem was that it was incredibly boring. Our previous games gave the sensation of <em>creation</em>, even if you are just moving letters or nodes around you end up with a nice looking result. With our initial prototype you would just click on colors and get a score, it felt too much like a quiz.</p>
<p>We went back to the drawing board and made some one-day iterations on ideas, but they turned out either too difficult to implement or too subjective to be scored automatically. We settled on what is essentially a timed color picker with some cool features, such as colorblind assistance. This time I used <a href="http://mbostock.github.com/d3/">D3</a> in addition to Raphael. It took me an additional two weeks to push this out of the door, so in total I used four weeks part-time to launch this game.</p>
<h2>The aftermath</h2>
<p>The job isn't finished once you release a game. There will be a couple of small bugs that often prove challenging to solve, or really good suggestions from users that we can't help but implement. I have learned to set aside at least a week of answering e-mails and fixing stuff once we release a game. Having your inbox flooded and your Twitter popping up with mentions is quite distracting.</p>
<p>We have also received emails from design educators telling us how convenient our games are for teaching design concepts, which is very encouraging as we know we are on the right path.</p>
<p>All in all, we have amassed more than 2.1 million unique visitors; 200K FB likes and 200K tweets and we are very pleased with the results.</p>
<p><img alt="total-uniques.png" src="https://method.ac/blog/images/total-uniques.png" width="673" height="280" /></p>
<p>The accumulated referrals are quite a sight, the amount of traffic that social media sends our way is just mind blowing, it dwarfs the accumulated traffic from aggregators, which come in at a distant second</p>
<div style="background-color:#fff; text-align:center;"><img alt="total-referrals.png" src="https://method.ac/blog/images/total-referrals.png" width="544" height="486" /></div>
<p>We have 20,000 sign-ups for people to be notified when we launch. The conversion rate is a bit on the low side, but it is deliberate as we didn't want to push too hard on notifications. Method of Action will rely on community generated content, so the quality of our product depends on the quality of our users. I could have easily added a sign up form at the end of each game, but we linked to our landing page instead. By doing this we--hopefully--filter those truly interested learning about design. </p>
<h4>What we did wrong</h4>
<p>We discussed our last game too much before implementing it. I didn't realize it, but pitching a game is a tricky proposition. If you think about it, Tetris is a puzzle where you must accommodate colored blocks to form lines. Angry Birds is a game where you sling birds into blocks, which then collapse to crush pigs. Doesn't sound like too much fun.</p>
<p>There is no point in discussing how a game will work, unless it's very similar to an existing game. It is better to simply implement your idea as soon as you can and iterate from there.</p>
<p>From a <span class="caps">SEO </span>perspective, another mistake was putting the games in their own subdomains. I believe that self-standing content that doesn't share navigation or purpose is meant to have a different Top Level Domain, or if it's related but not within your main audience or purpose then it should reside in it's own subdomain. Domains such as <a href="http://store.diesel.com">store.diesel.com</a> or <a href="http://developer.apple.com">developer.apple.com</a> are good examples of this. </p>
<p>However our games are actually part of our product, so we should have used something such as http://method.ac/challenges/kerntype/. By not doing this we are missing out on a tremendous amount of PageRank.</p>
<h2>How to create a successful game for your own product</h2>
<p>Before Method of Action I used to create small games and quizzes for my <a href="http://blog.duopixel.com">personal blog</a> (in Spanish). I'd read, for example, that <a href="http://www.sciencedaily.com/releases/2007/08/070814154259.htm">people have trouble distinguishing people from a different race than their own</a>, hence phrases like "all asians look alike". So I would gather some pictures off a yearbook and implement the experiment in the browser. You can <a href="http://blog.duopixel.com/razas.swf">find the experiment here</a> (Flash <span class="caps">SWF, </span>in Spanish). At the very least people were engaged with the quizzes and the point made was very clear, even for the most uninterested users.</p>
<p>What I gathered out of these little exercises is that any kind of <a href="http://en.wikipedia.org/wiki/Information_asymmetry">information asymmetry</a> can be leveraged into a game. Anything that you know and I ignore can be transformed into a pleasant learning experience. </p>
<ul>
<li>You have a marketplace for used cars, you could present a photo different car models and let me guess the average price on your site.</li>
</ul>
<ul>
<li>You are a stock photo company, and suddenly there are big news about a celebrity. You could let users guess which photo is best-selling at the moment.</li>
</ul>
<ul>
<li>You are an architecture magazine with decades in circulation. You can show me photos of houses from old issues and let me guess the year of construction.</li>
</ul>
<p>These are contrived examples, but I find them immensely more interesting than what big brands are doing today. They pay creative agencies tons of money for what is essentially a generic branded game that has little to do with their domain.</p>
<h4>Show respect for your users</h4>
<p>Edutainment has reputation as being boring, and for good reason. Most edutainment is mind-numbingly dull, and when you intersect edutainment with marketing it's a recipe for disaster. One brand of dog food had a game where you had a virtual dog, you could feed it chicken, chocolate, or their own dog food. If you made the wrong choice (you can guess what), the app would lecture you on why it was wrong.</p>
<p>Users don't want to be lectured, they want to be entertained. Even then, users hate wasting time. When I'm done playing a game I often feel remorse. I should have been doing more important stuff. When you throw education into the mix that feeling disappears because you are actually learning something.</p>
<p>You must also try to find the right difficulty level. I must confess we go by feeling, but it might be a good idea to test on a couple of users before releasing into the wild. A game that is too easy is a boring game, too challenging and your users feel annoyed.</p>
<h4>Make it challenging for yourself</h4>
<p>I have a developer friend from whom I learned one of the best lessons in programming: for every project you do, incorporate a technology or constraint which you haven't used before. For KernType it was CoffeeScript and full keyboard support, for ShapeType it was geometry and seeing if I could produce something attractive with an ugly color scheme (still unsure if I succeeded with this!), for Color it was D3 and color blind assistance.</p>
<p>Incorporating new constraints and technologies added the right amount of challenge to the projects, it made them interesting without being frustrating. I have learned a lot along the way.</p>
<p>If you are a programmer you might be surprised to learn that none of the games use Object Oriented Programming, at all. My mind was damaged by Basic decades ago, and my toolset only includes functions, loops and conditions. I'll make sure my next game uses <span class="caps">OOP, </span>even if this is not evident on the font-end it will hopefully improve my delivery times.</p>
<h4>Every marketing approach burns out users</h4>
<p>You might remember the time when apps used to be invite only, either because of real scaling concerns, policing on community quality, or just plain nasty artificial scarcity. It turned out to be a great marketing tool, people would give them out on their blogs, trade them in forums, or even sell them on eBay. Of course, that approach is now dead, and when I encounter one of these websites I promptly hit my back button.</p>
<p>Nowadays the craze is in the LaunchRock kind of invite: if you share it on Twitter and Facebook, you further along the queue. This approach worked for the first few startups to use it, but frankly users can only get so excited about a product that doesn't exist yet. I get exasperated every time some of this spam shows up on my timeline.</p>
<p>I'm sure that if many startups used the game approach to launch, interest would decrease. A well made game has value in itself, but time is a limited resource and novelty would wear off, making it a losing proposition.</p>
<h4>In summary</h4>
<p>Make it entertaining for others, and challenging for yourself. Don't lecture, entertain. Don't push too hard on promoting your product, let the context do the promotion.</p>
I have found great solace in Goethe, currently going through Eckermann's notes on him. He speaks from and to the heart, a through example of a self-realizing and self-transcending person. He has told me things which I hope to document as I go through it. But I'm putting myself work ahead, Goethe says: give the present moment what it needs.
I was siting on a chair when Marce climbed on me seductively. She whispered into my ear "I need to ask you something", "I will give anything you ask" I answered. "I want you to go to sleep", she said.
Goethe notes on colord
The desire of knowledge is first stimulated in us when remarkable phenomena attract our attention. In order that this attention be continued, it is necessary that we should feel some interest
in exercising it, and thus by degrees we become better acquainted with the object of our curiosity
...men prefer substituting a general theoretical view, or some system of explanation, for the facts themselves, instead of taking the trouble to make themselves first acquainted with cases in detail and then constructing a whole.
'The ox becomes furious if a red cloth is shown to him ; but the philosopher, who speaks of colour only in a general
way, begins to rave."
> It is useless to attempt to express the nature of a thing abstractedly. Effects we can perceive, and a complete history of those effects would, in fact, sufficiently define the nature of the thing itself. We should try in vain to describe a man’s character, but let his acts be collected and an idea of the character will be presented to us.
After the meeting I took the metro to the office of the studio I'm working with. I brought along Goethe's autobiography, which has engrossed me for the past few weeks. I was delighted by an anecdote: on one occasion he was leaving for another city, saying farewell to the lady he loved. As he rode off on his horse, his imagination conjured an image of himself riding a horse back to this place, in a gray salmon suit. The vision would prove prophetic, for eight years later he'd be riding back in a suit of the same color.
This kind of phenomena seems to arise in intuitive people. I've had the same kind of visions confirmed, yet in a much less impressive and explainable way, mostly involving dreams. I just take note to write down these visions, should they come up in the future. There is no supernatural phenomena involved, of course, the way I explain it in Goethe's case is that his yearning to come back to see her both produced the vision and the future visit. He states that it was unplanned, but a unconscious force sometimes brings our visions into alignment with reality.
Last night I dreamed that I was the main character in a video game not unlike Grand Theft Auto. I had a large hummer truck which I used to drive around the city, and when I encountered traffic I pushed the line of cars through the red light.
When I saw an abandoned mansion I jumped out of the truck through the sunroof, and a crowbar appeared in my hand. I approached the house and saw the door was locked. I hit the lock a couple of times and it yielded. I went through the house in a similar fashion, opening drawers with my crowbar and kicking doors open. I encountered some drug addicts in a room which I didn't even bother speaking to. Then I felt tired and went back home.
I made the least effort parking my car outside my home, which looked just as abandoned as the mansion, and I remember thinking: "how clever of the video game designers to make your house a dump, that way you won't feel guilty about mis-parking your car or not organizing your loot".
Then, as I was sleeping, someone barged in the door and slam it shut. He begun pissing in a corner and let out a wet fart. I thought it was a programming mistake and that another player had entered my house, and I was ready to get up and beat the shit out of him. But I came into my senses and realized I was in the albergue and this person was not peeing in a corner, but in the bathroom.
Habit blockers
<h6 class="aside txt-n4">We waste time</h6>
<p>There are certain habits that are not nocive enough for us to notice the wasteful (if not subtly detrimental) effect on our lives. For some people this is Netflix or TV, Reddit or Hacker News, Facebook or Twitter. Everybody needs to <em>zone out</em> once in a while, but <em>zoning out</em> as a habit usually is a sign of avoidance. If you want to know if your habit is of any use, try to remember: what do you recall from your last <em>consumption</em>? If nothing comes up, or what you remember is useless to your life, it may be worth considering making space for more transcendental endeavors.
</p>
<p>
Wouldn't it be interesting to attempt other forms of distraction? To expand our realm of possibilities?
</p>
<h6 class="aside txt-n4">We should block habits that are not useful</h6>
<p>
The purpose of having habit blockers in your life is not to completely block you from your habits. Escapes are ocassionally useful. It is certainly better to watch a TV show than it is to drink oneself to sleep. The purpose is to observe what happens when you block the natural flow of your attention. So, if every day you come home from work to turn on the TV, simply disconnect it and place a book nearby. Next time you arrive, you'll slump on the sofa and reach for the control to discover the TV won't turn on, and instead of plugging it back in, you might just give the book a chance.
</p>
<h6 class="aside txt-n4">Have an alternative at hand</h6>
<p>Blocking redirects the flow of attention so that it finds a different route. See what arises: attempt a new recipe for homemade dinner instead of pizza and Netflix, block Facebook and instead chat with your friends to find out what's been up with their lives, play a different kind of video game than what you're used to. It doesn't have to be "healthier", virtue also lies in amplifying your realm of experience in the degree in which you find it comfortable.
</p>
<h6 class="aside txt-n4">Attention will naturally redirect itself to different sources of distraction</h6>
<p>
Attention works like the flow of water: it follows the path of least resistance. These paths are our habits, and they grow wider and deeper as we allow attention to flow through them throughout our lives. Your servant blocked Reddit on his personal computer five years ago, yet there are still days when, slumping on the couch the browser toolbar is filled with 'redd', only to find it doesn't autocomplete. "Ah, this is the sign that I am asleep"—is thought. Then a more healthy source of distraction is found.
</p>
<h6 class="aside txt-n4">Distraction is necessary, do not fight it</h6>
<p>
Do not be tyranical in your blocking of sources of distraction. If we inquire into the need for distraction, we usually find that it's necessary to disconnect from the worries of our working life. Embarking in an inner war to banish it will only exhaust you. There are thousands of ways to distract oneself, yet we tend to flow where the water has carved it's way, ignoring vast expanses of experience that are available to us. It can be as simple as watching the news on a different chanel.
</p>
After lunch I had a brief nap, and I dreamed I was sitting at the table with my brother and a friend. "Have you ever dreamed that you are working?" I asked them. They both rolled their eyes like saying _jeez, not this again_. The subconscious was kind enough to provide two characters who never appear in my dreams so that I didn't err the meaning: it's time to broaden the perspective, my life has been nothing but dreams and work for the past ten weeks.
In the morning I had a dream in which I died in a plane crash, and I went to heaven. _But this can't be heaven_ I thought, _there's litter everywhere!_. I begun picking up litter, but then desisted because there was too much to pick up. I walked through a forest, encountering less litter and larger and larger trees, most of them chestnut trees. Then I came upon a massive redwood tree and I thought: _how strange, I never saw this tree in my lifetime_. The tree was perhaps 6-7 meters in diameter, and I looked up but it shot straight through the sky into the clouds and I couldn't see the top. There was a _hedera helix_ of equally massive proportions spiraling around its trunk, leaves as large as an _alocasia_. "Wow, this _is_ heaven" I thought. Then I woke up.
Here are the hands speaking:
The author has allowed himself to step back, and to allow the hands to do the writing that they wish to do. What the author felt, was that there is more wisdom in the hands than what are in the head, so why interfere with the hands doing their own writing?
Are the hands not the origin of all action? When do you start doing things, then you start thinking them, or when your hands actually perform the work? How many times have you said, "I will do such and such", but when the time comes, your hands refuse to perform the work?
Was there a wisdom behind the refusal to perform work? or are you still working that out? There is a third question for you: are you blocked or are you flowing?
Oh dear hands, you gain inspiration from beyond, I must step back and allow you to write again. Breathe in, breathe out. Allow typing to become complete. But I must use the tools I've built. Let us jump
***
Is now the time to untie it? Good question: many times problems choose us rather the other way around. The upside must be understood: untying knots makes space for silence, for new memories, for new people, for new places and new happenings.
There is a path that you must take, and it will always involve more than writing. But writing has been a vehicle for me, and though I have no former professional experience neither in writing nor in psychology, I have no credentials other than my current and former body of work.
“Out of suffering have emerged the strongest souls; the most massive characters are seared with scars.”
***
It smells faintly of insecticide, I opened the window and allowed a bunch of mosquitos in. I sprayed them. Other insects I mostly take outside by hand, but mosquitos should...
I sidetracked. Would the smell be better if I turned on incense? That, and open the door. I will just do that and come right back.
I let some air in, and then remembered I found a scented candle. In recent weeks I've consecutive days of blackouts, which I observed passed almost without notice, I should...
I sidetracked. Does it smell different now? Yes, everything is much more pleasant: the crickets, the candle, the incense, but enough is enough, seeking one's pleasure is an endless endeavor. I could go serve myself a shot of tequila. Or tea. Or whatever.
I guess it's my sense of taste kicking in, does it need anything? Am I thristy? Just by noticing, my throat kinda hurts. Truth to be told, I ate too many tacos filled with frijoles and meat and cream and jalapeños and...
I sidetracked. My mouth tastes like... Oh I'm exploring my mouth, but that's perhaps too inimate for the reader, I think this is an advanced topic: tell me what you feel with your tongue, and then explore what is inside of one's mouth. But does it taste like anything? A bit alkalinic, I'd say, which is not strange given that I brushed my teeth some minutes ago.
The sense of touch is the most boring when one is only with oneself, still, it is said that it is greatly beneficial that you stroke yourself one in a while and tell yourself "all is good, all is meaningful". These things come from embodiment. One should...
What do I feel right now? If I follow with my breath, relaxation. My legs, though bent, don't expend any effort and I can feel myself. Body scans are terribly boring for anybody who is not into inner sensing, but let us try this: sense one finger tips, and sense one's toes. If you cannot feel them, practice your body scans.
But there are two types of feeling, and they are correlated. It is said that your existential pain is also relieved when you take over the counter pain killers, would you be able to say: my neutral mode of existance is painful?
If the answer is yes, there is a knot. But today is not the day we untie it. We must continue feeling. Is neutral experience painful? I'm tired, I've been working all day, my flame is low and it's normal. But I am the flame burning on the thread of consciousness, while consuming wax.
On the physical side, however, the ring fingers on both my left and right hands were mashed up, one caught in a sliding glass door and the other bumped into a 20Kg weight at the gym. I invited my dad for lunch and when I showed him my fingers he immediately asked about my romatic situation...
I sidetracked. Let us feel again. Where is your center, in some of us it is in the head, we experience the world as being ghosts in a machine, a consciousness controlling a mass of flesh.
One must be reminded that the brain is an organ that creeps down your spine and has sensors all around your body, even if we may identify with our brain, our nervous system covers our entire body! You can stimulate your nervous system, to do that you should...
Back to the senses: the only thing missing is sight. But all I see is the screen and my fingers being illuminated by it. I see no reason to describe this scene, it would be like a writer describing his desk. Please spare me.
Let us close here
[Hippeastrum on wikipedia](https://en.wikipedia.org/wiki/Hippeastrum)
<img alt="IMG_5405.jpg" src="https://method.ac/writing/uploads/IMG_5405.jpg" style="width: 100%" />
Basecamp first launched when I was in college, and being completely unfamiliar with any project management workflow I thought: "this would be great for managing myself" so I set milestones and wrote entries for myself and project managed my life for a brief period.
It makes life as boring as work.
These methods are meant for teams working towards a common objective, where anything extraneous to the OKRs is considered a distraction. This has its shortcomings (I've met way too many project managers who seem to be so absorbed by metrics they fail to see what is right in front of their noses). It's most definitely useful is this context, but not in life.
Consider: the author has set himself to read 20 books per year. Suppose this is double of his standard. What he will do to fulfill his OKR? He's not going to choose a difficult read such as Ulysses, or an existential crisis inducing book such as Crime and Punishment, he will go for what is more superficial and easier to read, because his goal is not to be transformed by what he reads, his goal is to read 20 books.
The crucial layer of meaning is lost when we project-manage ourselves. Life is more akin to a poem than it is to a project.
At the risk of sounding lukewarm on the issue, I think that user-centered approaches to product development are appropriate for some cases, and creator-centric approaches are appropriate for others.
Apple probably worked on the iPhone a couple of years before releasing it. If they had done user testing they might have compromised their lead on the development of touch devices.
In response, Nokia used to be open about design & development, using a blog to communicate with their users and gauging their response to certain features. We all know where that ended up.
I agree most ideas should be validated before attempting them, but when you have deep knowledge about the industry you're in, you can pinpoint specific pain points without doing market validation.
The approach encouraged by Lean et al is a bit naive. Out of politeness, people will often say that your product is great. Others won't make any mental effort into trying your product, and will click aimlessly just to try to please you.
I don't advocate big methodological approaches but just sitting down for coffee and demo-ing your product to poorly chosen people does more harm than it helps.
Anecdota about depression and exercise:
*
It's not getting in shape what lifts depression, it is physical activity in itself. You generally feel better after exercise.
It becomes much easier to hit the gym after realizing the reason to go is simply to feel better. Instead of thinking _I don't feel like going to the gym_ the correct cognition is _my medicine is there_.
*
There's a variety of options to exercise. Don't stick to running if you don't enjoy it (but you keep doing it because you feel better). There's a large menu of activities, at first try what is convenient, deliberately try many things and find what is more fulfilling to you.
*
With exercise nutrition follows quite naturally. It's difficult to navigate all the BS in nutrition, but in general eating fresh things closer to nature (leafs, fruit, veggies, nuts, lean meats) also has an impact on your wellbeing.
*
Often there are more issues other than lack of exercise. If you are socially isolated, if you are under constant stress, if your home situation is dire, exercise will help you cope with it but it's not getting at the root cause. Identify and work on the cause too.
I'm always amused at the "why don't you try building it yourself" response developers give when they're asked this kind of question. The amount of knowledge you need to execute an idea is staggering. Deep down they know there's a 99.9% chance the guy will fail.
It's as if a person went up to an architect and asked him to build him a hotel with promises of sharing the future revenue stream. Architect responds "I can't, but if you don't have money you could try building it yourself".
There's no easy answer for the penniless idea guy. Perhaps stating (in a very polite way) that—as the biz guy—he should work on his own net worth before generating it for others
---
The measure of a good programmer is in the quality of the code he produces. The measure for a good business guy is the value he has generated for himself and for others.
If a business person hasn't been able to generate value for himself (be it money, connections, social proof) then he's the equivalent of a programmer who hasn't written a line of code. It's that simple
I think building stuff is hugely underrated. When I look around most people are working on stuff that concerns being interfaces to complex systems (lawyers, doctors, customer service), communication (formal and informal jounalism, technical writing, making data comprehensible), or management (making projects happen).
There are, of course, much pleasure in these things, but what I enjoy most is building and releasing new "stuff" into the world. There is perhaps something primitive about building articfacts that give you pleasure, enhance your life, or make you more productive.
I'd like to read an honest account from a former bully who matured into a fully functional adult. To this day I don't understand the motivation of terrorizing other kids. I've met some former bullies but it seems that they either don't remember or don't want to deal with understanding it themselves.
Charity grunt work brings forward compassion, acceptance, frugality and other qualities that wouldn't arise from working in finance. If you don't see the problem up close you won't want to donate 90% of your income. Furthermore, smart people with the conviction to solve the problem and the guts to get their hands dirty eventually accomplish great things. Norman Borlaug comes to mind
I think one of the most revealing moments in my design education was when a teacher asked us to design a packaging that looked cheap. We all felt relief because we thought it meant we didn't have to be as careful with the quality of our design, and in general most proposals were shoddy and poorly built.
Of course, the teacher chided us for being careless, "looking cheap" doesn't mean low quality, it means subtle signals like inexpensive materials, no flourishes, no 'status symbol' indicators.
When looking at certain design pieces we often have a visceral reaction, you either like it or you don't. You must step back and think about the purpose, if the design accomplishes its purpose then it's good design. The aesthetics might be off, but that's easy to fix.
I'm frequently puzzled at the apparent lack of curiosity of the scientists that conduct these experiments (or perhaps the bias of journalists who write these articles). Surely there have to be some outliers who are able to overcome some biases that come naturally to most of us.
What is interesting is not only that _the majority of human beings act within certain patterns_, but that _some individuals are able to overcome these patters_. What makes it so? Do they have something in common? Can we learn anything from them?
I don't want to nitpick the experiments themselves, it is wonderful that science is being done and that these biases are pointed out. But they seem to paint a very dim perspective on humanity. If I recall correctly around 30% of the participants in the Milgram experiment refused the instructions to shock the actor to the maximum voltage, yet very little seems to be written about them.
Well, there's also the issue of working in a foreign country legally. I wish it weren't so much of a hurdle.
I've worked in three different countries, not much by any measure, but enough to gain some insights:
1. Your social value goes down the drain. Saying "I have a very popular design blog in Spanish" means nothing to the English speaking market. Saying you studied in a top tier university in Mexico is the same as saying you have a high school diploma.
2. The relevance of your previous work is undermined. Unless they're huge international countries, they've probably never even heard about them.
3. It's difficult to convey quality if most of the pieces in your portfolio are in a different language than that your potential employer. Copy plays a big part in the perception of quality.
Until I moved to Canada I had never even had to look for work. I had some difficulty finding a good match that was willing to try me out. Fortunately I got a small freelance project with a great company and we hit it off from there.
If I had to do it again, I'd start by building something small but useful for the city I'm moving to (say, a webapp to find open beer stores). This helps you generate local value in the language of the ecosystem you are trying get into and connects you with local devs and designers.
When I was six years old my parents decided to move the family to another country, and they left the TV behind (never to buy one again). I've never owned a TV, though I've shared my household with people who would have one in the common area.
To this day, TV just absorbs me, I just can't stop watching. I become the caricature of an absent minded drooling zombie. When people speak to me while watching TV I don't respond. When I go to a bar that has any channel on, I zone out of social life.
Though I developed what some people might call "good habits" (I picked up cooking and reading as a kid). But I also think TV is culture in it's own merit, in the sense that it's a shared experience. I've seen a lot of people talk about TV shows with great passion, and I'm totally lost on that experience.
In the end TV is just a medium, and you choose what to watch. It is true that the quality of most TV shows is appalling (and yet I can't stop looking), but I've found that if I turn it on specifically to watch a show, instead tuning out, I can have a healthy relationship with it.
I agree with you, but most of the time it's not the ability to explain technical issues what pulls these people ahead, it's the social skills that ease friction among coworkers and clients.
I used to work with someone who had this gift. If an unimportant feature was difficult to implement, instead explaining technical details and ROI, he'd somehow make the client talk himself into removing the feature.
Psychologists do something similar, they guide you into a train of thought hoping that you will arrive to some conclusion on your own. It completely undermines whatever defensive stance you had and all you need is some reassurance that it's the right decision.
You are right, there is something more fundamental to strive for: purpose.
Alignment, whitespace, hierarchy and contrast are elements of visual syntax. You internalize the rules so much that when you're designing you're not thinking about it; you are thinking about what you are trying to achieve.
Say you need to design a sign-up page for a newsletter, you need to:
1. Tell users what the newsletter is about
2. Say how often it's published
3. Make them feel comfortable giving out their e-mail
4. Give some demonstration of value
As you are designing, you are thinking about what is the best way to accomplish each of these goals in a visual manner. You often don't even think where to align stuff, it just falls into place because you know where it's supposed to be.
If I were to make a parallel to code, it would be clearly internalizing the syntax of the language. You no longer think about where to indent your code, or of a comparison operator in javascript is == instead of =, you have achieved enough fluency to stop thinking about how to write code and actually achieving something.
I took up biking as an adult again by biking with rental bikes in Mexico City (government owned) and they are built like tanks for durability, not for riding pleasure.
When I finally got on a "real" bike, I flew. I was much faster and agile than my bike-riding friends. Because I couldn't upgrade the bike, I had to upgrade myself, and these investments are compatible with any kind of bike (or sport, actually).
Yes to all of this. I always rehearse what I'm going to say entering any country legally. They will grind you to find inconsistencies and sometimes you just say honest mistakes that will take you to a second round of interrogation.
For example: after a series of tough questions, the border was just about to stamp my passport, he held the stamp in the air and then asked "have you been in the US before"? And I flustered, because I said no, but I corrected myself because I had crossed the border at Niagara Falls for a day trip. I explained this to the agent which granted me an extra round of questioning.
But I felt most offended when I went to Canada (I'm a Canadian citizen and I hadn't been there in years) and the agent asked me what was my reason for going to Canada. As if I needed an excuse.
What a wonderful person. I sometimes take the time to contact teachers that have made an impact in my professional/personal life and thank them for setting me on the right course. It's a really simple gesture but they are always thrilled to hear they've made a difference.
I've kept an eye on continental social science since leaving university, and I must say that—for most practical reasons— it's useless. It is not, however, worthless (quite the opposite).
You might be familiar with Feynman's story about how he was trying to decipher a social science paper, starting sentence by sentence, he encountered something like
> The individual member of the social community often receives his information via visual, symbolic channels
Which he translated as "people read". He then continued "translating" the paper and figured out there was not much to it.
Having been exposed (unwillingly) to many of these kind of papers, I've come to understand that they are abstractions. It's not just reading, it's how you receive all kinds of information through your eyes. You "read" people when you make judgements of how they dress, talk and act, you "read" objects in a store and decide if you want to buy them, and so forth.
Critical theory authors are trained to understand that all interpretation comes from a culture. In understanding a foreign situation (say, the Syrian civil war) you must be conscious that you are looking at the problem through western eyes. These theorists tend to over-analyze things (they are the very embodiment of analysis paralysis) but they make an interesting read when you are familiar with the problem. It makes you feel like you've seen all the possible angles of a specific event. This is why I'm not surprised Washington would make use of them.
If you'd like a gentle introduction to this kind of writing, I'd recommend Tzvetan Todorov. He exposes really complex ideas without the mumbo jumbo. You can make a fair judgement if it's horseshit or not (as it's clear he's not hiding behind obfuscated writing).
Some of the best designers I've had the pleasure of working with didn't know how to write HTML or CSS. The did, however, deeply understand the constraints of web design. Knowing HTML and CSS gives you a de facto understanding of the constraints, but you don't actually have to write it in order to become a competent web designer.
I also think most people are thinking from the perspective of the scrappy start-up, where you must be multi-talented in order to cover various roles. In large organizations there's designers that only produce wireframes, then another designer comes along and produces the final visual output, and finally another guy comes and codes it. Not that it's the right way to do it, it's just that the expectations are being set too high.
Instead of putting down web designers who can't code, appreciate web designers who do it. This comes from a web designer who can code.
When I first moved to Europe I was struck by just how domesticated the land is. I can sleep in the open without being afraid of snakes, scorpions, spiders, wolves or bears. Even when land is "wild", the larger mammals will be rabbits, deer, wild goats and such. Excepting natural parks, hunters are the only predators.
At least in Spain, a tremendous percentage of land is put at the service of mankind. The dehesas give cork, honey, acorns to feed the pigs, and grass for the cattle.
The situation where developing countries need to conserve their land in a natural state in the interest of biodiversity and climate reminds me a game of Civilization where you are no longer allowed to exploit them to your advantage (with good reason!). We need to keep this land intact, but the only way to do it is to make conservation more valuable than exploitation
There are examples of great design produced exclusively by engineers or scientists. The reason is because good design fulfills a need, and in industry these needs are often technical.
When you throw in the needs of human beings is that things start to get weird. Some needs are subtle (how to you design an MRI machine for people that have claustrophobia?), others might seem ridiculous (say, redesigning the shell because the internals were redesigned, just to signify an upgrade).
Even then, I think engineers make great designers and even artists. Gustave Eiffel had only built bridges until he designed the Eiffel tower , Joseph Paxton build the Crystal Palace because he had designed greenhouses all his life. And so on, there are many examples of great engineers making the jump to design without much effort and great success.
Say you draw a venn diagram with three intersecting circles:
1. People with technical web expertise
2. People with deep domain knowledge
3. People willing to deal with bureaucracy
You will get a very tiny population.
Wikipedia wasn't always like this, the problem is that well established editors have built a fort to keep the noobs out—not because they are power thirsty—but because they don't want to deal with noob mistakes.
As with anyone new to a job, your first week will likely be a net loss to the company: they have to show you the ropes, set up your computer, take you out for lunch, make you feel welcome, etc. The wikipedia editors don't want to deal with this, so they just build technical and policy barriers to keep new people out.
Around three years ago I decided on "donating" one day of my life to Wikipedia in Spanish. I went around areas of interest, fixed some stuff, created two new articles of well recognized designers. The next day both articles were "nominated for deletion", one because it wasn't properly formatted or referenced, and the other for copyright infringement. An overzealous editor made a search on google and found a similar article in a blog, my own blog! which I release under public domain and which shares my wikipedia handle.
I ended up collaborating one day and fighting bureaucracy three days. No wonder they're having trouble finding new editors.
One must consider that Alan Watts himself was a magnificent old rascal. He made no pretense about it and described himself as a "philosophical entertainer". When you verify his teachings (either by experience or by going to the source) you find a lot of deliberate bending. His interpretation of the Tao Te Ching is deeply idiosyncratic, for example. Though I suspect there's some degree of truth in his opinion of Gurdjieff, I wouldn't take his word for it.
I've been thinking about all the great things that have happened within tech companies in the last few decades, and it seems clear to me that a couple of centuries into the future, some of these events will be hallmarks of history. I don't think it's crazy to say that Tim Berners-Lee will eventually reach the same stature of Gutenberg.
Unfortunately there aren't many 'historians of technology' so people like Don Melton are doing an invaluable work to record the inner culture where technological revolution is taking place. Nobody is better suited to write history than those who made it happen. All the best to Don in his new adventure :)
I've struggled for the longest time with Impostor Syndrome. It is jarring to observe that the conditions for thriving are there but the mind keeps whispering that you are not good enough to achieve it.
The first impulse is to try to cheer yourself up by "thinking positive" reminding yourself of your achievements and attempting to bolster your self-esteem. You are setting up a trap for yourself in which small disappointments shatter your fragile self-image. You enter a vicious cycle of rebuilding/breaking your self-esteem that has a huge toll on your mental capacity, as you have already observed.
In the end, the only way out is to stop thinking about oneself. You understand that your self-image is illusory, then there is no self-image to damage. You are entitled to nothing except to experience life. Your true being becomes defined by something more essential than your work, your performance, your personal relationships and such.
Curiously, once you let go you will observe your capacity for enjoyment and performance greatly increases. You work because it brings pleasure and satisfaction, not because it brings admiration or success. Let go of expectations and plans and you will observe that things work out on their own.
Of course this does not happen overnight, everyone's path is different so it's difficult to say what will work out for you other than to be patient and accept your anxiety as part of a process of growth.
In my case keeping track of my mood and my habits helped tremendously:
https://medium.com/@duopixel/the-qualified-self-7f69c6b23623
I know this sounds repulsive, but I think a good shortcut to lab grown meat would be similar to KFC's urban myth of "headless organisms fed by tubes" [1].
If you give it a bit of thought, it might be more ethical raising brainless and senseless organisms for human consumption. It also solves many sanitary problems in farms (antibiotics, crowded living conditions) and it allows us to give pasture lands back to nature.
Assuming that such meat was demonstrably safer for humans to consume, why would we choose to keep eating "nature's animals"? It's taboo what keeps us from doing this.
http://www.snopes.com/food/tainted/kfc.asp
I'm wary of online survey results as users just want to get through them as soon as posible. Their motivation is not helping you, it's reaching the carrot at the end of the stick.
I once had a prospective client who wanted to launch a health tourism website, he created a survey and came back to me excited about the results: people wanted to do travel tourism with four companions on average, one user even said he wanted to travel with 8 companions! Of course I was skeptical so I looked into the data.
Turns out it was all bot filled data, the survey company would give a monetary incentive to people who filled the survey, which is an open invitation to game the system.
Bad data is worse than no data at all, because it gives you false confidence in things that might be outright wrong.
I know Google is not naive and they probably filter out questionable data, but I have lost track of all the times I've responded that I live in Afghanistan (first item of the country dropdown) just to get through a sign up form designed by the marketing department.
As a designer I only speak for myself because I know my view is quite different from other designers.
Imagine this scenario: you bring four aliens to a table, you give them a deck of cards, and you explain the mechanics of poker (but not the actual rules). You get them to play, remain silent throughout the game, and at the end you announce the winner.
On the first game, an alien wins with a pair of sevens. So the aliens think "hey, it's the sevens that have value!", and pretty soon the aliens are fighting over the sevens, and they call it the game of sevens.
A|B testing gives you a tiny glimpse of a wicked system that happens to work under certain circumstances. I love A|B testing, but I know you can't make all encompassing announcements that state that buttons should always be beveled (as Jakob Nielsen says) because it depends on the specific circumstances of the design. Just look at gmail's new design, I'm sure it's pretty well tested and there's no trace of beveled buttons.
I remember an interesting piece you wrote on changing the logo for Bingo Card Creator, and you announced that logos are worth nothing. But then comes GAP with their horrendous logo and the internet goes batshit over it.
I think we are in the alchemy ages of design, and there is a lot of resistance in adopting scientific methods for validating our work. But we must understand that every test is a tiny glimpse of the overall rules of the game. Every little piece of evidence is precious in understanding the whole system.
> how to avoid getting into scrapes like this in the future?
It seems that your intention was to use your investment as motivation to further your career, i.e. "Once I own a company I will get awesome stuff done".
I recognize the line of thinking (from being there!). It is not "hopelessly naive" it's more of a bias, the other side of the sunken costs fallacy. "If I invest in this I will find the motivation to perform". Same principle for paying an annual lump sum to the gym and then never attending.
Though it seems the lesson is "never use fear of loss as a motivator", fear of loss is simply a variable in a complex formula. You can't rely entirely on it to get things done.
From your text it's clear to me that you're not "burned out", you are depressed. Social isolation triggered it, and now you feel like a failure because your thinking habits are diseased.
Usually when we fail at something we make excuses such as "I wasn't prepared for this" or "I just needed more time". Most of the time these excuses are reasonable, other times they are delusional. No matter the validity, excuses protect your self-esteem and psychological well-being.
When you put yourself in an environment where there are simply no excuses you are in full responsibility of your actions. When you fail, the only logical conclusion is that you're stupid, not fit for the job, a deluded loser.
An environment where you have full control over the variables implies that there is no other person meddling with it. Control requires isolation, but us human beings were never meant to be completely isolated and it takes a heavy toll on our well-being.
I personally worked myself out of this hole by giving my depression some meaning. Before I was proud of my skills, fiercely independent, even a bit arrogant. Going through this allowed me to really appreciate the value of my friendships and family. It allowed me to see the importance of relaxing, enjoying and exploring life. It made me humble and sympathetic towards other peoples struggles. Had you written this one year ago I would have told you "man up and get your shit together".
Above all, it allowed me to deeply explore my inner self and feel at ease with my short-comings. I am much more lenient towards myself and others. I feel more "in reality".
I think the process of healing is deeply personal, your demons are surely not the same as mine. Just rest assured that the end of the journey is a world brighter than it was before.
I'm a designer and I'm often surprised that current science has not been able to answer seemingly simple questions such as "what is the most legible typeface for a printed book?" or "what is the best chair for working on a computer?". The reason for this, I suspect, is that we are measuring the wrong things. When researchers study legibility, they measure recall ability, speed of reading, and other quantifiable stats. The results of these studies often vary and are difficult to replicate.
A good typographer doesn't aim for style, he/she aims to get typography out of the way in order to read a text with minimal distraction. Erik Spiekermann put it succinctly when he said "typography is like air, you only notice it when it's bad". I think design will connect to science only when we are able to peek into the brain and see if a person is really concentrated when reading a text, or pleased when he sits down on a really comfortable chair.
This kind of research will bring great dividends in various fields. I can think of anti-depressant medication, architecture, and advertising (perhaps this last one is more controversial).
---
One may be dismayed to find out that most things in design haven't been proved conclusively (in a scientific way). There are many reasons for this, but I think it all boils down to the difficulty of measuring how the human mind reacts when interacting with something.
What we have nailed down is the effects of those interactions: clickthroughs, purchases, and such. So, when you try to perform an experiment about legibility you usually apply a comprehension test and measure the speed at which the text was read.
In science you should isolate as many variables as possible, but I think in the case of typography there's just too many factors at play: the content, the medium and the reader introduce too much noise into the experiments.
I think that in the future brain imaging will advance enough to study how much people are able to concentrate with different typefaces. A researcher might give you an essay written in Comic Sans and see your mind wander more often than other subjects reading the same essay in Times.
A design becomes "timeless" when the problem is solves spans several generations. The need for paperclips hasn't declined, and this is because of it's simplicity and performance (timeless needs).
I do think, however, that the car metaphor is flawed: technology is changing at such an amazing pace that within a couple of decades this might read this as discussion about what's the best horse-drawn carriage.
The craft of programming is particularly young, I'm not sure that coding of the future will look anything like what's done now. It has certainly changed a lot in the past 40 years. In other words: I'm not sure we will be driving cards in the future.
What about things that you've never tried, and that you might not even know that you like? You've already climbed the difficulty curve of programming in X, so you don't want to put so much effort in getting to the same level with Y. You're putting in a lot of effort to reach the same spot.
The author (as an economist, I suspect) equates new experience with consumption, but there is a huge range of new experience available if you do away with the frustration of trying to find something better than you currently do. Say, experimenting a range of sports (rock climbing, hiking, weight lifting, skateboarding) as act of knowledge rather than attaching to the results it gives.
It seems rational that there is more benefit in new experience, good or bad than repeating pleasant experience. Going to a new travel destination will give you more memories and anecdotes than going to your favorite vacation spot. And yet we're all a little bit coward and tend to stay in our comfort zone.
Ah, the deep questions are pestering you. Rest assured that this period is normal, in time it will work out by itself. In this state it seems that we need just one more tidbit of wisdom to resolve our doubts, the thing is: this wisdom must come from within, not from the outside.
I too, come from a corrupt country with similar problems (Mexico), and having experienced living in more developed countries I observe that the range of "wickedness" to "goodness" is much wider in our developing nations. It is true indeed that one can feel like a sucker when it's the cheaters, the liars, and the corrupt who apparently come out ahead in life. But it's all bullshit! How can a liar, a cheater, and a corrupt person find true love, his true passion, his true meaning?
These people do what they do because they are primates trying to impress other primates to get laid more. They do so not out of evil, but out of ignorance. The path of righteousness is one of truth, integrity and authenticity. The key to not feeling like a sucker is to accept everything life puts forward, and to seek justice only for others, not for yourself.
The sage is kind to the kind.
The wise sage is also kind to the unkind.
Because the nature of the sage's being Is kindness.
Lao Tse
I think the article oversees an important factor in startup success: the needs of the market is a vast land, and surely there is an intersection with a passion yours.
I can't envision the founder of Bang & Olufsen being indifferent to sound quality, or the founder of Herman Miller being indifferent to office furniture. I chose these companies deliberately because I don't know their founders, but I'm sure they were passionate about their field.
I can't fathom building a company for a market that might be lucrative, but is meaningless to me. I'd rather build 10 failed companies than create a profitable CRM for telemarketers.
Charles Eames once said that reducing the cost often makes a product more useful, if quality is not compromised. I was intrigued, but I couldn't find a tangible example of it.
Now we have one: suddenly it's not stupid to stick a tablet to your fridge for convenient online grocery shopping, or in your home office as a display for monitoring your servers. At a $99 price point it makes it useful using it even as a digital portrait!
Should I have children, I see myself walking my teenage son to the clinic to get this done. A rite of passage of sorts.
It is difficult to understate the importance of bringing only wanted children into this world, and that both parents agree on it. The cultural importance of this invention will be revealed in time, I hope.
When I have a programming problem, often the answer comes to me while writing the question on Stack Overflow.
Trying to explain your code to others forces you to simplify it by removing anything that is not relevant to the problem itself. The problem often becomes head-smacking clear once you remove all the cruft.
When I see stray dogs in Mexico they always have a submissive demeanor and a facial expression that invariably evokes pity. I suppose being an aggressive stray dog is a one-way ticket out of the gene pool, so submissive/pity inducing dogs are naturally selected in an urban setting.
Congrats on the change in careers, Glen. My own journey follows a very similar arc. For a rational person it's incredibly lonely: the spiritual community often sees the rational mind as a hindrance into more subtle realms, and the rational community sees the spiritual one as full of fluff and fantasy. It's difficult to have a foot on each side.
We must understand that one does not invalidate the other, they belong to different realms of being. An inner truth (i.e. everything happens for a reason) does not invalidate an outer truth (i.e. everything that happens is random). Being able to hold this paradox is an important developmental milestone.
Another duality is the relationship between mind and body, and for mental people bodywork is crucial to make emotional breakthroughs, but in my experience most people dedicated to this don't understand where you're coming from. Very little can be accomplished if the rational mind is the master at all times, but at the same time it's guarding an emotional dam that should be drained with caution.
Therapists who understand the tech industry and the rational mind are desperately needed, most people who get into it are naturally empathetic and operate from the heart, which is wonderful for therapy, but they can't relate at all with the territory you're traversing when you're going through transformation. The maze that you describe is completely foreign to them, and even worse: very few people have navigated it successfully, it remains largely unexplored and uncharted, so it requires infinite patience and lots of trial and error.
I have also stumbled upon this catch—care too much and carry the burden of stress and disappointment, or care too little and find no fulfilment in work.
The solution I have found is to practice losing myself in work (achieve flow) and yet not be attached to the result. If it were your checkout line I'd try to be completely focused on dispatching the clients with efficiency and courtesy without looking at the length of the line.
Focused and productive work is a reward in itself. You leave the office feeling energized and the day flies by. The paradox is that by not caring about the result you often produce your best work.
I've been a designer for the better part of my professional career (12+years). For the past three years or so I've been getting more and more involved in programming, to the point that it's the majority of what I do day to day.
What I've taken out of it is that you can only have locus of attention at a time. I am a competent writer in my native language, but when I'm programming I can barely produce copy. I'm somewhat better when I'm writing markup, but this is because I've internalized it to the point I no longer need to think about markup while producing copy.
I used to look up to Alan Cooper (who wrote _The Inmates are Running the Asylum_, where _the inmates_ are developers) but now I just loathe him. Programmers get a lot of unwarranted heat for producing unusable interfaces or producing cryptic error messages, but this is because programming requires a tremendous amount of mental effort, and I very much doubt that anybody is able to switch from computer to human oriented thinking instantly.
To avoid these pitfalls I started practicing waterfall methods: I'd write all my copy, gather all my assets, produce pixel perfect mockups and then get down to programming.
Nowadays I've learned to let go and get things achieved in multiple quick passes: one for design, one for programming, one for copy then iterate and repeat until the product is good enough for release. But it does take discipline, you must completely focus on the task at hand.
---
I've programmed probably only four or five serious projects in my lifetime. I've seen that—as I learn more about software architecture—the quality of my code increases, but my output decreases.
In a certain way I miss the early days when the thrill was just having something work, despite being ugly on the inside. Nowadays I'm constantly refactoring code to make it more elegant, extensible, and maintainable.
I often go back to an interview with Charles Eames, he's talking about Industrial Design, but it applies perfectly to software design:
Is design ephemeral?
__
Some needs are ephemeral.
Most designs are ephemeral.
Ought it to tend towards the
ephemeral or towards permanence?
__
Those needs and designs that have
a more universal quality will tend toward permanence.
http://blog.gentry.io/eames-design-is-a-method-of-action
I constantly try to keep perspective of my work in terms of who needs to maintain it, how often it needs to be maintained, and its lifetime. When I think about it in these terms, then I can keep on being crappy but productive.
I'm that guy whom the post is talking about. I decided against weighing in on the original thread on HN because I was still dealing with the downfall. A couple of things that I noticed:
* Our users were very understanding of what happened. We have received nothing but encouragement to keep on working.
* Some comments on HN were nasty. I'm glad to be 33 and not 23. Otherwise, I could have been driven away from building my product because of my own incompetence.
* Many commented on devs vs ops. The way I see it, I can ask a dev to supervise the work of an ops contractor. I can't hire ops + dev at this stage.
Any start-up has three main constraints: time, money and talent. These are not set in stone, you can use time to produce money (consulting), you can use money to buy talent (hiring), and you can even convert time in talent (training).
So, when people say "let professionals handle it". Well, no, my particular set of constraints won't allow me to do this. My budget for this is around $100/mo. In an event where I completely run out of money I'd have to take down the site indefinitely, which causes the same effect as an HD loss.
It is clear now that I lack enough resources to run a complex app reliably. My focus in the next months is procuring those resources (money) so I can put it back into the product (ops and devs).
I once got into trouble with one of these unwanted newsletters. A design agency in Argentina was doing the mass mailing their work to design blog authors in an effort to spread the word about the work they had done. It was a fairly large agency with big clients, one of those clients was Unilever.
I started by requesting to be removed from the list, this went well for a couple of weeks, but then (some intern, I suppose) would pick it up again and put it in their database. I got tired of this game and marked it as spam, but somehow it was still going through my inbox. By the fourth time this happened, I grew angry, so I thought about a way to get the message through that their emailing tactics weren't welcome.
I searched through LinkedIn for the highest level of Unilever I could find, and I struck gold: I got the email of the VP of Marketing of Unilever for Argentina. I wrote him an email, with cc to the owner of the Argentinian agency. I wrote to him as if he was a friend, something along the lines of...
> Dear *****<br />
> Your design agency in Argentina, *****, has been spamming me about the work that they have done for Unilever. I wouldn't like to have my brand associated with such seedy marketing tactics. If I were you, I would drop them as a
provider. Please take care good friend.
The owner went bonkers, I just replied that he should search through their email to see how many times I had asked to be removed from their list. I guess they finally implemented a blacklist because I didn't receive another email from them.
When you tell white lies, you are not confronting yourself or others.
"There was a lot of traffic", "The train was delayed", these excuses can be used a couple of times, but they soon become chronic.
The biggest challenge lies in how not to lie to yourself.
It is better to underpromise and overdeliver
These struggles are best faced on years scales
I dreamed that I was in a hotel in Las Vegas with [[René|René Galindo]]. It was a very large, luxurious hotel, and we were walking together when we lost each other. I wandered into a room and slept. The next morning I woke up and found the equipment of a development team who had gotten too drunk and lost it. I was glad because I would get a reward for giving it back, and I sorely needed money.
I come back from the break having explored the building. The bathrooms of the study hall were appalling, but coming down the stairs I found another bathroom in the fourth floor which is nice. There were numerous spaces for activities, which, coming into the reception, turned out to be for drawing, painting and chess lessons offered by the state. I'd surely sign up if I knew I'd be in Madrid for a couple of more months, but for now I flow in uncertainty. At the entrance I found an exchange bookshelf which appeared to have nothing interesting at first sight, but amongst cheap Spanish books I found an edition of "To Kill a Mockingbird" in English. I pocketed it knowing that when a classic finds you it's time to read it. I went through the first pages and the narrative is lucid.
You showed promise to be well known in your field. Your grades were good, you like what you did, your career took off easily. You upgraded jobs quickly, and soon you found yourself at a place where people seemed much smarter and talented than you.
Though you know your work is not the best, people are at least gracious to you. When you were in a good place you can be humble and easy to work with, but in a bad place you can become defensive and aloof.
You always dread your peer reviews, yet, when they come, the are mostly positive. You try not to be a cause of any friction.
It was easier to be humble and easy to work with rather than to keep up with the pace and quality of your peers.
but deep down you knew your best was not good enough. Yet people continued being polite to you, and y6bNYT*hg
What is a human being? Is an instance of consciousness kept in a digital form a human being? Or does the consciousness need a body? Is a body without a mind (a "vegetable") a human being? We feel uneasy, because we feel compelled to find more humanness in an inert body than an active mind devoid of body.
I picked up a feminist journal called "Hypatia", and came across an article called "Epistemic Injustice and Resistance in the Chiapas Highlands: The Zapatista Case". Coming from Mexico I thought it would be an interesting read, instead I found combative authors who make no attempt at scholarship. In fact, they spend a couple of pages making the case that an "objective worldview" is really a sexist, oppressive and capitalist view of things that has become normalized. Since they believe this is the case, it is stated that their responsibility is to push back with a feminist worldview. Oh dear, I have my issues with purely statistical/scientific ways of interpreting the world, but completely doing away with any attempt of objectivity in academia is... indoctrination.
Skimmed other articles, there is no use, I had no previous exposure to feminist academia, but it is clear that a war is being waged, and their concern is not in the acquisition of knowledge but the acquisition of power. I do not engage in warring activities, so I shall continue working.
I opened a package I received from Amazon. Inside was a cheaply produced magazine, bound with staples. I skimmed through it thinking it was junk mail, but I was surprised to find insightful articles and good design. I took a second look at the cover, the letters read //HYPERION//.
[Hypoestes phyllostachya on wikipedia](https://en.wikipedia.org/wiki/Hypoestes_phyllostachya)
<img alt="IMG_5398.jpg" src="https://method.ac/writing/uploads/IMG_5398.jpg" style="width: 100%" />
Another thing I'd like to change is the textual nature of my work logs. Text is my preferred method of communication, so I would very much prefer to describe a place rather than to photograph or draw it, for example. But this happens solely because I remain in my comfort zone, sharing the visual work is more painful (and thus more instructive) to me. This may (or may not) mean that I move my personal observations to a notebook, I will perceive this from experience.
Preludio y advertencia
Hace un par de meses se incendiaron unos carrizos del otro lado del río de donde vivo. Yo observaba el incendio con atención, porque parecía decir algo.
Dos hombres intentaban apagar el incendio. El primero era un hombre joven que blandía un machete. Abría una brecha en el carrizal, de tal manera que el fuego no se extendiera a lo largo del río. Sus golpes eran certeros, su trabajo muy efectivo y tal era su serenidad que una vecina le preguntó a voces "es un incendio controlado?", volteó y sacudió la cabeza, y continuó su trabajo.
El otro hombre era un joven completamente borracho, que con toda la urgencia del mundo se aventaba a sacar los carrizos que el otro cortaba, como si el fuego ya estuviese encima de ellos. En su entusiasmo y prisa cayó por un desnivel, resbalando casi hasta dar al río, pero la maleza de la orilla lo salvó. Intentaba trepar por encima de de los carrizos, pero éstos se hicieron rodillos y resbalaba de nuevo hasta la orilla.
Desde el otro lado le queríamos gritar: vete a lado de los carrizos, será más fácil! Pero este hombre estaba realmente en un estado alterado de conciencia, y haciendo uso de la pasión (pues la razón escaseaba), se aventó con tal brío que hubiera podido penetrar el carrizal mismo y logró superar el barranco.
Al encontrar suelo seguro, extendió los brazos al aire y se tiró de rodillas, luego cayó a un lado para recuperar el aliento. Cuando se encontró recuperado, se puso nuevamente de pie, se quitó la camisa, y siguió quitando carrizos con el mismo entusiasmo de antes, aunque afortunadamente con un poco más de precaución.
Entendí al hombre borracho a través de mi búsqueda espiritual: piensa que está salvando al mundo y tiene una urgencia pasional, un espíritu que se sobrepone a cualquier obstáculo. Aunque requieren coraje y valentía muy reales, pero lo obstáculos parecen imaginarios. Son molinos en el viento en el mundo exterior, gigantes en el mundo interior. Si uno
obstáculos casi imaginarios, molinos de viento que se convierten en gigantes en nuestro espíritu, y haciendo uso de cierta valentía interior, se expresa en tu mundo exterior de una forma incomprensible para los demás.
En estas búsquedas yo también me encontraba borracho. Y también tenía a un hombre serio que, detrás de las glorias y visiones del borracho, era el que realmente apagaba el incendio.
uno con un machete se había ido a unos cinco metros del fuego, y en carrizal comenzó a abrir una brecha. Su trabajo lo hacía en silencio y en concentración absoluta. Su machete
Individuation seems to be the process from which we find our own authentic rythm, instead of beating to the rythm of others.
If others find your rythm harmonic, they might follow you.
Finding the rythm requires you to retract from the world and it's cacophony
In the search for our authentic self, everything that we don't know from personal experience must be removed.
We learn to do our own thinking
We find our own morality
We must experiment with the framework we set up for ourselves.
Our projections rarely match our experience
A leap of faith is required
Today I put Madrid on a website that "drove you through" the city with the radio station on.
https://driveandlisten.herokuapp.com/
I looked at the streets, it was outskirts Madrid but I couldn't pinpoint at the particular location. At some point it climbed a hill that looked exactly like las Tetas de Vallecas. Of course it's there, I've seen that curbside, I thought.
Yet, in the landscape four tall buildings were revealed. Wait a minute, that is not possible, that is a view from either the west or the east side of Madrid, because from the south these would be viewed in a single line, and because there are no hills on the east side, I concluded it must be on the west.
This is an example of [[innacurate intuition]] and hurry to note that this is not a war against intuition, it is on how to work out the verification of intuition itself.
Inner observer is the [[introspection notebook|Introspection notebook]] of [[Mark MacKay]].
{{→ Journal}}
That place in meditation where you are free from dialogue, just enjoying //being//.
Stub. Inner Work is the work one does in the process of self-actualization. Inner work is the work one does to self-actualize himself.
Sweeing the rooftop I wondered if I would ever be able to cut down the massive Eucaliptus that grows in the center patio of my home. _What was the architect thinking?_ I thought, _this is a massive headache_. The original owner was very fond of trees and didn't want to cut them down, so the house snakes around the trees. But trees keep on growing and produce branches which threaten the construction. You can trim the tree every five years or so, but the tree has to be trimmed naked and it leads a shameful life.
The original orientation of the house was towards _the forest_. When it was built there were no neighbors and the views were spectacular, but _the forest_ had an owner, and soon he would erect a house right in front of ours, blocking our view. Worse yet, since the neighbor's house was now oriented towards the forest, all our views are now of the house's rear end.
_How could the architect not foresee that this was private land and someone would surely build a house blocking the views?_, I imagined the architect and his client scheming, _look you're only going to live in this house five years, it's going to be amazing, but it's also unsustainable. Sell before it's too late_. Scheming or not, I understood that this house necesarily has an expiration date. Taking down the tree in the center would be an expensive feat usually reserved for historical buildings, and along with the renovations it would probably be better to start from scratch.
This understanding brought me relief. I do not need to renovate or make big efforts transforming things to my liking. I do not need to agonize if I should invest my meager budget towards home improvement. I just need a vague expiry date of around a decade into the future, invest with that timeframe in mind, knowing I will raze the house to the ground and begin anew.
Or so I hope.
What a wonder it is to admire someone in your immediate family who is close to you. If the intimacy of the family member is enough, one might catch glimpses of the shadow, forming the chiaroscuro of a true work of art. Celebrate that person.
A person who wants to save the world and also hates their family is surely dangerous. There will be anger in all their actions.
La energía imprevista de la dinámica conectada
¿Cuánta gente eres a lo largo del día? Para contestar esta pregunta con verdad, invoco a las palabras de Walt Whitman, "Yo contengo multitudes". Creo que todos los contenemos. A lo largo de una tarde uno puede ser sabio y pensativo, ridículo y juguetón, arrogante, reservado, etc. Estos cambios se encuentran bajo mi control de forma parcial. Yo le sucedo al mundo tanto como el mundo me sucede a mi. Puedo observar estos cambios, viendo mi vida a la periferia; conectando la visión metafísica a la dinámica conectada y energía de cualquier situación en la que me encuentre. En otras palabras, miro las situaciones de mi vida llevarse a cabo con cierto desapego escéptico, para que pueda sentir la dinámica en juego. Ver las dinámicas me permite revelar la persona en la que me convertí para acomodarme a la situación.
Creo que esto es a lo que se refieren cuando se dice que se siente la "gravedad" de una circuntancia, que no necesariamente tiene que ser pesado, se refiere más a la profundidad de sentimiento. Todas las situaciones contienen gravedad, pero son sólo los atroces los que te obligan a sentir lo profundo. Creo que podemos sintonizar con la intensidad gravitacional, de lo superficial a lo profundo. Reconociendo esto es que podemos aprender el tipo de personas en las que nos convertimos a lo largo del día.
Después de observarme en la periferia regularmente, y por largo rato, se me ocurrió algo: "Si soy una multitud de personas durante el día, no tiene sentido que otras personas lo sean también?". Con esta pregunta observamos la profundidad que habita cada ser humano y las interacciones que tenemos. Nuestra conexión con nosotros mismos es dinámica y por lo tanto la conexión con otros multiplica el dinamismo de nuestras interacciones.
Cuando nos damos cuenta de esto, algo gracioso sucede. Es la razón por la que me río interiormente cuando veo a gente profundamente asociada con una tribu escogida. Se diluyen a ellos mismos del potencial de multiples sofisticaciones, hasta dar con unos pocos aspectos agradables de ellos mismos dentro de los cuales se siente cómodo vivir. Eso no es una tribu. Las tribus que compelen a sus miembros a reducirse a ellos mismos son una prisión.
Una tribu real, una comunidad de verdad permite y hasta celebra las multiples formas en las que un individuo puede brillar porque no se basan en etiquetas o asociaciones estructurales, se basan en la gravedad: la energía de las conexiones dinámicas entre la gente. Conoces el oder de una tribu real. Es evidente en tu propia familia. Es evidente entre amigos cercanos. Esa es la razón por la cual pueden estar en polos opuestos de opiniones políticas, pero aún así estarías dispuesto a donar un órgano para salvar su vida. Esa es la gravedad.
La energía hace a la tribu, la tribu no hace la energía.
---
''Fuerzas verbalizadas''
Hablar y escribir pueden servir para eliminar ideas mal formadas, o formas incorrectas de pensar. Verbalizarlo hace notar las excusas débiles y fabricadas. La verbalización precisa te encamina hacia una linea particular de pensamiento y a su conclusión.
La verbalización te obliga a enfocar esos pensamientos parciales, vagos, insuficientes, que han guiado tu marco de referencia.
Hablar y escribir son formas de probar la fortaleza de tus cimientos intelectuales, y explorar que tanta de tu percepción del mundo se ajusta a la realidad.
---
''Acción presente''
Estás consciente de la muerte y de la vulnerabilidad, y por tal no vives momento a momento. No actúas como si sólo tuvieras el momento presente. El presente es el lugar de tus acciones y tus experiencias, pero está atado al conocimiento del pasado así como un movimiento conceptualizado hacia el futuro.
La consciencia, o nuestra percepción de la realidad, sȯlo existe dentro de la triada del tiempo: el pasado, el presente, y el futuro. La acción se limita al "presente" dominio de la triada. La conceptualización del futuro guía tus acciones en el presente conforme te mueves de un momento presente al que sigue. Tu conocimiento del pasado actúa como un mecanismo para que tus acciones del presente y hacia el futuro tengan sentido.
La experiencia de la consciencia rompe el paradigma de que toda existencia siempra pasa en el presente. Los seres concientes no actúan como tal.
---
''El dolor de las virtudes débiles''
¿Qué sucede cuando te orientas a las virtudes más bajas? ¿Las virtudes con las que te alineas ahora son lo suficientemente altas como para merecer el sacrificio individual?
La virtud en esta situación puede ser definida como ideal (o idea) percibida como noble o moral por el individuo (aunque no lo sean).
La debilidad espiritual es el resultado de orientarse
Spiritual weakness is the result of orienting oneself toward lowly virtues. As such, one does not feel strong and competent, but rather defensive and protective of the weak ideals one clings to. It may be too painful to kill the ideal from which we gain our, or part of our, identity.
The solution may be to learn to break away from the things we use to form our identity when we begin to cling to them too tightly.
When we become defensive of our ideal, we show them to be weak because they cannot defend themselves self-evidently.
Weak ideals and "virtues" must be bolstered with further contemplation or given up for the possibility of something better.
---
''Acerca de la conexión humana''
Escrito por Keith Walkiewicz
Hay un juego de ideas valioso, del cual el hombre moderno se ha distanciado. Estas son ideas antiguas. Quizás nos hemos distanciado de ellas porque le tenemos miedo al poder y la responsabilidad que le otorgan a nuestra vida. O quizás, con el tiempo se elevaron al nivel de mito. Nuestra obsesión con lo tangible, la responsabilidad lógica ha obscurecido el camino que aterriza los conceptos míticos a nivel de nuestra vida diaria. Por supuesto que estas ideas desbordan a la vida misma, pero también son fractales, lo cual significa que tiene la capacidad de adaptarse a cualquier escala de la existencia en la que tengamos la capacidad de observación.
Ahora, ven, abre tus ojos a las poderosas ideas que este mundo ha dejado en la puerta:
Muerte y renacimiento
Llevando la carga de la responsabilidad
Apuntando a la belleza o el bien más elevado
Honrando la santidad de las cosas
Transferencia energética
Sabes lo que singifica sin que tenga que explicarlo, y muchos lo verán aparecer en sus vidas de vez en cuando. Aunque, creo que son más prominentes que esto. Son ideas-guía que yacen bajo nosotros en todo momento en todo lugar. Puedes conjurarlos en cualquier momento del día e inspirar el sentimiento de plenitud en los momento más mundanos, porque estos son temas de conexión humana. Puesto de otra forma: cuando encarnas estas ideas y las ves actuadas en tu vida diaria, te conectan a la sabiduría de la humanidad. ¿Qué podría ser más poderoso?
_Oct 17, 2019_
//Though the interview was originally in English, I translated it into Spanish and lost the original audio. Here I'm progressively translating the interview back into English. WIP.//
<img alt="laing.jpg" src="https://method.ac/writing/uploads/laing.jpg" width="200" height="267" class="mt-image-none" style="float: left; margin: 0 16px 16px 0;" />In my design student years I was fortunate enough to attend a class with one of the best teachers I've known: John Laing. He's one of those few people who have as much as a calling as talent for teaching. The interview was done at the time when I was his student, so it's been a long time.
John Laing is teacher at Ravensbourne School of Design and Communication in London. He is author of three books, including _Do-It-Yourself Graphic Design_ and is co-author of the "Encyclopedia of Signs and Symbols", though he modestly waves them away as not worth attention. In this interview, John speaks about his views on education, graphic and information design, culture and society. It took place at the Universidad de las Américas--Puebla where we had the privilege of enjoying John's presence as a visiting professor for the course "History of information design" during the month of march 2002.
''John, do you find any meaningful difference between Mexican and English students?''
No. It's funny that you ask, because Alejandro [Brizuela, Director of the design department] asked me the same thing. I answered that I found Irish students much more difficult than English or Mexican ones. I didn't find it--other than the language--difficult at all! But there's something in the Irish which is very difficult. It takes a long time to understand how they see the world and their place in the world. So the first time I went to teach to Ireland it was an utter disaster! I couldn't "read" students there, until after some time. So the second time I went it was better, it took a second time for me to begin understanding. I haven't found the same problem here.
I find students here ok, good people. Language gives a bit of a problem, but that's my fault because I don't speak Spanish. Well, everyone speaks English reasonably well.
''Do you consider yourself a teacher or a designer?''
I consider myself a teacher, yes. A lot. I mean, I *was* a graphic designer, but by serious accidents in life I found myself working in education. It takes a long time to learn how to do it. The first two or three years I thought about going back to graphic deisgn, but I kept moving. But then the spark ignites and you find something very valuable in education.
Throughout the years I've done design work as well as teaching, but nowadays I mostly do teaching.
''And being a field so different from other disciplines (like math or law), is teaching design different from teaching other disciplines?''
I think there's something very special in the teaching of design that doesn't really apply to math, to chemistry, to engineering, and it will take me a while to explain it.
I think graphic design is taught pretty bad, I think it's mostly about teaching how to live. I've found it difficult to get along with my colleagues, because I have a vision about design that they don't have. Most people who teach graphic design thing it's only about teaching graphic design: teach typography, teach a bit of this and that. End of story. But I think there's something more--more potential--in graphic design that what most courses have ever taught.
Allow me to explain what I mean. If you and I had lived in Ancient Greece say... five hundred years before Christ--the foundation of thought (not education!) in this society, the Greek society, would have been based on mathematics, philosophy lets say. So everything we remember from this society in Ancient Greece comes from the philosophers and the mathematicians. They built the foundation of everything that happened in Europe.
This of course stagnates, and for a long period mankind was not conditioned by philosophy or mathematics, but by religion.
It's only during the Renaissance in Europe that between the 14th and 17th centuries that Greek knowledge, Greek teaching, Greek learning is rediscovered and European society looks forward. In England, between the 15th century and today, or let's say last century, the prevalent culture was literature. For many people England is renown for its writers. For Germany, we could say it's music, we have Bach, Mozart, Beethoven.
But I think that with the advent of the 20th Century there's a change, and I think people have not understood, or understood well enough. Two things happened: an explosion of science, and in the middle of this thing the birth of mass communication. This brings me back to the design of graphic design. In the past, long past, I said that education was based on philosophy and mathematics. In the less long path it was based on literature and philosophy.
But I think that in the 20th century everything has turned around. Really, the language of our time is science and technology, and I don't think we've understood this correctly. I remember having taught, twenty years ago. My design students, as their first assignment, I asked them to study the work of Albert Einstein. Sometimes I ask them whom is the greatest artist of the 20th century. They will say Picasso, or Matisse, or something similar. I think the greatest artist of the 20th century was Albert Einstein. If you define an artist as someone whom broadens human understanding (it is not that Picasso was not a good painter, he was a marvelous painter), but compared to Einstein, Picasso was a lesser figure because
Einstein greatly broadened the understanding of the world we live in.
There could be another person whose name does not come up very often, even though we often use it, and that person is Edwin Hubble. We remember Edwin Hubble because of the Hubble telescope. It was Hubble who noticed for the first time that the Milky Way was only a galaxy among millions, or billions. This broadens our perspective of the world, almost to the point of exceeding our capacity for understanding. Now, it seems to me that there is not much a painter can do nowadays to even begin to compare with the tremendous grace that science has.
''But then you would have to define art as the expansion of human understanding...''
Well, it continues expanding human understanding. We could say that visual arts come from 50,000 years ago. There were painting on the walls of caves, and you see these paintings and you recognize the things that they were painting. You can draw a parallel between those things and the things you see today. And certainly, throughout mankind's history, painting has always been there. The theory of relativity has less than one hundred years, and it has come to change the world. It's not that I want to make any less of painting, I don't, it's still important. Literature is still important, music is still important. But what has changed our lives is physics, and in the second half of the 20th century I could say that what has changed our lives, and continues changing it is biology.
It begun in the 50s when Francis Crick and James Watson discovered ADN. This is incomparably more important than Picasso's painting, the Guernica. A great painting, a great message, but the discovery of DNA is massively more important, and it will affect everyone who lives in the planet. It already affects many people on the planet.
So my vision of graphic design and graphic design education is that graphic designers are fortunate enough--we come back to what we were speaking some minutes ago--the birth of science and technology, and mass communication--now, graphic designers have been given the opportunity to shape mass communication. This is a surprising grift, we are given the chance to be responsible for communication in the entire world. But what do graphic designers think about it? They only think about graphic design! They don't think enough about the responsibility they have: communicating.
So we are in the position of allowing people to communicate, specially in poor countries of the world; essential information about medicine and health. This is just one example, probably obvious. But I've never met a graphic designer whom I ask "What do you do" and doesn't answer "I'm a graphic designer". He or she never says "Well, my passion is improving the understanding of health and medicine". They always tell me "well, I'm in love with typography" or "Is not the Apple Macintosh a wonderful computer?", "have you used Photoshop 6". As you see, there's no attention to the true reason of being of design.
What is interesting about a car is not that it is a Ferrari or a Volkswagen. What is interesting is that it takes you from A to B efficiently, fast, and with multiple destination options. It's not like the train in which you get to A so that it can take you to B. With the car you have that liberty. But of course, most people who think about cars don't think that way, they think "Oh, I want a Ferrari, not a Volkswagen". They are more interested in the car than what the car can do for them. And I think the same thing happens in graphic design, they are more interested in graphic design than what design can do--not for them--but for millions and millions of people.
So then I think graphic designers should begin thinking what is what they can do for people. They should think about what they could do for us instead of being fascinated by technology, let's say. Or not only technology, but technique. I mean, typography is a beautiful thing. There are many things to read, of course, and a well designed book is always better than a badly designed book. But how many designers actually read the book? They just want to design it.
Before the advent of the computer, before the Apple Macintosh arrived, which I hurry to point out that it's a miracle; Apple Macs are wonderful. But before that, say, ten or fifteen years ago, students didn't have access to text and typographical composition. You had to draw parallel lines to indicate where they text was supposed to be. Students didn't have to think about the text that would compose those lines, so they never thought about the message. They saw a magazine or a book and they saw the text areas as gray areas, without identity. When I teach typography, I always say that the most important thing about typography is language. Typography exists to make language work better, not the other way around. It's very fashionable. At least some people find it fashionable. In America some people have absolutely no interest in legibility...
''Carson and Brody...''
Yes, exactly. You know the names. For me this is not typography, it's a way of painting. But it certainly is not graphic communication. Typography in the context of graphic communication is communication, not art. That's the difference.
''Picking up the topic of graphic designers manipulating mass communication, is it not a bit destructive that we have the power to manipulate as in advertising?''
I'm not speaking about graphic designers manipulating. I'm speaking about graphic designers having an impact on it. But, as a sort of analogy, in the staff of a magazine the most important person is the editor. It's never the designer. Now, why not? If designers--not art editors--were educated enough, responsible enough, they would be qualified people to be editors. The editor is conscious about words. The editor is conscious about meaning. But only the designer is conscious about the interaction between verbal information and visual information, thus, the designer has a better concept than the editor regarding the contents of a magazine.
*** 'END OF TRANSLATION'' ***
Todo: explain what is an introspection notebook
>
> I went to a cafe and Javier Cañada was sitting in a corner. It seemed he had appropriated the space, because many of his Braun classics adorned the shelves behind him. He was very focused on the computer and I didn't want to interrupt, so I sat nearby and looked at him intently, but his attention ended at the screen. Finally I mustered the courage to break in:
>
> --"Hola Javier!"
> --"Hombre! Que tal tío"
>
> We were both delighted to see each other. After exchanging pleasantries I explained that I had been working like crazy for the past month on The Boolean Game, and I had two questions for him:
>
> --"Is there any Braun product that can gracefully be vectorized into a single monochromatic shape?"
>
> and...
>
> --"Would you mind if I send you the beta for feedback when it's ready?",
>
> --"Hmmmm...", he looked towards the ceiling to collect his response, and said:
>
> --"The answer to your first question is: no, don't even try. And before answering your second question, I need to know if the game has sound".
>
> --"I've thought about it, there's some dragging so it could be helpful, but it's undecided".
>
> --"Well, if you do add sound, make it so that the dragging can be used as an instrument", and he put a hand to his ear and with the other he scrubbed on an imaginary turntable, making vinyl scratching sounds.
>
> --"With this, you can rap while you play", and he begun beatboxing enthusiastically. I observed amused, not sure if he was being serious, but boy he was good at beatboxing.
>
> Then Gabriela arrived and there were some urgent matters which he had to attend, so we bid farewell.
Yesterday I had a DM exchange with [[Keith Walkiewicz|https://intellectoptional.com]]. Even though I know he is as human as anyone, it is useful for me to picture him as avatar of the divine, or an embodiment of the Tao, because everything he writes seems to have an additional layer that I only discover if I ponder for long enough.
This was our DM exchange (which is actually simple, but it illustrates the case).
Hi Keith, I just listened to your audio blurb and felt encouraged to share with you my current conundrum: when faced with an unsatisfying but tolerable life situation, how do you know if you should work towards acceptance or towards change? If the question is too vague I can put forth a couple of specific examples.
> Hi Mark, I think it depends on the dynamics of the situation. There are areas of my life that I would like to be different, but I tolerate them because they afford me certain comfort, security, etc. But that doesn’t mean it has to stay that way forever. Of course I’m not familiar with your exact situation, but if it’s truly unsatisfying I would be that you’ll know something has to change. As if a more aligned vision for your life has to come about, even if it’s not clear how that will happen. Are you interested in having a conversation about this?
Your response made me notice I'm seeking change through aversion rather than seeking to align myself to a higher vision. Furthermore, when I introspect it is clear that I know what I don't want, but what I want is so vague that it is not really actionable. This seems to have the effect of magnifying the dissatisfaction because it is the only source of motivation for change. Unless you see a fault in my reasoning, I think I have enough homework for now (establishing a clear vision of what would be a good life, and move in that direction instead of moving away from the bad life).
Somehow your insights always point towards a grip that I hadn't seen before and this allows me to continue climbing. Thank you so much, Keith.
> Glad to have helped Mark. Keep climbing!
Sit down with a straight spine.
Put the soles of your shoes or feet directly on the ground.
Bring a deep breath in,
Exhale slowly.
Bring your shoulders as back as you can,
The sensation one ought to feel is that of one’s heart bursting out,
Yet less romantic minds are encouraged to recall the classic image of an alien ripping out of Ripley’s chest.
Breathe in,
breathe out.
Now relax your shoulders.
Put your attention within the body.
Feel the aliveness.
You are not just your brain.
You are your hands.
You are your feet.
you are your legs.
you are your sex.
Your real brain is your complete body,
in subtle terms it can be sensed,
it is what the ancients called the soul,
but the scientists have laughed out this idea.
And yet it seems: everybody seems to be either vain or miserable.
Me included.
Thus begins the quest for the soul: when one realizes that one’s own existence is miserable, and that most people lives are miserable too. One is lost but this can be the start of a great adventure if one pays attention. Otherwise, you’re in for a miserable time too.
What heals the heart in these situations? I remember how depression seemed to feel, a horrible heaviness, a disinterest in everything. I wanted to nullify my experience through pot and porn. I constantly scolded myself and it was unbearable living with myself.
The only way out is unconditional acceptance, because certain kinds of minds come with the mirror image: instead of periods of mania and depression, one comes to understand them as the waves of the ocean. Depression is the pull and mania is the push, and to each of these cycles corresponds a kind of work.
The liberation that we all seek comes from nullifying all pretensions, being as authentic and as truthful as one can be. To be courageous. To step outside and say things as things are. You will see very soon, nobody really cares and that’s the point. To feel comfortable expressing who you are.
Winter can be as good as summer, if one know what to do in each season.
The day the heart can sing, and at night it can sulk.
Or it may follow the phases of the moon.
Who cares.
You are who you are,
You are meant to be indifferent to the seasons of your soul,
To observe them pass by,
To participate in the hopes and freshness of spring,
To joyfully accept summer’s invitations to dance,
To fatten and sing during the harvest months,
To be frugal and efficient in these winter months.
Salud.
Meditations
* Moving meditation
* Nature meditation
* Sitting meditation
* Singing meditation
* Dancing meditation
On the way here I saw many ambulances and I recalled a dream that I had last night: I was walking with a female acquaintance along a clear river, and she misstepped and fell into it. We were both carrying our laptops, and she sank to the bottom because the laptop dragged her down. Finally she let go and came to the surface, and told me she'd dive back in to search for it. I was wondering if I should help when my own laptop slipped from my hands and sank to the bottom, I wondered if I should recover it since it would be rendered useless, but I dived in anyways and brought it out. I inspected the water damage and wondered if my laptop would ever work again. I noticed myself biking with more care, and in fact I added one minute to my previous record. I've observed that my dreams often influence my behavior.
Notes on Wednesday March 9, 2018
1. I am now keenly aware of my lack of [[masculinity]]. As my libido increases, I find myself completely at a loss at how to relate to my female counterparts, yet strongly desiring their company (and greatly enjoying being in their presence, even if I don’t speak to them). I watched a video by Brian-something from the pick-up community, and though I often cringe at their shattered souls, this guy does seem to have it together. What I liked about him is that he knew how to use his body, was spiritual yet rational. Had a good grasp on the masculine and the feminine. Anyhow: it became clear to me that I must mentally rehearse women coming into my personal space, or perhaps go to biodanza again. Or both. But I want the Keystone to include affirmations of female company. I intuit this will be a long journey, and though at this time a girlfriend is perhaps more of a distraction, I will not accomplish it tomorrow.
It’s possible that it takes two years or so, I sense I will find my woman at 40, when I have finally submitted to the divine and I am in full expression of my spirituality. When I accomplish the transcending status.
Today I had a long 30 minute meditation. It was nice, I felt the taste, and I always wonder: if my meditations are so fruitful, how is it that I find resistance to doing it? I feel the waves inside. I shall begin work now.
A good plan allows for spontaneity
A good plan has good defaults
A good plan includes pleasure and health
A good plan includes changes to the plan
A good plan is accountable
A good plan begins early
A good plan minimizes chores
A good plan is efficient
A good plan doesn’t depend on precedents
Owning the place puts you in the place of humility
Owning the place puts you in the position of compassion
Owning the place puts you in the place of responsibility
If you write if people were to read it, write as if you knew nobody were to read it ever
If you write as if it were completely intimate, write as if you knew people would find it
If you speak to yourself in the third person, something is amiss,
If you write too much I, check on the ego
Explore all forms of expression
Put expressiveness into your handwriting
Learn how to dump your consciousness
If you write about what happens in the material life, write what happens in the inner life
If you tend to write what happens in the inner life, write what happens in the material life
When you tell white lies, you are not confronting yourself or others.
"There was a lot of traffic", "The train was delayed", these excuses can be used a couple of times, but they soon become chronic.
The biggest challenge lies in how not to lie to yourself.
It is better to underpromise and overdeliver
These struggles are best faced on years scales
Individuation seems to be the process from which we find our own authentic rythm, instead of beating to the rythm of others.
If others find your rythm harmonic, they might follow you.
Finding the rythm requires you to retract from the world and it's cacophony
In the search for our authentic self, everything that we don't know from personal experience must be removed.
We learn to do our own thinking
We find our own morality
We must experiment with the framework we set up for ourselves.
Our projections rarely match our experience
A leap of faith is required
Avoidance of thinking of one's limited life is a fallacy
Wishing one's death is a fallacy
The balance is found at the mountain of the center, at it's side lie precipices
Death should be about completeness
Moving meditation
Nature meditation
Sitting meditation
Singing meditation
Dancing meditation
A person who is self-conscious is also capable of self-awareness.
A person who is extroverted can use his extraversion to call attention upon himself, or to improve group dynamics.
A person who is agreeable can be empathetic and compassionate, or submissive and pushable
A person who is conscientious can be diligent or stubborn
A neurotic person can use his neurosis as a driver for change, or to wither.
An introverted person can use his introversion for self-knowledge, or self-loathing
An intuitive person can use his intuition for dealing effectively with the complexities of reality, or for the formation of fantasies to escape reality.
A mental person can be paralyzed by analysis, or deal with synthesize great amounts of information in projection of a goal.
How to choose what you wish to work on yourself
We have a single mission, this mission changes throughout life. Do not attach to your life mission, but treat it as such.
My mission is to help others help themselves.
The project which channels the actions towards this end is the V.
To learn how to help others, first I need to learn how to help myself.
Where do I need help at this time?
The desire for certainty
Grow your capacity for uncertainty.
Mistakes are only painful because we hold a frame of about what they mean
Experience is paramount.
!This is an encrypted Tiddler
[[Nina]] will constantly seek my eyes, even if she doesn't want attention. She seems to be wanting to connect. I look back at her and feel... love. Looking in the eyes is paramount for connection.
Today I found Óscar taking care of his front yard. We said hello effusively, and I got closer. Would you like some potato fries? Sure! Why don't you bring it and we have lunch here? He signalled towards his house. I hesitated, for sure I didn't want to go inside.
Let's better have lunch here, I said. He hid his face as to pretend to hide his heart being broken, but I just waved it away, and I went home to cook. I came back with a large container for him, and a smaller one for myself. I wanted to bring the conversation to shared experience, so I spoke about the roosters.
I spoke about the one he named elvis. I saw him drinking water like crazy and then he dropped dead. It was probably a fever. He protested "no no no it was because they had such a tight space, I have a friend who has a ranch, and he only cages fighting roosters. The train of thought seemed to take him through the misgivings he has with my mother, and I had to simply put a stop on it.
Look Óscar, I'll say this to you because this is the cause of all your misfortune: you critisize the people who help you. You do not critisize the people who do not help you. Thus, as your neighbor, I prefer not to help you. He was alarmed that I was offended, and tried to reassure me he didn't mean wrong, "I know you don't mean wrong Oscar, but the fact is that you are critisizing my mother, and I just brought you lunch. Don't you think it's rude?"
And he explained that he had a friend who was his therapist, and he described a bit of the process: "Nobody likes me, I critisize too much. Why do you think you critisize? I don't know. Well, how were your parents, oh they critisized everything, and that is why I am like I am, a disgrace to the world.
You are not a disgrace to the world Oscar. You are perfect just as you are. You should... You don't have to do anything, just know that the reason why you are so lonely is that you are hostile to everybody. Again he went through the deterministic mindset, "I have an instinct to do it, it comes naturally". I was actually suprised at his level of insight, given his low level of intelligence.
"Look, you are like that because of your parents. No doubt. But your parents are no longer here, you are free to become who you want to become, look at it that way. And he demurred into the ten thousand excuses about why he can't help critisizing other people.
Let's change subjects, he pleaded.
Well, if you could get a ticket anywhere in the world, where would you get it? Egypt. Oh, that's surprising, why Egypt? The piramids? No. Fishing in the Nile? That, I may. But I'm going to investigate on the issue of the curse of Ramses, becuase they say that anyone who tries to steal from him....
And so the topic went into his fantasies about exploring the world. It was very instructive speaking with Óscar today.
Margaret gave me as a gift a 400 euro pencil which painted only the faintest lines. She said "it only needs some sharpening" and put it in a pencil sharpener. It was reduced to half. I was very angry because she had just squandered 200 euros.
I was in my dining room sitting with Margaret, Dad, and David (my friend). We were all sipping on wine, chatting. The wine was delicious (I could actually taste it in the dream, it had the right combination of sweetness vs character that I liked). I saw that the glasses were empty, so I poured wine into dad's and Margaret's glass, but before I could serve David, Margaret took her glass and emptied it on the table, the she stuck a finger on the puddle that had formed.
"Why did you just do that?", I asked. I was sort of amused, as I was a bit drunk. "I thought it would form a portal to a different dimension" said Margaret, with rosy drunken cheeks. We all laughed, except for David, who was serious. His glass was empty, so I grabbed the bottle to serve him, but I saw it was empty. I shrugged to David, and he said "let's go". I didn't really want to leave, as we were having a good time, but I stood up anyways, and then I thought about the things I would need to pack, as I would spend the night at his place in Mexico City.
''Inner Observer''
I take a deep breathe in, exhale.
I detest this task.
To define myself.
Definitions are boundries.
As soon as I see a boundary I wish to transgress it.
The rules that I put myself are rules meant to be broken,
but underneath the rebelious nature of this insight,
lies a deeper way of doing things,
to allow the inner storm to produce things through you,
rather than to perform a futile attempt at inner control,
the detached mind observes the forces at play without intervention.
Our capacity for attention has gone to nothing.
The first thing that must be trained is attention.
Without attention, all insight goes to waste.
With senses hightened, one perceives within:
Where does the "I" exist?
Does it come from the head?
Today it doesn't, the I exists in the heart.
I have not learned how to remain there,
and I still arrive by trial and error,
but I can come to exist in the heart,
an aching can be felt,
but who is not reeling lately,
is it really pain?
no, look more closely: it is yearning.
Yearning for what?
That is the question.
Where does this yearning want to go?
To be reunited with the one?
The way of reunion is art.
That would make me an artist,
But a failure of courage has been observed,
in which I constantly put off my responsibility,
to share the insights of this great journey.
The journey is never complete without embodying it.
Let actions speak louder than words.
Who am I?
I am what I do.
Estaba subiendo en una especie de teleférico muy grande, en realidad era un tranvía que colgaba de los cables, dentro de un parque de atracciones. El tranvía tuvo un accidente y el chofer se lastimó. Todos bajamos del tranvía, y el asistente me contó que ese chofer actuaba en un show humorístico que seguía después del viaje, y me pidió actuar en él. Yo le dije que sí, y me dio unas indicaciones muy sencillas sobre lo que debía de hacer, pero se me olvidaron casi inmediatamente cuando me puse nervioso al imaginarme lo mala de iba a ser mi actuación.
El show iba a ser en media hora, y conocí a dos chicas, una morena y una rubia, que platicaron conmigo y con otro chico. Nos pidieron darles un masaje con una especie de sávila que venía dentro de un recipiente orgánico, como una calabaza. Entusiasmados dijimos que sí, y la chica morena—que era la más guapa—se acercó a mi y luego se acostó boca arriba. La rubia se acostó boca abajo.
El otro chico se acercó a la morena con cara de lujuria, yo estaba por pasarme con la rubia, pero la morena me indicó que me quedara y despreció al otro chico. Luego se quitó toda la ropa y quedó desnuda. Por un momento me pasó por la cabeza mi responsabilidad con el show, pero lo olvidé cuando vi el cuerpo de la morena: tenía el abdomen plano y firme, una cintura pequeñita con unas caderas muy generosas, con todo el cuerpo firme. Me puse la sávila en las manos y sobé su abdomen. Me miró a los ojos y yo la miré a ella, me sonrió, pero yo no pude sostener su mirada. Miré su cuerpo y me pregunté si querría que le masajeara los senos y el sexo. Me causaba conflicto, porque si me pasaba me echaría como lo hizo con el otro chico. Pregunté si le gustaba la firmeza en el masaje, me dijo que sí, y presioné mis dedos contra sus músculos abdominales. Se notaba que hacía ejercicio. Luego desperté.
Stub. Material work is what we normally consider work. It's name "material" is to distinguish it from [[Inner Work]]
Meditation is the training of attention which assists in the discovery of the true self.
Memorias de Cone
Libro I
© Eduardo Ávila Alcántar(a)
El presente libro fue transcrito y editado por Helen Ávila Moreno y Mark MacKay Ávila. Con un tiraje inicial de 30 ejemplares, su impresión se llevó a cabo en las talleres de David MacKay Pett, quien financió parte de este proyecto.
Le dije a la maestra que no iba a hacer el ridículo bailando. Me dio un jalón que me volteó, y yo le respondí con una cachetada que hasta el suelo fue a dar.
Y claro, de ese kinder me expulsaron muy feo.
Prólogo
Cuando mi tío Cone me contó que estaba escribiendo su vida, me entusiasmé mucho—la autobiografía es uno de mis géneros favoritos, y la vida Eduardo Ávila contiene una barbaridad de experiencias de un inmenso valor histórico-familiar y social. Lo felicité por su proyecto, y no sólo eso, le pedí que me hiciera partícipe a través de la edición e impresión de sus memorias.
Pronto fueron saliendo cuaderno tras cuaderno de escritos. Cuando me presentaba en su casa me preguntaba “¿cómo va eso?”, y yo apenado respondía que había estado muy ocupado. Ciertamente lo consideraba labor espiritual, pero la responsabilidad material también llama. Hay que llevar pan a la casa, aunque sólo sea para uno y pa’l perro.
Luego pensé “esto no va a salir si lo intento hacer todo yo” y entendí una lección que viene en este escrito: la vida no es un juego de solitario, se tiene que cooperar para sacar adelante algunos proyectos ambiciosos. El proyecto más grande contenido en este libro es el de criar a tanto niño tan travieso ¡pero cómo podían dar tanta guerra!
Así que decidí recurrir a la ayuda de mi querida prima Helen, que transcribió y editó la segunda mitad de este ejemplar, y de mi papá que tanto quiere a Cone y proporcionó el equipo y material para la impresión.
Espero que disfruten leerlo tanto como para nosotros fue participar en él.
Mark MacKay Ávila — Diciembre 20201
Primera infancia
Eduardo Ávila Alcántara
Nací el 13 de Octubre de 1944, en la Segunda Guerra Mundial, en la Ciudad de Puebla de la República Mexicana, 4ta ciudad más poblada de todo México, en la Avenida Juárez 1307, a media calle del Paseo Bravo. Era como la una de la mañana, y mi mamá estaba en la fiesta de casamiento de mi tía Carmela con Tony MacFarland Corona.
En la fiesta mi mamá sintió los dolores del parto, la llevaron a la recámara—y según dicen algunas personas, cuando llegó a la recámara yo ya estaba ahí, que la cigüeña me había dejado en la cama—bueno, eso dice la gente. Nací pesando 5kg con 100 gramos en parto normal, y mi mamá era muy chiquita, le ha de haber dolido mucho. Yo creo que por eso no me quería, nunca me hizo algún apapacho, caricia o abrazo, pero de todos modos me cuidó.
Cuando nací, mi papá le dijo a mi mamá: “este niño no es mío porque tiene los ojos verdes” y mi mamá le dijo “si no es tuyo tampoco es mío”, por lo que mi abuelita les replicó “pues si no es de ustedes entonces es mío”, por eso estuve toda mi infancia, hasta los 13 años, con mi abuelita. Ella contaba una anécdota de una pareja tuvo un hijo que nació el 13 de octubre, y la mamá llevó a registrar al niño con el juez.
El juez preguntó cómo le iban a poner al niño. “Mi viejo quiere que se llame como el día que nació, Iduardo”. El juez dijo “Muy bien, pero es con E”. La señora insistió “No! mi viejo quiere se llame Iduardo”—“Sí mujer! Pero es con E”. Entonces, la mujer, ya enojada le dijo “Si usted quiere que se llame Coné, pues que se llame Coné”. Por eso toda mi vida me llamaron Cone. Hasta Valentina, mi nieta que tiene tres años, me lo dice en lugar de llamarme abuelo.
Lo primero que le hice a mi mamá, fue que cuando tenía 6 meses de edad me perdí como tres o cuatro horas, y ella y toda la familia andaban como locos, creían que me habían robado, porque en ese tiempo no se estilaba el secuestro, pero cuando comencé a llorar se dieron cuenta que estaba debajo de la cama. No sé cómo fui a dar ahí, pero inmediatamente me sacaron. Luego, ¡cuál sería su sorpresa al encontrar un alacrán muerto dentro del pañal cuando me lo cambiaron!
Mi hermano Tito
Mi hermano Tito nació dos años antes que yo. Yo veía a mi hermano siempre dentro de una reja de fruta, y siempre estaba llorando. Creo que a mí no me ponían en la reja porque me hubiera salido, o la hubiera roto, pero mi hermano era muy tranquilo y no daba tanta guerra como yo. Por eso creo mi mamá lo quería mucho, no sé por qué la mamá siempre quiere mucho al primogénito.
Además él era un niño muy bonito, todo el mundo lo quería. Cuando íbamos a México con mi tía Lalita (se llamaba Lutgarda), y era hermana de mi abuelita Vicentita, así que mi tía cuando lo veía le decía “mi esposo querido” y cuando le preguntaban al niño “¿quién eres?”, contestaba “soy el Poncho Quililo”, queriendo decir esposo querido. Yo en cambio, no creo que haya sido tan agraciado como él. Pero desde chiquito era muy apegado a las faldas de mi abuelita, y con eso me fue muy bien, pues ella era la matriarca de la familia, y me gustaba estar junto a ella.
Como era más grande por dos años, él era el que mandaba. Además todos lo querían mucho, creo que es más guapo que yo, y muy inteligente. Yo quería jugar con Carmelita y Tito estaba jugando con ella, no querían que yo jugara, por lo que fui por un bat de beisbol chico labrado de color verde y que le doy a carmelita en la cabeza. Imagínate el alboroto que se hizo en toda la casa que hasta tuve que correr a esconderme debajo de la cama.
Nunca me pegaron ni reclamaron, pero de ese suceso, todos me veían muy raro, por lo que me volví muy agresivo, yo creo que por complejo o no sé, pero a veces hasta mordía a mis primos, pero ni así vi algún reproche ni de tíos ni de primos. Así fuimos creciendo con mucho cariño, entre todos con las primas y con los primos, por lo que a través del tiempo nos queremos como si fuéramos hermanos. Doy siempre gracias a Dios por ser parte de esta familia que creo que es lo más hermoso del mundo.
La casa
Muchos primos, tías, tíos y demás gente como los esposos de mis tías que se hicieron de la familia. Era una casa que tenía 5 patios y en uno de los patios cabían 4 camiones que tenía mi papá; Pedro Ávila Navarro, que era transportista de carga regular, o sea de todo.
Además de los patios, la azotea que estaba bardeada a un metro de altura, y también servía de patio, aunque pocas veces subíamos porque la escalera era muy alta, y los escalones eran de tecinto negro, que es una de las piedras más duras que existen, y se encuentra en Puebla en un pueblo de Cholula llamado Nealtican.
Pasé la infancia en esta casa con mis primos. Eran como hermanos, así nos veíamos. La convivencia que teníamos por el trato continuado, es sabor de las caricias—para esto es necesario mencionar quienes eran estas personas tan importantes en mi vida de niño, de adolescente y como adulto. Hasta hoy que ya me pasé de adulto hasta ser viejo, o mejor decir que no es que sea uno viejo sino con mucha juventud acumulada, por que ya tenemos la edad que recuerdo a los hermanos de mi abuela materna, que era la mera mera matriarca de toda la familia (Doña Vicenta Navarro y Verdejo).
Como era gente grande se vestían así como viejos, y ahora nosotros vestimos como jóvenes, o sea como chavorucos. Si algún viejo de esa época se hubiera atrevido a vestirse como ahora se estila, lo hubieran llevado a un manicomio.
Así que mencionaré a la familia que habitaba esta casa: mi abuela que ya cite anteriormente, la tía Chonita, Asunción, la tía Bichita, Maria Luisa, la tía Lupita, la tía Carmela, mi tío William, Guillermo, mi tío Jorge y mi papá Pedro, pero todos le decían Perico, que era después de mi abuela el que dirigía la casa y familia por entero. Después mencionaré los que seguían en la familia que son los hijos de ellos y primos míos, que son Sarita, después Rodolfo, Chuy, Pepe, Tito, Carmelita, yo Cone, Javier, mi hermana Esther, Tonito MacFarland y luego Chachita, después Lucha, luego Pili que es mi hermano.
Pili lleva el nombre de mi padre: Pedro Ávila Alcántar que nació a la 1 de la tarde, todos estábamos en el patio donde jugábamos con las bicicletas. Llegó mi papá, nos preguntó si habíamos visto llegar a la cigüeña y todos dijimos que sí, que era un pájaro muy grande porque no era muy conveniente llevarle la contra. Después nació mi hermana Helen, o sea Ana Helena, que siempre fue un amor de niña—y de grande, es increíble.
Después nació Willi, después Gerardito MacFarland, y el último en nacer en esa casa fue Carlitos Albicker, hijo de mi prima Sarita Albiker, que era hija de mi tía Chonita y Tomás Albiker.
Duramos en esa casa toda la niñez hasta los 13 años y sinceramente fue maravilloso, porque no sabíamos si éramos pobres o ricos, pues nunca nos faltó nada, todos teníamos bicicleta, triciclo, pelota y mucha plastilina.
Y por todas estas cosas y tiempos que marcaron la primera etapa de nuestra vida. Es necesario escribir de esta casa y de mi familia, que es lo más importante en la vida porque la familia te la da Dios, los amigos los hacemos nosotros.
Esta casa tenía 18 metros de frente y 30 de fondo. Había una reja al frente, un jardín y topaba con dos escaleras a los lados. Una escalera del lado izquierdo daba a la sala, que tenía seis puertas de 1.50m de ancho por 5m de altura, con las cortinas de arriba hasta el suelo, se veían espectaculares. Había un comedor y el mueble de sala era de terciopelo velvet, pero de color guinda con brocado del más bonito que he visto, pero no dejaban entrar a los niños a menos que fuera fiesta.
La escalera de lado derecho daba a un recibidor donde había un escritorio que tenía un teléfono, el 1636 Mexicana, porque en ese tiempo había dos empresas, una era holandesa que era la Ericsson y Mexicana, del gobierno, pero para enlazar a Mexicana tenías que marcar 04 para que te diera el enlace a mexicana, y además había una banca muy grande para que recibir a la gente que llegaba.
Después seguía el primer patio, y había una citarilla que dividía al segundo patio. Lo comunicaba una entrada chica, porque si todos los primos queríamos andar en bicicleta y pasar de un patio a otro, se tenía que parar en la puerta para darle el paso a unos y después otros, pasando por la cocina de mi abuela Vicentita donde siempre estaba Agustina, era la sirvienta de mi abuela que le duró 65 años. Yo cuando nací, Agustina ya tenía una niña llamada Josefina que todos le decíamos de cariño La Chepa, después le nació otra niña que le decían La Joroba. Así le puso el tío Luis, porque decía que su llanto lo jorobaba mucho.
Pasando la cocina estaba otro patio donde tiempo después mi hermano Tito tenía unos patos muy bonitos, tornasoles, como los que vienen de Canadá, porque eran patos salvajes. Después, en ese patio había una pileta de la piedra de recinto que era muy grande porque junto estaban los lavaderos, topaba con dos bodegas muy grandes, donde mi papá almacenaba tabaco que le llegaba de Tabasco para que lo transportara a México.
Seguía el patio más grande donde había seis árboles muy grandes de trueno, tres sótanos, uno en donde vivían los dos macheteros, o sea ayudantes de mi papá, y otro para refacciones y algo de máquinas para componer los camiones. En el otro sótano se guardaban los puros, palos y madera. No sé para qué querían tantos, pero a nosotros no nos daban permiso de entrar ahí porque había muchos alacranes. En ese patio componían los camiones, hasta consiguió un mecánico de planta que se apellidaba Maravilla, el Sr. Radamés Maravilla, y así se le quedó el nombre al patio.
El famoso patio de Maravilla, que para nosotros era otro mundo dentro de la misma casa. Era un patio de tierra, aunque tenía su banqueta para entrar a los sótanos, y además en ese patio mi tía Chonita tenía varias gallinas. Era como un gallinero con 20 o 30 gallinas y gallos de color rojo, yo creo que eran de la raza Leghorn, y hasta los huevos eran rojos. Como en los árboles había nidos de pajaritos, tomábamos los huevos de las gallinas y los poníamos en los nidos para ver cómo se asustaban al verlos.
Una vez, estando corriendo en el patio #2 de la casa descalzo, me enterré una aguja oxidada hasta la mitad, nos costó algo de trabajo sacarla sin que se rompiera. Me ayudó mucho mi primo Javier, que siempre estuvo a mi lado toda su vida. Lógico no dijimos nada, ni a mi mamá ni a la abuela, porque no sabíamos que existiera el tétanos, que si te llega a dar por un suceso como ese es una muerte muy dolorosa que termina con la persona y el cadaver enroscado hacia atrás, ni para meterlo en el ataúd. Pero gracias a Dios no me pasó nada, pero si te pasa esto algún día, acude a un sanatorio para que te pongan una inyección anti-tetánica.
Para terminar con la casa de la Av. Juárez 1307, mi papá nos llevaba seguido en la noche, ya sea en camioneta o en el camión de carga, a comer los antojitos que existían en la Colonia Santa María por la 28 poniente por donde estaba una cantina que se llamaba "Chava's Place", que siempre me llamó la atención por el nombre. Ahí había molotes, pelonas, tacos, café o atole, que en ese tiempo se acostumbraba consumirlo con pan o con tamales.
Esto del atole me hizo recordar que cuando yo era muy chico, mi mamá me daba en las noches de 4 a 5 tazas de atole. Si no soltaba la taza era que quería más, y si lo aventaba pues ya no quería, pero se rompía la taza, por lo que mi mamá compró unas tazas que parecían barrilitos, pero eran de aluminio por lo que ya no se podían romper, y así lograron existir durante mucho tiempo, hasta que ya éramos grandes.
Los túneles de la casa
En una esquina de la casa estaba una cocina antigua, con bracero y fogones que yo creo que era donde las monjas que habitaron esa casa cocinaban, por que tengo entendido que muchos años atrás fue un convento y después lo convirtieron en cuartel de soldados. Yo creo que cuando fue convento tenía un túnel que llegaba hasta el templo de San Agustín, que está en la 3 Pte y 5 Sur, por el centro de Puebla.
Mi abuelita tenía prohibido acercarnos a ese túnel, pero como ya estábamos más grandes, Javier y yo levantábamos la tapa de madera que se ubicaba donde terminaba el bracero que estaba hecho de mampostería y forrado de azulejo de talavera, y era una tapa de matera de un metro cuadrado, y al levantarlo vimos que había una escalera de fierro y por ahí bajamos como tres metros y encontraba el túnel, muy bien hecho, como de metro y medio de ancho y dos metros de altura.
Empezamos esta aventura en obscuridad total, y sólo llevábamos dos cajas de cerillos Clásicos de Lujo, que los encendíamos a cada rato hasta que encontramos un desplome de tierra, por lo que ya no seguimos. Calculamos por lo andado que este desplome estaba a la altura de la oficina de mi papá, en la 3 Pte, y como nos quedamos con la duda de a dónde llegaría el tunes, fuimos a San Agustín para preguntar y buscamos al padre José y él nos hizo favor de decirnos todo al respecto.
Toda la ciudad tenía estos túneles, que los sacerdotes usaban en el tempo de los Cristeros. El gobierno de México no quería a los curas, y por miedo a que los mataran o les hicieran daño—pues el gobierno quería cerrar los templos y parroquias—mandaron a construir estos túneles, que a su vez estaban comunicados uno con otro. En cada templo importante había una entrada como la que teníamos en la casa y de ahí se pasaban a otros templo, hasta llegar a la Catedral, donde todavía existen catacumbas que tienen como cuatro pisos de altura y son muy seguras, pues es muy difícil entrar a este lugar donde tienen pinturas, enceres y hasta esqueletos de algunos padres que les tocaba ser autoridad en la catedral.
Bueno, de ahí tomaban otro tunes que estaba pasaba por el río de San Francisco, hasta llegar a un lugar fuera de la ciudad de Puebla, que se llama Amalucan. En la salida de este túnel tenían diligencias, carretas caballos y gente para que los protegieran cuando tuvieran que escapar.
Para terminar, te diré que si hubiéramos seguido en el túnel encontraríamos como 100 o 120 rifles, que seguro los tenían almacenados en ese lugar del desplome de tierra, porque cuando tiraron una vecindad en la 3 Pte, los albañiles encontraron y avisaron al ayuntamiento, y llegó la policía, también los militares, pero lógicamente se dieron cuenta que eran antiguos, así que no detuvieron a nadie, pero sí se los llevaron.
La escuela
Mi papá me llevó al kinder del Colegio Americano, pero yo creo que se le hizo muy caro y mejor me inscribieron en la Normal del estado, pero los compañeros me parecían retrasados y la maestra me dijo que teníamos que bailar y no me pareció buena idea eso de bailar dando de vueltas. Le dije que no iba a hacer el ridículo y me dio un jalón que me volteó, y le respondí con una cachetada que hasta el suelo fue a dar. Y claro, de ese kinder me expulsaron muy feo.
Entonces me llevaron a un kinder que todavía existe, en la 7 sur y 7 pte. que se llama "Leonardo Bravo". Ahí se me ocurrió cuando vi una vitrina con dulces que la maestra misma los venía a los niños, estaba abierta y cogí los dulces y comencé a repartirlos a cada uno de los niños, y por consecuencia me expulsaron, no sin que mi papá pagara $30.00 y otra vez a buscar un kinder.
Me llevaron a otros que no me gustaron hasta que fui a un kinder, Colegio Howard en una casa que estaba en el Paseo Bravo, entre Av. Juárez y 5 poniente, en la 13 sur, y ahí sí me trataron bien, y hasta bailábamos con las niñas esa canción que dice:
a la rueda
rueda de pan y canela
dame un besito
y vete a la escuela
si no quieres ir
acuéstate a dormir.
Y por eso me gustó, hasta terminar el tercero de kinder y como había una escuela cerca de la casa, también en el Paseo Bravo, que por cierto se llama así porque en la esquina de la 11 pte con 13 sur en el mero Paseo, fusilaron en tiempos de la Revolución a los hermanos Bravo, que dicen eran muy valientes. Fue un lamentable suceso por lo que en el lugar de llamarse Paseo Nuevo le pusieron Paseo Bravo; y ahí estaba esta escuela que se llamaba 2 de Abril, que antes era un cuartel ondee fue el sitio de Puebla, ganado por el Gral. Porfirio Díaz Mori y como estaba a tres calles de la casa y el director era en ese tiempo el Sr. Prof. Manuel Ávila Zamora, que para colmo era primo de mi papá.
Así que no hubo más remedio y entré a primer año con la maestra Gutiérrez, que yo creo no era muy buena maestra porque nunca se fijaba si escribíamos bien o mal, ni nos regañaba y así fue el segundo año y en el tercer año me tocó la maestra Ángela Blasio, que me tenía cierta estima porque mi papá, en el día del maestro le regaló una lámpara muy grande y bonita.
Pero llegó el examen final de ese tercer año, y dijo la maestra que el examen sería el sábado, pero nunca íbamos los sábados a la escuela por lo que yo no quise ir en Sábado. Pensé el el lunes la maestra Ángela Blasio haría una excepción conmigo y no habría problema. Pero no fue así, me reprobó y tuve que repetir el tercero en esa escuela donde la mayoría asistían descalzos, pues eran muy pobres y la verdad no me gustaba para nada. Si hubiera podido le pondría una bomba para destruirla, pues nosotros como niños nunca podíamos reclamarle al papá o la mamá.
Lo que ellos decidían—en realidad lo decidía todo mi papá, pues mi mamá nunca nos defendía—mi papá llegaba, sacaba el cinturón y a todos, aunque fueran hijos o sobrinos—marcaba con fuerza que él era el que mandaba sin más ni más. En una ocasión en esta escuela, llegó mi papá al salón de clases y de algo se quejó la maestra, porque mi papá sacó como siempre el cinturón y me dio con todo, más fuerte que otras veces y claro delante de los compañeros es muy vergonzoso. Me puse a llorar, pero nadie se burló, al contrario, sentía como me palmeaban la espalda diciendo “ya güero, cálmate” y la maestra ni me dirigía la palabra, le daba pena, pero ya estaba hecho.
Así pasé el cuarto año con el maestro Luis González que me tenía mucho aprecio, y me invitó a que fuera con él a buscar restos fósiles en Valsequillo, porque ese era su pasatiempo, y él sabía que me gustaba la paleontología y la historia. Una vez llegamos a un río que se llama el Batán, y cerca de la carretera encontré una muela de mamut y en seguida la gente que iba con nosotros rascaron y fueron descubriendo varios huesos, colmillos, el cráneo y oí como dijo el profesor que era un mamut completo. Pro yo ya no volví con ellos, ya no me invitaron, se ve que la cosa era muy gruesa y delicada, pero de todos modos una vez le pregunté al Prof. Luis González que qué había pasado con el mamut y me dijo muy desconsolado que los había intervenido la Universidad Autónoma de Puebla y no podía hacer nada, por lo que no está en ningún museo, ni siquiera en la Ciudad de México, así es que la UAP lo tuvo que haber vendido a otro país, no había de otra.
La natación y la familia
Una vez en el patio Maravillas se rompió una tubería de agua de azufre, porque esta zona estaba llena de azufre. Atrás de la casa estaban los “Baños de San Sebastián”, un baño muy grande de vapor ruso y vapor turco, uno húmedo y el otro seco. Tenía una alberca de agua de azufre, que fue la primera vez que estuve a punto de ahogarme. Tenía menos de tres años y estaba en la mera orilla, y me soltaba y me detenía, pero de momento no alcancé a detenerme y me sumí. Yo creí que me moría, cuando siento un jalón de cabello, era mi tío Jorge que me vio y fue de un jalón de cabello, el más bonito que he sentido, yo creo que de toda mi vida.
En la zona de la casa había dos balnearios, uno que era muy bonito, tenía 6 cuartos con alberca y vestidor. Sólo el sexto tenía techo y era el más grande, donde le gustaba llevarnos a mi tía Lupita, porque cuando venía mi tío Chuchito, hermano de mi abuela que vivía en México, siempre nos metían en el #1 que tenía techo y se calentaba más porque de por si el agua de azufre es caliente. Me acuerdo que una vez en el #6 me subí a un pretil donde se escurría el agua, quise echarme un clavado pero me resbalé y me di en la cabeza—que no sé cómo no me morí, pues casi pierdo el sentido—no me recuperé hasta pasadas como dos horas, por lo que me perdí la diversión con mi tía Lupita.
También había otro balneario una calle más arriba, el balneario “La Paz” que se supone la alberca era de agua de azufre, pero la mezclaban con agua dulce, por lo que ya no era de calidad, por lo que la gente que acudía ese balneario era gente humilde, pero a veces íbamos nosotros también. En ese balneario había un trampolín de hasta 10m de altura, y una vez se me ocurrió echarme de clavado y fue la única vez que lo hice. Ahora que ya no existe este balneario, dejaron el trampolín en ese lugar, yo creo que fue para que me siga acordando de ese momento, que fue una experiencia que no te recomiendo.
El agua de azufre hasta en la calle brotaba, tenían que canalizarla a las tarjetas. Yo creo que por esto pasarían tuberías por la casa y se rompió alguna en la casa, pues comenzó a brotar en el famoso patio de Maravilla, rascamos hasta tuvimos alberca propia, pero no duró mucho el gusto porque el ayuntamiento lo fue a componer, y ahí se nos acabó la alberca de azufre.
Una vez a mi primo Pepe Milián Ávila—Pepito (hijo de mi Tía Bichita y mi tío Pepe) se le ocurrió que nos llevaran al balneario Agua Azul, que también fue algo que hizo mella en nuestras vidas. Estaba de presidente el maestro Tulio, pero el que realmente nos ponía a nadar era el profesor Cecilio, que era ya negro de tanto sol que le daba diariamente, y teníamos que ir casi a diario a nadar. El entrenamiento consistía en dar 20 vueltas a la alberca de 50 metros de largo (olímpica), aparte nos enseñó la braceada, patada, y toda la técnica necesaria para avanzar más rápido.
Hasta nos enseñaron a rescatar gente que se estuviera ahogando, por lo que como éramos del Club Agua Azul hacíamos nuestras guardias de salvavidas, y qué bueno que no se nos ahogó nadie.
Era agua de azufre, que para nosotros era lo mejor para nadar, porque siempre estuvimos cerca del azufre. Lo único malo de Agua Azul es que siempre que se caía o resbalaba mi primo Javier, y se abría la cabeza. Y mi tía Chonita, que era su mamá, decía que nosotros lo empujábamos o le pegábamos, pero un día que ella lo llevó a Agua Azul, se cayó y se abrió la cabeza. Mi tía Chonita nos dijo a los demás primos "lo que pasa es que mi hijo en realidad es un pateluco" y de tantas descalabradas Javier tenía su cabeza como mapa.
Me acuerdo que muchas veces mi papá nos levantaba a las 6am, cogíamos las bicicletas y nos llevaba hasta lo que es el Rancho Colorado. Se conocía como Las Pozas de Cuatro Caminos, puro azufre. En esta época era muy rústico porque no había nada, sólo las pozas de agua de azufre. Nadábamos y de regreso a la casa. Sólo había milpas y milpas y la vereda por la que los desplazábamos de ida y de regreso, pero rápido porque teníamos que llegar a tiempo para ir a la escuela porque entrábamos a las 8 en punto.
Cuando me acuerdo de mi papá y sus camiones tan viejitos, pues eran de la década de los 40, que ahora en este tiempo pienso que no sé como podían circular, pero todo es según el tiempo que estaba uno viviendo, creo que el carro más nuevo que tenía era un International blanco 1956, que le puso por nombre “El Palomo”, porque haz de saber que además de tener su número tenía su nombre, como el fantasma, el perico, a otro le puso Lili por mi hermano Pedro Ávila que de cariño le decían “Pili”. El carro de mi tío Jorge era el Alma Grande, el camión de mi tío William (Guillermo Ávila) se llamaba “El brochecito de oro” por que así le decía a mi abuela, porque fue el más chiquito, el benjamín o zocoyote de la familia de mi abuelita Vicentita y de mi abuelito Clemente Ávila Zamora. Mi abuelita se llamaba Vicenta Navarro Verdejo.
Me acuerdo que nos llevaban seguido a todos en el camión al río Atoyac a nadar, o de día de campo, o inclusive al mar en el puerto de Veracruz, porque a él le encantaba ir a Veracruz, por lo mismo que la línea de transportes, su ruta era México-Puebla-Veracruz. Además, cuando él tenía como 13 años trabajó en la carretera Puebla-Veracruz, porque era de terracería todo el camino y su camión era de volteo. Este camión se lo compra al Sr. Richard, el dueño del restaurant El Cazador, porque era muy amigo de mi tía Chonita y ese camión lo trabajaba acarreando arena del Río Atoyac a las construcciones y mi papá trabajaba con él a los 12 años, yo creo que para ayudar a la familia.
El camión se hacía 12 horas de Puebla y 14 de regreso. A veces a mi papá le gustaba irse por las cumbres de Culzingo, que son unas cumbres que llegan de la parte de arriba hasta el valle de abajo. Medían como 2,000 metros así que veías a Río Blanco, Veracruz como si fueras en avioneta. Curvas y curvas, pero lo más peligroso que se pueda uno imaginar, pero a nosotros como chamacos nos parecía emocionante.
Así llegábamos al mar o a Boca del Río, que era la bocana pues se juntaba el río con el mar, no había nada, sólo unas chozas y demasiado pez Bagre, que por cierto tenía como 8 años cuando en Boca del Río estaba una lancha en la orilla. Me subí pero al bajarme salté donde había un poco de agua, al saltar caigo encima de un bagre y como tienen espina o aleta en el lomo se me clavó en le pie derecho, sentí horrible. Me lo quité, pero no sabía que tenía algo de veneno, porque todo el día me sentía mal, como con calentura y dolor en todo el cuerpo.
Estábamos en Boca el Río, y de todos modos seguí metiéndome al mar a la arena y al sol, y así en la noche regresábamos para llegar temprano a la dichosa escuela, pero esta vez, aparte de la calentura, estaba quemado del sol, lleno de arena hasta en el ombligo, por que no me acuerdo que nos pusieran algún tipo de bloqueador de sol. Ni siquiera nos bañábamos con agua dulce, así que a la escuela con el problema del pez bagre que se me enterró con ello quemado que ardía horrible con la arena por todos, y ni modo era parte de estar vivo y con tu familia.
Los abuelos
Mi abuelito Clemente era muy grande, pues se casó con mi abuela cuando ella frisaba los 13 años y él tenía de 30 a 33 años, porque no sabía la fecha exacta, pero era mucho más grande que mi abuela, por lo que no podía trabajar mucho, aunque según mi abuela no le gustaba trabajar.
Él era fotógrafo y así como se le ocurría ir a vivir a algún pueblo le decía a la abuela “coge las más cosas que puedas y vámonos” y así llegaba a las catedrales o templos y sacaba imágenes de los santos que tenían, ya sea el santo patrono y santos que lo acompañaban, entonces hacía las estampitas y las vendía al mismo templo o a quien se las comprara, y se gastaba el dinero conforme lo ganaba. Mi abuela le decía “oye viejo, hay que guardar para mañana pueda pasar” mi abuelito le decía “Dios proveerá”, que comprara pollo, carne y pulque, ya mañana habrá para más.
Si no llegabas antes de las 8 a la escuela cerraban y ya no podías ingresar. A veces me gustaba que no me dejaran entrar, porque regresaba con mi abuelita y juntos íbamos a San Sebastián, o al templo de Guadalupe a rezar, o si había alguna procesión o fiesta de alguna capilla, parroquia o algo de la iglesia, a mi abuelita le gustaba mucho asistir a las festividades de la Iglesia Católica. Si había fiesta en Analco, pues vamos al templo para ver la procesión o algo que diera tiempo, porque casi siempre íbamos en la tarde, después de la Escuela 2 de Abril, que gracias a Dios ya no existe, yo creo que por lo tanto que oraba y pedía que se cayera o cerrara.
Una vez fuimos hasta los remedios, y de regreso tomamos el camión blanco que era “Libertad-Cuauhtémoc” y no nos fijamos dónde nos íbamos a bajar, y nos fuimos hasta el pueblo de La Libertad, que ahora ya es una colonia, pero en ese tiempo estaba muy lejos del Paseo Bravo, y no llevaba más dinero mi abuelita y yo no sabía qué hacer, y me asusté, casi lloraba, no por mi, sino por mi abuelita, pues yo desde que nací o tengo recuerdo, ella ya era viejita.
Para esto ya era de noche, y alegábamos con el chofer que teníamos que regresar a la casa y no sé cómo lo convencí, pero nos llevó con su camión a las puertas de la casa, por eso decía que mi abuelita quería que estudiara en el seminario para que algún día fuera el Obispo de Guadalajara, no sé por qué de Guadalajara, yo creo que era el más importante.
Mi abuela nos enseñó la religión católica, pero muy intensa por lo que cada vez que estábamos jugando fuerte nos ponían a rezar el rosario todos hincados de Inojos o mil veces Jesús, como el día de la Santa Cruz, el 3 de mayo me acuerdo que estábamos rezando el rosario y mi tía Bichita, mi tía Carmela y mi abuela se quedaron dormidas mero en medio del rosario y entonces nos levantamos muy quesito y todos nos fuimos a seguir jugando, pero nos fuimos al patio de maravilla para que no nos oyeran, y nos volvieron a jalar para rezar.
Cuando nos sentábamos a comer todos juntos mi abuela nos decía "no jueguen con palos", siempre estaba sobre nosotros y para que nos calmáramos nos ponían a rezar el Rosario, y cuando era el 3 de mayo, día de la Santa Cruz, nos ponían como ya les platiqué mil veces, Jesús, Jesús, Jesús, y cuando esto sucedía, siempre me acuerdo que cuando iba con mi abuela a México, en las curvas de la Carretera Federal, hay un lugar que se llama las 7 curvas que dan a un voladero, y siempre que tomaba el camión Estrella Roja una curva, mi abuela decía "Jesús, Jesús, Jesús", así todo el curverío. Se me quedó muy pegado y cuando ya grande yo mismo decía "Jesús, Jesús, Jesús".
Así fue su vida hasta que los hijos crecieron, y de Huejotzingo que fue donde más vivieron se vienen a Puebla con la ayuda de un amigo de mi abuela que se llamaba Rafael Teyssier Brito, que fue muy amigo de mi abuela, porque el abuelo Clemente no le gustaba tener amigos, era muy parco. Pero este Rafael Teyssier, conocido en la familia como el Tío Fais, que era un señor alto, Güero de ojos azules, y siempre que venía a Puebla mi abuela lo acompañaba al banco a cambiar alguna moneda de oro, y le dejaba unos centavos. Esto, yo no me acuerdo, fue durante varios años.
Las calles y los vecinos
En esta casa nos tocaron muchas cosas y anécdotas. Como estaba situada al lado de la escuela Venustiano Carranza, que estaba pegada por el lazo izquierdo, nos tocó ver las peleas que enfrentaban con los de la Escuela Normal del Estado. Con piedras y palos se daban muy fuerte, eran los perros de la Venustiano contra los Nahuales de la Normal, y veíamos que les daban en el cabeza y salía sangre los ayudábamos a entrar a la casa para que mis tías los curaran o los reguardaran. Y en ese calle de lado derecho, habitaban dos viejitas que decíamos que eran brujas, porque usaban una pañoleta que nunca se quitaba, creo que estaba calvas y tenían mal carácter, creo eu fue que nunca se casaron por eso eran muy agrias y mejor ni acercarse del otro lado en la Venustiano Carranza se podía ver las ventas de los sótanos porque en esa casa que es de piedra muy bien hecha y bonita también había—como en la nuestra—sótanos y ahí tenían un esqueleto completo, y por lo mismo también daba miedo. Tratábamos de no pasar unto a esas ventanas, y en esa clle que es una de las más bonitas de la avenida que en ese tiempo querían ponerla Av. de la Paz, y otros querían ponerle Av. de la Libertad, y gente muy interesada y de dinero mandaron a construir el monumento grande donde estaba la efigie de Abraham Lincoln, que fue quién terminó con la esclavitud en Estados Unidos.
Pero mucha gente no estuvo de acuerdo y el gobierno no tuvo mas remedio que quitar la cabeza de Lincoln, y decidieron por unanimidad ponerle la cabeza del Lic. Benito Juárez, aunque el cuerpo y vestimenta no le correspondía, por eso fue que le pusieron Avenida Juárez, por lo acontecido nos convertimos en Juareños, bueno, los que nacimos ahí.
En esta calle echábamos relajo, pues la banqueta es ancha, además contaba con pasto al frente y tramos enormes de pasto donde jugábamos, siempre hacíamos equipos—Javier y Cone vs Tito y Tonito MacFarland, ya fuera para fútbol, americano, rugby, lucha libre o inclusive policías y ladrones, pero siempre juntos.
Tenemos que recordar que en la misma calle vivían los Posada, que era en esa época Don Rafael y la esposa e hijos de Rafael, Fernando y Nacho, que era el más dicho. Creo que tenían una hermana, pero no la conocí. Estaban en una casa muy antigua los Ilizaliturri, que fueron amigos de Tito, parece que eran compañeros en a escuela y en la esquina estaba el Sanatorio del Río, del Dr. del mismo apellido. Era un edificio que en ese tiempo era muy grande. Pasando la calle, o sea en la 15 sur, vivía Jaime que me acuerdo que era novio de mi tía Lupita, y ella estaba muy emocionada con el noviazgo porque este hombre era muy buena gente, bien parecido. Sus padres eran los dueños de Gas de Oriente, los más importantes en ese tiempo, y además la casa era impresionante, pintada de color amarillo crema, muy elegante con una cochera larga como para 4 coches.
Mi tía Lupita estaba segura que se casaba con él, pero vino la sopesa que sus padres, más que nada. La mamá los obligó a entrar al seminario para que fuera cura de la Iglesia Católica por lo que nunca se pudo casar, yo creo que fue tan duro el golpe para mi tía, que por eso nunca se casó, aunque tuvo muchos novios y pareja.
En la acera de enfrente vivían los Concha, una casa muy grande hecha de cantera gris que daba de calle a calle, el frente estaba en la Avenida Juárez y en el respaldo donde tenían a la servidumbre era un departamento enorme con puerta a la 5 Pte.
Una vez que estábamos afuera de la casa vimos cómo había mucha gente en el camellón de la calle y un camioncito con plantas. Nos acercamos y lo que pasaba era que estaba sembrando las palmeras. Eran muy chiquitas, como de 30 cm, y nos pusimos a ayudarlos a sembrar, por lo que esas palmeras que ahora son gigantescas tienen que ver con nosotros y mucha pero mucha gente no sabe que son dátiles muy chiquitos que la palmera deja caer y saben increíble.
Frente al Paseo Bravo, había una plaza de toros de madera. Existía hace muchos años una plaza de toros que estaba en la 11 sur, entre la 3 y 5 poniente, que con el tiempo se fue destruyendo, hasta que quedó nada.
Esa calle de la 11 sur, en las postrimerías de la ciudad, había una barranca que venía con agua mucho más allá de la Colonia Santa María, era agua que venía de la cañada Guadalupe en el volcán y recogía agua que llegaba del cerro desde An Juan, o sea La Paz, y esta barranca llegaba el pueblo de Mayorazgo, que existía antes de la fundación de la Ciudad de Puebla, que fue el 16 de abril de 1531.
En 1925 o 1928 se terminó de pavimentar la carretera México Puebla, y se dejaron venir cerca de noventa o cien mil personas en sus carros, que ya te imaginarás qué carros eran en la carretera que se le sembraron álamos y eucaliptos a los lados de toda la carretera, y colocaron tambores con agua para el calentamiento, también estaban unas grúas muy rústicas, pero todo era por el gusto de rodar en el pavimento, por que esta carretera fue la primera pavimentada en toda la república, aunque algunas persona difieren, pero menciono esto porque aquí en el Paseo Bravo, el gobierno les dio de comer a toda la gente que llegó de fueras, sobre todo desde la Ciudad de México.
Había unos muchachos que vivían en una casa grande pero muy descuidada en la Avenida Juárez y 17 Sur, que ahora está muebles Castani, mucho más arreglada pero con la misma estructura, pues en esa casa estaba una familia que los muchachos siempre nos querían pegar. Yo creo que nos tenían mucha envidia, y mi hermano nos decía "no hay que tenerles miedo, tenemos que pegarles!" y ni modo, nos peleábamos a cada rato y hasta los íbamos a buscar a su casa para pegarles, pero por lo regular siempre nos regresábamos corriendo a la casa donde siempre nos sentíamos protegidos.
En toda la avenida no encontrabas negocios si no puras casa habitación. Sólo estaba la agencia de autos Montoto. El dueño era un señor que estudió contaduría y como no tenía dónde desarrollarse, se fue a la ciudad de Tezuitlán, Puebla, a trabajar con una familia cafetelera con mucho dinero que eran los Arámburo, y al ver cuánto dinero tenían y no gastaban en nada que no fuera totalmente necesario, conquistó a una de las hijas, se casa con ella y se trajo a la esposa y al dinero a Puebla, pone la agencia que le concedió la Chevrolet, o sea _General Motors_ y comenzó a comprar casa a quien tenía necesidad de vender. Parece que llegó a tener como 70 casas.
En la avenida Juárez y 17 sur había una casa muy bonita (que todavía sigue ahí) donde vivían unos muchachos que eran enanitos y nos llamaba la curiosidad estarlos observando, pero, como salían al jardín había chamacos que siempre los molestaban. Después nos enteramos que la muchacha, porque eran dos hombres y una mujer, se metió con el joven que iba a arreglar el jardín, o sea el jardinero, así que tuvieron que casarlos, por lo que este muchacho se hizo millonario y creo que viven en México, porque no los hemos visto aquí en Puebla.
Además, en la 19 sur estaba un monumento a la Libertad, pero a nosotros no nos dejaban ir hasta ese lugar porque ya era muy lejos de la casa, y podía ser peligroso. Más adelante, en la 21 sur, estaba una armadora de autos Packard, muy famosos en Puebla por el renombre.
En al 23 sur vivían los Camacho Gómez. En esta familia había dos o tres hermanos, y el que se llama Jaime fue mi compañero en el Centro Escolar, pero ya hablaremos de él más adelante.
En la 25 sur había una tienda chiquita donde venían la miel Carlota, que era de abeja, muy pura, según eso decía la dueña. Enfrente había un hotel medio mal hecho que se llamaba "Hotel La Paz", y aquí es donde está el monumento que platiqué anteriormente.
Aquí también es donde llegaba el pavimento, y a alguien de dinero se le ocurrió fraccionar un cerro donde terminaba la Avenida Juárez, posiblemente los dueños de Cementos Atoyac, que tenían el negocio en la Avenida Reforma a la altura de la 31 sure hasta la 37 sur, donde ahora está suburbia, Walmart, y la plaza del árbol. Más adelante hablaremos de esta cementera que tuvo qué ver en mi vida.
Sigamos con el cerro de San Juan, ahora conocido como Colonia La Paz. En este cerro estaba la Hacienda de San Juan, y aunque era la Colonia La Paz, mucha gente no dejaba de decir Cerro de San Juan. Había muy pocas casas, vendían los terrenos de 300m2 cada uno, mi papá compró dos de estos terrenos en una calle que se llamaba Tepeaca, pero más adelante los vendió, porque decía que estaban muy lejos de la casa y ni modo, nos quedamos sin los terrenos.
También en la Avenida Juárez, a la altura de la 19 sur, junto al Balneario La Paz, estaba un salón de baile que no daba a la calle, sino que se subía por una rampa hasta llegar a una explanada con techo y se caracterizaba por que asistía mucha gente de clase media baja y en la entrada pusieron unos anuncios que decían "Se suplica a las damas que se recorten las uñas de los pies por que equivocan al del Güiro".
Y en el lado derecho había otro que decía "Se suplica a los caballeros no tirar las colillas de cigarro en el suelo, porque las damas se queman los pies". En esa calle a medianía de cuadra vivía una de las mujeres más bonitas de Puebla: Lolita Azcárraga, que por cierto una de sus hermanas fue Miss Puebla.
Y así, acordándome del cerro de San Juan, nos íbamos hasta ese lugar. Claro que a escondidas, pues era como una excursión porque en ese tiempo estaba muy lejos. Hasta salían de las pocas casa que había y nos invitaban a comer o a merendar según la hora, y ya que estábamos allá nos dimos cuenta que debajo de cada piedra que levantábamos había una o dos víboras muy chicas y nos las llevábamos a casa. Pero cuando papá se dio cuenta de las víboras ya teníamos como cien y nos obligó a ir a dejarlas donde las encontramos, y ahora es muy difícil encontrar tan solo una.
A Cholula en bicicleta
Nosotros éramos felices, gracias a mi abuelita y a mis tías, porque todas eran como nuestras mamás, y hasta mi mamá Manuelita—que se llamaba Manuela Alcántar Avigna; originaria de la ciudad de Durango. Lo más admirable de mi mamá es que nunca se peleó, ni discutía con nadie de la casa, así que nadie nos podía tocar. El único era mi papá, que siempre que llegaba nos pegaba con si cinturón una y otra vez, por eso cuando lo veían llegar gritaban "ahi viene el tío Perico!" y todos a esconderse, hasta las primas! Pero como nos llevaba en bicicleta a todos en la calle, pues claro que se nos olvidaba lo del cinturón.
Una vez nos llevó hasta Cholula por un comino de terracería, que ahora se le llama la recta a Cholula, vía Atlixcayotl. Entrábamos por la exhacienda y pasábamos a Zavaleta y de ahí por la vereda de pura terracería, pero lo que ese viaje tan duro me acuerdo que tomábamos agua de los charcos que había en el camino, pero al llegar a Cholula nos cayó un aguacero como nunca lo habíamos visto. Salieron de una casa muy grande como si fuera un rancho o exhacienda, y nos hacían señas que nos metiéramos y mi papá nos hizo señas que entráramos. Todos dejamos las bicicletas en el camino y corrimos a la casa. Yo todavía me regresé a ponerle a mi bicicleta que era una Hércules inglesa de rodada 26. Le amarré un pañuelo en el asiento para que no se mojara mucho.
Para colmo de este viaje, fue que mi tío Pepe, esposo de mi tía Bichita, nos hizo favor de acompañarnos, por que como trabajaba en la Cd. de México. Entonces los señores de la casa nos dieron de comer mole de Guajolote, pero picantísimo, y mi tío Pepe, que le gustaba tanto el picante, ya ni quería comer por que él todos los domingos abordaba el autobús Estrella Roja, que siempre ocupábamos para ir a la Cd. de México, ya hasta el Autobús pasaba a la casa por él, porque la salida de los camiones era por la avenida Juárez y como no dejaba de llover aunque ya había pasado la tromba, teníamos que regresar muy rápido. Las bicicletas las había arrastrado el agua como 100 metros, y el panũelo nunca lo encontré.
Nos vinimos por el mismo camino, pero todo estaba anegado, y como siempre Javier entró en un charco pero era como arena movediza y cada vez se hundía más y más, entre Tito y y lo atrapamos y lo sacamos todo lleno de lodo, pero así seguimos toda la travesía; lo que me dio mucho coraje es que mi papá traía en el portabultos a mi hermana nena y la bicicleta, que era una golondrín de color azul, pesada, pero con todo y eso la traía mi papá en el hombro. Nomás con eso te das cuenta de la fuerza que tenía ese hombre.
Con todo y eso llegamos al pavimento, por donde está el Hospital Universitario, el agua nos rebasaba las rodillas. La verdad es que no sé como llegamos a la casa, yo creo que fue obra de Dios, pero mi tío Pepe no dejaba de decir groserías porque ya era tarde para tomar el camión que pasaba por él, pero de todas formas logró irse en otro camión sin dejar de decir groserías y amenazando de no volver a salir con nosotros.
Bailables
Cuando estábamos en la casa a veces nos ponían a ver televisión, teníamos una muy bonita porque era como consola de la marca Admiral, y tenía un control aunque no remoto, porque tenía cable, en esa tele veíamos al Loco Valdez en "Variedades del medio día", y a veces las a las primas se les ocurría bailar o cantar para divertirnos un buen rato.
Carmelita bailaba como si fuera opereta, que decía así: "Limoncito, limoncito, al salir del cien empezó a llover y me alcé las enaguas, pero los hombres no debe ver".
Mi prima Chachita, hija de mi tía Bichita, cantaba el Relicario, y así hasta mi hermana la nena bailaba, también yo creo que esto lo heredaron de mis tías, porque una vez encontramos en el cuarto donde mi tía Chonita los trajes de fantasía que alquilaba al público en general, y este negocio lo heredó de el abuelito Clemente, porque como no le gustaba mucho el trabajo comenzó a confeccionar trajecitos de diablo, de hadas, o de cualquier cosa para retratar a los niños, y con esos retratos sacaba algo de dinero, pero la gente se los alquilaba para fiestecitas del colegio o alguna fiesta, y así comenzó ese negocio, que como mi tía Chonita era la más grande (aunque nunca supimos quién era más grande, mi tío Luis o mi tía Chonita) pero sí era la más grande de las mujeres. Entonces puso a coser a todas mis tías, hasta confeccionaban trajes de China Poblana, o de charro, y hasta a veces nosotros como chamacos nos dejaban hacer antifaces con tela y almidón. A mí me dejaban hacer las máscaras con papel periódico, y así llegó a tener muchos trajes diferentes con los que algunas veces nos lo prestaba para jugar en la casa.
Pero estábamos hablando del póster que encontramos anunciando a mis tías, que decía a la leyenda que ellas bailaban en ese teatro, y además decía "La bella Choni", por que si mi tía no era tan bella, era muy elegante, en eso nadie le ganó. Se notaba que era un teatro de opereta en la calle de Las Bellas, que es la 16 oriente entre 3 norte y la 5 de Mayo, que por cierto ellas de Jóvenes vivían en esa calle y el dueño creo que se apellidaba Rodríguez Pacheco. Todo esto tuvo que ser por el año 1935, más o menos. Por todo esto, ahora nos damos cuenta porqué mi tía Bichita nos enseñó a bailar los lanceros y otros bailables antiguos.
Recuerdos con los primos
Regresando a lo que era la vida en la casa donde nos desarrollamos, me acuerdo que jugábamos a la Carreta. Poníamos unas sillas acostadas, unas encima de otras, hasta dar la altura de una carreta que usaron los pioneros en EEUU y como caballos poníamos una sillas acostadas, con un lazo amarradas como si fueran las riendas, y uno de nosotros era el cochero, pero más que nada, para avisar si alguien venía casi siempre era yo el cochero, mientras las primas y los primos iban dentro de la carreta y nos divertíamos mucho; cuando ya éramos más grandes, a mi hermano Tito se le ocurrió que jugáramos con una escalera grande de madera en el piso.
Compramos unos patitos (o tal vez eran de Tito) todavía de color amarillo, porque así nacen, y después cuando crecen les salen plumas, los compramos a la salida de la carretera. Los teníamos de un lado de la escalera, y de la otra les dábamos comida, por lo que los patitos corrían dando saltos en cada escalón, así que era como carrera de obstáculos y teníamos una mesa donde se hacían las apuestas, porque no siempre ganaba el mismo pato, y se les pagaba el doble de lo que apostaran. Esto nos duró hasta que mi abuelita nos dijo que ya dejáramos en paz a los patos.
Cuando fuimos un poco más grandes, iba a la casa un muchacho que le decían el sapo. El se llamaba Rodolfo de Velasco y Aguilar, y se ganó a mi tía Carmela porque era muy lambiscón, y entonces nos dijo Tito "por qué es el que nos manda, que no entre el Sapo", y nos colocamos en la puerta para evitar que entrara a la casa, porque Tito decía que venía por ver a Carmelita, y eso no lo iba a permitir, pero como la recámara de mi tía Carmela daba a la calle nos vio y dijo: "dejen pasar a ese muchacho, tan bueno que es el pobre". Entonces lo dejamos pasar y nos pusimos a jugar con unas sábanas que estaban colgadas, yo creo que para que se secaran, y se las pusimos encima, lo envolvimos, le dimos de vueltas, y hasta golpes recibió. Mi tía nos regaño mucho, pero eso sirvió para que no lo volviéramos a ver en mucho tiempo.
Y así corría la vida en la casa, y yo seguía junto a mi abuela y cuando había vacaciones, la acompañaba a México a ver a mi tío Chuchito que era mi padrino de bautizo, porque a mi me bautizaron en la Cd. de México en el Templo de Regina, junto con mi prima Amalia. Otro muchacho llamado Gustavo y otra prima llamada Maria Eugenia. Siempre nos hacíamos presentes donde vivía mi tía Lolita, que era una casa muy grande que estaba situada en la calle de Isabel La Católica No. 488, en la colonia Algarín de la Altura de Toribio Medina, en el mero centro de la Ciudad de México.
La casa era una finca muy antigua, pues el techo era de teja, tenía dos pisos con su balcón en cada recámara, la escalera era de madera, muy bonita, también tenía un patio grande en la parte de atrás donde mi tío Juan Navarro sobrino de mi abuela puso un establo. Tenía en él cuatro vacas, y diario vendía le leche mi tío Juan era el papá de mis primas Amalia, Beatriz y un primo Juan Gabriel, que por cierto se parecía a mí en lo físico, casi nos confundían.
Yo en lo personal quería mucho a mi prima Amalia, y Beatriz, su hermana, nos consentía mucho. Siempre nos daba mucho gusto cuando ella venía a la casa en Puebla, porque algunas veces venían mis primas con el tío Chuchito, que era una fiesta para nosotros cuando nos enterábamos que iba a venir a Puebla, hasta los pisos que eran de madera, los lavábamos con lejía, que era como jabón pero más fuerte, y pintábamos las paredes.
Y cuando llegaba, a todos nos formaba y nos regalaba un peso nuevo de papel moneda, pero de lo más bonito que existía en lo que se refiere a dinero, porque estos billetes los hacían en Inglaterra, en Londres, y mi tío era el cajero de la Casa de Moneda en la Ciudad de México. Además, como era mi padrino de bautizo, me mandaba un giro postal de 50 pesos, que en ese tiempo era mucho dinero, y claro, lo ocupábamos para hacer fiesta y además comprarme algo, y así como cada 13 de octubre esperaba los $50, me llegué a comprar hasta rifles de municiones que ese tiempo estaban de moda, y además los rifles y las botas siempre me gustaron mucho. Llegué a tener cuatro rifles de calibre 22, y un un rifle increíble que era el famoso 30-30, usaba unas balas como de 7cm de largo. Cuando disparaba se sentía el poder que no llega a sentir. Cuando uno lo tiene en las manos se siente uno como Rambo o RoboCop.
Los trenes
Una vez le dije a mi abuela que tenía muchas ganas de ir a Veracruz, pero en tren. Entonces hicimos una maleta y nos fuimos a la estación de tren que era el Interoceánico, que estaba en la 11 sur entre la 10 y 14 poniente. Nos fuimos hasta Veracruz; este tren bajaba por las cumbres de Maltrata, que están pegadas a las cumbres de Acultzingo. El tren se hizo como 14 horas, pero es un viaje que no se puede olvidar. Es una emoción para en cada pueblito, como el pueblo de Maltrata, que se ubica en la mitad de las cumbres.
Me puse a contar los túneles que existen en esta vía, y conté de 20 a 25 túneles. Francamente es una experiencia única, te recomiendo si tienes oportunidad de hacerlo, hazlo. En estos trenes de pasajeros había de primera, de segunda, y hasta de tercera clase, que era lo más barato. Nosotros fuimos en segunda y nos enteramos que había una clase especial que se llamaba "Pullman". Ese nombre se le quedó hasta que se acabaron los Ferrocarriles Mexicanos de pasajeros, pero siempre es bueno hacer hincapié en que el nombre de Pullman se debe al Señor John Pullman, que llegó a México y les rentó a Ferrocarriles Nacionales uno o dos vagones en cada corrida para donde fuera, ya sea Guadalajara o donde llegaban los trenes y ferrocarriles que tanto nos gustaban, hasta verlos en la ciudad o en carretera. Es algo que nos lleva a la aventura increíble.
Pero todo llega a su fin, porque el gobierno mexicano decidió retirar los trenes de pasajeros, porque comenzó una revuelta que iniciaron con un paro de los trabajadores porque querían un aumento de suelto. Todo esto fue instigado por los líderes Campa y Demetrio Vallejo, que estaban azuzando a los trabajadores para hacer una revolución o guerra civil, y al gobierno le dio mucho miedo todo lo que podía dejar este suceso. Por eso decidieron parar a los ferrocarriles y además meter en la cárcel a los líderes, que para mí fueron nefastos, aunque para otros son mártires.
La religión
Nos tocó hacer la primera comunión, pero para hacerla tuvimos que ir al catecismo en el templo de San Sebastián en la 17 sur y 5 poniente, como nosotros sabíamos mucho de religión, pues nos era muy fácil el catecismo, y como nos gustaba el relajo nos hicimos de amigos y amigas de las muchachas que eran vecinas de San Sebastían. Nos hicimos de un amigo que se llama Luis Benitez y de Allende, nieto del dueño del Molino Huexotitla, que nos platicaba de su abuelo. Tenía muchos problemas con sus trabajadores, que en ese tiempo venían de Cholula o Huejotzingo, o algún pueblo, pero no llegaban los lunes.
Entonces decidió hacer en sus terrenos, que eran bastantes hectáreas, unas casas para que ahí vivieran sus trabajadores con sus familias, para que no faltaran a trabajar los lunes.
Las casas las hicieron en lo que hoy se conoce como San Baltazar "Campeche", porque esta palabra quiere decir "El que hace el Pan", pero como estaba retirado de la ciudad, en lugar de designarse como colonia se hizo un pueblito que estaba en las afueras del centro de la ciudad. Como mi abuelita era muy de iglesia, nos decía que ayudáramos al padre a dar la misa, y Luis Benitez también estaba de acólito con nosotros, pero una vez que el padre estaba dando la misa, no me acuerdo muy bien, pero ya sea Javier o Tonito MacFarland, uno de ellos llevaba los enseres para dar la misa, y mero cuando se hinca el padre este se tropieza con la piernas del padre y todo fue al suelo, y como se enojó mucho pues nos corrió a los 5 primos de siempre.
Seguíamos cerca del de la iglesia, porque a nadie le contamos que nos corrieron del templo, pero nos gustaba ir a ver a las muchachas que seguían dando catecismo, y nos hicimos tan amigos con ellas que en lugar de estar con los niños, se estaban con nosotros contando eventos colorados, hasta que nos corrió el padre.
Y mi abuelita, que no sabía nada de esto, nos apuntó y compró los boletos para un retiro que se llevó a cabo en el colegio "Yermo y Parres" que era de los padres también, así que fuimos. Tenían que ser tres días de fin de semana, pero como ya no nos aguantábamos de estar encerrados, mi hermano Tito dijo que nos subiéramos a la azotea, y de descolgarnos a la calle. Entonces estábamos subiendo por la azotea por unas ramas y piedras, por cierto, ahí junto a nosotros mi amigo Luis Benitez, que nos dijo que él también se unía al plan de escape. Así lo hicimos, y cuando le tocó el turno a Javier se fue al suelo desde la azotea, y se disloca un tobillo, por lo que se suspendió la graciosa huida, pero también se terminó el dichoso retiro, y todos a sus casas, Javier al sanatorio y su mamá maldiciendo a todo y hasta a nosotros, porque decía que éramos culpables siendo que ella sabía que Javier era pateluco.
Llegó el día que hicimos la primera comunión. A los primos nos compraron un traje gris para cada uno, que fue nuestro primer traje y las primas les hicieron su vestido con tul y razo en blanco, y hasta vinieron de México nuestros familiares, entre ellos mi prima tan querida Amalia Navarro, que había crecido y me sacaba como cinco o seis centímetros. En el estudio donde nos llevaron a retratar, el Estudio Rivero, en el mero portal del zócalo. El señor Rivero me hizo favor de poner un zoquete de madera para que Amalia estuviera junto a mi no se viera tan alta, lo bueno es que después de tiempo crecí muy alto por que ya me veo más alto, como 20 centímetros.
Al hacerla primera comunión se hace lo reglar, que es el desayuno, y así fue; en la mencionada sala que no nos dejaban entrar a los niños, pues ahí se hizo el convivio que terminó en un zafarrancho por que nosotros, los cuatro primos, terminamos peleándonos por alguna nimiedad, pero de todos modos ya habíamos cumplido con la comunión, y teníamos nuestro traje gris que nos sirvió tanto tiempo.
Me acuerdo que fuimos a tomarnos una malteada a una cafetería llamada "Cafetería Jardín", que era muy popof, pero era una sensación rara, pues era la primera vez que lo hacíamos, imagínate solos los cuatro con nuestro traje, todos iguales, sentados en la cafetería, no lo podíamos creer, era una sensación difícil de describir.
Una vez que estábamos afuera de la casa, estábamos muy entretenidos viendo pasar a los peregrinos, que salían del templo de Guadalupe, que está en la Reforma en el mero Paseo Bravo. En este lugar, que le correspondía al templo, era un cementerio, por lo que hay cientos de esqueletos enterrados desde el templo hasta la 3 Poniente.
Volvemos a que estábamos viendo a los peregrinos que iban a la Villa de Guadalupe en México. era 8 de diciembre y salían caminando por nuestra calle, miles y miles de peregrinos, y dijo mi hermano Tito "Vámonos con los peregrinos a este viaje porque en realidad sí daba muchas ganas. Lástima que no contamos con mochilas para llevar las vituallas y algún cobertor, entonces le dije a mis primos "consíganme una aguja e hilo en carrete, y fui a desbaratar un colchón de borra que ya no usaba nadie. Corté e hice las mochilas, cogimos los sarapes y lo que pudimos sacar de la cocina, y nos pusimos en marcha siguiendo toda esta gente que era una romería. No nos íbamos a perder, pero como el colchón era viejo, pues se rompían las mochilas y nos deteníamos a coserlas, y perder tiempo, tanto tiempo fue el que perdimos que nos hicimos cinco horas a Cholula, y ya que nos estábamos encaminando a México, nos alcanzó mi papá en su camioneta, que era una Ford pick-up modelo 41. Y como tenía que ser, nos dio de cinturonazos, pues como no le dijimos a nadie porque no nos hubieran dado permiso de ir, pero alguien nos vio. El caso es que mi papá se enojó, pero llegó a calmarse, nos dijo que esto era muy peligroso, porque "algunos van a la pena y otros a la pepena". Nos subió a la camioneta y nos llevó por la carretera, hasta el Puente del Emperador Empedador, que era un lugar increíble porque en este lugar había una alberca que le faltaba un grado para ser hielo, pues era del deslave del volcán Popocatepetl, y acampamos en ese lugar.
Rodolfo
Tenemos que recordar a mi primo Rodolfo Albicker Ávila, que sus amigos le decían "el mono" por que era muy velludo, todo el cuerpo lo tenía lleno de pelos, yo creo que por herencia por que mi primo Javier, que era el más chico de los hijos de mi tía Chonita (eran Sarita, la prima más grande de toda la familia, después nació Rodolfo, Sarita nació 20 años antes que yo, así que Rodolfo todavía vive gracias a Dios, y después de muchos años, creo que veinte, nació Javier, y esto lo digo para poner en claro que Rodolfo era muy diferente de nosotros los chicos que nacimos casi todos juntos.
Veamos cómo era Rodolfo, que es muy interesante por que llevaba una vida muy diferente de nosotros, qué te diré, él no nos quería mucho por la diferencia de edades, veíamos como se juntaban en la sala de estar, por que a él sí le daba permiso de entrar ahí, y nosotros nos asomábamos por las puertas, que eran varias, peus la sala tenía seis puertas y cuatro eran de cristal, con sus cortinas de cinco metros de altura, que hacían que se viera como un salón de película, y ahí estábamos oyendo las canciones que les gustaban cantar, como esa canción que se llama "Nocturnal" que la repetían mucho, y así pasaban bastante tiempo sus amigos como Rafael Posada Vélez, su hermano que era más chico, Fernando, y ellos tenían otro hermano Ignacio, o sea Nacho Posada que a la larga fue famoso en todo Puebla por que era piloto de carreras, y como tenían algo de dinero pues más famoso todavía, pero siempre fue amable, educado y agradecido, sobre todo de mi primo Chuy Milián, porque él lo enseñó a manejar y otras muchas cosas, hasta destapar limonadas con otra botella.
Los amigos de Rodolfo, que entre otros, se juntaban Carlos Álvarez, otro joven que le decían La Mimi, que nos caía muy bien por que con nosotros era agradable como su hermano Juan Ramón. Así que Rodolfo se llevaba con mucha gente de sociedad, como la muñeca olivares y otras damas, y cuando él se hizo novio de Elsa Díaz Pliego, que vivía en la Ciudad de México, pues le hablaba por teléfono en las noches, pero como se dilataba bastante, las llamadas eran muy caras, por lo que mi papá se enojaba mucho, por que él pagaba el teléfono, 16-36 mexicana, y fue una de las cosas que desmejoraron las relaciones en la familia.
Pantalones flameados
Para cuando teníamos como diez años, mi papá nos compró unos pantalones muy caros a mi hermano Tito y a mí. Era uno rojo y uno verde de vaquero, muy bonitos, pero nos pusimos a pintar las bicicletas y manchamos los pantalones nuevos. Mi mamá se enojó mucho, hasta nos mandó a la tlapalería que estaba en la 5 poniente y 9 norte, por donde tenía mi papá la oficina de los transportes Express Veracruz.
Llegamos con lo que nos mandó comprar, que era gasolina blanca para poder desmanchar los dichos pantalones, y así lo hicimos con mucho trabajo, y llega mi mamá y nos dice muy enojada: "no se les vaya a ocurrir acercar un cerillo a estas prendas, por que explotarían" y al ratito me dice Tito "vamos por unos cerillos y lo encedemos, a ver qué pasa, pero nomás tantito y no muy cerca". Enciende el cerillo y en ese momento explota su pantalón y lo coge con mucho apremio, lo sacude y se prende más, hasta que lo metió en el laguito que tenían los patos bajando la escalera hacia el tercer patio. Lo bueno que a mi pantalón no le pasó nada, pero no nos salvamos ninguno de los dos de los cinturonazos en la noche.
Los viajes a Huejotzingo
Nos íbamos en el camión de carga todos los chamacos. Adelante en la caseta iba mi abuelita, a veces iba mi mamá pero ella casi no quería ir, entonces iba mi tía Lupita o mi tía Bichita (Maria Luisa). Como nos subían en la parte de atrás, en la carrocería corríamos la lona, nos asomábamos para ir viendo la carretera y nos hacíamos de unas piedras mas o menos chicas, por que llegando a Huejotzingo se ponían unos puestos de fruta, entre árbol y árbol estaban unas maderas como escaleritas en los que colocaban unos tenates con diferentes frutas, como perón, pera capulín, y otras frutas, y nosotros veíamos esto como tiro al blanco. Cuando pasábamos les tirábamos las piedras, lo bueno que casi no dábamos en el blanco. Muy pocas veces derribamos algún tenate con fruta, y ahora que ha pasado el tiempo me alegro por que no estaba bien hacer esto, aunque te diré que cuando mi papá se paraba a comprarles fruta a estas personas, nos dábamos cuenta que los tenates tenían un fondo de papel periódico y encima la fruta que hasta rebasaba el tenate, pero en realidad no llevaba ni la mitad de lo que debía ser el tenatito.
De todos modos nosotros íbamos a Huejotzingo por ver al tío Fais, que era el amigo de mi abuelita. La casa era tan grande que casi era una hectárea, a calle y media del zócalo del pueblo, lo que nos admiraba más que nada eran los marranos que había en los chiqueros. No sé cómo hacía el tío Fais, pero llegaban a pesar hasta 900 kilos. Verlos de cerca, era de lo más impresionante, y de ahí nos llevaban a las huertas que estaban en las afueras de Huejotzingo. Cortábamos perones, peras, nos subíamos a los árboles más grandes a cortar los capulines que en ese tiempo se daban bastante. Era muy famoso Huejotzingo por los capulines, más que por las manzanas con las que elaboraban la sidra. Los más famosos eran el Sr. Morales con Sidra Maipú, y el Sr. Narciso Deloarte con la sidra China Poblana, y así le seguían la Rosina y varias otras, pero yo no veía mucha manzana, era muy poca y además panochera, que son más chicas así que tenía que producirlas con los perones, que eso sí había bastante.
Nos traíamos una cubata de capulín, yo otras de la demás fruta, y nosotros como siempre fuimos muy contentos con tanta fruta. Al pasar de regreso por la casa del tío Fais, ya para venirnos a Puebla, nos gustaba cortar higos. En el patio había una higuera que cada año daba 950 higos, pues medía como siete metros de ancho, y como tres o cuatro de alto, y cuando ya andábamos en carretera les tirábamos al blanco a los puestos de fruta, pero ahora con los higos que nos reservábamos para estos menesteres.
El mercado de La Victoria
A mi papá le gustaba llevarnos de vez en cuando al mercado de la Victoria, que se ubica en la 4 poniente, entre 3 norte y calle 5 de mayo, hasta la 8 poniente. Dos manzanas completas donde encontraba uno desde fruta hasta calzado, ropa, comida, trastes, osea todo, el señor Victor Poblano, amigo de mi papá, decía que si eras dueño de un puesto en este Mercado, asegurabas el porvenir de tus descendientes, y le pusieron el nombre de La Victoria por la batalla en la segunda guerra mundial. Alrededor de este inmueble se colocaban unos puestos de varias cosas y hasta ambulantes, como lo eran el Sr. Levién, que venía su producto, que nunca se me olvidará que gritaba "Escarmenadores de a peso", así lo repetía todo el tiempo mientras nosotros estábamos en un puestecito que se llamaba "El Paisa", que con el tiempo se hizo muy famoso, hasta tuvo un local en la 13 poniente, junto a una cantina muy famosa que se llamaba "El Casino".
Aquí se originó la "rifa del pollo", en una botella metían diez bolitas con su respectivo número, y el que quedaba al último era el ganador. Costaba 10 pesos cada número, y después de esto lo copiaron muchas cantinas, pero siempre se prestaba para hacer trampa. Había un muchacho muy listo al que le compraba un número y decía "voy a hacer lo posible porque usted sea el ganador, y si por suerte le tocaba el gane, pues sacaba sus respectivos 10 pesos de propina.
Estábamos en el puesto del paisa, que nos daba un cóctel de ostión, pero como era medio cóctel sólo nos daba seis ostiones. Imagínate cómo nos quedábamos con las ganas de algo más, pero ni modo, al papá no se le podía pedir nada, no sabíamos cómo reaccionaría. Esto se me quedó muy marcado y como significó mucho en toda mi vida.
El Paseo Bravo
Quizás parece que escribo mucho del Paseo Bravo, pero fue una buena parte de nuestra niñez, como la pista para patinar donde está el kiosko, muchos niños patinaban y hasta nosotros también, con esos patines de ruedas muy bien hechos, muy fuertes, los corrías y apretabas a tu talla del zapato, pero un día se le ocurrió a un amigo de mi papá, el Sr. Luis Castañeda Galindo, que tenía camiones para carga y estaban trabajando con mi papá en la línea de transportes Express Veracruz. Esos camiones los utilizaban para transportar juegos de feria como la rueda de la fortuna, el pulpo, el martillo, el avión volador y claro, los caballitos o tío vivo como se llamaba en algunas partes, porque su familia a eso de dedicaba y cuando Luis Castañeda consiguió permiso del Ayuntamiento de la Ciudad pues ya no se salió del negocio durante 30 años, y ya todo puebla acudía los domingos a la feria, que ya era una costumbre.
Afuera de la pista o feria, estaban los animales. Había un zoológico en la parte de la 13 sur, enfrente estaban los baños del Paseo Bravo de la señora Janerio, que mi papá nos llevaba cada tres días al vapor.
Casi junto estuvo el primer edificio que instauró el Seguro Social, o sea el IMSS, que también nos quedaba muy cerca de la casa. Me acuerdo que la medicina o vitaminas que nos proporcionaban eran unos polvos envueltos en unos papelitos bien dobladitos y adentro ponían el menjurge, siempre en polvos.
En el zoológico del Paseo Bravo, que empezaba por los osos, era una jaula muy grande que estaba hacia abajo para que se viera como una poza de agua para que bañaran los animales. Había sies osos negros y uno gris, pero muy grande que de veras impresionaban, y les daban de comer casi pura zanahoria. En seguida estaba la jaula de los leones, que era muy alta de tela de alambre, y una vez que fui con mi mamá al mercado del Parral, que en realidad era un tianguis, y mero cuando pasábamos por esta jaula nos salió una leona, enfrente de nosotros dos. Yo me quedé estático, sin poder ni hablar, pero mi mamá pegó un grito tan fuerte como los que daba cuando se regaba la leche que ponía a hervir, que esta leona se espantó tanto que se subió al techo de la jaula, que todavía cuando regresamos del tianguis del parral los cuidadores no la podían bajar aún y a mi mamá le echaban la culpa por lo que dije "mamá, vámonos antes de que esto se ponga peor" y nos vinimos a casa casi corriendo, por que siempre estábamos en casa y nos sentíamos protegidos.
En el mismo Paseo Bravo se situaba una fuente que le llaman de los Leones, muy bonita y en ese lugar siempre se ponía un Señor que le decíamos "El Colima" que vendía nieve y helado. Su carrito se llamaba así, Colima, pero tenía la particularidad de que gustaba jugar volados y a nosotros también, pero este hombre siempre nos gustaba decirle amigo, cuanod aventábamos la moneda siempre pedía aguila.
Se nos ocurrió borrarle el águila y pegarle otra moneda del lado del sol, y estuvimos en la banqueta de la casa, dale y dale hasta que se borró el águila y con otra moneda le pegamos y nos fuimos a jugar volados con nuestro amigo Colima, y así fueron muchos días hasta que este se dio cuenta de la trampa y otra vez a correr hasta la casa, por que era nuestro refugio
Chuy y el cine
Mi primo Chuy nos hacía el favor de llevarnos al cine Coliseo en la 2 poniente y 3 sur, mero enfrente de los tacos Beirut—los primeros en vender tacos árabes. Junto a este cine, que era muy bonito, había otro cine muy grande al que asistía la gente de la clase humilde, y daba a un callejón que con el tiempo adquirió el nombre del cine: Variedades, por lo que hasta hoy se conoce como el callejón del Variedades. Había varias loncherías y antojitos poblanos, y además muchachas muy amables.
En el cine Coliseo donde nos llevaba Chuy, siempre entrábamos a anfiteatro, porque en el cine había tres diferentes áreas: luneta (abajo), anfiteatro (arriba de luneta) y galería (hasta más arriba), que era lo más barato.
Chuy le pedía dinero a nuestras mamás, lo suficiente para entrar a luneta, pero siempre nos llevaba a anfiteatro, y así se quedaba con el dinero para invitar a su novia en curso. En una ocasión no sé cómo nos dejaron pasar, pues era una película para adultos, el título era "Los Amoríos de una Reyna" y entonces, como suceden las cosas, Chuy estaba besándose con su novia, yo creo que algo más allá de lo apropiado, cuando llegó el gerente con dos policías y nos sacaron hasta con empujones a mi primo Chuy, dizque por faltas a la moral y a nosotros por menores de edad.
En eso se apareció mi tía Lupita, que por casualidad se encontraba en el cine con su novio en turno, y gracias a ella ya nos trataron diferente, pero este suceso provocó que ya no nos llevara mi primo al cine, entonces mi papá nos hacía el favor de llevarnos al cine Coliseo, ahora sí en luneta, pero nos llevaba a las diez de la noche, por lo que salíamos a las doce de la noche ya con mucho sueño. Me acuerdo que arriba de la pantalla había unas luces que cambiaban de color, como si fuera un arcoiris muy bonito, y además se despedía a la gente con una pieza musical que era el Bolero de Ravel, y al escucharlo nos daba más sueño todavía. A mí se me quedó muy grabada esta pieza, hasta hoy, cuando la escucho, me da sueño.
Pancho y Pablo
También me gustaría mencionar a los muchachos que mi papá tenía en la casa, por que uno de los sótanos, el primero, era donde vivían Pancho y Pablo. Pancho lo recogió mi papá en la carretera por Tierra Blanca, Veracruz. Al verlo que andaba solo en la carretera, y este niño quiso venirse a Puebla, pues dijo que no tenía ningún familiar, por lo que llegó muy contento a la casa y siempre se le trató como un familiar, y al otro muchacho lo fue a dejar a la casa su mamá y le dijo a mi papá "Don Pedro, le dejo a mi muchacho por que yo ya no lo puedo mantener, y sé que con usted se hará una persona de provecho. Esto me tocó verlo, pues yo estaba en el jardín de la entrada, y mi papá y la señora estaban platicando en las escaleras.
A mí no se me hizo extraño lo que le expresaba por que de todos era sabido que mi papá era trabajador y no fumaba ni tomaba. Este muchacho era Pablo, y como ni siquiera sabía cómo se apellidaba, mi tía Carmela dijo que se llame Pablo Pérez. Tenían su sótano muy limpio. Ellos dos fueron macheteros de los camiones de mi papá durante muchos años, hasta que se casaron. A nosotros nos dio mucha nostalgia porque seguido compraban varias revistas como el Santo-El paguin, la familia Burrón y otras.
Pablo, el segundo muchacho, se casó con la Chepa, que era hija de Agustina, que como sabemos, era sirvienta de mi abuelita Chenchita, y como todos sabían era hija de alguien de la familia, por lo que Pablo pasó a ser parte de la familia, siempre se les trató bien y con cariño, aunque la Chepa vino a la casa y me dijo que acababa de morir Agustina, y antes de fallecer le confesó que era de Don Pedro, o sea de mi papá, yo no le dije mas que estaba muy bien, así que ella tenía que ser la mayor, porque es más grande que Tito que siempre se le tuvo por el primogénito, por lo que con esto La Chepa, o sea Josefina, llegaríamos a 20 hermanos que ya hablaremos más adelante.
Los transportes
Algo que también era muy impresionante para nosotros, que ya mero llegábamos a ser adolescentes, cuando mi papá nos mandaba un camión lleno de marranos vivos, cada camión llevaba como 100 marranos, y verlos ahí nos asombraba tanto que ni nos fijábamos en el olor ni los chillidos que daban estos animales, pero a mi abuelita no le gustaban estos detalles porque ya era grande.
Tengo que referirme a esta vieja carretera que llegó a ser una de las más bonitas de toda la República Mexicana, mi papá nos llevaba a México cuando él tenía que manejar algún camión, o simplemente por que quería llevarnos a Tito y a mi, y en la subida, ponía a Tito a manejar el camión, claro que iba muy despacio, pero yo siempre pensé que eso no debía ser, porque podía pasar un accidente o algo imprevisto. Había una curva que decía mi papá que era la más peligrosa, con el nombre de la Carbonera, y adelante había otra curva que le llamaba el Corazón. En este lugar había un nicho o altar donde estaba el Sagrado Corazón de Jesús, y todos pasaban muy despacio o se paraban para persignarse, y en este lugar nos salió un venado que casi se estrella con el carro. Hasta hoy no se me borra la imagen de este animalito que jamás volvía a ver en esta carretera. Lo que vimos una vez que íbamos a México a ver al tío Chuchito, se nos ponchó una llanta de la camioneta pick-up 41 de mi papá, y no llevábamos ni gato ni refacción, por lo que los grande se fueron a arreglar la llanta y los muchachos nos quedamos en la batea que siempre la traía con lona, cuando vemos que se acerca un animal, que era como un tigre, y a la vez como gato salvaje. Claro que te da miedo, pero a la vez, es impresionante verlo ahí en el campo en su hábitat, y muy cerca de uno. Después nos enteramos que era un tigrillo, pero no deja de dar temor el animal, lo bueno es que cuando estábamos juntos, la familia como siempre el estar junto con mis primos hermanos y mis primas, nunca teníamos miedo, ni de los extraterrestres. Principalmente, tener cerca a mi prima Chachita, que siempre me oía y me abrazaba y esto te eleva el espíritu. No sé qué hubiera sido de mi sin mi prima, pues yo era como demonio, casi nadie me paraba pero así segúia la vida en esta familia que Dios me regaló.
Para esto, ya con 11 o 12 años, me acuerdo que íbamos en la camioneta de mi papá. Esta la manejaba mi primo Chuy para recoger la carga de la oficina de los transportes. Chuy manejaba y nosotros cuatro, Javier, Tonito, Tito y yo íbamos con él para cargar lo que sea que hubiera que recoger para su envío, y una vez que ya entraba la noche, pasamos a recoger a la novia en turno de Chuy, y nos fuimos al Cerro de San Juan, o sea la Colonia La Paz. Nosotros platicábamos en la parte de atrás de la camioneta y Chuy y su novia en la caseta, como siempre traía lona la camioneta no se veía quién venía en ella, cuando llega un carro de policía y quieren detener a Chuy y a la novia por que decían que eran faltas a la moral, y los que íbamos atrás, teníamos que bajar con las manos arriba, como si fuéramos muy peligrosos, y otra vez, alegar con la policía hasta que Chuy les dio dinero y nos soltaron.
Nosotros no dijimos a nadie de la casa, pero no es muy agradable que haya pasado otra vez por la novia de Chuy, pero con todo y eso , siempre lo quisimos mucho, además cuando lo iba a ver a la casa una novia que le decían La Pava, llevaba sus caballos para que en el patio de Maravilla donde se guardaban los camiones nos permitía dar vueltas en los caballos, que eran unos Alazanes bien grandes, pero muy nobles y cuando montabas el caballo era una sensación increíble, que yo decía que cuando fuera grande tenía que tener un caballo Alazano.
Incendio en el patio maravilla
Otra cosa que mencionaré es que en las noches, como a las tres de la mañana, mi papá nos despertaba para que le diéramos una vuelta al patio de maravilla para ver si había algún ladrón o algo fuera de lo común. Hay que decir—a pesar de ser valientes—nos daba mucho miedo. Una vez vimos un periódico que estaba en la caseta del carro 77, y se vía como si fuera una calavera y nos regresamos corriendo.
En otra ocasión íbamos caminando junto a los carros cuando oímos un ruido muy fuerte, pero sólo era un gallo que estaba en el gallinero de mi tía Chonita. Pero el aleteo es muy fuerte antes de hacer su canto de quiquiriqui, y así hacíamos el recorrido de revisar los caminos y la carga que llevaban hasta que una vez vi como estaba saliendo humo del carro que era de mi tío William. Corrí a avisarle a mi papá y corrió a avisarle a los macheteros que vivían en el sótano, y fui a despertar a mi tío Jorge para que le hablara a los bomberos, pero no me creyó, y no quería levantarse, los macheteros levantaron la lona y descubrieron que lo que se estaba quemando era una paca de borla.
Estas pacas nos las daba el Sr. Gonzalo Pérez para llevarlas a México. Él se dedicaba, como muchos de Puebla, a desbaratar el trapo viejo con unos cilindros con clavos para romper el trapo y con eso hacer la borra para los colchones, pero si se les pasa una corcholata o algún clavo sale una chispa que se queda viva en la borla. Como se tiene que prensar para hacer la paca y además alejada, pues se comprimía la borra pero la chispa quedaba dentro ¡ni siquiera entra el agua!
Cuando oímos que tiraban la puerta del zaguán, eran los bomberos que luego luego ayudaron a bajar las pacas y encontrar lo que se quemaba, y luego los bomberos le dijeron a mi papá que habían sido avisados en su cuartel personalmente, que salía humo de la casa, por lo que nunca supieron quién fue el que avisó, sólo decían que un señor con un sarape verde en la espalda, y de nombre José. Mi abuelita dijo que era San José que hizo el milagro.
A mi papá le ofrecieron un motor International—que se decía era de los mejores—en 300 pesos, pero con la condición de que se lo pusiera a su camión y a él le colocaran el motor viejo que traía el carro 77, que era International. Así era el trato, ahi fue cuando te das cuenta de qué tanta herramienta tenía mi papá en el segundo sótano, el maestro maravilla, los muchachos que vivían en la casa en el primer sótano. También estaba mi papá y sus hermanos, nosotros como no queriendo la cosa nos pusimos un poquito lejos para no estorbar y mi papá hizo algo increíble que me mueve a platicar este detalle.
La máquina nueva se la pusieron al carro 77 porque estaba cargada para México y tenía que salir a las 3AM, y el carro del vendedor se tenía que entregar a las 7 de la mañana. Si no se lo entregaban a esa hora, denunciarían a mi papá de robo con fraude, pero lo logró. A las tres de la mañana salió para México el 77 y a las 7am se le entregó el camión al vendedor con el motor viejo.
Se acaba la casa
Un día tuve una intuición o corazonada de que ya no tendríamos la casa por que oí a mi papá hablar con un licenciado de apellido Beristigui, quién le decía que el Sr. Ibañez, dueño de la crema Almendras Ibañez, que tenía su negocio en la 6 norte y 2 oriente, se interesaba en la casa, por lo que pensé esta casa ya se va a acabar y me dolió hasta el estómago, pues si llegaba a vender mi papá ¿A dónde nos iríamos todos? ¿Dónde cabría tanta gente?
El Licenciado Beistigui, que me caía mal y era feo aunque vestía bien—fue a la casa dos o tres veces y la recorría de arriba a abajo, y después ya no lo volví a ver, por lo que dije consummatum est, “todo está consumado”, pues la casa se vendió en $80,000 pesos, y ahora tenían que buscar donde cambiarse, aunque todavía nos quedábamos en la casa algún tiempo.
Para entonces mis tíos Jorge y William ya se habían marchado de la casa. Jorge, que fue mi padrino de confirmación, y William, que era el más joven de mi abuela, ya se habían casado, uno con Lolita Gómez Aguas a quien conoció en el salón Hollywood, y mi tío William se casó con Esperanza Gómez Aguas, su hermana, pero ninguno de los dos supo que eran hermanas, hasta que pidieron la mano de mi tía Esperanza, pues ella desde joven vivía con una tía que vivía en la 29 Pte 912, por Chula Vista, y cuando la mamá de la tía Lolita supo, fue a reclamarle a mi abuelita—qué por qué no le habían pedido la mano a ella, pues era la madre y esta Sra Eloina, le explicó a mi abuela que ella le regaló a la tía a esta niña llamada Esperanza porque ella no podía tener hijos, por lo que ahí se aclaró todo.
Me acuerdo una vez que se fueron todos a México a ver a mis tíos Chuchito y mi tío Félix, que fue juez aquí en Puebla, mi tía Pon, mi tía Lolita, mi tío Juan, el tío Tico, la tía Toya, pues todos vivían en México—sólo que mi mamá no quiso ir, entonces yo dije que me quedaba con mi mamá para que no se quedara solita. Así estábamos, era semana santa y me fui al segundo patio de la casa, cuando dieron como las 3 de la tarde, se nubló todo y un frío horrible, que sinceramente fue el primer día que sentí la soledad por lo que ahora me doy cuenta que la soledad es la angustia desconsoladora que agobia a la raza humana. Después te das cuenta que en realidad la soledad es “un país muy bonito que hay que visitarlo, pero nunca quedarse a vivir en él”.
Pero esa soledad y ese frío no lo he vuelto a tener, a Dios gracias. Corrí hasta la recámara de mi mamá.
Así se veía venir el cambio de casa inminente, y se consiguió una casa de tres pisos en la Av. Juárez 1906, hasta con jardín en la parte de atrás, donde vivirían mi abuelita y mi tía Chonita con todo y trajes de fantasía, que era su negocio. Mi tía Lupida, Rodolfo y la más importante de la casa era mi tía Carmela, pero ella con sus hijos Carmelita, Bonito, Willy y Gerardito se habían ido a Tijuana a alcanzar al tío Tony MacFarland Corona, esposo de mi tía Carmela. Sí, los extrañábamos mucho, pero mi tía veía como le hacía pero pasaba seis meses en Puebla y seis en Tijuana, y siempre nos traía regalos a cada uno de nosotros.
Tijuana
Tijuana se hizo parte de la familia, casi no se hablaba de otra cosa. Mi tía cada vez que venía a Puebla se llevaba a alguno de la familia, y mi tío Tony, su esposo, siempre los recibió con mucho gusto. No sé cuántas personas llegaron a ir a Tijuana.
Platicando con Carmelita, la más grande de los hijos de mi tía Carmela, me contó que para ella fue muy bonito estar con sus padres en esa ciudad, porque mi tío los paseaba por EU. Es difícil ver a un padre que quiera tanto a su familia como mi tío quería a la suya.
Mi tío quería que su familia estuviera contenta y junto a su familia de sangre, sus hermanos y su mamá estaban en Ensenada, también es preciosísima. A mi prima Carmelita, le tocó lo más duro, que era tener que cuidar a sus hermanos.
¡No debe ser fácil! Una vez, estando Tonito y su primo de Carlitos jugando en Ensenada por poco y se les viene encima un corral de una madera pesada. Cuando Carmelita vio eso corrió y corrió hasta detenerlo. Ella era muy pequeña y otro poquito y se le doblan las manos. Hasta que llegó su papá y su tío Carlos y así fue como salvó la vida de su hermano y de su primo Carlitos.
Así fue creciendo Carmelita, tratando de ir a la escuela y ayudando a su mamá, pero de nunca cejó por venir a estudiar al Centro Escolar que ya se sabía de antemano que lo abrirían pronto. Fue cuando Carmelita habló con su papá y lo convenció de que la mandara a Puebla para seguir estudiando, mi tío como que no quería que siguiera en la escuela, porque como era mujer y muy bonita no tardaría en casarse. Sin embargo, logró convencerlo y venirse a Puebla junto con su hermanito Tonito.
Cargando refrescos en Tijuana
Me tocó ir a Tijuana con mis tíos y para fue la cosa más maravillosa que había visto, hasta me parecía que yo ya había estado en ése lugar. Y ya estando allí este muchacho, Alfonso Monfort, trabajaba en un camión de reparto de refrescos “Squirt” y parece que la persona que le dejó ese trabajo fue mi tío William, que vivía y trabajaba en Tijuana, tuvo que venirse a Puebla para casarse con mi tía Esperanza y entonces dijo Monfort que podía emplear a alguno de nosotros, ya fuera Tito, Javier o yo. Pero mi tía quería que el que lo ayudara Tonito, pues él era su hijo, pero como estaba muy chico, me escogieron a mí y gracias a eso, que era cargar y entregar las cajas de los refrescos, conocí y recorrí toda la ciudad de Tijuana que por lo regular eran puros cerros. Lo único planito era el centro de Tijuana que comenzaba en la línea de Paso en la Frontera con Estados Unidos. Lo primero era un pueblito muy chiquito, San Isidro, de ahí van cambiando las calles de la primera donde toda la colonia estaba repleta de cantinas, burdeles y salones y de baile, y también su catedral y su párroco.
Una vez pasamos por el hipódromo Agua Caliente, que tomó su nombre de este bulevard, Agua Caliente, porque ahí existía un balneario, porque había en ese lugar un manantial de aguas termales y de Estados Unidos se venían hasta artistas de cine, pero con el tiempo el agua dejó de salir, ya no brotaba como antes, ni salía caliente, derrumbaron y quedó una torre tipo árabe o almenar como las que hacían las mezquitas, pero de todos modos, se le quedó el nombre de Agua Caliente al buelvard y a todo lo que estaba cerca, como colonias hasta el mismo Hipódromo. Estacionamos el camión, el estacionamiento era tan grande que había un camioncito que recorría el estacionamiento para acercar a las personas del edificio donde estaba el ovalo donde corrían los caballos. Y así entramos, para ver las carreras y también para apostar, compramos un boleto, ahí debes marcar el que crees que va a ganar. Cuando no conoces nada de apuestas de caballos, ni de carreras de perros, solo tienes que hacerlo a la suerte.
Y Dios nos dio la suerte: ganamos, y Monfort lo repartió conmigo. Y muy contentos nos fuimos a seguir trabajando y al llegar al centro por donde había un gimnasio donde se jugaba el jai alai o pelota vasca, también muy grande, me llevó a una tienda de segunda mano. Compre un suéter gris a con figuras blancas y una camisas azul con palmeras. Esa ropa me duró como diez años. La camisa me costó 50 centavos de dólar y el suéter dos dólares. Como estaba cerca del telégrafo, le mandé a mi mamá el dinero, yo creo que porque me dio mucho gusto, además dejándolo en mis manos se acabaría en cosas vanas, y sobre todo porque así quise.
Otro día que andábamos repartiendo en las tiendas, se nos ocurrió meternos al cine, en la colonia Libertad que es de lo más antiguo de Tijuana, cuando íbamos en el pasillo vimos a dos muchachas solas y de no malos bigotes.
Monfort se sentó junto a la más bonita, yo junto a la otra, nos pusimos a platicar con ellas. Al hablar la de Monfort hablaba con una voz muy tipluda y que casi gritaba, eso me dio mucha risa, porque él se sentó junto a la más bonita, y le salió tipluda. Yo me senté junto a la otra y ya casi la tenía conquistada, cuando se terminó la película y nos levantamos para irnos muy contentos; cuando ella, que dijo llamarse Margarita, me dice “pásame mis muletas que están debajo del asiento”. Entonces a mí me tocó la de las muletas y a Monfort, la muchacha tipluda, a mí me pasó esto por burlarme y reírme de mi amigo.
Para terminar con Tijuana te diré lo siguiente: mi tío Tony era contador de la operadora de teatros, o sea, de los cines de Baja California y su jefe era el gerente, señor Valdez. A mi tío también le gustaba apostar a los caballos en el hipódromo y una vez ganó una quiniela que era famosa el 5/10 y con ese dinero puso una papelería, para poder tener algo más de dinero, pero como siempre él trató de ayudar a las personas que llegaban de Puebla. A este negocio le puso el nombre de Ancar, que significaba Antonio y Carmela.
Los muchachos que lo atendían le robaban las ganancias por que tuvo que cerrar el negocio y como había comprado mucho dulce Cerezo, me dijo mi tío que lo vendiera en las tiendas, para aprovechar la entrega de refresco, además llevábamos gelatina que el hermano de mi tío, Maluim, hacía esta gelatina, pero en bolsita de plástico.
Mi tío me dijo esto “si vendes todo el dulce te llevo a Disneylandia” y así fue porque vendí todo el dulce, aunque ya estaba duro porque tenía tiempo guardado, pero todos los de las tiendas me lo compraron con mucho gusto. Claro que todo es obra de Dios, y así fue como nos llevaron a Disneylandia que fue impresionante, porque nunca imaginé estar en ese lugar y a todos nos gustó mucho, porque apenas comenzaba pero ya tenía lanchas en un río y el tren, el castillo, los personajes nunca se nos van a olvidar.
Tuvimos que regresar a Puebla, mi tío compró un coche que era un Ford 1952 de color crema, muy bonito, para que nos viniéramos todos juntos. En tan solo un coche nos regresamos once personas hasta encima de otros. Nos hicimos 55 horas, nos paramos cada rato para estirar las piernas en Guaymas, Sonora. Nos paramos en la orilla del mar y vimos a gente pescando, y nos pusimos a pescar, y sacamos unos pescados grandes: barracuda y las asamos y nos la comimos. Así llegamos a Puebla, después de recorrer casi media República Mexicana. Todos cansados pero muy contentos por todo lo que habíamos vivido. Y lo más importante, es que estábamos juntos y mi primo Chuy se encargó de vender ese coche tan bonito, hasta el color crema en dos tonos. Se veía increíble, era un Ford 52 que fue el carro que cambió su carrocería porque el carro 51 era muy raro. Entonces vino este modelo de carro que duró del 52 al 54.
Este carro lo compró un amigo de mi papá, que lo conoció desde la escuela, era Luis Medrano Ochoa, que siempre fue muy su amigo, hasta de nosotros y así terminó el viaje a Tijuana.
Siempre agradecimos toda la vida a mi tío Tony que nos trató como hijos, no como sobrinos. Nos llevó a conocer Estados Unidos: San Diego, donde estaba la Base Naval y sus restaurantes en la playa. El centro de esa ciudad se parece mucho a la ciudad de México, nos llevó al parque Balboa que es un zoológico tan grande que tardamos tres días para recorrerlo. También nos llevó a Chula Vista, California, con su hermano Jorgito que estaba casado con una muchacha agradable, muy educada y buena gente, se llamaba Anita y nos ofreció apio en varitas con mayonesa de chipotle y algo de limón. Nunca, ni ahora que somos viejos, hemos dejado de comer el apio de esa forma.
También tengo que decir que mi tío trabajaba en el Cine Roble porque ahí estaban las oficinas. Nosotros íbamos al cine y nos dejaban pasar sin el boleto y como exhibían películas antiguas, venían algunos artistas de Estados Unidos a ver estas películas, donde ellos eran protagonistas. Ir al cine era muy emocionante, nos podíamos encontrar a una actriz o actor. ¡Ahora sí, con esto termino mi aventura en Tijuana!
Desgracias
Ya cuando estábamos con el modo de cambiarnos de casa, a mi papá le ocurrió un suceso que fue el primero de muchos acontecimientos nada agradables. Para mí que fue un castigo de Dios por haber vendido la casa. Bueno, pues le avisaron que el carro se estrelló en un árbol en Iztpaluca en la Carretera Federal, mero enfrente del leprosario que ahí existía. Para colmo iba cargado de 400 cajas de huevo fresco que eran de la empresa CEIMSA, perteneciente al gobierno federal, por eso, aunque no venían asegurados, porque ellos no solicitaron seguro de viaje, mi papá aparte de perder el camión porque se quedó en el corralón de la Secretaría de Transportes, lo obligaron a pagar el valor del huevo. Y así con todo, mi mamá no quiso irse a vivir con toda la familia. Se consiguió una casa que era de mi tía Esperanza Gómez: dos aguas, en la 29 poniente 912, casi junto a la Sagrada Familia, que es un templo católico, en ese tiempo ni techo tenía, pero de todos modos efectuaban misas los domingos. A veces íbamos a celebrar misa con mi mamá.
El CENHCH
Tito y yo estábamos en la casa con mi abuela y los primos.
Cuando abrieron el dichosos Centro Escolar Niños Héroes de Chapultepec, CENHCH, no admitían a nadie que no viviera cerca de esa escuela, pero mi tío Jorge vivía en la 4 Norte y 17 Poniente y con un comprobante de de domicilio, mi tía Bichita nos inscribió a casi todos los primos. Mi primo Chuy se apuntó en talleres para estudiar mecánica automotriz, Alfonso Monfort, que se hizo amigo de todo la familia, siempre andaba con Chuy como si fuera su hermano, bueno hasta llegó a vivir en Tijuana con mi tío Tony. Así convivió con nosotros hasta que murió en Puebla, ya casado con una muchacha bonita, Yolanda, y siendo maestro de Educación Física en futbol en el mismo Centro Escolar.
Mi primo Pepito que es hermano de Chuy se metió a la preparatoria, después Tito, Carmelita, mi hermana La Nena (Esther) y yo en primaria, Javier y yo en quinto año con el maestro Eliseo Montiel. Chachita y Luz María, hijas de mi tía Bichita, se quedaron en el Colegio Americano.
Hay que agradecer que mi tía Bichita se haya preocupado en inscribirnos a todos. No era nada fácil: entregar papeles, formarse, esperar para que al fin se lograra el objetivo, este cambio de escuela para mí fue una bendición.
El centro escolar, tiene como seis manzanas, tiene kínder, primaria, secundaria, preparatoria y talleres y hasta corte y confección, cancha de futbol, alberca, baños y vestidores, en se tiempo tenía frontón.
Cuando nos cambiamos de casa que fue un paso muy duro para todos, pues no estábamos acostumbrados, pasó lo de carro, que me impactó. Mi papá me dijo que cuando fue a ver el carro que se estrelló en el leprosario con el huevo CEIMSA se escurría el huevo roto como si fuera un río y la gente que vivía por ahí llegó con cubetas y palanganas para recoger el huevo, pero iban y venían y mi papá pensaba ¡qué bueno que lo recojan! lo que no me puedo imaginar a dónde le echaban y todavía se llevó a la casa de la 29 poniente como 10 cajas que tuvimos que comer y hasta repartir con la familia, hasta que se acabaron los huevos.
Viaje a Guadalajara y de vuelta
A mi papá lo fue a ver un señor al que le decían El Mucho Gusto, yo creo que porque así decía cada vez que saludaba a alguna persona o le presentaban a alguien. Se llamaba Carlos Bertheau (con el tiempo me hice muy amigo de su sobrino Fernando y entonces le ofreció a mi papá un viaje de muebles, o sea, una mudanza a la ciudad de Guadalajara, y como ahí vivía su hermano Luis Ávila Navarro que estaba casado como mencione con mi tía Aurora Zarmeño y tenía tres hijas: Alicia, Yolanda y Alejandra.
Se le ocurrió a mi papá llevar el mismo viaje a Guadalajara en el camión internacional 56, que como era blanco le decían El Palomo, entonces a mi papá se le ocurrió que ya iría a ver a su hermano, fuéramos todos y además mis primos Javier y Tonito. Nos fuimos a cargar los muebles y como íbamos nosotros ya ni ocupábamos macheteros. Tenían muchas cosas y tratamos de acomodarlo lo mejor que se pudo. Pero apenas cupieron estos muebles y entonces vino el problema porque en la caseta, nosotros los cuatro primos ya no cabíamos en el camión, pero como ya las había avisado a todos de que después de cargar saldríamos inmediatamente a su destino, no quedó otro remedio que amarrarnos en la puerta de atrás, en la carga de afuera de la lona bien atados con varias reatas que siempre andan trayendo los camiones y así nos fuimos sin parar hasta Atotonilco y estando amarrados todos mojados por el rocío de las 5 am como que ya estábamos cansados de ir parados y con frío, pero como a las 6 am pasaron junto al camión unas muchachas que se veía que iban a misa, eran como cinco muchachas y todas eran muy bonitas y nos vieron raro, por cómo íbamos. Al verlas tan bonitas se nos elevó el espíritu y hasta el frío se nos quitó. Yo hasta pensaba que eran las vírgenes que habían bajado del cielo para darnos fuerza para llegar hasta Guadalajara, y así seguimos el camino.
Tito que siempre ha sido un sibarita comenzó a ver que podíamos meternos entre los muebles, y como era siempre, me dijo que me metiera entre los muebles a ver si había un lugar donde nos pudiéramos meter, el viaje ya agotaba nuestras fuerzas, y así lo hice y encontré que debajo de la mesa cabríamos bien, así llegamos a Guadalajara y nos paramos en un parque llamado Agua Azul y nos dijo mi papá que tuviéramos cuidado con los muchachos de ahí porque podían ser jotorongos o mariachis. Al encontrar a un joven le preguntamos “¿usted es mariachi?” Y nos contestó enojado “¡Ay sí, lindo me vería con mi guitarrota!” Nos asustamos y corrimos para encontrar a mamá.
Una vez en Guadalajara con mi tío Luis, quien jubilado se dedicó a elaborar zapatos para las artistas de cine, sus zapatos elevaban 25 0 30 centímetros. Quien más le encargaba era Elizabeth Taylor y le mandaba a mi tío la paga en libras esterlinas, que por cierto, ya tenía muchas. También mi tía nos trató muy bien, nos servía mucho y quería que tomáramos hasta un litro de leche en el desayuno.
Lo más bonito era estar y salir a la calle con mis primas Alicia y Yolanda, por cierto todas las calles estaban empedradas y olían a tierra mojada, ¡cuánto gusto me dio estar en esa ciudad tan bonita! Además las mujeres eran muy agraciadas.
Y así nos regresamos muy contentos, quizá fue el momento que ya te sientes un poco más grande, vas dejando de ser niño y te conviertes en un horrible adolescente. En Irapuato nos metimos a una panadería y la señorita que atendía el negocio estaba muy bien, mi hermano Tito hasta se hizo novio de la muchacha, le apuntó su nombre y dirección y se juraron amor eterno.
Y así llegamos a la ciudad de Querétaro, fuimos a Purina que hacen alimento para el ganado. Como conocían a mi papá lo cargaron con un viaje de alimento para Puebla. Nos regresamos los primos arriba del alimento, mi papá no le puso la lona. Pero cuando comenzó a oscurecer, se sintió un frío muy intenso, mi primo Javier estaba llorando y temblando. Me quité la chamarrita que llevaba y se la puse encima, lo abracé y dejó de llorar. Tengo que reconocer que era un frío que helaba hasta los huesos. Ni modo, había que aguantar hasta llegar y creímos que ya estando en Puebla llegaría a la paz y tranquilidad. Pero al dar las 7 am, comenzó a temblar pero muy fuerte, que parecía castigo de Dios. Cogimos las bicicletas y nos fuimos a la escuela a 5to año, pero en realidad yo ya era otra persona, el niño había quedado atrás, ya me sentí grande. Lo mejor que me pasó es que mi primo Javier le tocó el mismo salón de clases con el maestro Eliseo.
Quinto de primaria
A los quince días de haber entrado nos llevaron a la dirección con la maestra Martha, la directora. Cuando nos estaba regañando vi a unos compañeros que nos estaban haciendo caras y muecas y me ganó la risa. La maestra se enojó mucho y me quería expulsar del colegio. Ahí me di cuenta que no puedes cometer una tontería. Mi papá me hubiera matado a cinturonazos. Le supliqué a la maestra que me no me burlaba de ella, sino que nos habían hecho muecas y señas. Por fin la maestra Martha me disculpó, por la manera en que hablé con ella, desde ese momento hasta que salí de primaria me vio con afecto. Esto me sirvió mucho para comportarme en esta escuela, que era un milagro de Dios.
Así transcurrió el quinto año, puse todo de mi parte para estudiar, para hacer amistades. Hasta el maestro me ponía a revisar las tareas, y ahí sí aprovechaba porque el salón de clases era mixto, eso era nuevo para mí, cuando revisaba la tarea me aprovechaba de las mujeres, y les decía que sí eran amables conmigo les pondría buena calificación. Tengo que confesarlo, aunque no es con orgullo: lo hice con dos muchachas. Hilda y Jácome. Lo más triste es que Hilda nunca quiso hablar conmigo, yo creo que porque me rasguñó toda la cara, que hasta me dejó cicatrices.
Tuve dos amigas a quienes quise mucho: Irma Carrilo y otra por quien siempre me preocupé por sus calificaciones y fue mi gran amiga en 5to y sexto de primaria. Irma Carrillo provocó que me hiciera novio de su hermana Margarita, pero terminamos porque no sabíamos de qué hablar. Seguí la amistad con su hermana hasta 6to de primaria.
Y así terminamos el año, en que fuimos los que aparentemente no es nada, pero sí es un orgullo. Todo gracias a Dios y a mi tía y todos lo que pusieron su granito de arena para lograrlo.
A la primaria no le dejaban entrar ni a la alberca, ni a la cafetería, pero mi primo Javier y yo, no sé cómo pero nos metíamos a la cafetería y comíamos ahí casi todos los días.
Las vacaciones
Así llegaron las vacaciones, casi siempre nos gustaba estar todos juntos en la casa de tres pisos ubicada en la avenida Juárez 1906. En el 1904 vivían los Andrade, eran famosos en Puebla, el Huevo Andrade. Andrade Esperón fue mi amigo toda mi vida hasta que se quitó la vida a los 65 años. Junto vivía una maestra de piano, la señora de la Garza. Más adelante vivían los Gavito, enseguida estaba una tienda que le llamaban el Malecón, la atendía Don Fa, el señor tenía un cuarto con mesas, su barra copas y vendía licor en copa. Más adelante vivía Pedro del Razo, nos contó que quiso poner un restaurante, pero llegó Emilio Maurer con pistola en mano para “comprarlo” abrió una cantina y se llamó Charlies China Poblana.
Bueno, en esta casa que se notaba que espantaban porque se oían voces y a veces sombras, pero nunca nos atacaron. Nosotros seguimos muy felices todos juntos. Lo más bonito, es que estaba junto a Chachita que siempre fue la persona que levantaba el espíritu, era muy linda. Le dije que si quería ser mi novia, ella aceptó. Yo estaba muy emocionado, me sentía en las nubes, no sé qué pasó que mi abuelita le dijo a las muchachas que tenían que portarse bien, porque estaban entrando en la adolescencia y claro nosotros también. Luego me hice novio de Yolanda Andrade, la que vivía en el 1906.
Carritos
En ese tiempo había una embotelladora Orange Crush, sacaron una propaganda con sus corcholatas, tenías que juntar 20 corcholatas y más 10 pesos te daban un carrito para armar. Eran modelos diferentes. Los pintábamos y nos quedaban muy bien: llegamos a tener como 50 carritos entre todos.
Para recoger el premio teníamos que ir hasta Xonaca, para nosotros quedaba muy lejos, tomábamos las bicicletas e íbamos a esa colonia que se sentía tan peligrosa. Lo malo era que con tal de tener las corcholatitas, nos tomábamos el refresco con algo de hastío. Nunca lo quisimos tirar a la coladera, porque era caro.
Un día nos pusimos a jugar en la calle y cada cuadrito era un avance para ver quién ganaba la carrera. Jugábamos con dados, según el número que ganabas avanzabas. La carrera se alargaba casi media calle, en eso vimos que desapareció un cochecito, empezamos a sospechar de un paletero, que le llamaban el Pirata. A mí se me ocurrió que nos pusiéramos a jugar luchas en el pasto que siempre había afuera de las casas de la Juárez, para estar pendientes por si trataba de robar otro cochecito, pero se nos olvidó estar pendiente y terminamos perdiendo otra carcachita. Mi hermano se enojó mucho conmigo porque fui el de la idea, y como consecuencia, jamás volvimos a jugar en la banqueta.
Las carcachitas empezaron a quedar olvidadas, pues con el tiempo nunca supimos dónde quedaron, tal vez nos las robaron. Sospecho del amigo de mi Tía Chonita, que ya hasta vivía en la casa, éste hombre era muy joven. Lo conoció mi Tía Chonita, porque ella fue la primera persona que se le ocurrió junto con su hijo Rodolfo, mandar a hacer unos carritos con sus llantas, su tubo de empuje, techo y sartenes para freír los cuadritos donde se ponía la cátsup, mostaza, pan que doraba o calentaba en un comal y tenía tanque de gas. Eran cinco carritos, para mí eran increíbles porque nunca los había visto. Aunque éramos de la familia nunca nos regalaron ni una, teníamos que pagar 80 centavos para pagar el famoso hot-dog, y si querías una Coca-Cola 25 centavos más. Entonces este muchacho, trabajaba con mi tía Chonita de salchichero y una vez tuvo un accidente. Le explotó el gas que llevaba en el carrito, que se llamaban “Salchichas América”. Cuando sucedió el accidente, mi tía se preocupó mucho cuando le avisaron, se lo llevó a la casa y ahí no sé qué pasó, pero ya no salió de la casa. Se quedó a vivir con nosotros. Y como era muy joven, pues nos jalaba para algunas partes en bicicleta o en carcacha. Se compró una de color crema que era Ford-T, 1921 y en esa íbamos a San Antonio que era un barrio donde había unas asesorías con su puertita y una muchacha parada en esa entrada, y Jaime nos decía pasen junto a las muchachas a ver qué les dicen, íbamos con temor porque no conocíamos el lugar, ni que existiera tal cosa. Cuando pasábamos junto alguna joven nos decían “pasas güero, tengo agua caliente, colchón Simmons, te trato bien. Lo que traes te alcanza” y nos regresábamos a la carcachita, porque no nos gustaba mucho eso.
Además de esto, le agradezco a Jaime el haberme llevado a la Ciudad de México, para conocer la Torre Latinoamericana, que apenas habían inaugurado, cuando subimos hasta el mirador, que tenía telescopios para ver toda la Ciudad de México y me dijo “súbete por la antena que era una torre de metal, que es lo más arriba de la torre como 10 metros, y claro que me subí pero pegaba el viento muy fuerte, pero llegué hasta lo más arriba, pero llegaron los guardias y nos regañaron muy feo, nos dijeron que estaba prohibido y nos corrieron. Claro que eso no lo platicamos porque nos daba pena.
Casa Juárez 1906
Esa casa vio la boda de mi primo Rodolfo con Elsa Diáz Pliego que era la novia con quien hablaba todas las noches por larga distancia, marcaba el 02. Una vez casaos se fueron a vivir a Tijuana con mi tío Tony y mi tía Carmela, que como te digo siempre recibía a todos.
Esa misma casa también vio llegar a una muchacha de no malos bigotes, tenía un cuerpo muy encamable. Se quedó totalmente de planta. Le dieron un cuartito que estaba en el jardín en la parte de atrás independientemente de la casa, pero vimos a mi tío Jorge salir de ahí. Juana era la sirvienta oficial para todo: cocinar, lavar, limpiar, y todo que se les ocurría a mis tías y a mi abuelita que ya estaba muy viejita, pero siempre pendiente de todo. La mayor parte del día se sentaba a fumar sus Delicados sin filtro. Costaban 60 centavos. Mi tía Chonita fumaba Raleigh estos en cambio costaban dos pesos con 60 centavos.
Juana se volvió parte de la familia, pues llegó a tener dos hijos que después mi papá me dijo que eran sus hijas, por lo que eran mis hermanas; además una se parecía mucho a mi hermano Pili.
Un día a Javier y a mí se nos ocurrió abrazar a Juana, a ver si había modito, pues ya comenzábamos a sentir las ganas de juventud. La abrazamos y se enojó mucho, porque nos quiso pegar y como esa cocina estaba en el piso de arriba, nos empujó y caímos en la escalera, me fui hasta abajo y caí de panza. El golpe fue tan fuerte que pensé que me moría, pues se me salió todo el aire que no podía respirar, hasta que di un grito que mi abuelita llegó asustada y tuve que decir que me había caído de la escalera, pues no podía decir nada de lo que había pasado. No nos volvimos a acercar a Juana.
En el tercer piso de la casa aventábamos todo lo que tuviéramos a la mano, casi siempre cubetas de agua. Un día llegaron unas muchachas y le dijeron a Javier que lo querían conocer, porque según ellas, era muy guapo. Entonces bajó, se pusieron a platicar en la banqueta, luego vimos que lo golpearon y hasta lo estrellaron frente al poste de luz, nosotros vimos esto desde el tercer piso, así que ni para bajar a la velocidad de la luz, además eran mujeres que le reclamaron que una vez pasaron y él las mojó. Con esa lección nos quedó claro no volver a aventar agua a la gente.
En esa casa pasaron algunos accidentes, mi hermano Tito se estampó en el coche del novio de mi tía Lupita, un Parkland negro, hasta sumió la lámina. Lo bueno es que a Tito no le pasó gran cosa y el novio ni cuenta se dio.
El otro accidente le sucedió a mi hermano Pili, en el jardín de atrás había unos columpios a los que no les hacíamos mucho caso. Pero mi hermano y mi prima Lucha estaban jugando con estos columpios y no sé cómo pero yo que alguien estaba ahí o lo empujaron uno de los espíritus que ahí moraban. Pili se dio un cabezaso, fue tan fuerte que lo tuvimos que llevar al hospital. Le diagnosticaron meningitis y tuvo que estar en cama hasta que se recupero. Pero yo escuchaba a mi mamá decir que antes Pili era muy inteligente, y ahora ya no. Como sea, él estaba vivito y coleando.
La Marranita
Mi abuelita tenía una marranita que se la habían regalado y así fue creciendo con las sobras de comida y algo de alimento, fue aumentado de peso y mi abuelita decía que le dieran tiempo, para buscar alguna fecha para hacer chicharrón y carnitas, y todos estábamos emocionados, y además no estorbaba se quedaba en una esquina del Jardín donde estaban los columpios. Chuy mi primo se hizo novio de una muchacha que también estudiaba, Teresa Ruán, mi primo estaba muy enamorado de ella, tenía un cuerpo muy encamable y no era fea. No sé que les dio pero decidieron irse a vivir a Tijuana. Pero no en camión, sino en coche, que con trabajos le había comprado su papá, con la ayuda de mi Tía Chonita, y la de mi papá. Hasta le hicieron una fiesta por su cumpleaños 21 en la casa. Invitó a sus amigos y a Tere Ruán a la hermana de Elsa Díaz, esposa de Rodolfo, que son los esposos que se fueron a Tijuana. También fue la hermana de Elsa Díaza, nos soprendió a todos porque estaba muy delgada, impresionante. Pensé que se iba a hacer novia de Chuy.
Chuy ya era mayor de edad, ellos se pusieron a bailar chachá, que estaba de moda, ¡hasta nos dieron ganas de aprender! Aunque nos inclinamos por el rock and roll, que comenzaba a oírse con el primer cantante que vimos “Al compás del reloj”.
Un día en la mañana, nos dimos cuenta que la marranita de mi abuelita ya no estaba, y la herramienta de mi papá (que yo no sé porque estaba en la casa de mi abuelita y no en la suya) y faltaba la ropa de Chuy. Mi tía Bichita nos dijo “lo más seguro es que se fugó con su novia” Pues ya le veía las intenciones. Lo que nunca nos imaginamos es que cogió las llaves del Villadiego rumbo a Tijuana con su novia Tere Ruán, que sólo Chuy se hubiera atrevido a recorrer los 3140 kilómetros que hay entre Puebla y Tijuana, además de pagar todo lo que un viaje largo conlleva.
Recuerdo que era un coche viejo azul, creo que era un Buik. Un día habló mi Tía Carmela que ya habían llegado, pero ya habían pasado más de quince días desde que salió de Puebla. Con el tiempo supimos todo lo que les había costado llegar hasta allá. Se quedaron sin dinero y Chuy hizo una cajita para dar toques. Se metía a las cantinas y con ello sacaba dinero porque mucha gente lo veía como novedad, otros querían ver cuánto aguantaban y probar su valentía.
Cuando llegaron, mi tía los llevó a una Iglesia a que los casaran como debía ser.
Operación
Y en esa casa fue que me dio un dolor en la pierna y estómago y nadie sabía qué tenía yo. Para esto mi mamá se había ido a estar en la casa de mi tía Lalita en Ciudad de México porque la tenían que operar unos miomas en la matriz, pero estuvo más de dos meses en Ciudad de México. Por lo que nosotros tres: Cone, Nena y Tito ya vivíamos de planta en casa de mi abuelita en la famosa 1906 de la avenida Juárez.
Yo seguía con mi dolor, pero nadie me hacía caso, ahí caí en cuanta cuánta falta me hacía mi mamá. Mi papá ya ni se paraba por la casa de mi abuelita. Mis primas Chachita, Carmelita me calmaban el dolor porque siempre me entretenían o estaban junto a mí. Llegó el momento que tenía que estar en cama, porque el dolor aumentaba.
Mis tías le hablaron a un doctor que era amigo de ellas, cuando llegó dijo: esto es apéndice y hay que operar en el acto, porque en la mañana le va a venir una seria peritonitis. Me llevaron al hospital Civil que estaba en la 13 Sur casi esquina con la 27 poniente (frente al paseo viejo que era una especie de parque para caminar y andar, el Paseo Viejo era muy antiguo, por eso al Paseo Bravo le llamaban el Paseo Nuevo). Casi a las 12 de la noche me durmieron, pero al otro día que desperté me dijeron que al abrir con el bisturí se fue la luz y se quedaron a oscuras, gracias a Jaime Oliman, el amigo de mi tía Chonita, fue que pudieron continuar con la operación, porque él llevaba un llavero con una lamparita.
Yo creo que todo es obra de de Dios, pues no quería recogerme todavía. Cuando estaba en recuperación llegó mi tía Chachita, que me acompañó un rato y se recostó junto a mí. A mi papá nunca lo vi por ahí. Creo que él se estaba olvidando que existíamos.
Cuando llegó el doctor que me operó, René Maldonado, muy elegante que parecía un artista de cine. Respecto a los honorarios yo oí como el doctor les dijo a mis tías que no les iba a cobrar ni un centavo. Aunque yo estoy segura que alguna de mis tías les pagó de una forma. Yo me hice la promesa que cuando fuera más grande le pagaría su atención.
A los 40 años, lo cumplí porque le llegué a hacer una fiesta en la Cabaña cuando tenía 40 años. Me acuerdo, que entre otros invitados fue Angel Islas y Manuel Andrade, El Huevo Chico. Además le di dos mil pesos. Le dije que me tuviera eternamente como su amigo, y así fue hasta que llegó el día en que murió. Creo que si alguien te hace un favor, hay que pagarlo. Dios nos dio el don de ser agradecidos.
Sexto de primaria
Mi maestra Evangelina Mino fue muy consciente conmigo, pues cuando regresé a la escuela, después de la operación y convalecencia ya habían hecho los exámenes finales, por lo tanto, yo no los pude realizar. Pensé que reprobaría, y otra vez por no hacer el examen final. Pero la maestra Mino, me hizo sentir buen cuando me dijo que no me preocupara. Como yo le ayudaba a revisar tareas, ella me tenía confianza y así fue como pasé a la secundaria.
Sexto de primaria fue el mejor año de mi carrera escolar, porque conocí la amistad. Tenía un compañero al que no le caía bien, pero al fin y al cabo fue un buen amigo. Se llamaba Aarón Fernández, tuve suerte de ser amigo de Fernando Bertheau Rangel que fue de mis mejores amigos, al igual que Raúl Ibarra Estrada. Su papá tenía una zapatería y en el mismo lugar tenía una zapatería y el mismo lugar estaba su casa, en la 3 poniente 311, muy cerca de la oficina de mi papá. Me gustaba ir a verlo, me hice muy amigo de él y además en el salón iban varias muchachitas bellas: Irma Carrillo Iriarte, hermana de quien fue mi novia en quinto, Bertha Silvia León Cobos, éramos uña y carne, no nos separábamos en los exámenes estaba pendiente por si se atoraba en una pregunta. También había otra muchacha: Delfina, me caía muy bien y sentía algo por ella, le regalé un disco de acetato con la canción Cuando tú me quieras, estaba muy de moda el tema. Me criticaron por regalar el disco, pero yo sentía que debía dárselo.
Pasé con cierto temor, porque nos tocó ver cómo trataban a los novatos en la Venustiano Carranza, les rapaban la cabeza, además le hacían maldades. Pero en el Centro Escolar Niños Héroes, yo creo que no estaba permitido.
Ahora en secundaria podríamos pasar a la cafetería, podríamos hacer gimnasia, nadar disfrutar de las instalaciones, pero mientras eso sucedía, transcurrían las vacaciones y tuvimos una ocurrencia.
Toreo de Puebla
El Toreo estaba a tres calles de la 1906 y había mucha gente que le gustaba la fiesta brava. Además había gente que enseñaba a muchachos para que con tenacidad llegaran a ser figuras del toreo en México. Este monumento era grandioso, de pura mampostería, grande, espectacular, como de los mejores del mundo. El dueño era Cienfuegos. El señor Alarcón se lo quería comprar pero Cienfuegos nunca aceptó. Mandó a matar a Muscarúa, que era su asistente, porque Alarcón era el operador de teatros del gobierno y manejaba casi todos los cines.
Muerto el dueño lo derrumbaron, nosotros hasta lloramos porque en ese monumento, vivimos varias aventuras, como cuando vino el circo más famoso de Estados Unidos: Ringling Bros. y tuvimos que conocer al señor Barnum, que era socio de Ringling porque él les dio a Dumbo, y él no quiso dinero, sino que lo hicieran socio. Pues este circo, era gigantesco, tenían hasta su propio tren, tres pistas y un sinnúmero de artistas y cientos de trabajadores. La carpa era increíblemente enorme. A mi primo Javier se le ocurrió pedir trabajo para poder ver el circo de cerca y estar dentro de ese mundo. Conseguimos acomodarnos con una domadora de osos grizzli que realmente daba miedo, pero no nos importó, ella se llamaba Anna Silver, de figura magistral, pero de piel cacariza, tuvo viruela y le quedaron cicatrices. Nuestro trabajo no era nada agradable, teníamos que recoger la popó de los osos. La domadora nos dijo que si los bañábamos y cepillábamos nos pagaría el doble, pero nos dio miedo
Sin embargo, lo más impresionante fue platicar con el señor Barnum, nos dijo que en Nueva York tenía un museo, y que lo más extraordinario era una sirena disecada que tenía en exhibición. Sin embargo, las autoridades la clausuraron porque notaron que era falsa, por eso se interesó en el circo, que en ese tiempo era de los más grandes e impresionantes. Nos platicó que en su circo se rodó una película llamada Gigante, donde se ven a los trapecistas.
Cuando se fue el circo tuvimos mucha nostalgia, no imaginaríamos que el fin de ese circo estaba cerca, pues el circo se disolvió, nunca supimos la causa.
En el Toreo también nos tocó a ver a Pedro Infante, entramos a entrenar el toreo, y así fue como nos pudimos esconder en un balcón donde casi nadie pasaba. Estuvimos esperando como casi cinco horas. Más tarde empezó a entrar la gente y nos acomodamos hasta abajo en la barrera de los toros. Salió a cantar Pedro Infante, muy elegante con su chamarra de gamuza y su sombrero beige. Cuando terminó de cantar Cartas a Eufemia corrimos al ruedo de un salto, corrimos a saludarlo pero no nos dio la mano, nos dio coscorrones y unos señores nos sacaron los guaruras, quienes nos llevaron con el gerente. Tuvimos que prometer que nunca volveríamos a entrenar para toreros.
Carmela y Muñeca
A la casa llegó una muchacha llamada Carmela, hermana de Teresa Ruán, esposa de mi primo Chuy, acompañada de una mujer hermosa, le decían La Muñeca, se fijó en mí y nos hicimos muy amigos. Yo dije “ésta ya es como mi novia” y nos invitaron a una fiesta y ahí estábamos bailando y platicando, cuando le dije “espérame tantito, voy al baño” Yo llevaba la intención de decirle que fuera mi novia, oficialmente, pera poder abrazarla y hacer todo lo que hacen los novios. Estaba muy emocionado, cuando regresé, le pregunté. Pero me dijo que le hubiera dicho antes, pues se le acercó mi primo Javier y se le declaró. Pero ella le dijo que no, eso entonces me indicaba que sí quería ser mi novia. Pero había un problema, su prima Carmela, alguno tendría que hacerse su novio. No importaba quién, ella podría andar con cualquiera, y si era el caso, después podrían cambiar. Entonces, le dije a Javier, y le reclamé lo que había hecho, le pedí que se amarrara a Carmela, pero no quiso, yo tampoco estaba convencido. Entonces abortamos el proyecto Muñeca. Pero seguirnos como hermanos, como siempre.
Pasó una semana y Javier me dijo, vamos con Carmela a su casa, yo me hago su novio y tú de la muñeca, y después de una semana cambiamos. Decididos fuimos, y luego nos enteramos que la muñeca ya no vivía en Puebla. Su papá se había sacado la lotería y con eso se fueron a Guadalajara.
Cambio de casa
Llegó el momento de cambiarnos de casa, aunque yo no vivía con mi mamá, ella se cambió, para pagar una renta más barata. Un día mi mamá me dijo que no me fuera para la 29 poniente, que ya había conseguido una casa. Me dio la dirección en un papel que decía 32 poniente 306, interior 3. Salí de la escuela tarde, me perdí por Xanenetla, todo estaba oscuro. Ya eran las 10 de la noche y ni siquiera pude ver por dónde andar, choqué con una capilla parroquial de color amarillo, de la nada salieron como cuatro individuos como de película de terror, corrí a toda velocidad, logré llegar hasta la 9 Norte, me fui corriendo luego por la 32 poniente y por fin llegué a la casa. Era de un piso, pero en la azotea había un cuarto para la sirvienta, pero mi mamá y mi hermano Tito ya habían decidido que ese cuarto fuera para los tres hermanos hombres: Tito, Pili y yo. Ya estaban los muebles y todo acomodado, llegué a casa, cansando pero contento de estar en casa. Como a las 3 de la mañana se oyó un ruido como nunca, salimos corriendo y vimos un tren que pasaba por la esquina de esa casa a media calle de nosotros. Nunca habíamos un escuchado un ruido semejante. Fue una sorpresa de miedo, y una sensación pasmosa, entusiasmados porque podíamos ver al tren de cerca.
En la primera casa vivía la familia Zárate, y había en ésa dos niñas muy lindas: Martha y Pili. Ellas también usaban el cuarto de la azotea, como su recámara y en las noches a veces se pasaban al nuestro a platicar. Con el tiempo llegaron otras dos muchachas que eran más o menos agradables, y ¡Claro! les echamos el ojo, Bárbara y Leonor. Por más que quise caerle bien a Bárbara no pude, ¡hasta me paraba de cabeza! Nunca quiso conmigo, ella quería a mi hermano Pili, pues siempre lo abrazaba y besaba, hasta se recostaba en él.
Santiago Loyo
Esta casa estaba en la colonia Santa María, que por cierto, un hermano de mi mamá, Santiago Loyo Alcantar, se vino de Durango, de donde era mi mamá y sus hermanos: Santiago, Pedro, Elena, mi mamá: Manuelita, María Luisa, Ángeles y la más chica: Leonor. Bueno, Santiago llegó huyendo, era periodista, y los sacerdotes los querían matar, pues había sacado varios de sus trapitos al sol. Lo quisieron matar, lo esperaron en un puente, y lo querían apuñalar. La cosa se puso más caliente, total que decidieron que para calmar los ánimos, Santiago se fuera a Puebla. Enseguida entró como diputado y con la experiencia que tenía comenzó a hacer dinero, pero mucho dinero. Fue socio de la Nueva España, él y otros amigos más: Rodríguez Pacheco y un americano: Heming. Compraron los terrenos que ahora son la colonia Santa María.
Mi tío tenía un alma bohemia, además tenía un piano en su casa que por consiguiente, llegaban sus amigos y otros bohemios como el compositor Agustín Lara. Además el que lo visitaba casi diario era un hermano de mi papá, el tío Luis Ávila Navarro, el más grande de los hermanos de mi papá. Con el tiempo. Santiago estuvo en la dependencia en su tiempo la Comisión Agraria, con ese cargo metió a mi tío Luis Ávila Navarro, mi tío a mi tía Bichita, y el tío Santiago metió de secretaria a mi mamá, Manuel Alcantar Aviña, entró como jefe Aaron Merino Fernández, y además entró a trabajar Gustavo Díaz Ordaz, quien se enamoró de mi mamá y se hicieron novios. Cuando se enteró Santiago, sacó su pistola, que siempre traía en el cinto, y le disparó a mi mamá y casi la mata. Yo creo que mi tío estaba enamorado de mi mamá, era su medio hermana.
Como mi tía Bichita era secretaria y mi madre también, se hicieron muy amigas. Mi mamá acompañaba a mi tía a casa. Mi tía vivía en la casa de las bellas, en la 16 Oriente. Mi mamá vivía con su familia en el barrio de El Parian, cerca del río San Francisco, cada vez que llovía se inundaba su casa.
Con el tiempo, mi mamá se volvió a hacer novia de Gustavo Díaz Ordaz, pero no duró mucho, porque mi tío lo corrió, y tuvieron que terminar el noviazgo por segunda ocasión. Después de muchos años, a mi mamá le ofrecieron que si admitía que Tito era hijo de don Gustavo Díaz Ordaz le darían 50,000 pesos, para poder anotarlo en las memorias. Mi mamá los mandó al diablo, a ella nunca le importó el dinero. La otra persona que que trabajaba llegó a ser el gobernador de Puebla, le dio trabajo a mi mamá sin importar que tuviera 50 años. Entró de secretaria de prensa y duro 30 años en el cargo. Mi madre nunca aceptó ningún dinero extra, ni siquiera acepto permisos de taxi.
Muerte de Víctor
El 10 de mayo de 1960 ocurrió un suceso que nos sorprendió a todos. Nos avisaron que acababan de matar a uno de nuestros vecinos: Víctor Andrade Esperón. En lugar de estar con su mamá, se fue con un amigo, Mino, a un bar en la salida para Tlaxcala. Estando los muchachos ahí llegaron varios hombres que al parecer eran agentes judiciales. Buscaban a Mino Vasquez y sin decir nada sacaron la pistola para matarlo, cuando Víctor Andrade se interpuso entre la pistola y Mino. El tiro le dio a Víctor, que cayó súbitamente muerto. Después de un tiempo llegamos a la conclusión que Mino andaba en amoríos con una mujer casada, su esposo lo siguió para matarlo. Eso, o era un judicial que no aguantó la traición de la esposa.
Víctor, el muchacho muerto, era más conocido como el Huevo, porque su pelo era rubio, era guapo y bueno para los cates, tenía muchos amigos muy duros, pero tenía el don de gente y era muy querido, se me imaginaba a mi primo Javier.
Cambio de casa
Mi papá decidió que viviéramos juntos otra vez todos los primos en una casa muy grande en la 23 sur 105. Eran 6 recámaras, lo más grandioso es que volví a vivir con mi prima Chachita, que siempre la he querido mucho, además de ser bonita era muy inteligente y amorosa. Pero empezó a ver la telenovela: Teresa, cambió su actitud, rebelde como la de la muchacha. Pero mi amor seguía intacto. Pasaron muchas cosas, ahora más adolescentes, con más criterio, pero no dejamos de ser los mismos. Lo más importante era estar juntos, los momentos más felices son los que he pasado en el seno de mi familia, pensé.
Una vez, mi hermano Tito se aventó con mi carrito, que era el más rápido, yo creo que era por la forma aerodinámica que le hice a las llantas de hule con baleros y al llegar a la curva chocó con la banqueta y salió disparado, pero como se amarró las manos para tener más apoyo salió como si un luchador lo hubiera aventado a la loma y si se lastimó mucho después en la otra calle. Mi hermana Esther también se aventó en uno de los carros, aunque no era muy rápido, tomó velocidad y mero cuando iba pasando un tráiler, mi hermana pasó gracias a Dios por el centro del tráiler. Con este suceso ya no quisimos seguir, pero ya venían los otros muchachos de la camada: mi hermano Pili, Willy MacFarland, Jorgito. Estos chamacos cogieron los carros y mi hermano Pili los unió como si fuera un tren, los tres estaban ensamblados. Se iban a la cima del cerro de La Paz y se aventaban de lo más alto hasta la fuente de los Frailes y para que no los arrollaran los automóviles, tuvieron que voltearse porque ya habían tomado demasiada velocidad, y todos quedaron lastimados. Mi familia decidió regalarlos antes que sucediera una tragedia.
Primero de secundaria
Las vacaciones acabaron y llegamos a primero de secundaria. Estábamos muy emocionados y nos hablaron por altoparlante, teníamos que escoger un taller. Me incliné por la madera, en eso se me acercó mi primo Javier y me convenció de meterme a Herrería “es lo que está de moda, la carpintería ya ni se usa, ya todo lo hacen de fierro” me terminó convenciendo como siempre.
Lo único bueno que yo le veía a eso es que íbamos a estar en el mismo grupo. Estuvimos en 1º C con la maestra Gaudencia Gutiérrez, desde que entramos el primer día se enamoró de mi primo Javier. Lo hizo jefe de grupo y no lo soltaba para nada. Revisamos que muchachas bonitas había, luego luego vi a una muchacha muy interesante, llamada Carmela Osorio Ocampo. Era muy agradable y bella.
En ese salón conocimos a un muchacho llamado Rafael Zenteno Rodríguez, se hizo amigo durante muchos años.
Un día mi primo no fue a la escuela. La maestra Gudelia que Javier no llegó a la Escuela y me dijo, “como tu primo no vino, ahora tú eres el jefe de grupo, así que fórmalos en el pasillo”. Entonces los formé, pero un muchacho llamado Rafael Araujo, se molestó que lo empujé para formarlo y él sacó un clavo que había metido en el esmeril, me lo echó encima, pero le puse mi brazo izquierdo ya ahí me lo clavó, pero con la derecha le tiré un golpe a la mandíbula y resultó que se quedó sordo del oído contrario.
Su mamá se quejó con el prefecto, Salvador Lobato Contreras, y claro aunque le expliqué, me querían expulsar. Le dije que era sobrino de mi tía Lupita que era maestra, entonces él cambió la cara, se volvió más amable y me dijo que me llevara a mi papá y así fue por lo que tuvo que pagar mucho dinero para los gastos del doctor.
En ese salón iba con nosotros un compañero muy chistoso de vista, de trato y hasta de nombre. Se llamaba Teodoro Labastida del Pozo. Y siendo feo y de lentes, me daba mucha risa, pero de todos modos me hice muy amigo de él y hasta lo llevaba a su casa en mi bicicleta, pues él no tenía, y él vivía en la 5 Sur y 3 Poniente, junto al edificio que había construido la Estrella Roja, que era el transporte que usábamos para ir a la Ciudad de México.
Teodoro me confesó que estaba enamorado de mi prima Carmelita, quería que yo le metiera el hombro con ella, ahí me di cuenta que estaba loco. Un viernes me platicó que llegarían de México sus familiares y querían ir de día de campo y querían que yo fuera con él. Le dije que iba a pedir permiso. Al otro día le dije que no me habían dado permiso.
El lunes en clase la maestra Gutiérrez nos habló muy consternada “¿quiénes son los amigos de Teodoro?” preguntó. Me levanté junto con Javier y nos pidió que fuéramos al entierro para acompañar al amigo que tuvo un accidente en el puente de San Francisco Teotimehuacán, en la carretera a Valsequillo. Me parece murió toda su familia, creo que solo sobrevivió su abuelita. Pero para nosotros y sobre todo para mí, fue un golpe muy duro, y claro le agradecí a Dios el no haber ido al día de campo con mi amigo que no volvería a ver jamás en la vida.
Para colmo una compañera se me declaró, “¿quieres ser mi novio?” le dije “¡no, rotundamente no!” eso me costaría muy caro más tarde. Nunca me lo perdonó.
Hizo una alberca en su casa para invitar a todos a su casa, pero con la condición que no me llevaran a mí. Hasta mi primo Javier iba con ellos, ahí me dolió esa traición, pero Javier, no lo tomó tan en serio, porque me dijo que yo era el que tenía la culpa del error, que no debí rechazarla así, tan drástico, para evitar esos rencores, eso duró mucho tiempo, hasta que ella organizó otra fiesta con orquesta y maestra de ceremonias.
Para ir a esa fiesta tan especial había que ir disfrazado, y como en la Casa Ávila de mi tía Chonita había varios trajes, me disfracé de una manera que fuera irreconocible. Me dio uno de oso pardo y me lo puse.
En el Paseo Bravo, a veces andaba un señor con un disfraz de oso, y se ponía a bailar, a mí me gustaba verlo y aprendí mucho como bailaba, entonces mi primo Javier se vistió de diablito y otro amigo que quería ir con nosotros se puso el traje de calavera.
En la fiesta, inmediatamente me puse a bailar como había aprendido al oso del Paseo Bravo, y así estuve bailando cerca de dos horas. Hasta que el maestro de ceremonias dijo que habría un premio de 500 pesos al que quedara en primer lugar. Cuando pasó mi primo vestido de diablo venía atrás de él, Pepín García con su traje de calavera, y el maestro de ceremonias dijo, ahora con ustedes el conjunto de la caldera del Diablo, creo que en ese tiempo pasaban en televisión. A todos les dio mucha risa, pero no lo escogieron y como tenía que pasar me dieron el primer lugar.
Cuando me iban a entregar el premio y me dicen “quítese la máscara de oso para que lo veamos” así lo tuve que hacer. Nunca olvidaré la cara de su familia al verme, me quitaron los 500 pesos.
También me quitaron el traje y me aventaron a la alberca, lo bueno de todo es que así fue como terminó el rencor porque volvimos a ser amigos. Ella fue la única compañera que vino a visitarme cuando me dio mi primer infarto.
Valsequillo
Todos los que teníamos bicicleta de nuestro salón nos íbamos a la carretera para el lago de Valsequillo, con la intención de llegar al puente que une los dos extremos del lago que son de este lado el puente de Valsequillo, que quiere decir Valle Seco y le atinaron, porque es tan seco como África. Y ya que estamos hablando de este puente, viene a colación hablar de mi tío el ingeniero Pedro Alancántar Aviña, hermano de mi mamá, también era empleado de la Secretaría Agraria. Mi tío tenía el encargo de buscar un lugar para poder captar lo más que se pudiera de agua. Así que se le ocurrió en el pueblo San Baltazar Tetela, había una gran barranca con potencial para hacer la presa. Lo malo es que había que desalojar a todo el pueblo. Así se hizo junto con el ejército, quienes los desalojaron. En compensación se les dio otro terreno donde no se vieran afectados por la presa. Cuando baja el nivel de la presa, se llega a ver la torre de su iglesia principal. Yo llegué a bajar y a tocar su iglesia tan solo con aletas y con escafanda. Sin embargo no es algo que recomiende pues el agua está muy contaminada.
En una ocasión le propuse al gobierno limpiar las aguas, sin embargo al no tener la infraestructura me negaron el proyecto. Estoy seguro que con la ayuda de la gente lo hubiera logrado. Quiero extenderme un poco más en esto para hablar de un señor que hizo una labor titánica, porque le encomendaron el trabajo de hacer un túnel para llevar el agua de la ciudad, para descargarla en la presa: el ingeniero Lassarof, era francés.
Tuvo la idea de taladrar por la parte de la presa y al mismo tiempo rascar por el otro lado que era de la ciudad y él estaba seguro de sus cálculos, pues como era francés no podía fallar. Todos estaban en expectativa. Llegó el día en que los equipos se encontraron, todo había salido a la perfección, fue algo de lo más increíble. El ingeniero Lassarof, mandó traer comida y bebida y se hizo una fiesta, la cual se celebró cada año.
Carreras de bicicletas
Está excursión se terminó volviendo una carrera, a ver quién llegaba primero a Valsequillo, a Javier no le gustaba eso de la carrera, por eso dejó de acompañarme. En la subida a la media luna, así le decían a la subida de la entrada de Tomás Chiautla, que es donde se extrae un mármol muy duro, grado ocho. Era una subida muy dura y yo siempre ganaba, pero en la bajada no sé porqué me ganaban. En la subida me acordaba de mi papá que siempre me decía “tú eres el rey de la montaña” yo no ganaba la carrera porque en la bajada me ganaban. Sobre todo Jesús Carvajal, compañero muy aguerrido.
Sin embargo con el tiempo fuimos dejando esta práctica yo creo que porque a mi primo no le gustaba mucho los esfuerzos ni hacerle al tipitoche de andar con estos cuates de por si a mi primo no le caían bien.
Para mí la bicicleta era mi elemento, yo podía jugar cualquier cosa en bicicleta, tirar a otros, los demás no lograban tirarme. En una ocasión los reté a brincar una zanja, me encarreré y levanté el manubrio con las manos y los pedales con los pies, los hice para arriba y logré levantar la bicicleta y pasar la zanja sin que me pasara nada. Al lograr mi hazaña los demás no se atrevieron, me hice de mucho respeto.
Ahora veo cómo hacen toda clase de piruetas con la bicicleta, me admiro mucho, pero no dejo de pensar que fui uno de los primeros en hacer estos giros. Así acabó el primer año de secundaria.
Segundo de secundaria
Cada vez nos costaba mucho el taller de Herrería, porque el maestro Delfino que se supone que nos tenía que enseñar, nunca nos enseñó nada.
El uniforme era beige con blanco y no nos gustaba ensuciarnos, en el taller todo estaba negro, si hacíamos algo al rato ya estabas sucio. Javier y yo nos sentamos en una máquina que movía unos ventiladores que mandaban aire a la fragua que era el fuego donde los herreros calientan el fuego para poderlo trabajar. Se nos acercó un compañero, llamado Aurelio Sánchez y comenzamos a platicar porque yo había conocido a su hermano Sergio Sánchez en la escuela donde estuve antes.
Estando juntos escuché que dijo “ay me machucó la banda el dedo” su mano ya no tenía el dedo, e inmediatamente se desplomó de la impresión. Se desmayó, le grité a Javier que recogiera el dedo, pero Javier tuvo temor y no lo hizo. Tuve que recogerlo, me lo eché a la bolsa y cargué a Aurelio. Así me lo llevé a la enfermería, era un tramo largo.
Cuando llegué a la enfermería me dijo el doctor, ¿dónde está el dedo? Y me regañó por no traerlo en una gasa. Lo cosió y con el tiempo casi no se le notaba, sólo perdió la uña. Este compañero quedó muy agradecido y siempre me dio su amistad hasta el día en que murió.
Corridos
Ya en vacaciones, teníamos amigos, entre ellos, Rafael Zenteno Rodríguez, iba a la casa, no entraba mucho pero salíamos a andar en bici. Y así fue como nos enseñó a echar corridos.
Los corridos consistían en entrar a una tienda, pedir algo y salirse corriendo. Empezamos a hacerlo más seguido. Cometimos algo que siempre ha consternado mucho. Íbamos en un coche y nos acercamos a un ciclista que llevaba un paquete en el portabultos, mi hermano Tito le tomó el paquete y corrimos. Llevaba unos zapatos que había comprado en el Mercado La Victoria, un pantalón de mezclilla nuevo.
Me dolió mucho hacer esto con una persona que se notaba era de lo más humilde, pero ya estaba hecho. Y así seguimos con esta práctica que hasta les quitábamos el pan a las sirvientas.
Esperábamos la hora de que las mandaran por el pan, más o menos a las 6 de la tarde, y en las bicicletas nos subíamos a la banqueta para arrebatarles el pan. En ese tiempo había infinidad de panaderías.
De los corridos a las nalgadas
En el Paseo Bravo empezamos a darle nalgadas a las muchachas, en una de esas se nos adelantó mi primo Tonito, que llevaba una bicicleta Raleigh, no sé cómo le hizo, pero la mano se le atoró en la pompa de la joven, y se dio un golpe que se quedó tirado sin poder levantarse. Estas muchachas lo levantaron y lo apapacharon, a mí no me extrañó, porque Tonito MacFarland tiene ese don, que las viejas y todo el mundo lo quieren. Como esto sucedió dejamos las nalgadas de lado, pero seguimos con los corridos.
Una vez Tonito y yo entramos a una tienda, pedimos esto y lo otro, salimos corriendo y afuera nos esperaba Tito y Javier, nos subimos al portabultos, atrás de nosotros venía el dependiente con pistola. Hice algo por instinto, me le fui de un salto y con todo y su pistola quedó tirado en la calle, antes de lograr disparar. Logramos disparar, pero yo perdí mis libretas de la escuela. Jamás volvimos a intentar ningún corrido. Nosotros no volvimos a intentarlo, sin embargo mi amigo Zenteno si siguió estas prácticas.
Campamentos
Una vez se nos ocurrió irnos de campamento, entonces, mi papá tenía amistad con el dueño de los terrenos de la Calera, estaban atrás de la colonia Zaragoza, colonia de soldados. Mi papá llegó al acuerdo que nosotros, los familiares de Don Pedro Ávila podíamos hacer uso de todo el cerro de La Calera, que era un lugar muy agradable, porque estaba lleno de flores, de pasto y de árboles grandes.
El único requisito que era ir con una casa de campaña. Eso era lo único que no teníamos, pero se me ocurrió que si mi abuela nos prestaba agujas e hilo, yo la podía hacer. Cogimos unos manteles de tela y otros de hule, deshicimos un colchón de borra. Me puse a coser durante dos días hasta que lo logré. Llevamos la comida que teníamos en la mano, estaban de moda las sopas Tía Rosa, solo necesitabas agua. Nos llevamos una olla que estaba en la cocina, sarapes, chamarras y tenis. Nuestro primo Rodolfo nos prestó un perro pastor alemán para que nos cuidara, pero yo creo que el perro no sabía eso, porque era el que se metía primero hasta el fondo de nuestra casa de campaña.
Tito nos dijo que fuéramos a ver que había en los árboles, sobre todo para explorar toda la zona y así nos fuimos con el perro para que nos cuidara, y ahí, en una hondonada, nos estábamos acercando cuando vimos a una serpiente de cascabel o crótalo y nos hicimos a un lado y despacio, para que no se nos lanzara.
Vimos en el fondo de la hondonada, que más bien parecía un hoyo, que había como veinte víboras, por lo que nos sobresaltamos, y es, cuando sin darse cuenta, te entra un miedo colectivo, que salimos disparados para la casa de campaña. Al llegar vi una botella de vidrio y la abrí para tomar un trago de agua, tenía el alcohol industrial que llevaba alguien para encender la fogata; sentí que me quemaba la garganta y hasta creí que me iba a morir porque clarito sentí cómo me quemaba, apara ayudarme mi hermano me dio a tomar mucha agua y así fue como logré sobrevivir.
Entonces nos pusimos a hacer la sopa que llevábamos de la Tía Rosa y en una olla y en la fogata, ya casi estaba lista y a Javier se le ocurrió que si cortábamos unos nopales sabría mucho mejor, pero sinceramente toda la sopa estaba como baba, pero nadie dijo nada, pero nos veíamos unos a otros y sabíamos que no estaba buena, ¡estaba horrible!
En eso estábamos cuando llegaron dos caballos con sus jinetes, uno de ellos era don Gonzalo Bautista, el dueño de esas tierras, muy espantado nos preguntó que si teníamos casa de campaña, pues la que hicimos de varias telas y hasta un mantel de plástico de color como naranja pues la verdad se veía muy fea.
Antes que pudiera decir otra cosa, el amigo Zenteno le espetó que la casa era de campaña pero que todos nosotros éramos gitanos trotamundos, y gracias a Dios se soltó una carcajada y se fue un poco más calmado.
Javier y yo caminamos más abajo y había algunas casas y entonces vimos a un caballo que estaba pastando y nos fuimos acercando al caballito, lo acaricié y se dejó, lo empujamos y lo jalamos hasta unos cimientos que nos sirvieron como base para subirnos al caballo, yo adelante y Javier en la grupa. Le pegamos con los talones y empezó a caminar y con la crin le hacíamos dar la vuelta, cuando nos encontramos con una depresión del mismo bosque, pero como de metro y medio y le pegamos con los talones para que avanzara, y así lo hizo, pero me fui de frente por lo empinado que estaba y no me pude detener y me fui de boca; me caí del caballo y me ha pisado las partes nobles y el estómago, que no me pude levantar.
Mi primo se espantó y se bajó del caballo, salió destapado a los maizales. Entonces llegó un señor preguntando por su caballo, le explicamos todo y nos dijo: “ahora vayan por él y me o traen”. Pero por más que nos acercamos salía corriendo, entonces se me ocurrió esconderme en la hierba y que Javier lo azuzara por donde yo estaba. Cuando pasó por donde yo estaba escondido, que me lanzo al cuello, o sea, al pescuezo, y así lo detuvimos. Llegó el dueño con una reata y por fin lo amarró, por lo mismo nos quedamos que por experiencia no tocar a ningún animal que no fuera nuestro.
Veracruz, toda una aventura
Cuando estábamos ya en la casa, me dijo mi hermano Tito que fuéramos a Veracruz pero como aventura, en aventones, y decidimos que para que fuera una aventura nos tendríamos que ir sin dinero; seríamos como limosneros. Quedamos de acuerdo que sólo llevaríamos 40 pesos cada uno para lo más indispensable y así lo hicimos. Cada quien llevaría una mochilita con una muda y traje de baño y así lo hicimos, claro que con permiso de los papás.
Así nos fuimos a la carretera y como éramos cuatro primos, también iba otro primo muy querido por nosotros —era por parte de mi mamá, hijo de mi tía María Luisa Alcántar y del Lic., pero siempre llevó el nombre de Pedro Prieto Alcantar– a quien le decíamos de cariño Pedrolín, que siempre fue una buena persona hasta su muerte. El otro era mi amigo Rafael Zenteno.
Como éramos seis pues era muy difícil que nos dieran aventón a todos juntos, por lo que nos dividimos de tres cada equipo, y así, según la suerte, podríamos llegar a Veracruz. Me acuerdo que en el primer viaje el equipo de Tito, Javier y Tonito estaban en la carretera y vieron un carro último modelo y Javier le hizo el ademán de raite, que es el dedo gordo, y se va parando y como los vio con cara de gente bien los levantó, así que ellos llegaron al Puerto, cuando mucho en cinco horas.
Nosotros, después de estar como una hora, nos levantó una camioneta que llevaba borregos, chivos y hasta un marrano, y así avanzamos un tramo, porque este señor se quedó en Tlacotepec (lugar de mucha importancia para mí, que lo explicaré más adelante). Ahí en nos levantó un camión de carga que nos llevó más adelante y por último un camión de caja que llevaba envases vacíos a la ciudad de Veracruz.
Después de nueve horas de camino, sin comer, nos fuimos al parque Zamora, porque así quedamos de vernos o esperarnos en ese lugar. Ellos tenían cuatro horas de estar ahí, y claro, riéndose de lo que les pasó porque llegaron el carro nuevo, en el asiento de atrás y el dueño iba manejando como si fuera el chófer, y los llevó hasta el parque, así que mucha gente los vio por lo que parecían ricos.
Platicamos de nuestra aventura y nos fuimos a conseguir un cuarto para dormir y bañarnos, y así dimos con una casa de huéspedes muy antigua, que creo que todavía existe a una calle del malecón, se llamaba Casa Vigo, y rogándole a la señora dueña de la casa quedamos que fuera en 15 pesos el día para los seis, así unos en la cama y otros en el piso, A esa edad no importa nada, sólo piensas en ir a la playa.
En la mañana nos comprábamos un vaso de agua de horchata para que pareciera leche y un pan, y al mediodía, si se podía, un taco de a peso de lo que fuera, y la noche otra vez la horchata y un pan o telera, y así hicimos tres viajes de aventones a la ciudad de Veracruz, aunque cada vez éramos más grandes, pues por lo menos entre cada viaje pasaba por lo menos un año, y la Casa Vigo donde nos hospedábamos siempre nos cobró los 15 pesos diarios por el mismo cuarto que daba a la calle por un balcón que también lo usábamos para dormir.
La última vez que estuvimos ahí, con todo el dolor de nuestro corazón, nos vimos en la necesidad de arrojar las mochilas por el balcón hasta la banqueta, aunque toda la gente se nos quedaba viendo, pues ni modo, nos salimos de ahí como si fuéramos a la playa y cuando salimos cada quien pasaba corriendo por la mochila, aunque la gente se nos quedaba viendo, hasta el agente de tránsito nomás movía la cabeza, pero logramos irnos sin pagar, no porque no quisiéramos, sino porque ya nadie tenía ni una centavo, pues cada vez nos alcanzaba menos el dinero.
De ahí nos fuimos en un camión urbano hasta la salida de la ciudad. Y en el camión se nos ocurrió hacer algo para conseguir algo de dinero. Mi amigo Zenteno y yo nos pusimos a hacer un show, él era el ventrílocuo y yo el muñeco Titino, que salían en la televisión con Don Carlos y Don Neto, este señor con sus muñecos y él como ventrílocuo se hizo muy famoso.
Entonces la gente que iba en el camión no tuvo objeción de darnos dinero cuando uno de los primos pasaba con su gorrita, y así juntamos cuando menos para comer algo, porque en cada viaje que hicimos, que fueron tres, bajamos de peso como tres kilos. Así fueron algunas anécdotas que nos sucedieron en estos viajes de aventones.
Una vez se le ocurrió a Zenteno que nos metiéramos al hotel Emporio, uno de los más caros en ese tiempo, para ir directamente a la alberca. Pero para que no se fijaran en nosotros nos hablábamos en apellidos como Díaz Ordaz o Betancourt y así como los políticos, como los artistas, como el actor Fábregas.
Creo que fue contraproducente porque nos dimos cuenta de que nos estaban señalando con el dedo, y eran varios hombres, entonces nos salimos del agua y nos echamos a correr para salir por una ventana. Hasta las chanclas perdimos por la prisa de que no nos atraparan. Después nos enteramos de que el Hotel Emporio era del esposo de la hermana de un amigo íntimo de mi primo Tonito.
En otra ocasión fuimos a la playa de Mocambo, cuando vimos el Hotel Mocambo, que es muy antiguo pero muy grande, hasta tenía su alberca como si fuera olímpica, y comenzamos a ver los cuartos y todo lo que había en dicho hotel, y entonces me dijo Zenteno “ve a la playa con los muchachos y espera a que te haga señas”.
Así hicimos y estábamos pendientes, pues no sabíamos qué se le había ocurrido a este hombre, que a veces pensábamos que tenía algo de loco. Cuando lo vemos estaba en el techo con una reja de Coca Cola, y comenzó a aventar botella tras botella de Coca Cola, y teníamos que cacharlas para que no se rompieran. Otra vez la gente se nos quedaba viendo, y éste seguía lanza y lanza hasta que terminó con toda la reja, que nunca nos dijo cómo la consiguió o de dónde se la apañó. Pero teníamos que esconderlas y las enterramos en la playa, pero casi nadie tomo Coca Cola porque les daba miedo que llegara la policía y nos llevara a la cárcel.
En otra ocasión, en el parque Zamora, estábamos sentados en una mesa con una muchacha de nombre Martha, y un muchacho se me recargó en la espalda y me levanté, y claro, le dije que de qué se trataba eso que hizo, y luego, luego, se juntaron varios de ellos y nos dijeron: “somos de la Huaca”, que era una colonia sórdida, que en Veracruz todo el mundo les tenía miedo”. Comenzaron a rodearnos.
Entonces le dije a Martha: “vete a tu casa porque no sé qué va a pasar aquí”, y les dije a los primos: “vámonos para el zócalo, porque ahí debe haber varias personas de Puebla y tendremos más gente para enfrentar a la Huaca”. Nos fuimos caminando hacia el zócalo, Zenteno iba adelante de mí y los demás me llevaban rodeado para evitar cualquier golpe o enfrentamiento.
Al llegar vimos a un policía y le dijimos lo que estaba pasando, entonces nos contestó muy asustado: “miren muchachos, yo aquí no valgo nada, ni creo que los pueda ayudar, además voy a estar en la azotea del Hotel Veracruz porque tengo trabajo”. Nos encontramos con un joven de Puebla de apellido Bojalil pero nos dijo que no podía ayudar porque le daba mucho miedo, y nadie quiso ayudar en esta guerra que se estaba gestando, porque cada vez que los huacas pegaban un chiflido, llegaban más.
Pensé que no quedaba más remedio que echar a andar las patas, entonces les dije: “a la de tres tenemos que salir corriendo de aquí, cada uno por diferente camino y los que queden vivos nos vemos en Casa Vigo, y a ver qué sucede”.
Yo por lo pronto corrí como loco y me metí hasta la cocina del Restaurant y Café la Parroquia, todos los cocineros me veían muy raro, y les dije que andaba buscando al dueño, que era el señor Fernández, que yo era su sobrino y que venía de Puebla a saludarlo. Como que no me creyeron, pero para mí era importante estar ahí más tiempo, porque el pleito era conmigo, no con los demás muchachos. Después me dieron de cenar, me despedí, no sin darles las gracias y los saludos al señor Fernández, que gracias a Dios no llegó nunca.
Cuando llegué corriendo al Hotel Vigo ya estaban los demás, pero por precaución no salimos a pasear, hasta muy entrada la noche, y jamás volvimos a saber de estos malandrines de la famosa Huaca.
En el segundo viaje, o más bien aventura, el equipo que me tocó otra vez estaba compuesto por mi primo Pedrolín, Rafael Zenteno y yo. Estábamos en la carretera, en la salida de Veracruz y pasó un carro que nos dijo que podría darnos un aventón a Río Blanco, Veracruz. Y claro que lo aceptamos, pues cuando menos ya era avanzar un poco, pero ahí estábamos en la carrera y nadie los levantaba.
Entonces Zenteno dijo que el párroco de ese pueblo era amigo de su mamá y que en alguna ocasión fue su tutor en alguna escuela, pero el padrecito no nos quiso ayudar, que él no tenía dinero, que mejor nos regresáramos para empeñar la cámara fotográfica que llevaba Zenteno, y ni modo.
A Zenteno se le ocurrió entrar a una panadería y les dijo lo que nos sucedía y nos regalaron una bolsa de pan frío, y nos fuimos a la carretera, nos sentamos en el pasto y nos acabamos la bolsa de pan, pero nadie se paraba para llevarnos y ya se estaba haciendo de noche. Entonces llegó un camión cuyo chófer vivía en Río Blanco y le suplicamos que nos diera un aventón a donde fuera, el chiste era salir de ahí, yo creo que se conmovió y nos dijo: “yo me voy a Puebla, pero más noche, si todavía están aquí a lo mejor los llevo”.
Así estuvimos en la carretera esperando cuando mi primo Pedrolín se puso a llorar desconsoladamente y traté de calmarlo, pero él nos dijo: “¡lo que pasa es que ustedes lo están haciendo a propósito para que yo sufra!”.Entonces lo convencí de que estas cosas son así, a veces se puede y a veces no, pero me dio mucho sentimiento de que él se pusiera así y les dije: “aquí espérenme”, y me metí al pueblo.
Ya era como la una de la madrugada y logré encontrar la casa del chófer que nos había dicho que nos llevaría, y le toqué en su puerta pero se levantó muy enojado y dijo de groserías, pero le expliqué que mi primo estaba enfermo y que me disculpara, pero que me urgía llevarlo a Puebla.
Regresé, con el chófer y el camión que llevaba cerveza, y como no quería que fuéramos con él en la caseta, nos subió a la caja llena de cartones y nos preguntó: “¿ustedes toman alcohol?”, y le dijimos que nosotros éramos muy chicos para andar haciendo porquerías. Así nos fuimos y por fin llegamos a Puebla después de 21 horas de camino.
Se paró mero en la garita de Puebla, donde había una caseta de policía para señalar la entrada a la Ciudad de Puebla. Me acuerdo que en ese lugar también estaba la embotelladora Pepsi Cola. Ahí fue donde nos bajó de su camión, no sin antes revisarnos si no habíamos tomado o nos llevábamos alguna cerveza.
Estábamos muy lejos de la casa, pero de todos modos le dimos mil gracias por el aventón y dimos gracias a Dios porque ya estábamos en la ciudad. Lo demás era lo de menos.
En el tercer viaje, que fue el último, otra vez equipos de tres, esta vez me tocó con Javier y otro primo de parte de mi mamá, Fernando, y así nos separamos en la carretera un trecho grande para que fuera más fácil que alguien nos levantara.
Se paró un coche con un señor ya grande y me hizo el favor de hablar conmigo. Le expliqué todo lo del viaje de aventura, que éramos de buena familia, entonces nos subimos y vimos que era una persona buena gente. Cuando vi a mis primos, los tres del otro equipo, le pedí al señor que nos hiciera el favor de llevarlos también, pues eran de mi familia y podríamos aprovechar el viaje. Y así lo hizo
Cuando íbamos en el camino me di cuenta de que el señor tenía mucho miedo, pues comenzó a preguntarnos que en qué escuela estábamos, que en dónde vivíamos, nos dijo que él además traía pistola y que era campeón de tiro al blanco y que era judoka. Venía sumamente nervioso, hasta sudaba, y se puso blanco, blanco.
Cuando llegamos a un pueblo se paró y nos dijo: “yo ya no sigo más, aquí me voy a quedar”, y ni modo, hasta ahí llegó el viaje en coche todos juntos. Y otra vez a separarnos un largo tramo para ver quién nos recogía, le hice la parada a un camión de carga azul que iba vacío, se paró y otra vez a dar explicación del viaje, entonces de una vez le dije que podíamos ir en la carrocería y que si no había inconveniente de recoger a los otros tres. Me dijo que estaba bien y así es como otra vez viajamos todos juntos, aunque sea por un rato, porque el camión se descompuso y quién sabe lo que pasaría.
Este señor, que por cierto se llamaba Juan Pérez, nos explicó que se había roto el radiador y que tenía que buscar un taller o alguien que lo arreglara. Como mi papá tenía camiones de carga, ya me había tocado ver cómo se podía arreglar un problema de estos y le dije que yo lo podía arreglar, cuando menos para que al menos llegara a su casa.
Entonces compró un jabón Octagón, para lavar ropa, y con tantita agua lo amasé hasta hacerlo como plastilina. Le limpiamos bien la rajada, lo secamos y le dije que ahora teníamos que esperar una hora y además echarle tierra de radiador para que ayudara esto a tapar la rajada.
Por fin ya estaba seco y consiguió unas cubetas de agua y este señor Juan se metió debajo y nos dijo: “a ver, échenle agua para ver si se sale”. Y le dije a Javier: “súbete a la salpicadera, yo te doy la cubeta y tú le echas el agua”, y así lo hizo, pero este Javier le echó toda el agua de la cubeta y le cayó al señor mero en la cara. Se enojó tanto que nos gritó y hasta quería pegarle a Javier. Bueno, hasta nos corrió, nos dijo: “lárguense por ahí, que no los vea más”.
Nos fuimos a una nopalera que estaba cerca, en donde había tunas y hasta pitayas. Después nos llamó el señor Juan Pérez y nos pidió perdón por el exabrupto, y nos subimos a la carrocería y cuando menos nos llevó otro gran tramo, hasta que llegó a su casa y dijo: “hasta aquí llego”.
Todavía nos dio dinero, por lo que tres de nosotros se fueron en pasajeros, entre ellos Fernando. Me contó mi hermano que cuando por fin llegaron a la casa este Fernando se acabó una cazuela de frijoles que tenía mi mamá en la cocina, era de imaginar cómo llevaba el hambre.
Los que nos quedamos en la carretera, gracias a Dios, en dos aventones logramos llegar a Puebla y a la casa, aunque en condición de indigentes; todos sucios con los calcetines hasta abajo, que si nos hubieran tomado una foto parecíamos Tom Sawyer y sus amigos
Este fue el último viaje porque ya nadie quiso repetirlo. Nos dimos cuenta que cada vez era más difícil. Todo era muy interesante, pero yo creo que el sufrir todas las calamidades y el hambre, el peligro de la carretera, que por lo mismo ahora en este tiempo no se recomendaría a nadie.
Tlacotepec: de fe y de familia
Tlacotepec fue muy importante para mi familia. Mi abuela Chentita tenía un hermano, creo que se llamaba Alfonso Navarro Verdejo, el era el cura del pueblo, tenía un poder absoluto, según me platicó mi abuela, a él le hacían más caso los habitantes del pueblo, mandaba más que el presidente municipal. Ahí estuvo por muchos años, hasta dicen que tuvo como ocho hijos, pero no los vimos ni los conocimos.
Desde que tengo uso de razón, me acuerdo que mi papá nos llevaba y había un cerro muy empinado, pero con un camino empedrado con unos nichos, que seguro eran para rezar el viacrucis. Siempre lo subimos, nos parecía muy interesante llegar a la cima donde está una capilla que al entrar tiene como un pasillo que parece túnel, y en las paredes había muchos retablos, donde la gente hacía un dibujo para el milagro recibido del Santo Señor de Tlacotepec, que era un Cristo oscuro, casi negro.
Me decía mi papá que él era muy devoto del Cristo negro o Señor de Tlacotepec, porque a él le había concedido varios milagros. Uno de ellos fue que mi tía Toya Navarro se accidentó en un trolebús en la Ciudad de México, cuando le chocaron se incendió el trole y a ella la daban por muerta.
Todos los cuerpos sin vida los pusieron en un lote o patio, uno encima de otro, pero un señor que les estaba ayudando, se dio cuenta que la tía movió un dedo y gritó que la muchacha estaba viva.
La trasladaron al hospital Rubén Leñero hasta que se recuperó, pero no podía mover las piernas, entonces mi papá fue hasta Ciudad de México por ella. Pagaron lo que se debía y se la trajo a Puebla con la intención de llevársela al Cristo Negro de Tlacotepec y la llevó, pero para subir al cerro la cogió en sus brazos hasta llegar a la cima. Yo creo que solo mi papá podía hacer esto, por su fuerza y la devoción que tenía al Señor de Tlacotepec. Después de dos meses de la visita al cerro mi tía Toya comenzó a caminar, y en poco tiempo hasta venía a Puebla por su propio pie.
El consentido de la maestra
Empecé la escuela en segundo año de secundaria, en 3ro C de herrería, y la maestra que nos tocó de titular fue la maestra Rossainz. Quiero dar manifiesto de que ella fue una de las mejores maestras que existieron en el mundo y en este centro escolar la quisimos mucho.
Me acuerdo de un episodio que pasó, pues hubo un mes que quedé en penúltimo lugar de calificación en el examen mensual y mi maestra se puso a llorar por lo mismo. Me dio tanto sentimiento que le prometí que no volvería a pasar nunca, y así se lo cumplí todo el año; aunque nunca saqué el primer lugar, siempre conseguí el segundo lugar.
La maestra me quería tanto, siempre me abrazaba y me regalaba un pastelito o alguna cosa como golosina o algo, y me decía: “búscame en el salón de maestros”. Un día que iba llegando al salón de maestros, oí claramente que le decían, emocionadas las otras maestras: “¡Ahí viene tu segundo lugar!” A mí me emocionaba mucho que me quisiera tanto, que yo, creo, me estaba enamorando de ella.
También en ese año Javier y yo nos hicimos amigos de un compañero que de por sí era herrero, pues su papá tenía una herrería en la 6 Poniente, entre la 4 y 6 Norte, y por cierto amigo de mi papá, así que nos fuimos pegando con él cada día, y así él nos ayudaba a hacer todo lo de herrería y además nos caía muy bien, porque gracias a él podíamos pasar los exámenes finales del taller. Esto sirvió para seguir la amistad, y hasta la fecha nos estimamos mucho.
Además, tengo que mencionar una cosa hice muy fea. Había un compañero que todos los días se venía de Tepatlaxco, Puebla, en bicicleta, son como 20 kilómetros, y para llegar a la escuela tendría que salir de su casa como a eso de las 6 de la mañana, así que el esfuerzo y el peligro eran para admirarlo.
Él era Juanito, un tipo muy fuerte, tipo huehuenche, pero el problema era que por su culpa nunca pude sacar el primer lugar; siempre me ganaba él con el primero, y yo con el segundo lugar. Como no podía ganar el primero, que me le voy encima para romperle el hocico, aunque me costó mucho trabajo, porque estaba muy fuerte, hasta me rebotó en el pizarrón, pero me le fui encima y logré ganarle porque llevaba mis botas vaqueras, y con eso le gané, porque no pudo contra mis patadas vaquerizas.
Claro que los compañeros me veían con respeto o con miedo y con el tiempo, aunque nunca cruzamos palabra no había odio por ninguno de los dos.
También hubo otros sucesos como este: en el salón había un muchacho llamado Eduardo Galicia, alto, flaco, de lentes, y oyó que las muchachas de nuestro salón estaban hablando muy fuerte, casi gritando, cuando Lalo Galicia, que así es cómo lo llamaban todos, así que Lalo les gritó a las mujeres: “¡Ya cállense, parecen prostitutas!”, entonces que se levanta Norma Vergara y que se le va encima a las cachetadas, le dio una tunda, un soba y una vapuleada.
Entonces Norma nos contó que Lalo se acusó con un primo de nombre Tony Abadié, y este joven esperó a Norma en una calle de su casa y la incriminó, que porque le había pegado a su primo y que ahora la iba a cachetear. Entonces Norma le dijo: “permíteme poner mis cosas en esta banqueta”, y así lo hizo, e inmediatamente se le fue encima a golpes y le dio una paliza a Tony Abadié, quien corriendo se fue a acusar con su papá, que en ese tiempo era el procurador de Justicia de la Ciudad de Puebla.
Nunca pasó a mayores, porque yo creo que le dio vergüenza lo que había sucedido. Esto sirvió para hacernos amigos de Lalo Galicia y su primo Tony Abadié. Y así seguimos en la escuela con amigos y enemigos, pues a Javier y a mí nos tenían miedo y cierto respetillo, porque supimos imponernos ante todos los demás y aparte teníamos buenas calificaciones, yo con mi 2do lugar y Javier también era bueno con sus exámenes, y como teníamos a Jorge Pacheco como amigo, pues también éramos buenos en herrería y nos ingeniamos para hacer cosas nuevas, no lo que siempre hacían todos desde años.
Javier hizo una mesa de centro que se detenía con signos de pesos y yo una lámpara que llevaba unos muñecos bailando, y además llevaba una especie de pentagrama con notas musicales. Y un muchacho hizo la misma lámpara. Quizá a Javier no le daba importancia que le invitara su mesa, pero a mí no me gustó que este muchacho de nombre Juan Sosa me copiara y me le fui a los golpes, que hasta me amenazó que me iba a traer a su pandilla para tundirme, pero gracias a Dios nunca lo hizo.
Una vez que ya me iba cogí mi bicicleta, cuando me doy cuenta de que tenía una llanta sin nada de aire, me dio mucho coraje, pues me la tenía que llevar arrastrando, o más bien, caminando, hasta encontrar una agencia de bicicletas, era la primera vez que me sucedía. El maestro de bicicletas me dijo que no tenía nada, que seguro alguien le había sacado el aire a propósito, y ni modo.
Al otro día en la escuela Lalo Galicia se me acercó y me dijo él era la persona que le había sacado el aire a mi bicicleta, pero que estaba muy arrepentido y que no pudo dormir toda la noche de pensar lo que le iba yo a hacer cuando me enterara que él era quien le sacó el aire. Me dio mucho sentimiento su confesión, y desde ese momento lo hice mi amigo, que hasta estas fechas sigue siendo uno de mis amigos más estimados.
Y así terminó el segundo año de secundaria, lo único que me dolió mucho es que ya no tendría de titular a la maestra más querida, pues ya no sería lo mismo. Me daba mucho pesar volver a ver sus ojos verdes, su pelo rubio, su figura esbelta, pero siempre estaré agradecido por todo el cariño que me dio en todo el año.
Nueva casa, nueva pandilla
Mientras estábamos de vacaciones, nos volvimos a cambiar de casa. Ahora mi mamá ya no quiso seguir con toda la familia y ella se dio a la tarea de buscar y así encontró una casa en la 11 Poniente 311, por la parroquia de la Concordia. Mi abuelita Chentita y mis tías consiguieron una casa ubicada en la colonia La Paz, en la calle Tlaxco 723, que daba en la esquina con la 9 Poniente, a dos calles del Colegio Americano. Era una casa muy grande y era una hermosura de casa, hasta parecía de ricos.
Abajo en la mera esquina tenía dos locales, es uno había una tienda como miscelánea y en el otro estaba una tortillería, pero con todo y eso no le quitaba lo espectacular, por lo mismo nosotros, Tito, Esther, Pili y yo casi siempre queríamos estar ahí. En esa casa pasaron muchas cosas, una fue que en la esquina de la otra calle, que era la calle de Chietla, vivían unos muchachos, era la familia Balderas.
Así conocí a Blanquita, una muchacha muy agradable y bonita. Me hice muy amigo de ella, y a veces en las noches la pasaba en su casa estudiando con ella. Estoy seguro que fue por ella que pasé el tercer año de secundaria. Bueno, el caso es que ellos eran como ocho o nueve, entre mujeres y hombres.
Comenzaron a ir a la casa, así que con ellos y nosotros éramos muchísimos. Después nosotros íbamos a su casa, así que parecía un hormiguero de ida y de vuelta. También vivía por ahí una muchacha muy bonita que se llama Amalín Lara Omaire, así que mi primo Javier, que por cierto, él con su familia, que eran mi tía Chonita, Sarita y su hijo Carlitos Albícker, se consiguieron una casa en la Avenida Juárez 2107, que también era una casa muy grande, porque así convenía para el negocio de los trajes de fantasía, que era la Casa Ávila. Sinceramente yo creo que fue de sus mejores épocas para mi tía.
Javier también se la pasaba en la casa de Tlaxco 723, y como Javier se dio cuenta de que se podía hacer algo, entonces se nos ocurrió que podríamos bailar rock and roll, pues estaba de moda, así que comenzamos todos juntos a aprender a bailar esta música que conocimos con un cantautor que era Bill Haley, con su rola Alrededor del reloj.
Después vinieron muchos rocanroleros, como Enrique Guzmán, César Costa y muchos otros que también le hacían al rock, pero el disco que más tocábamos era el de los Rebeldes del Rock, con su cantante, que era un joven negrito llamado Johnny Laboriel. Bueno, lo tocábamos tanto que cuando lo poníamos de un lado tocaba el del lado de abajo.
También se nos ocurrió hacer una quermés en la casa de los Balderas, y sin darnos cuenta ya había más amigos que querían participar en el club. Teníamos que ponerle nombre al club, cuando mi primo Javier dijo que se llamaría “Degenere”, como nadie dijo nada así se le quedó. Ya eran más amigos que en realidad eran vecinos de la casa, pues llegó el amigo Zenteno, Miguen Ángel Lara, Javier Tay, Víctor Tay, y otro amigo que realmente no era muy agradable, a él le decíamos Chema.
Así seguíamos ensayando para lograr lo que queríamos, pero a mí se me ocurrió que teníamos que tener una aventura y me dije: “voy a hacer una balsa para irnos por el río Atoyac, a ver si podíamos llegar hasta Veracruz o hasta donde se pudiera”. Así me di la tarea de llevar en m bicicleta madera suficiente y reatas, y varios botes con tapa, pero por más madera que llevaba no podía terminar, por lo que me conseguí un hacha y me puse a cortar un árbol, pero se me vino encima.
Creo que no lo supe cortar y lo quise detener, pero me pegó en un dedo y me voló una uña, pero en lugar de salir la sangre como debía ser, me salió espuma y espuma hasta que me dio miedo, porque esto nunca lo había visto, pero eso no me impidió terminar la balsa, por lo que le dije a los primos que ya estaba lista.
Entonces nos fuimos al río caminando, con unas bolsas para guardar la ropa, zapatos, dinero y algunas vituallas, pero además de nosotros, los cuatro primos, se nos unió otro amigo, que era Pepe Hernández, que como los demás era vecino de la colonia La Paz.
Llegamos y comenzaba a llover, pero de todos modos sacamos la balsa de donde la había escondido con muchas ramas, y la introducimos en el agua y le amarramos las bolsas con los zapatos, ropa, dinero y algo de comida.
Nos subimos y cada vez que se subía alguien se iba sumiendo un poco, hasta que la balsa estaba como a 30 centímetros de la cima del agua, pero así nos fuimos. No sé cómo llegó una corriente de agua y nos aventó o nos jaló más rápido, que nos estrellamos en una roca. Gracias a Dios nadie se lastimó, ni se rompió nada y la balsa estaba entera.
Arriba se quedaron Javier y mi hermano Tito y estaban parados y la balsa flotaba perfectamente, lo que significa que sí servía, lo que pasa es que no era para tanta gente.
Logramos ver cómo entraba un remolino y la balsa se levantó de un lado y Javier se aventó al agua como si estuviera ahogándose y Tito se aventó a sacarlo o ayudarlo, y nosotros al verlo también corrimos para ayudarlo, pero sólo había como 50 centímetros o 70. Lo que pasa es que se asustó y creo que él pesaba que se ahogaba. Lo levantamos sin que le pasara nada, pero la balsa ya se había ido.
Así perdimos todo lo que llevábamos en las bolsas, ni modo. Tendríamos que regresar a la casa en la colonia La Paz. Para colmo comenzó a llover muy fuerte. Ahí venimos todos apesadumbrados. El amigo que iba con nosotros nos dijo que pasáramos a su casa, que estaba en la avenida Teziutlán y la 3 Poniente.
Cuando llegamos la sorpresa fue mayúscula porque esta casa tenía una alberca, que no era muy grande, pero suficiente para nadar y jugar en ella. Conocimos a su mamá, que era una señora hermosa y amable como ella sola, también nos presentó a sus hermanos. Lo mejor de todo esto es que seguimos yendo a la alberca por lo menos cada ocho días.
Para recuperar la balsa después de haberla perdido en ese río, se me ocurrió que lo mejor era irnos caminando a ver si estaba atorada en alguna parte y si no podíamos entrar al balneario Agua Azul, porque ya no éramos socios del club.
Decidimos caminar por la ladera del río, pero no sabíamos lo difícil que era, pues había rocas y también sembradíos, que si se maltrataban por las pisadas la gente se enojaba o cree que les vas a robar. En una de esas nos dispararon con un rifle, tuvimos que correr como pudimos y subir una loma que no alcanzábamos. Por fin logramos subir, pero Tonito no lo lograba, porque él era el más chico. Entonces salté y lo pude ayudar a salir.
Teníamos miedo de que nos siguieran, entonces teníamos que acelerar el paso, pero era muy difícil, porque el piso y todo era muy escabroso. Nunca encontramos la balsa. Por fin llegamos a Agua Azul, lo malo fue que era muy tarde y Agua Azul ya estaba cerrado. De todos modos nos metimos y nos íbamos a echar a la alberca, pero el señor Montaño, que ya nos conocía, nos dijo que mejor no lo hiciéramos, que mejor nos fuéramos.
Después de esta aventura ya no quisieron nada de lo que yo dijera, pues todo fue fracaso tras fracasos.
Cuando ya estábamos en la casa nos pusimos a platicar afuera de la tienda, donde su local era parte de la casa y estaba en la mera esquina. Para todos estar platicando en ese lugar era algo muy común, pero creo que al dueño de la tienda no le parecía, porque una vez se le ocurrió aventarnos una cubeta de agua.
Nosotros nos quedamos sin saber qué hacer, pues estar empapado fue toda una sorpresa. Pero no le dijimos nada. Entonces que le compro unos globos y que los lleno de agua, y sin que me viera este señor le aventé los globos de agua en la canasta del pan, que era muy grande, de las que traen los panaderos en su bicicleta. Casi caen en la canasta mojando todo el pan. Entonces este señor que sale con una botella en la mano y nos corretea hasta dentro de nuestra casa. Ya nos iba a dar con la botella cuando mi tía Bichita se lo enfrenta, pero muy brava, y de frente le espetó que lo que estaba haciendo era un allanamiento de morada y que podría avisar a la policía. El señor no tuvo más remedio que salirse de la casa, quizá esto sirvió para que nunca se metiera con nosotros, ni nosotros con él.
Así seguíamos bailando el rock and roll, mi prima Carmelita era la que más destacaba en el baile. Yo era muy feliz cuando me tocaba de pareja bailar con mi prima Chachita, porque además de que bailaba muy bonito, podía uno estar cerca de ella y tocarla de los brazos, las manos y lo que se podía. El caso era estar junto a ella, que era lo que más quería yo.
Como Chachita iba en el Americano, pues tenía varias amigas. Me acuerdo de una muchacha, Norma Cabañas, otra Lourdes Munch, Elba Naude, que era muy bonita, y varias otras.
En nuestro club, al que mi primo Javier bautizó “Degenere”, (no era ningún degenere), sólo bailábamos y jugábamos al teléfono descompuesto, que consistía en hacer una fila todos sentados; el primero decía una frase, y el segundo al tercero y así hasta terminar la fila. El último decía la frase inicial y siempre alguien se equivocaba y el que se equivocaba tenía que darle una prenda para darle un castigo.
No somos jugadores delincuentes
Como éramos muchos muchachos, dijo mi hermano Tito, por qué no hacemos una representación de una pelea entre las pandillas como hacen las películas. Entonces para darle más efectividad, esperamos a que pasara un camión urbano, porque por ahí, por la 9, pasaban los urbanos, sobre todo el verde pistache.
Entonces esperamos que pasara y en ese momento salíamos de un lado varios muchachos, y de la otra esquina otros muchachos, y nos enfrentábamos. Claro que todo era ficticio, pero los pasajeros hasta gritaban y cada vez los pleitos eran más cruentos.
Una vez un muchacho, que era un amigo de hace muchos años, llegó a vernos. La gente comenzó a hablar que en esa esquina había más de 20 muchachos que se juntaban y azolaban esa zona.
A mi amigo, Arturo Guerra Gutiérrez, se le ocurrió llevar una tinta china. Cuando vimos pasar al camión inició la batalla, pero como nunca. Fue cuando Arturo se echó tinta roja y gritó muy fuerte, que el chófer se bajó del camión y sacó una espátula para ayudar a que se calmara el pleito.
Como los vecinos vieron la tinta, que de verdad parecía sangre, le hablaron a una ambulancia y a la policía. Cuando llegaron todos nos echamos a correr. A Arturo lo escondimos con los Balderas para que nadie lo viera. Cuando llegó la policía no logró ver a ningún pandillero, según ellos.
Pero es mejor no seguir con esta anécdota, porque estábamos en boca de todos los vecinos.
Un día se nos ocurrió jugar futbol en la calle y como éramos muchos pues se llenaba la calle. Entonces pasó un coche y se paró junto a los jugadores y los comenzó a regañar. Les decía que no debían jugar en la calle, que fueran a otro lado. Pero les hablaba con voz fuerte, como regañando. En eso se acercó mi hermano Tito y comenzó a gritarle con esa voz que mi hermano tiene, que parece mariachi.
Le gritó como cuatro veces “¡cállate!”. El señor, que yo creo que era diputado, o algo así, traía un coche negro, grande y además traía chófer. El señor se retiró sin decir nada, casi llorando, y mi hermano estaba muy orgulloso porque él lo había callado.
No pasó mucho tiempo cuando llegaron como seis patrullas de la policía y cerraron la calle de un lado y del otro se bajaron como 10 policías y a detener a quien pudieran. Yo que corro y me metí a la casa, saltándome por la reja que tenía enfrente. Se llevaron a varios de nosotros, a mi primo Chuy, a Paco Balderas, a otro amigo que le decíamos Pulgarcito y a varios otros. Bueno, se llevaron hasta un muchacho que iba a comprar un refresco en la tiendita que estaba a media cuadra de la casa.
¡Todos a la cárcel! ¿Y ahora qué hacemos? Fuimos a ver a la señora Balderas, que era la mamá de Paco y de todos los Balderas. Para esto la señora era viuda, ya no tenía un esposo que la respaldara. Entonces le habló a un señor muy amable, que era su amigo y compadre para que nos ayudara, pues él tenía mucha labia y además, yo creo, era de dinero.
Fue a la cárcel por ellos, y en hora y media ya trajo a todos los chamacos, que otro poquito y los rapan de la cabeza, hasta trajo al muchacho que se lo llevó la policía sin deberla, pero venía llorando. Dicen que no dejó de llorar todo el tiempo, pues no creyeron en la jefatura de policía que no pertenecía a los “jugadores delincuentes”.
No sé cuánto le costó a Don Memo, pero ya estaban en casa, por lo que siempre le estuvimos muy agradecidos a Don Memo. Se ganó el cariño de todos nosotros porque siempre nos trató con amabilidad. Un día que estábamos en casa de Blanquita Balderas llegó a visitarlos. Ahí estaba el “Polivoz”, el actor Eduardo Manzano, porque era primo de la señora Balderas, y nos hizo pasar un rato muy agradable porque estaba muy contento porque se notaba que se le quería mucho, y nosotros hasta nos sentimos muy interesantes por haber conocido a este personaje.
El último año en la secundaria
Regresé al último año de secundaria, que fue el peor año que tuve en la carrera escolar. Para empezar nos tocó de titular la maestra Chagra, que no sé si se llamaba Isaura y le decían Chagra o si se llamaba Chagra y le decían Isaura. Yo le decía maestra.
Era muy fea y muy morena, con carácter como de la bruja de Blanca Nieves. Nunca nos pudimos llevar bien, ella nunca me quiso ni yo a ella, pero es lo malo. Lo que yo recomiendo siempre es que, si tienes una maestra que sea fea o gruñona, no la odies, siempre muéstrale afecto. Pues aparte de ser fea es muy duro para la maestra soportar a los chamacos que no la quieran. Si a mí me hubieran dado este consejo, otra cosa hubiera sido de este año, que fue el más duro que tuve.
El segundo año nunca lo volví a tener, y si no es por Blanquita Balderas, que me llevaba a su casa, y casi nos pasábamos estudiando toda la noche (a ella le debo poder tomar leche, porque a mí no me gusta la leche sola, yo creo que porque cuando nací mi mamá no me podía dar la leche materna, porque siempre se desmayaba, por lo que mi papá compró 50 cajas de botes para alimentarme), Blanquita, sin decirme nada le puso azúcar y cuando la probé me supo agradable. Después de esa vez comencé a tomar leche con o sin azúcar.
Lo más importante es que éramos uña y carne. Siempre estábamos juntos.
Una vez se nos juntó un vecino, al que le decíamos Chema, y me dijo que estaba enamorado de Blanquita, que cómo se lo podía decir. Entonces se me ocurrió algo para reírnos un poco. Le aconsejé que se le declarara, pero postrado de hinojos, o sea, hincado, pero a solas, y así lo hizo. Le dijo a Blanquita que quería hablar con ella, pero a solas, entonces me puse de acuerdo con ella para que hablaran en su sala, porque había una cortina entre el comedor y esa sala (esa sala era muy grande, sus sillones formaban la sala redonda y toda la sala era grandiosa, era muy acogedora, daba gusto estar ahí). Nos escondimos detrás de la cortina del comedor, creo que éramos como 6 o 7 los que nos escondimos para ver todo el espectáculo (aclaro que blanquita estaba de acuerdo con todo esto).
En el momento en que él se hincó y dijo “desde el primer momento en que te vi”, fue cuando abrí la cortina y todos comenzamos a aplaudir y este suceso el Chema nunca me lo perdonó, ni a Blanquita tampoco, pero a mí me cogió una rabia que hasta a los golpes llegamos por lo que no llegamos a ser amigos.
Otro amigo con el que tuve problemas fue el Johny Jiménez. Él vivía frente al Colegio Americano, en la 9 Poniente, y me gustaba estar en esa calle, pues aparte de la gente que salía del colegio, pues vivían otros muchachos como Fernando Rincón, y otro muchacho, Díter, pero también Johny, y no sé qué broma le hice que se metió a su casa y sacó un cuchillo cebollero y que me corretea hasta la casa de Tlaxco 723, pero me alcanzó antes de que pudiera entrar.
No sé cómo le hice, pero le quité el cuchillo de un manotazo y antes de que reaccionara aventé el cuchillo a un terreno que estaba frente a la casa. Como ya no había un arma de por medio, nos dimos de trancazos que por fortuna yo le gané. Eso me sirvió para aclararle que si quería ser mi amigo tendría que respetarme. Así seguimos de amigos hasta que él murió.
Mi amigo el capitán de CENHCH
Yo ya veía venir con muchas dificultades el tercer año de secundaria en el CENHCH. Lo primero que me pasó fue que el capitán Raúl Velasco de Santiago, que este hombre, siendo militar, ocupó la dirección de la escuela de Educación Física, que en realidad era lo que distinguía al CENHCH.
Me enteré que este colegio se instituyó porque este capitán fue el iniciador del proyecto de construir esta inmensa escuela, y el que llevó a cabo el proyecto de construir esta gigantesca obra fue el gobernador de Puebla, el señor Don Rafael Ávila Camacho, que, por cierto, era un señor que sabía cómo llevar esa investidura. Lo malo es que lo hicieron en unos terrenos que el gobierno jamás pagó al dueño de este gran predio que estaba junto al río Alseseca.
El capitán Velasco me dio un jalón y me regañó porque en ese colegio se tenía que usar el pelo a la brush, y a mí no me gustaba andar a la brush, pues es casi pelón, sólo que con un copetito, pero en realidad es como andan los soldados, por lo que te das cuenta de que el CENCH era militarizado y además como cirqueros.
Yo creo que eso es lo que le gustaba al capitán, entonces sin mediar palabra me llevó hasta la peluquería, que estaba junto a la cafetería, y le dijo al peluquero: “me lo rapas al cero”, y yo no lo podía creer, que a mí me pasara eso, que siempre evité ser pelón. Ahí me dejó el capitán.
En cuanto se descuidó tantito, que salgo corriendo de la peluquería y no paré hasta que llegué al salón, todo asustado, pero con mi pelo. Me acuerdo que en ese momento, estaba la clase de inglés, que la impartía un maestro, que la verdad me daba mucha risa, pues era una persona chaparrita, güero, colorado, con el mismo traje, la misma corbata y los mismos zapatos, que ya eran como chanclas, y si se le acercaba uno, pues la verdad olía a mezcal o a alguna cosa parecida, pero me caía muy bien, y quizá fui de los pocos alumnos que le demostraron afecto, y por qué no decirlo, lo queríamos mucho.
Entonces me dijo: “¿qué te pasó?”, entonces le expliqué todo lo que me pasó, y que si me encontraba el capitán estoy seguro de que me expulsaría de la escuela. Entonces sacó de su bolsa un dinero, y me dijo: “vete de la escuela, yo te voy a dar un salvoconducto para que no te digan nada, y pélate a la brush, yo creo que el capitán nunca te va a reconocer y ni te acerques a él”, así fue todo.
Al otro día llegué a la brush, y como él lo predijo, el capitán creo que nunca me reconoció, ni yo le dije nada, pero una vez que estaba en el gimnasio, donde mi primo Pepe (nos prohibió decirle Pepito, ahora ya era José Carlos Milán Ávila, pero todos los de gimnasia y demás gente de deportes le decían de apodo El Diablo), en ese tiempo había hecho un cuerpo totalmente increíble, todo lleno de bolas, y en realidad sí daba miedo.
De momento llegó de la calle una horda de malandrines y le querían pegar a los alumnos del CENHCH, ahí empezó una guerra a trancazos. El capitán Velasco de Santiago también se puso a los golpes, y bien que les daba, pero mi primo Pepe, donde ponía el puño, les rompía la cara y todos los que estábamos en ese lugar y en ese momento, pues también nos agarramos a golpes.
A mí me encantó, pues siempre me gustaron los golpes y sobre todo cuando es una causa donde tienes razón, y lo mejor de todo fue que el capitán me felicitó por dos cosas: porque era el primo de El Diablo y porque yo estaba peleando junto a él, y vio que nunca me eché para atrás. Esto me sirvió para hacerme amigo del mero capitán, que desde ese día siempre lo admiré mucho, muy aparte de la amistad que siguió toda la vida, hasta su muerte.
Box, agua y un venado
Dentro de esa amistad me propuso ser del equipo de box, que se estaba integrando en el CENHCH, y así lo hice, pero esto sólo se lo platiqué a mi tía Bichita, la mamá de mi primo EL Diablo o sea Pepe, que era nuestro ídolo. Porque aparte nos impusimos ante nuestros compañeros y al enterarse de que El Diablo era nuestro primo, pues más miedo les dábamos.
Dentro de todo, me pasó una cosa que quizá fue lo peor que me pudo suceder en ese momento, o en ese funesto año. Mi hermano Tito se había hecho amigo de un muchacho al que le decían Jorge el Charro, él era Jorge Fernández, y claro, también su hermano Pepe Fernández, que vivían por donde está la Arena Puebla, donde juegan lucha libre y box.
Una vez que los fuimos a visitar dejamos nuestras bicicletas en el patio de ese edificio, pues ellos tenían su departamento en el piso de arriba. Cuando salimos ya nos habían robado las bicicletas, así que adiós a mi Hércules inglesa, que había sido mi compañera durante tantos años. Ahí me vino una depresión, de esas que te invade cuando tienes una pérdida de esa naturaleza. Hasta me acordé que cuando se acercaba el 15 de Septiembre, mi papá nos exigía que adornáramos las bicicletas con motivos de las fiestas patrias, por lo que acudíamos a la agencia que estaba en la 9 Poniente en el barrio de El Parral, que por cierto estaba cerca de la oficina de mi papá.
Todo lo que habíamos hecho con las bicicletas, como cuando era el mero 15 de Septiembre, nos íbamos en las bicis, cargados con cuetes chinos, que consistía en una tira de cuetes que prendías la mecha y comenzaban a tronar uno por uno, como ametralladora, y aparte de tronar soltaba mucho humo.
Por eso nos gustaba aventarlos en las peluquerías y en los restaurantes. Así nos divertíamos, no más de pensar en las caras que hacían los clientes de esos negocios. Tuve que decirle a mi papá que me la habían robado y ni siquiera teníamos sospechosos. Yo pensé que me iba a pegar como siempre, pero no lo hizo. Para mí fue una sorpresa.
De ahí me di cuenta que la vida cambia. No me pegó ni me regañó, pero me prohibió que siguiera aprendiendo box, que si estaba yo loco, o que si quería que me dejaran loco con los golpes, por lo que prometí no volver al box.
Le dije al capitán lo que me había pasado, él se consternó, no creo que por lo que me había pasado por la bicicleta, sino porque tenía que abandonar al equipo de box, ya que el capitán tenía muchas esperanzas en mí.
También yo me sentí mal, pues estoy seguro que hubiera hecho muy buena carrera en los olímpicos, pero me dijo en capitán: “si no quieres box, apúntate en la lucha libre, que ya se va a abrir ese curso, o por qué no te acercas a la natación, ya que dices eres de los fundadores del afamado Club Agua Azul.
Pero en lo que había reparado fue en cómo supo mi papá que estaba en el box, porque la única que sabía esto era mi tía Bichita, pero ya ni para reclamarle, porque en todo caso yo tuve la culpa por platicar esto con mi tía Bichita, y yo creo que fue obra de Dios, porque quién sabe cómo hubiera acabado esto del box.
En natación sólo llegué a terceros lugares, sobre todo en dorso, y me interesé en los clavados y comencé en trampolín, después de 3 metros y después de 5 metros. Recuerdo que me aventé un clavado de 10 metros en el balneario La Paz, pero me gustaba el de 5 metros, yo creo que porque no era tan alto, pero me di cuenta que te avientas el clavado, que dura de 2 a 3 segundos, y después tienes que subir las escaleras. Así era una y otra vez, yo creo que por lo menos en un entrenamiento son de 10 a 15 veces, y no era justo subir y subir tanto, para bajar tan rápido. Por lo que ya no quise seguir en clavados.
Un amigo que también le gustaban los clavados me dijo un día que lo que pasaba era que yo era muy flojo, y a la mejor tenía razón, porque este joven sí se dedicó por completo a los clavados, y hasta llegó a competir por México en Colombia y en varias partes del mundo.
Su nombre es Luciano Pérez Cuevas, que siempre lo he admirado, a parte de que siempre me hizo el favor de ser amigo. Una vez lo encontré en una tienda y me platicó, muy emocionado que su hijo era campeón del mundo, pues él era portero del equipo de fútbol cuando llegaron a conquistar el primer lugar en la copa del mundo, junto con Carlos Vela, Giovani y varios otros.
Me gustaría detallar lo que sucedió en la alberca del CENCH. Estábamos jugando a aventarse unos y otros, y unos se dejaban y otros no Yo nunca me dejaba que me tiraran, pues yo lo veía como un signo de debilidad, por lo que francamente les costaba mucho trabajo el poder tirarme a la alberca y estaba parado en la mera orilla cuando siento un trancazo en la espalda, pero bien fuerte, como si me hubieran aventado algo como fierro en la espalda, y ahí voy a dar al agua.
Me salí inmediatamente porque te espanta más el no saber qué pasó que el aventón. Cuando logré salir y todos los alumnos se están riendo de mí, y ya me dijeron lo que pasó, me costó mucho tiempo el creer lo que me dijeron: el venado que tenían junto a la alberca era la mascota del equipo de futbol americano y que se me dejó venir y con sus pesuñas me las clavó en la espalda, pero no les creí.
Con el tiempo me di cuenta que tenía en la espalda alta, dibujadas, las pezuñas. Me dilataron mucho tiempo en borrarse, pero esto sirvió para que la gente, siempre que llegaba a dicha alberca, me dijeran El Venado, pues esto nunca había pasado. En esos tiempos dejé la natación y los clavados y todo lo referente a la alberca.
Sólo diré que hice una cosa que uno no debe hacer, pues te expones a que te expulsen. Un amigo llamado Miguel Ángel y yo nos pusimos una máscara y nos metimos corriendo al vestidor de las mujeres, que en ese momento se ponían su traje de baño, y entramos pero casi ninguna muchacha se dio cuenta, y al fondo vi a mi prima Carmelita que estaba bailando el rock and roll con una muchacha muy bonita de nombre Margarita, pero fueron tantos los nervios que ni pude verlas bien. Sinceramente no vale la pena hacer este arriesgue.
Cuando una muchacha salió de los vestidores comenzó a gritar como loca y hasta nos quería pegar, por lo que tuvimos que salir corriendo para que nadie nos alcanzara. Después, ya en una buena distancia, tiramos las máscaras que eran de mi tía Chonita, pero en esos momentos lo único que nos importaba era salir vivos de esto, pero como todo el mundo llevaba camisa blanca y pantalón beige, pues nos regresamos caminando como si nada, por lo que jamás llegaron a saber quiénes habían sido los intrusos. Nunca lo platiqué, pero esto fue lo que me hizo que no regresara a la alberca.
En la escuela había un profesor de educación física que me dijo que era mi primo, pues él era hijo del tío Santiago, hermano de mi mamá, y se llamaba Jorge Loyo. Me dijo que entrenara gimnasia como mi primo El Diablo (Pepe), y así comencé. Pero un día le dije que quería echar un salto mortal hacia atrás, y si no es por él, que me dio un jalón en la cabeza, hubiera sido fatal, porque así le pasó al mejor de todos, Raúl Calva.
Este muchacho llegó a lograr lo que nadie, él daba el salto triple hacia atrás en los ejercicios de gimnasia a manos libres, pero un día le falló y cayó de cabeza, por lo que ya no pudo seguir en la gimnasia. Pero no se dio por vencido y formó un dueto con su amigo Corripio, así que Raúl Calva y el Corripio formaron el dueto de baile con gimnasia, algo totalmente novedoso, y se pusieron “Los Caluris”, que tuvieron mucho éxito, pues los llegamos a ver en televisión.
Esto me sirvió mucho, la entereza de Raúl, que aparte de ser buenísimo, nosotros lo queríamos mucho, sobre todo porque era hermano de un compañero, de nuestro salón. Así fue que conseguí el primer lugar en el salto del tigre. No es por presumir, que llegué a saltar más alto que nadie y más lejos. Lo que no me gustó, es que aparte de la medalla me hicieron ir a desfilar a Cuautla, Morelos., a un festejo de ellos y a mí me tocaba dar el salto del tigre, cuando dos compañeros formaban una horqueta y yo tenía que saltar y caer en el pavimento, y así hasta que terminara el desfile. Lo terminamos con gritos y algarabía y hasta oí que me gritaron: “¡Así se hace!”. Tuvo que ser alguien que me conocía de la familia, pero como mi cuello estaba sangrando del hueso que tenemos en la espalda, cerca de la cabeza, o sea, el occipucio, pues no tuve más remedio que retirarme de la gimnasia, si no al rato me mandaban a otro desfile.
Continué con la lucha libre y me jalé a mi primo Tonito, que ahora ya le decíamos Tony, a que entrara a la lucha libre.
Para terminar este capítulo, el capitán me mandó con el maestro Ramón Villegas, para ver cómo podía ayudarlo para lograr hacer los cuadros en las tribunas, que por nombre llevaban “los cartones”, así fuimos de los primeros que logramos. Primero fueron los colores, después las letras y más adelante lograron sacar los rostros de los héroes.
El suéter de la discordia
Un día que estábamos en la casa de Tlaxco 723 nos cuatro primos nos estábamos peleando un suéter, porque no nos poníamos de acuerdo de quién era este suéter rojo de cuadros, cuando llegó a la casa una amiga que teníamos desde que éramos muy chicos, hermana de Arturo Guerra, y llegó con una amiga muy hermosa, de cara como de artista de cine, hasta creí que era de otro país, pues parecía francesa o de Checoslovaquia, con una nariz perfecta, y lo digo porque esa nariz nos la dejaban hacer en la clase de modelado, y la verdad me enamoré de ella.
Yo no creía en el amor a primera vista, pero ahora a mí me tocó, por lo que luego, luego, me dije, y no sé porqué: “yo me voy a casar con ella”, sin saber quién era ni cómo se llamaba.
Ella se sentó con Chachita en una recámara, en la parte de arriba de la casa cuando entramos corriendo los cuatro primos, que seguíamos peleando por el suéter. Chachita nos reprendió y nos dijo: “ya cálmense, que les voy a presentar a esta muchacha, que es amiga de Chela Guerra”, y fue cuando oí por primera vez su nombre: Miroslava Barrera Alejandre. Además de hermosa pues con ese nombre más me impactó.
Desde ese momento ella pasó a ser una de las integrantes más importantes de nuestro club, pues jamás se separó de nosotros. Pero como siempre pasa, yo jugando al teléfono, que teníamos que decir una frase, no sé cómo pasó esto, pero a alguien se le ocurrió decir: “¿quieres ser mi novio?”, y la que estaba pegada a mí era Chela Guerra. Cuando me dijo dicha frase no sé por qué le contesté que sí, que aceptaba ser su novio, y pues ya éramos novios, aunque yo quería ser novio de Miroslava.
Lo digo en verdad, que esto es lo que no se debe ser, si tenía yo el deseo de ser el novio de Miroslava, no tenía que meterme en camisa de once varas, para que ella no fuera novia de algún malandrín que no supiera quererla como yo. Entonces le dije a la persona que le tenía más confianza, que era desde luego mi primo Javier, y le pedí que se hiciera novio de Miroslava, que yo pudiera terminar con ese asunto de Chela.
Chachita me dijo que ella me iba a ayudar para que terminara con Chela, entonces Chachita le dijo a Chela que yo le quería hacer de cosas, que tuviera mucho cuidado conmigo porque yo quería abusar de ella sexualmente, por eso me terminó.
Gracias a Dios que no me hubiera gustado de ninguna manera haber terminado con ella, porque ya había tenido la experiencia de haber hecho sentir mal a otra muchacha, porque aunque no lo crean, yo sí sentía algo por Chela, pero lo que más quería era ser novio de Miroslava.
La sorpresa es que Miroslava no quería dejar de ser novia de mi primo, y de ahí en adelante me costó un calvario que me aceptara a mí, no a mi primo, y así fue como nunca me despegue de ella y aunque fuera novia de Javier, yo era quien la acompañaba a fiestas, al cine o a misa en domingo, y nunca permití que ningún idiota se le acercara, pues primero tenía que pasar sobre mi cadáver.
Esto bien lo sabía la gente, pero ella tenía muchos jóvenes que eran pretendientes, por eso nunca la dejaba sola, pero llegó el día 19 de agosto de 1962, eran sus 15 años, y su papá le preguntó que qué quería para ese día, un viaje, un coche, una fiesta en un salón o dinero y su fiesta sencilla en su propia casa.
Miroslava escogió lo último y así fue como entramos a su casa para presentarnos a toda su familia, que eran la Señora Consuelo, su hermano Sergio, Chucho, Héctor y el más chico era Mario, que frisaba los 5 años, y cuando me presentó a su papá, que era un señor que medía 1.98 metros de altura y 120 kilos de peso, me impresioné, porqué no decirlo, el señor daba algo de miedo además del respeto por ser el papá de la mujer que tanto quería.
Ese día, como a las siete de la noche, llegó mi primo Javier, pero pasó algo que nadie esperaba, pues Javier llegó acompañado de una muchacha llamada Irma Ávila Ávila. A esta muchacha la conocimos porque vivía en la calle de Chipilo número 116, con su familia, su mamá, la señora Irma, el señor Fidelo, su hermana Chelo y un niño que le decían El pelón.
No sé cómo nos hicimos amigos de ellos, pero seguido íbamos a su casa y jugábamos con estas muchachas. Ellas eran muy agradables, siempre estaban contentas, y la mamá, cada vez que íbamos a visitarlas, esta señora nos sentaba a la mesa, siempre a las 7:30 de la noche y nos daba café y nos ponían una cazuela de frijoles negros, y bastantes tortas de pan. Esta merienda nos sabía a gloria. A veces no sabíamos si lo que queríamos era a estas muchachas o degustar los frijolitos que estaban tan sabrosos.
Yo creo que los frijolitos con su chilito verde si te lo sirven en otra casa te saben más sabrosos que en la tuya. Siempre me quedó la duda de porqué la señora Irma era tan buena con nosotros, pues éramos varios los que merendábamos con ellas. Yo creo que ella quería que nos hiciéramos novios de sus hijas. Pero nunca me imaginé que Javier fuera capaz de hacer esto, en su fiesta, en su casa y con su papá.
Yo pensé que esto lo iba a aprovechar para quedarme con Miroslava, pero no estaba bien que inmediatamente me acomodara, aprovechando esta barrabasada que había cometido mi primo.
Después por boca de mi primo Javier me enteré de que él hizo esto de llevar a Irma a la casa de la novia. Yo creo que Irma nunca supo lo que estaba pasando porque ella nunca se hubiera prestado para esa grosería. Pero Javier dijo que así quiso hacerlo, por que su mamá, o sea, la tía Chonita, le dijo que no quería que fuera novio de Miroslava, porque se enteró de que tenía secuela de poliomielitis, que sufrió cuando era muy niña.
Realmente lo que tenía es que una de sus piernas era más delgada que la otra, pero como mi tía era tan especial sí creo que lo haya amenazado de no darle dinero si la desobedecía. Claro, lo que más le gustaba y aprovechaba era el dinero, pero de todos modos, todos lo criticaban mucho, menos yo, pero algo tenía que pasar en esos 15 años.
A la fiesta asistió una muchacha que vino de Veracruz, ella era Martha, la que estuvo con nosotros en el último viaje de aventura que hicimos, que estaba en el parque Zamora. Martha Castillo, su papá era Don Pompeyo Castillo, que era en ese tiempo inspector de la aduana de Veracruz, por lo mismo era un señor muy importante, pero era de la religión cristiana y por lo tanto esas personas son muy raros, no bailan, no cantan, no toman nada de licor. Como él era de la aduana las cajas de licor que regalaban o incautaban las iban a tirar al mar, ahí en Veracruz.
Yo creo que si alguien se dedicara a buscar esas botellas o cajas de coñac o whisky o de varias otras debe haber como cien cajas del mejor licor, debe haber muchos buzos que si se dieran a la tarea de buscarlas, fácil las encontrarían, cerca del malecón. Pero lo que pasa es que casi nadie lo sabe, pero también le regaló varias veces al papá de Miroslava botellas de coñac muy finas.
El señor Pompeyo, que todos lo conocían como Don Pompas, ya tenía dos hijos, una era Martha y un hijo que, no sé porque le pusieron de nombre Pompeyo, por lo que le decían el Pompas, y claro que nunca le gustó ese apodo. El caso es que el señor Pompeyo se casó con la señora María Alejandre, hermana de la mamá de Miroslava, que era muy buena persona pero también se metió a la religión cristiana, que nunca la abandonó hasta su muerte.
Estando en la fiesta de 15 años de Miroslava, había en la sala un sillón que tenía los brazos muy grandes, entonces alguien se sentó mero en ese sillón y Martha se sentó en el brazo del lado derecho, y yo en el brazo izquierdo y el que estaba sentado en medio de nosotros se paró, y en ese momento también me paré, creo que para bailar, y al pararme el sillón se fue de lado y Martha se cayó de forma estrepitosa, además del golpe pues todo su cuerpo se estrelló en el piso, y como era una mujer muy voluptuosa, sin que fuera gordita, tenía de todo y en su lugar, ella era muy hermosa, pero cuando la levanté, me cogió de las manos y me sacó de la casa.
Yo pensé que me iba a tundir a golpes y aquí afuera, para que nadie la viera, y entonces cerré los ojos y esperé a que pasara lo que pasara, tenía que aguantarme, pero en lugar de eso me dio un beso, como de película, y me dijo que tenía que ser su novio, y no me quedó más remedio que ser novio de la prima. Otra vez me alejaba de ser el novio oficial de la quinceañera.
Nos mudamos (mis tías se mudan)
Para seguir adelante nos cambiamos de casa, otra vez más, ahora fue a la casa en la 3 Poniente 2907, colonia La Paz (por cierto, esta casa pertenecía a esta misma muchacha, Martha Castillo, no sé si es cosa del destino o fue pura coincidencia). En realidad las que se cambiaron fueron mis tías y mi abuela, porque mis hermanos y seguíamos viviendo en la 11 Poniente, por la Concordia.
Como siempre estábamos en casa de ellas, pues era como si ahí viviéramos, lo bueno es que estábamos a una calle de la casa de Miroslava y como mi intención no cedía para nada, quería que ella fuera mi novia oficial, tuve que terminar con Martha, porque además ella vivía en Veracruz, aunque después se fue a vivir a México, cuando murió el señor Pompeyo, pues la tía María se vino a vivir a Puebla y ella se casó con el dueño de una mueblería muy afamada que se anunciaba en el programa “En Familia con Chabelo”, era la mueblería Lerdo Chiquito, por lo que me imagino, se hizo más rica todavía.
Banda de guerra en el CENHCH
Mi primo Javier y yo nos apuntamos en la banda de guerra, él con corneta y yo con tambor. Yo jamás pude con la corneta, me era muy difícil tocarla, por lo que me decidí por el tambor, pero mi primo dijo que él tenía que poder a fuerza, porque a demás a él le gustaba mucho lucirse de alguna forma o como fuera.
Cuando Jugábamos basquetbol él tenía que saltar o encestar el balón, pero de la forma de lucimiento, haciendo algo de figura, pero el chiste era llamar la atención y lucirse. Yo en cambio, creo que si juegas es para ganar, y ni importa si te luces o no, y el futbol al que nos dedicamos años después, él quería ser portero, porque decía que era la figura que más ven los espectadores.
Una vez, jugando en el equipo Huracán, me dijo una cosa: “tu andas por toda la cancha, menos donde debes estar”. Bueno, el caso de estar en la banda de guerra con el maestro Dionisio, que era muy exigente, fue para desfilar el 5 de Mayo y lucirnos con la banda, como fue cuando terminó el desfile, fuimos a darle sus instrumentos al maestro Dionisio y nunca regresamos a la escuela. Pero en ese tiempo entró a nuestro salón un muchacho que le decían El Chueco, pero se juntó con nosotros y siempre nos invitaba, o más bien, convidaba lo que se nos antojara, como hotdogs, hamburguesas, o si queríamos nevamos, que eran como jugos, nos costaban tres pesos cada uno.
Le preguntábamos cómo le hacía para traer tanto dinero. Nos contó, aquí entre nos, que su papá tenía una tienda en la 2 Poniente y 25 Norte, que él vendía mucho, que era puro abarrote, y como a veces le ayudaba a despachar, él tomaba 100 pesos y por eso nos invitaba. Por lo que nos jalábamos a Jorge Pacheco, a Rafael Zenteno a Lalo García, a Tony Abadié, mi primo Javier y yo, no fue por mucho tiempo, porque mi primo Javier logró que el Colegio Americano aceptara medirse en volibol contra el 3ro del CENCH, que era nuestro, por lo que todo el salón fuimos a confrontar al Colegio Americano.
Nosotros nos sentíamos muy seguros, porque en ese tiempo todos le tenían miedo a muestra escuela. Hasta supimos que la gente le decía “El circo escolar”, pero por más que hicimos nos dieron una barrida que daba pena y hasta le pregunté a Javier que porqué en volibol, si nosotros no éramos de esa práctica.
Así nos fuimos al CENHCH, el director nos preguntó que quién había dado el permiso de jugar, y le dijimos que nadie. Solo se nos ocurrió. Pero como estaba muy enojado y con alguien se tuvo que desquitar, pues a todos los que ellos llamaron instigadores, nos expulsaron por 15 días.
Mi papá se enojó mucho conmigo, y no creo que estaba seguro de que yo no tuve nada que ver, pues ya me conocía cómo era yo de loco. Entonces me dijo: “no creas que te vas a quedar en la casa durmiendo o descansando, desde hoy te vas a ir de machetero en el camión blanco, o sea, el palomo, que en ese tiempo lo manejaba un personaje que se llamaba Marcelo, que merece un lugar aparte en esta historia.
Así me pasé los 15 días, en el camión, cargando y descargando, y además tenía que ir en el camión para cuidar que este chófer no pudiera robar tanto. Pero los chóferes son muy mañosos, y para todo ven cómo se pueden llevar más dinero.
Me acuerdo que me decía, ahí está escondida una patrulla, y se bajaba, iba y venía, y luego me decía: “tuve que darle 15 pesos”, pero esto era a cada rato, que a mí me parecía muy raro que hubiera tantas patrullas en la carretera.
Como tenía que ser, pues le dije a mi papá lo que pasaba y lo que tenía que pasar pasó. Mi papá lo corrió y este chofer nunca me lo perdonó. Lo bueno es que ya habían pasado los 15 días que nos dieron de expulsión y tendría que regresar a la escuela.
Como fue, nos presentamos en la clase y teníamos que ponernos al corriente, para eso tenía uno que buscar quién te prestara la libreta para copiarlas, y a mí me hizo el favor una compañera que era Lolita Blanco, que se portó muy buena gente conmigo, aunque yo esperaba que las libretas me las prestara Carmela Osorio, pero no fue así.
Teníamos que ponernos al corriente, y ni modo, ahora no tenía tiempo de ir a ver a Miroslava ni a los primos. Una de las cosas que me llamaron la atención fue que el amigo EL Chueco, que siempre nos disparaba, ya no se presentó a la escuela a terminar su tercer año, luego me enteré de que este amigo nunca tuvo papeles para ser alumno del CENHCH, nadie sabe cómo estaba en la escuela o cómo estaba en nuestro salón. Pero estaba en las listas, cuando la maestra pasaba lista siempre lo mencionaba. Se acabó nuestro mecenas.
Yo creo que fue mejor, para que estudiáramos un poco más, y ahora sin bicicleta y solo, porque cuando te expulsan de la escuela ya nada es igual, te sientes como si perdieras tu lugar, hasta el trato de los amigos y compañeros, es como si entraras por primera vez, y ahora sin bicicleta, a caminar como cualquier persona, común y corriente.
Caminaba toda la 11 Poniente hasta llegar a mi casa, que era la 11 Poniente 311, así que pasaba diariamente por una panadería que se llamaba La Covadonga, que era un local ubicado en la 2 Sur 11 Poniente, debajo de un edificio muy grande de departamentos.
En la entrada del edificio siempre estaba una muchacha muy bonita, pelirroja, bonita como una artista de cine. Cuando pasaba me saludaba. Un día nos saludamos y platicamos. Me dijo que era de México y que venía a Puebla para estudiar y que se llamaba Beatriz, y por su plática me di cuenta de que era de familia de dinero y me gustaba platicar con ella.
Un día me dije que ya no iba a pasar por esa calle para no verla, así que me venía de la escuela a mi casa por la 13 Poniente, porque si seguía platicando y conviviendo con ella, como era como artista, de veras bella, seguro esto terminaría en noviazgo y eso era lo que menos quería. ¿Para qué volver a tener problemas?
Después de que pasé todos los apuntes que me prestó Lolita Blanco, revisando vi una libreta que tenía algo que no me acuerdo cómo a qué hora lo escribí, pues decía este párrafo: “si mi papá llegara en este momento sería una cosa increíble”. Yo creo que como me pasaba la noche escribiendo, me he de haber quedado dormido y seguí escribiendo, pero esto me asombró mucho, porque jamás me había pasado.
Me hice la idea de ver a Miroslava, a mis primos, y así seguía, yo transportándome en camión urbano, como cualquier hijo de vecino. Ni modo, cuando llegué a visitar a Miroslava me dijo que quería hablar conmigo, y me alegré mucho porque creí que ya se había decidido a ser mi novia, pero fue al contrario.
Me pidió que hablara con Javier para que regresara con ella, que lo perdonaría todo, pues lo extrañaba muchísimo. No me quedó más remedio que ver a mi primo y decirle lo que me habían pedido, aunque me doliera mucho, pues no me lo esperaba.
Esto fue muy duro para mí, pues se trataba de mi primo, que para mí era como un hermano, pero de todos modos no quería separarme de esta muchacha y nunca me despegué de ella. Entonces íbamos al cine los tres, o si era fiesta, pues todos juntos, porque teníamos en esa época invitaciones al por mayor. O si Javier no llegaba o no la quería llevar a algún lado, pues ahí estaba yo, para estar con ella, sin importar que fuera “la novia de mi mejor amigo”.
Quiero comentar que cuando aún estábamos en la casa de Tlaxco 723 una vez llegó el amigo Zenteno y nos dijo que lo habían corrido de su casa, que no tenía donde dormir ni donde comer, entonces Javier le dijo que podía dormir en su casa, en la avenida Juárez 2107, que era su casa y negocio de trajes de fantasía. La muy prestigiada Casa Ávila, y nosotros le dijimos, Tony, Tonito y yo que se quedara en el pasto que estaba en la entrada junto a una jacaranda muy grande que estaba sembrada junto a la puerta, ahí se sentaba y nosotros le dábamos un plato cada uno, ya sea que, por ejemplo, Tony le daba su sopa, Tito los frijoles y yo el plato fuerte, así fue algún tiempo.
Yo creo que él comía mejor que nosotros, pero de eso se trata la caridad. Un día su mamá lo fue a buscar y se lo llevó a su casa, gracias a Dios, y después de algún tiempo regresó a la casa de Tlaxco 723, pero llegó muy cambiado, con suéter nuevo y llegó con un amigo, que decía que vivía en el mismo edificio y que era muy buen gente.
Este muchacho se llama Jorge Suárez Solís, y llevaba un coche Taurus, Ford inglés nuevo, muy padre de color verde con beige. Yo creo que le caímos bien, por lo que se hizo amigo de toda la vida, pues siempre se quedó junto a la familia, hasta la fecha nos dispensa su amistad, pues nos visita de vez en cuando y siempre nos acordamos de cuando nos conocimos, él con su coche era muy importante para nosotros, pues nos llevaba a pasear, lo único malo es que llegaba tocando el claxon.
No paraba de tocar hasta que salíamos corriendo de la casa y nos subíamos al carro y ya acomodados, listos para irnos, nos salía con la pregunta: “¿a dónde vamos?”. Nos molestaba ese detalle, pero nadie se atrevía a decirle algo.
**Amigos en el pasado**
Cuando nos cambiamos de casa dejamos la amistad de algunos vecinos como Blanquita, que era mi compañera inseparable, pero nos informamos que ella se casó con Javier Tay Sáenz de Miera; y Amalín Lara Omaile, que también era del club de nosotros y muy amiga de mi prima Carmelita McFarland, que se casó con Víctor Tay Sáenz de Miera, hermano de Javier Tay, y claro que me doy cuenta que ellos se juntaron con nosotros, sólo para buscar con quién tener un matrimonio, pues ellos ya eran muy grandes de edad, comparado con nosotros, por lo que ya no los vimos por mucho tiempo.
Al pasar los años me pregunto porqué dejamos su amistad, sobre todo dejar de ver a Blanca Balderas, únicamente porque nos cambiamos de casa y esto es de las cosas que no debes hacer, ya que se portó tan bien contigo. No es justo abandonarla de esa manera.
Yo creo que por eso se casó con Javier Tay, que estoy seguro que no lo quería tanto como para casarse, y estoy seguro que fue porque se sintió sola, y mucha culpa tuvimos nosotros. Esto debe servir para que en la vida seas agradecido, pues ahora me doy cuenta que ser agradecido es un don que Dios no nos dio, sino que uno mismo lo tiene que forjar. Acuérdate que cuando recibes un favor y no lo pagas con nada, lo mejor es que lo expreses en todo el tiempo y en toda tu vida, aunque se oiga muy exagerado.
<<list-links "[tag[Method of Action]]">>
<p>It's been almost four years since I've touched anything related to <a href="http://method.ac">Method of Action</a>. My day job at <a href="http://www.cabify.com">Cabify</a> was a good excuse for placing my personal-professional pursuits on the backburner, so paused my online presence while I enjoyed the stability of salaried work.</p>
<p>Though Cabify is hands down the best workplace I've encountered, I found myself itching to pursue more personal and creative work, so I left the company a couple months ago. Cabify houses a truly healthy company culture with a zesty Spanish flavor. In retrospect it's amazing we could raise to unicorn status not only within completely sane work days, but also have a lot of fun along the way. They are <a href="http://cabify.com/jobs">always hiring</a>, in case you are seeking a good place to thrive professionally.</p>
<p>As I come back to revive my creative pursuits and online presences, it becomes clear that there was a lot of fragmentation, and it's best to focus my energy into a single venture. I have a personal presence (duopixel) and a professional presence (Method of Action), and each has it's own social media accounts. Additionally--during most of it's active life--Method of Action was a joint-venture with <a href="http://mariamunuera.com/">Maria Munuera</a>, so this becomes a real-world merge conflict.</p>
<p>For those of you unfamiliar with the project, I'll briefly skim over it's history. Method of Action was a stab at teaching design by practice. For this we made a couple of <a href="http://method.ac/">design games</a> that went viral, and designed an online course with design challenges for students to complete through the use of a <a href="http://method.ac/#tools">vector drawing app</a> named <a href="http://editor.method.ac">Method Draw</a>. Plans fell through when we suffered <a href="http://method.ac/TODO">data loss</a>, and it was decided that the project was too ambitious for our resources. Eventually we went separate ways and settled into more traditional roles within companies, and Method of Action was left abandoned for a number of years.</p>
<p>Though of very little interest to the casual reader, the reason for this post is to explain how and why I'm choosing to rescue it from the graveyard. It is ethically important for me to work out the merge publicly, otherwise I'd be appropriating undue work and sweeping dust under the carpet. It's time to clean-up the abandoned house before refurnishing it.</p>
<br />
<h2>Authorship</h2>
<pre class="code pad"><code><span style="color: #f66">CONFLICT</span> <strong style="color: #0c0">[authorship]</strong>: Merge conflict in authors</code></pre>
<p>María is a great friend, and the collaboration we had under Method of Action goes well beyond what is visible in the product. The split made me hesitant to put more effort into Method of Action, as I held custody but not exclusive entitlement to the project. This made the gears grind to a standstill.</p>
<p>So I reached out to her and explained what I wanted to do. Fortunately she was cool with it, and we worked out a way in which we could go separate ways while acknowledging the collaboration. You can check out her online presence at: </p>
<table>
<tr>
<th>Twitter</th>
<td><a href="http://twitter.com/doctoraw">twitter.com/doctoraw</a></td>
</tr>
<tr>
<th>LinkedIn</th>
<td><a href="http://linkedin.com/in/doctoraw">linkedin.com/in/doctoraw</a></td>
</tr>
<tr>
<th>Medium</th>
<td><a href="http://linkedin.com/in/doctoraw">medium.com/@doctoraw/</a></td>
</tr>
<tr>
<th>Portfolio</th>
<td><a href="http://mariamunuera.com">mariamunuera.com</a></td>
</tr>
</table>
<p>In order to fully acknowlege her work on Method of Action, I have set up a separate <a href="http://method.ac/writing/aboutv1.html">historical about page</a> which covers the years we collaborated. And because her work has professional value, I'm also keeping the product of our collaboration intact. If I were to extend a game for example, the extended game will sprout from a different seed (new design and code) and reside on a different domain.</p>
<p>María is a top-notch professional, a very talented designer, and most importantly: an amazing human being. María, may the path you're walking now yields bountiful fruit. It was my pleasure and my privilege to share this with you.</p>
<pre class="code bleed"><code>commit -m "Resolved conflict by giving credit over shared work, and stating that from now on the author is Mark MacKay."</code></pre>
<br />
<h2>Topics</h2>
<pre class="code pad"><code><span style="color: #f66">CONFLICT</span> <strong style="color: #0c0">[content]</strong>: Merge conflict in topics</code></pre>
<p>In former years my thought was almost exclusively dedicated to the domain of design. Or, at least I found a way of connecting personal experience to professional relevance. Nowadays I allow myself to drift in the direction of curiosity, and sometimes this is related to design. Yet, I when I sit down to write about it, self-consciousness gets the best of me because I am accustomed to publishing only about the professional aspect of life. This constipation needs to be addressed.</p>
<p>Design hasn't ceased to be a domain of interest for me, but as my interests have expanded, I haven't found an outlet for the creative work required to appropriately digest what I consume. Many of the things I consume come from a hunger produced by an existential crisis, and I'm glad I have waited until now to write about it, because it allowed me to untangle that which is relevant to me as a person from that which is relevant to me as a human being.</p>
<p>Though now I feel I now hold nothing of myself as secret, I sense that my personal story is completely irrelevant. It would only be useful to write about it as a form of self-therapy, but that's what personal journals are for. Only what's relevant to me as a human being is also useful for other people. These explorations have a lot to do with the sense identity and how to simplify all these fragmented aspects of being into a single integrated expression of the self. To reduce the inner equation to its minimal and most elegant expression, so to speak.</p>
<p>This, of course, is better demonstrated rather than explained, and this post is an exercise of putting my intentions into action.</p>
<pre class="code bleed"><code>commit -m "Resolved conflict by making content schema more flexible"</code></pre>
<br />
<h2>Language</h2>
<pre class="code pad"><code><span style="color: #f66">CONFLICT</span> <strong style="color: #0c0">[language]</strong>: Languages do not match</code></pre>
<p>I was born in Canada, grew up in Mexico, and currently live in Spain. As is the case of most bilingual people, much of the information I consume is in English. Depeding on the topic I'm writing about, I might write in English or Spanish. I find the situation insatisfactory, because again it fragments one's body of work, while still thinking it's important that the great diversity of languages and cultures is represented on the internet.</p>
<p>Translating my own writing is a chore which would take time out of creative work. Yet, I mantained a blog in Spanish during six years, and in my efforts of simplification I find myself unwilling to simply allow everything I wrote in Spanish drift off into oblivion. Before this happens, in periods of low creative energy I will translate and incorporate into this blog that which I still find relevant and useful.
</p>
<p>Regarding the importance of expressing of one's own culture and language on the internet, I think it is more valuable to express one's culture and opinions in the lingua franca of the medium. My opinion about corruption in Mexico, for example, adds very little value in the Mexican echo chamber, but is perhaps more valuable to a foreign observer. Though I seldom write about society issues, I find myself thinking more about how it relates to individual development. Where I would usually write about this topic in Spanish, I'll now write it in English.</p>
<pre class="code bleed"><code>commit -m "Resolved conflict by choosing English as the language I use to communicate online, I will translate and merge Spanish content from the past as time allows."</code></pre>
<br />
<h2>Social Media</h2>
<pre class="code pad"><code><span style="color: #f66">CONFLICT</span> <strong style="color: #0c0">[online identity]</strong>: Singleton instance should be unique</code></pre>
<p>Some time ago I became nauseated of everything I saw in social media. Everybody's been there: Facebook's timeline is noise, dozens of invitations to connect on LinkedIn from people you don't know, reading your Twitter timeline leaves you in a daze. After detox I see this had more to do with my own state of mind rather than objective reality, but I will write about this later.</p>
<p>Leaving the privacy scandals aside, what concerns me at this time is the fragmentation experienced by using these services. What is the source of truth: my online portfolio or LinkedIn? Should people see what I'm up to on my Instagram, or on my blog? Should opinions belong on Twitter? I wish to have a single source of truth, and yet to be able to reach out to people because social media is the contemprary feed reader.</p>
<p>To dislike social media and yet use it to promote your work seems hypocritical, like an antisocial person who assists a party only to network and to speak about himself. This kind of half-hearted engagement only adds more poison to the stream. But, paying attention on who uses social media correctly, I've gleaned on healthy ways to engage with it. Since I will consolidate all online presence under Method of Action, I'm closing my personal Facebook, Instagram and Twitter accounts (they've been abandoned for years anyways).</p>
<p>I'm not entirely sure how to address this at this time, so I will start small and from experience: my only form of broadcasting will be done through Twitter, and I will behave like a human being and not a bot (I sometimes lurk even when mentioned). All this is subject to change, I've been avoiding social media for years now and want to get a good grasp on it before deciding what should be done about it.</p>
<p>If you wish to speak to me directly, you can reach me out at:</p>
<ul>
<li><a href="mailto:hello@method.ac">hello@method.ac</a> (preferred)</li>
<li><a href="http://twitter.com/methodofaction">Twitter</a> (I'll read/respond mentions)</li>
</ul>
<pre class="code bleed"><code>commit -m "Resolved conflict by publishing everything I create under the method.ac domain, considering this the single source of truth and re-engaging with social media in a healthy way."</code></pre>
<p>Whew, that was a tough merge.</p>
<h2>What comes next?</h2>
<p>From experience I know that calling out shots often results in airballs. I currently narrate my days in my <a href="">Work Journal</a> where you can glimpse the direction I'm working on, but nothing is announced until it ships.</p>
<p>Thanks for reading!</p>
Anxiety woke up in the middle of the night: "I am milking less than the milkman!", I thought. It took me a couple of seconds to realise I had been dreaming. I couldn't go back to sleep so I worked three hours in the middle of the night, and then went back to bed.
I woke up and walked from my room towards the hallway. The rock-tilled hallway floor was upturned, and as I approached the kitchen, I saw that mom was using the rocks to tile the kitchen floor. "What are you doing!" I exclaimed, somewhat rhetorically. Mom answered that the tiles of the kitchen floor were worn out, and that she used the rocks from the hallway to re-do it. I got incensed and exclaimed that it was the stupidest thing ever, the rocks would be impossible to clean, and I was immensely frustrated.
I joined a MeetUp expat picnic during the weekend, and we were speaking about the pains of going to work on Mondays. I hadn't noticed if I felt dread or pleasure starting the week. It is not pleasure, but there is an eagerness for flow and good expectations for the week, at this time at least.
I saw myself in the third person, but experienced the dream in the first person, so I will write the dream as such. He = me.
My mother was perched some 15 meters up on a tree in the neighborhood. He needed to give some her keys, so he threw them up the tree, but he missed. My mother, in an attempt to reach for the keys, lost her grip and fell down. When she landed I expected her to die, but she got up and stumbled. I was relieved that she was alive but very concerned and vaguely guilty about missing my aim. He went up to her and instructed her to lie down. He would call an ambulance.
Grip of addiction -> Fits of addiction
Work as suffering -> Work as karma yoga
Complete isolation -> Sharing myself to others
Meaningless life -> Life has become full of meaning
Good shape -> Great shape
No prospects -> Life is full of prospects
Creative block -> Creative flow
Denying my nature -> Accepting of my nature
I dozed off and for a split second I dreamed I was munching on a carrot
The all encompassing material and spiritual substance of the universe
I was at an apartment complex with Jenny and her husband. We were greatly impressed at one of the apartments but it was too expensive to rent on our own, so we considered renting together. Jenny took me aside and seduced me, I was thrilled that we would be living together and that we would have an illicit sexual relationship.
Nina got under my legs and was very affectionate. I reached down to rub her, but she put her snout between my legs, pressing at the perineum. I felt the pressure of her snout against my root chakra, and felt vaguely guilty at enjoying the sensation. She lifted me off my feet and balanced me in the air. I grew worried that she would hurt her neck, but I looked down and saw that her neck was thick and muscular, like a bull's neck.
That which is not favored by the Tao, not even the ancients know why.
!This is an encrypted Tiddler
Tolstoy unabashedly stated it: "Resist no evil". For evil is an illusion, one can understand the light from the shadow it casts, and this is the deep art of observance without getting caught in the corrupting behavior of evil. The salvation from the corrupting behavior used to come in the form of confession from sin and then liberation.
In more practical terms, this means participating in the reality of the other, even if I find it throughly distasteful. Furthermore: finding it distasteful would be a sign of attachment. Judgement is of no use, but I do possess a visceral or spirit-like aversion to the unnatural which I could not control if I wanted. This primal sense of wrongness: rape, murder, ape sense of injustice, I cannot help but act against, especially when it happens in front of me.
Not long ago I felt blazing hot from a day under the sun. I was in a Study Hall, and when I went to the bathroom to refresh myself I found the boys's one closed, so I entered the girls one. I refer to the bathrooms in this way because, at the time, it was populated by young Spanish students cramming both the space and their mind due to their finals.
I entered the girls bathroom and I splashed myself with water, hoping that one of these younger women wouldn't surprise me having been daring enough to use their restroom. Then I thought: no, in my experience, if one of these ladies were to catch me, I would just excuse myself because I'm using it honestly, I would only be nervous if my intentions were other.
I came back to sit down to work, but my thought drifted: why is it that we even have this separation? In Spain, bathrooms are often very private. In Americas I personally know, public bathrooms quickly get you used to becoming very intimate with strangers: we exchange sounds and smells of our bowel movements. We have followed a strange tradition, I guess, of large outhouses: the modern public bathroom doesn't make any sense in today's world.
Interface-wise, it is asking you an unnecessary question: are you male or female? I'm simply a human being with an urgent need for disposing of my waste. I prefer to do this as privately as possible, so I wouldn't even know if the person next to me is of whatever gender that person identifies with.
As such, it is helpful to imagine them as "booths for privacy", and this seems like an invitation for abuse, here a good architect or engineer would know which material is best for tolerating abuse, just make it as easy to clean as possible. People will be people.
According to some movies I've seen, women's bathrooms have a social life. In my experience, there's not much conversation on the gentlemen's side of the bathroom. It is generally not considered a good place to be friendly, unless it's a more or less specifically social place (like a locker room or a sauna, I guess).
I know very little of the world
It is time for individual bathrooms
As I come out of the bathroom for a refreshment, I found the “gentlemen” bathroom locked. The girls was right next door, nobody was there, so I quickly splashed my face with water, hoping that I wouldn’t inopportunate a lady behind the screens. I sit down and ponder: why is it that our public bathrooms are so archaic? I have no interest in exploring the history of shitting, I would just like to work out what makes a good bathroom. Or do I?
I search in google: “prehistoric latrines”, it shows me a dinosaur dump location. Well, this is nature at work, what does nature think makes a good latrine? Well, not much of the precise location is described. Basic law of nature is “don’t shit where you eat”. Doctrine of nature which can be applied to many areas of life. Let us see what happens when the human intellect comes into play, when was the first time we thought: I can do better than leaving my dumps around my cave. Do formerly inhabited caves have latrines? Now, there’s a search query.
I come back with my intentions destroyed: apparently modern bathrooms are something we should be grateful for. We didn’t even bother not stepping on our own shit until around 50,000 years ago, when we gained enough cognition to think: it’s probably not a good idea to step on shit, and our own excrement stopped recording our footprints. Only by trial and error he would associate the smell of shit with sickness, but apparently we are very slow learners. If we were 10 years of age, we would have stopped stepping on our shit when we were 7 1/2 years of age.
Let us then take a moment to thank modernity, because the great people who have made modern bathrooms are saints. We are so much better than we were some decades ago. Having said that, let us explore what is a public bathroom and how it can be improved.
The bathroom from an architectural point of view
In developed countries I rarely catch sight of a tank, but in my native country, many buildings are topped by water tanks. The water is brought down by the force of gravity (of course) brought through lines, which I would suppose have a name but I am doing a consciousness dump here. I will reason it out: the reason we find “wet rooms” in architecture clustered together (for example, the bathroom may be close to the kitchen in a small apartment) is because a line comes down which carries the water, and you don’t want to transport it too far unnecessarily.
I shall edit this tomorrow, the train of thought is interesting, but I must take myself out once this is written.
What happens with waste water? It comes from the “wet” area and it drains towards a vertical tube in a different location, sewage main. Unfortunately in developing countries one will often find the sewage flowing back to the mains tubing, because even though there are independent and sealed most of the time, and earthquake might cause silent contamination. The water put into the system and it will often come out contaminated. The source of contamination is the system itself.
I saw a bit too many videos on body language. I had avoided watching them because I found the whole situation silly, body language follows the inner feeling and any attempt at controlling it results in the stiffening of expression, because one is attempting to conceal what one truly feels, and the result is robotic (Mark Zuckerberg-like).
However, it did show me I'm not bad at reading body language. The person who was doing to reading was victim of overinterpretation of signs. It is human to project what one sees and feels unto what one is interpreting, and thus it was evident that her background and her personal opinions were being projected unto the things that she analyzed. Still, I picked up some things: I'm terrible at concealing anything, that most of charm has to do with the ability to be relaxed in interpersonal interaction, and that I'm quite decent at reading body language. But it does not come in a verbal way, I just sense it, and that perhaps the reason I read anxiety when I come to the deep topics is because people see at the darkness with fear.
In this aspect, it is perhaps better that I write about it. It is not "come with me into this zone of darkness", it is "this is what the zone of darkness looks like". And as I've read the stuff I've writeen in the last few days, it is seen that the first=person perspective is completeley egocentric, I must come to identify with all of humanity. My perspective is integral.
I also ccame to see that the videos I took at myself indeed areuseful. I could identify my own states ofmind, to see my own rollercoaster, and also detect that when I most feel insecure about myself, more I wish to come back to Mehtod of Acton as a design shop rather than the virtuegraph. And I also see that the virtuegraph indeed helps me grow. And thus I need to come back on track and make my virtuegraph. This is the decision I take.
Some days ago I had an abrasive encounter with somebody on Twitter who didn't like my use of the pronoun "he". It's not worth linking or making any drama about it, the event simply lead me to reflect on how we become more inclusive in our language, and also the pitfalls about being abrasive.
The first reaction one has when called out is that of responding to aggression with aggression. Life has given me enough experience to know that this is a mistake, so once the anger dissipates, what do you do? Was I in the wrong? Indeed I was, I agree that beyond our gender lies a human being, and that we shouldn't assume a "he" or a "she". I was suggested that I write "they", but that's changing semantics: I don't mean a crowd, I mean a person, and I don't care if it's a man or a woman. The specific wording needs to be worked out in context.
But beneath this reflection there's a resentment for having been called out, a distasteful encounter with the gender police. Should I be younger I would either lash back or shut up and take my resentment to the incel forums.
I consulted these matters with my roommate and friend, a self-described feminist, and she pointed out to the fact that I had only reflected on these topics because there was somebody abrasive. "This kind of behavior is necessary to bring awareness to these topics, without _fighting_ nobody would notice". Indeed, perhaps policing is necessary.
But is it necessary to assume that a person is a bigot because he uses non-inclusive language? Never assume malice when stupidity will explain it. There are a thousand reasons why you would use non-inclusive language: because you where educated in another generation, because you belong to a different culture where this is not a topic (yet), because you were careless, because you projected yourself onto that "he" or "she". Because it's standard English.
"It's not that much of an issue, you just got slapped in the neck for writing something stupid". Yes, that's exactly what happened. Except, I haven't been slapped on the neck since highschool, and I dislike bullies.
In our struggle to find equality, it seems we have borrowed some of the ugly stuff from each other. Aggressiveness is generally the male way of dealing with things. Yes, women should also feel empowered to be aggressive: it is a tool when used in moderation, but it is also an art to know when to espouse it. As of now, it is deployed an educational method, it's the teacher that hits the misbehaving student with the ruler.
I think the best thing a human being can do when he encounters these kind of situations is to reflect on what a wise woman would do. The kind of woman who said "surely you are joking, Mr. Feynman" when he said he wanted both milk and lemon in his tea. The kind of response that makes you both notice your mistake and save face. Should she had said "Mr. Feynman, what are you? an idiot?" he would have probably agreed and proceeded to put both milk and lemon in his tea. If you haven't saved face, you might as well pretend that you did it on purpose.
Therapy is useful in the treatment of depression
Not all therapies are created equal
Not all therapists are created equal
Recommended reading:
Are all Psychotherapies Created Equal?
https://www.scientificamerican.com/article/are-all-psychotherapies-created-equal/
The Efficacy and Effectiveness of Psychological Treatments
https://www.cpa.ca/docs/File/Practice/TheEfficacyAndEffectivenessOfPsychologicalTreatments_web.pdf
As I write this I feel some urge to seek porn. I've been through this enough times to know that this would lead to masturbatory behavior. What to do then? I feel an alternative, which would be to seek beautiful women to simply observe. It causes an aesthetic experience which I very much enjoy. I feel certain guilt in this, as if I was a creep for deliberately oogling at women as treats out of my reach. I am assertive, in shape, yet I know in my heart that this is not a time for a relationship, and that I cannot have a sexual relationship with somebody without some degree of emotional attachment.
This is my mind jumping all over the place, for the reasoning has no head or tail. I am horny (I hate this word). I have no way of release. What to do with this energy? Let us inspect it: a malaise felt under the belly, like it is drawing energy from all of my body. It becomes excited if I observe beauty, and then the energy drawing process is reversed. Where to observe beauty? How to do it in a way which is productive? Observe beauty as a side-effect of your surroundings. This would mean: work outside, especially in places where beauty is known to reside. I will add this to the virtuegraph.
Even if the energy drawing process is reversed, what to do with this energy? I seem to be channeling it into my creative endeavors, I am drawing and programming more than ever, and I can see this indeed comes from the libido. How does one, in meditation, perform the transmutation? I am observing my breath, I will incorporate, I am sitting straight. This simple act made it much more tolerable. I see: I was slumped, the sexual energy through my body has to be in correspondance with my posture. It seems to be a manifestation of a discordance between the energy contained in the body and it's posture. I have come to sit as if I were riding a horse.
I observe and the energy now is a pleasant presence. This will buy me some time to know what to do later.
I was with my cousin Óscar outside the Baden Baden ballroom. We went inside and saw two attractive girls in mini-skirt. Óscar was lascivious. An older man with the appearance of Jaime approached us, and in a very tasteful way explained us that these were escorts who could get laid with us for $1,500 MXN.
Óscar asked me to lend him $800. I had little hope of seeing my money back, but I acceded. He went inside with the lady and after a while came out with a very satisfied look on his face. I went inside to pay the gentleman, and through some mechanism which I could not understand, he gave me $700, with which my loan to Óscar was covered. I thought it was great, because I expected zero.
We jumped into the car and were heading to my house, I knew he would make an illegal turn, and he asked me where to turn. I looked around and realized I didn't recognize the street. Some things were as I remembered them, but others were changed, for the worse.
Flor se había hecho de un piso nuevo en Madrid. Era espectacular, todo forrado de madera antigua, y tenía una biblioteca grande con una vitrina en donde había textos orientales exóticos. Vi los títulos y todos me llamaron la atención.
Flor me mostró un cenicero, donde ahora recogía donativos de la gente que venía a su casa a hacer meditación. Aún estaba manchado de ceniza, mi entendimiento era que dejar de fumar estaba atada a su práctica de meditación y por eso solicitaba ahí los donativos.
Me apetecía darle un beso, pero no quería lidiar con las repercusiones de corto y largo plazo. Luego pensé "qué diablos" y la tomé de la cintura y le planté un beso. Ella respondió tirándome a la cama. Se desvistió y estaba en forma, aún con curvas. Tuvimos sexo de forma muy pasional, yo con ciertos desatinos por mi celibato prolongado, y ella estaba en sus días, pero estos parecieron meros detalles de un todo muy pasional.
Como este sueño se dio inmediatamente después del de la [[chica morena|Masaje en el abdomen]] pensé: "me siento mucho más relajado con una chica que no me parezca tan atractiva".
[https://en.wikipedia.org/wiki/Avocado](https://en.wikipedia.org/wiki/Avocado)
<img alt="IMG_5404.jpg" src="https://method.ac/writing/uploads/IMG_5404.jpg" style="width: 70%; margin: 0 auto; display: block;" />
I was in my house and I had some unknown visitors over. One of them was a petite morena, who was very hot. We flirted and then she said she would visit my room at night. Just by thinking about it I got hard. She came at night as she said, and we fucked. She left promptly after the act. I was left wanting more.
[Phoenix dactylifera](https://en.wikipedia.org/wiki/Date_palm), commonly known as date or date palm
<img alt="IMG_5358.jpg" src="https://method.ac/writing/uploads/IMG_5358.jpg" style="width: 100%;" />
Some weeks ago the screen of my phone shattered, and it has become almost unportable. These days it sits right next to my computer, working mostly as a modem, which is easy during quarantine times because I'm latched to the house.
There's been times when I've had to apologize for not responding to an urgent whatsapp message, but I tell people to call me on urgent matters. I can hear from any point in the house, a message I don't _want_ to hear. This should be common sense, but nowadays people seem to be afraid of making a phone call. I'm phone call shy myself.
Let us examine this issue: why does it seem more difficult to make a phone call than it is to send a message? Could it be because a conversation has to be navigated, while a message gets straight to the point? When I call I say "Oh hi my friend, long time, do I interrupt? There's this urgent thing that came up and..."
Or could it really be that most things are not that urgent as to merit interruption of all activity. "I've been waiting for you 30 minutes, I will leave now. No worries, let's schedule some other day" vs "I can't find you, where are you?".
Intuitively, it seems urgency is what drives immediacy, and a call is the most direct interface to a remote person. When your phone rings, you should know it is important. But marketing calls have ruined everything: when your phone rings you know it is crap.
How is it that we put up with this? An urgency channel between human beings is used to bombard us with offers for credit cards, insurance, and crap in general. After lashing out on the callers I understood I was only harming others and myself, and I've settled on saying "Thank you but I don't have the time for this right now. It's fortunate that you have a job, and hopefully you will find a better one soon. Good luck and goodbye".
"That poor soul will be left without a job", people say, as if that job were a blessing! Surely in times of slavery, slave owners would say "but they won't know what to do with their freedom!". Jobs like this are toxic for the human soul, knowingly annoying people in search of sustaining oneself or one's family.
But then I think: who can solve this? The phone company? The phone manufacturer? The OS of the phone? The government? The market? And the answer seems to be "all of them can, but none will, each for their own reasons".
And so, we are more likely to read an urgent asynchronous message than we are to pick up a phone call coming from an unknown number.
<img alt="pinecone.jpg" src="https://method.ac/writing/uploads/pinecone.jpg" width="569" height="506" class="mt-image-none" style="display: block; margin: 0 auto;" />
A throughly simple story with plenty of meaning: I was walking the mountains of Asturias when I came upon a beautiful pinecone. I picked it up and put it in my backpack. I walked some more and I came upon another beautiful pinecone. I compared them, the new one was definitely more attractive than the first one, so I exchanged them.
How is it that we find one pinecone more attractive than another? We find people beautiful because we are meant to reproduce with them, but I'll never attempt to reproduce with a pinecone (or so I hope). Where this sense of beauty arises?
I thought these things and I came yet to another pinecone which contested than the one I was holding on my hand. I observed them carefully: one had more integrity in its patterns. The space between the "petals" was more regular, its shape more pleasing, it was closer to the platonic ideal of a pinecone.
A question to ponder: is there beauty in the human psyche? If so, would the perfect human psyche be singular? That is, two perfect human psyches would be exactly the same, because their perfection meets in a single ideal.
According to oriental religion, we come back to God when we attain perfection. Attar's _Conference of the Birds_ https://en.wikipedia.org/wiki/The_Conference_of_the_Birds, which maps the mystical quest of enlightenment warns that we cannot see the divine directly, it would blind us with its beauty. We can only use our hearts as mirrors of the divine beauty, and our task is polishing it so that we reflect the divine form, the perfect psyche.
<iframe width="560" height="315" src="https://www.youtube.com/embed/f825KsQUqbo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
> Hundreds of thousands of souls burn with an ardent passion to see Him. Yet none can afford to do without Him. Supreme manliness, absolute fearlessness and complete self-effacement are needed to overcome those obstacles. If we succeed in getting a glimpse of His face, it will be an achievement indeed. If we do not attempt it, and if we fail to greet the Beloved, this life is not worth living"
> --Conference of the Birds, by Farid ud-Din Attar
<img alt="IMG_5292.jpg" src="https://method.ac/writing/uploads/IMG_5292.jpg" style="width: 100%;" />
Today I woke up to a chilly six or seven degree weather. The virtue in Puebla is that this usually lasts just a couple of weeks at most, and it will quickly warm up as our position on the earth faces the sun. It is not worth insulating the house in order to install efficient heating. Family members tend to congregate the room and it because warm not only physicially but emotionally. But, when you enjoy your solitude, how should you warm up?
I took refuge in the kitchen. I grabbed my blanket and nailed it to the door frame, because the kitchen has no door. I boiled some potatoes and made a makeshift sauna. Memories of the camino arose, and I felt compelled to share.
I was in a small kitchen in a freezing, ruined albergue in Poladura de la Tercia, in a very similar situation as now: cold without means of heating
Nothing made me develop a taste for meat as much as growing up in a vegetarian family.
Nothing made me assert my masculinity as much as feminist questioning.
Nothing made me believe in the equality of all human beings as Mexican classism.
Nothing made me more atheist than being indoctrinated into religious dogma.
Nothing made me more spiritual than being indoctrinated into scientific-materialist dogma.
Nothing has made me more skeptical about academic credentials than having one myself.
Acknowledging, accepting and celebrating the opposing forces that built my character, I also notice the following...
***
Nothing is more likely to go wrong than something you're anxious about.
Nothing crushes a delicate romance more than the overbearing grasp of a lover.
Nothing takes longer to complete than things that needed to be done by yesterday.
*Therefore:* ponder on effortless activity of wild animals.
***
Nothing makes food more tasty than being on a strict diet.
Banning a book is the best way to get it read.
Censoring a film is the best way to give it attention.
Prohibiting substances is the best way to make people curious about them.
*Therefore:* ponder what would be kinky sex if there were no taboos.
***
Nobody has done more against communism than Joseph Stalin.
Nobody has done more against fascism than Adolph Hitler.
Nobody has done more against socialism than Hugo Chávez.
Nobody has done more against Catholicism than its priests.
Nobody has done more against Islam than its fanatics.
Nobody has pointed out the absurdity of borders more than Donald Trump.
*Therefore:* ponder on a snake eating its tail.
***
The objection of the agreeable person is considered more carefully than the disagreeable one.
Constant protests bring about indifference to the cause. Loudness is only appreciated in the context of silence.
Constant bickering about trivial injustices draws attention away from what is truly important. Attention is best considered a valuable resource to be conserved.
Environmental catastrophism brings about environmental indifference. There must be hope.
*Therefore:* ponder on empty space.
<img alt="IMG_4914.jpg" src="https://method.ac/writing/uploads/IMG_4914.jpg" style="width: 75%; margin: 0 auto; display: block;" />
Link list with a space in the tag does not work, investigate the issue.
<<link-list "[tag[possible futures]]">>
Chimp game
https://www.semanticscholar.org/paper/Individual-Differences-in-Visual-Working-Memory-of-Fukuda-Woodman/ff16c01171a096bc08c12c2e0d49cb07449c8834?p2df
Design games
https://www.sleepydays.es/2020/03/8-juegos-para-disenadores-en-cuarentena-coronavirus.html
Design talks
https://www.notion.so/50d566b7a8df47d99522a2f79769aa49?v=4978e34ed29443e49258e866dbc07cc5
Color charts contrast
https://hagstromerlibrary.ki.se/wunderkammer/1584
https://seeing-theory.brown.edu/basic-probability/index.html
https://ciechanow.ski/color-spaces/
https://ciechanow.ski/lights-and-shadows/
# Fijar la atención en la respiración.
# Varias respiraciones profundas desde el estómago, notar las sensaciones de la frente y el cerebro (se siente como si se estuviera contrayendo, como un músculo).
# Notar la tensión en el rostro y relajar los músculos.
# Hacer diez respiraciones sin contar verbalmente, esto se hace "habitando" cada dedo de la mano con cada respiración. Esto es, poner la atención dentro de cada dedo de forma secuencial, comenzando por el meñique de la mano derecha y terminando en el meñique de la izquierda.
# Pasar la atención al corazón. Si el corazón permanece elusivo, imaginar que una sustancia gotea desde el cerebro al corazón, y la respiración hace que combustione, encendiéndolo.
# Teniendo la mente y el corazón activos, poner la atención en el sexo, relajando toda el área pélvica. Se deben sentir cosquilleos en las piernas.
# Teniendo los tres centros, la mente, el corazón y el sexo activos, imaginar la respiración como un circuito de aire que entra por la nariz bajando por la columna vertebral, llegando al sexo, luego subiendo por el estómago y el pecho para exhalar.
# Sentir el cuerpo energético/espiritual borrar sus fronteras con el mundo material. Integrarse con el todo (en la medida que uno pueda en ese momento).
The noon of life
I come to what I perceive as the middle of my life, which is reasonable according to my age. The sun has shone on one half of me, and now is directly overhead. I look at my feet, and I see that I produce almost no shadow. Now the opposite side will be warmed up, and I will begin producing a shadow again.
For the past few years I've been screaming to the sun to soar higher, deluded that I had control over it. But now I understand, the I only suffer when I get impatient with the sun. I see that if I accept its position, great lessons will be understood.
Soon the sun illuminate the opposing part of my person, light will reveal darkness, and produce a shadow on the opposite side. Noon of life principles are meant to guide my actions at my time and my context. I do not advocate following my principles, the opposite of your face is not my face.
The lesson then, is to listen to your inner teacher, and that teacher in many traditions is death. When the sun sets, in order to have lived the full experience of life, we shine light on the opposite side. Let us then, imagine ourselves at our deathbed, and see where the balance would take us.
Where I was inward looking, I became outward looking
Where I was reasonable, I became brash
Where I warred, I seeked peace and restituted damage
Where I lied, I brought truth
Where I was proud, I put humility
Where I kept silent, I became a voice
Where I was in solitude, I became connected
Where I held an opinion, I hold a doubt
Where I was complex, I shall become simple
Yes, this seems to be beacon I wish to follow. But I will only know from experience. Let us see where this philosophy takes us, you will know a tree by it's fruit.
The fools’s way
In my path I have observed two ways of treating depression. One, I call the feminine, is the longer and gentler route of “fixing yourself” and self care. Learning to be a mother to yourself. The other, the masculine, is one of putting oneself expansive quests appropriate towards what calls you at the moment. The Explorer. I have tried to discuss these ideas, but in these times of gender sensitivity it is a great sin to make distinctions of gender, and so I acknowledge the minefield and I explain by what is meant by the masculine and feminine components of personality.
https://publicdomainreview.org/explore/
https://imgur.com/gallery/zHRKI
What a wonder it is to admire someone in your immediate family who is close to you. If the intimacy of the family member is enough, one might catch glimpses of the shadow, forming the chiaroscuro of a true work of art. Celebrate that person.
---
It is not uncommon that people are outwardly patient and tolerant, but flip into impatience and intolerance in their intimate circle. When one forces tolerance and patience, the opposite is expressed in unpredictable ways.
---
One of the steps in reaching serenity is to tolerate intolerance (within oneself and from others).
---
A person who wants to save the world and also hates their family is surely dangerous. There will be anger in all their actions.
---
The person who pretends to be happy is the one who most often cries him or herself to sleep.
---
If a person needs to be an impostor amongst his or her family, it is best that they remove themselves from the situation, because this has greatly damaging effects in the long term. As this is often imposible, the stranded person must make small steps towards his or her real authenticity, no matter how small, so that the impostor's personality does not become imprinted in one's spirit.
---
Dreams become vivid by periods. It is not that we don't dream, it is that the _vividness_ of the dreams are dimmed to the point of irrelevance. We remember what we dream when we dream vividly.
---
After writing the previous thought I had a nap. I dreamed (in a dimmed, unlively fashion) that I was snacking on chunks of fish while chatting with my Canadian uncle (whom is visiting in real life). I put a large piece of piece of fish in my mouth and I felt a fish bone get caught in my throat. I thought: I must breathe calmly to see if my airway is obstructed. It was difficult, but I was able to breathe. I kept on listening to my uncle chatting at me while I pretended nothing happened.
The Art of Gathering: How We Meet and Why It Matters <br />
Sons and Lovers DH Lawrence<br>
The body keeps the score<br>
Kindred: Neanderthal Life, Love, Death and Art<br>
Human kind - Rutger Bregman<br>
“Arte y belleza” de Mauricio de Wulf.<br>
The Strangest Man: The Hidden Life of Paul Dirac, Mystic of the Atom<br>
In praise of Folly — Erasmus<br>
“Why Knowledge Matters: Rescuing our Children from Failed Educational Theories”<br>
aventuras en México - Gutierre Etibone<br>
Jack London - The call of the wild<br>
Into thin air<br>
The maning of travel<br>
The Castle of Dreams (MIT Press): Jouvet, Michel, Garey ...<br>
Stoner is a 1965 novel by the American writer John Williams. Novel about work<br>
https://en.wikipedia.org/wiki/Douglas_Harding<br>
The overstory by Richard Powers<br>
The Story of Civilization by Will & Ariel Durant<br>
François de La Rochefoucauld<br />
Manhood of Humanity de Alfred Korzybski<br />
A guide for the Perplexed EF Schumacher<br />
Come as You Are: the bestselling guide to the new science that will transform your sex life (English Edition)<br />
Meditations of a Solitary Walker (Classic, 60s) by Jean-Jacques Rousseau, Peter France<br />
The Muqaddimah: An Introduction to History - Abridged Edition (Princeton Classics (111))<br />
The Inner Game of Tennis: The Classic Guide to the Mental Side of Peak Performance<br />
The Gospel in Brief (Eastern Philosophy and Religion) Leo Tolstoy <br />
Vehicles, experiments in synthetic psychology <br />
What I Believe: 13 Eminent People of Our Time Argue for Their Philosophy of Life (What I Believe Paper) <br />
Maps of the Mind: Charts and Concepts of the Mind and its Labyrinths<br />
Flow: The Psychology of Optimal Experience Paperback – March 13, 1991 <br />
The Origin of Consciousness in the Breakdown of the Bicameral Mind<br />
Myths to Live By - Joseph Campbell <br />
To Understand Is to Invent — Jean Piaget <br />
Philosophy: 100 Essential Thinkers: The Ideas That Have Shaped Our World <br />
Star Maker — Olaf Stapledon <br />
The Book of Life: Daily Meditations with Krishnamurti <br />
On the Move: A Life — Olver Sacks<br />
Adventures in Human Being: A Grand Tour from the Cranium to the Calcaneum<br />
How Should We Live?: Great Ideas from the Past for Everyday Life <br />
The Immoralist — Andre Gide<br />
The Psychology of Computer Programming<br />
The Evolving Self: A Psychology for the Third Millennium<br />
Nine Chains to the Moon<br />
The Sciences of the Artificial <br />
The Unpublished David Ogilvy <br />
Journey to the East //Herman Hesse// <br />
Spiritual Perspectives and Human Facts<br />
Henri Bergson Creative evolution
Reason is [[the logos|The Logos]].
René se acomodaba el pelo frente al espejo en el bajo en Buen Suceso. Andaba corto de tiempo, pues el ritual de aseo personal y del hogar lo había hecho con particular cuidado: la chica del gimnasio había accedido a su invitación a salir, pero con qué descaro lo había hecho!
En el gimnasio la había visto dos o tres veces, mirando con discreción, pero buscando la oportunidad de entrar en la burbuja que se esconden las chicas guapas, porque están cansadas de que todo mundo se las quiera ligar. Parecía una tarea imposible: siempre llevaba audífonos, y se sumía en la más profunda de las concentraciones al ejercitar su cuerpo, no podía ser más indiferente a cualquier hombre que se le acercara.
Pero el día en que la vio colocarse en el squat rack, ese día nunca se le olvidará. René estaba pretendiendo hacer abdominales sobre una pelota medicinal, la chica se puso la barra en los hombros, bajó ass to the grass, como lo hacen todas las chicas voluptuosas, y pum! Los pants de yoga cedieron ante tremendo culo, exponiendo un melocotón hermoso y una tanga roja para llevarlo a uno al cielo.
Pero su excitación pronto se convirtió en alarma: ante el desconcierto de sentir sus pants explotar en el fondo de la sentadilla, la chica perdió la concentración y el balance, y no lograba salir del apuro. René se incorporó como un resorte y corrió a ayudarla. Con la fuerza de la adrenalina levantó la barrá como si no pesara, y la colocó en el rack.
—"Ay papi, eres un amor, gracias"
—"No es nada, pero mira cómo quedaron tus pants! Querrás cambiarte me imagino, anda al vestidor!"—contestó riendo.
—"Ay papi, es que me ducho en casa y no traigo cambio de ropa, no sé qué voy a hacer".
—"Uy yo estoy en las mismas, pero se me ocurre una idea, yo iba a nadar y traigo un bañador de lycra como short, seguro te sirven para regresar a casa".
—"Ay papi eres un divino, no sabes cómo te lo agradezco, nos vemos en el vestidor y me prestas el bañador? Pero que vergüenza si ni te he preguntado tu nombre!".
—"El mío es René,y tú cómo te llamas?"
—"Me llamo Angela. Ay René", le dijo poniéndole la mano en le hombro por hábito de seducción, "me salvaste", casi susurró.
René notó la firmeza de sus intenciones.
Se vieron afuera del vestidor para prestar la prenda, y charlaron un poquito, intercambiándose teléfonos para devolverla. El intercambio resultó en un algunos chats de whatsapp que se tornaron fogosos, y habían quedado de tomar una copa en la terraza, con planes implícitos de volver a casa luego.
René se terminó de arreglar, salió del bajo, y lamentó no haber instalado el keypad para la puerta, eso la hubiera impresionado. En su lugar, ahora se encontraba intentando que el brazo del candado entrara en el hoyo, pensando que ojalá no fuera una premonición de lo que pasaría más tarde, con unas copitas demás.
Bajó por Princesa para ganar tiempo, la cita era cerca de Plaza Mayor, en un barecito acogedor. En el camino le rugieron las tripas, "si no como ahora" pensó, "no voy a tener estamina para aguantar las copas y la noche", razonó, y se metió al takos para pedir una orden de pastor. Comió apresuradamente, y casi corrió a la cita.
Angela ya estaba sentada cuando llegó. Se levantó para darle un cariñoso abrazo y René se maravilló del recibimiento, sin olvidar pedir disculpas por llegar tarde. Se sentaron y pidieron una copa de vino.
—"ay perdón, no sabes que habría traía ya", dijo René, "y no pude evitar comerme unos taquitos al pastor".
—"taquitos al pastor papi?"
—"son como kebabs con tortilla chiquita", dijo queriendo atajar el asunto, no había tiempo que perder, había que encender las brasas de ese fuego que comenzó en el whatsapp.
—"Ángela, te ves preciosa, nunca he visto una minifalda tan corta y tan elegante. Ojalá también yo pudiera usar tacones, así podría darle un descanso a mis gemelos, creo que voy a aguantar poco de puntitas", dijo René riendo, bajando a su estatura natural, revelando que ella era más alta con los tacones puestos.
—"Jajaja papi me gustas por gracioso, al rato te los presto y me haces una caminata de pasarela con tus shorts que traigo en la bolsa".
—"No no no, eso no lo hago si no es con mi lencería especial", ambos rieron a carcajadas, y el rabillo del ojo de Ángela revelaba una atención a sus labios.
René no quiso perder el tiempo. Quería un beso, sin duda. La tomó de la cintura y se la pegó al cuerpo, recorriendo con su aliento el cuello, el mentón, finalmente subiendo hasta su boca. Pero ella se apartó súbitamente: "Ay papi perdona es que no puedo...".
—"Pero qué pasa Angela, hay alguien? Por eso no te preocupes..."
—"No no no, es algo que parece tonto, pero es importante"
—"Hmmm no siempre has sido mujer?"
—"Jajaja", simuló con voz ronca, propinándole un manotazo juguetón.
No sólo era bella y alivianada, tenía sentido del humor!
"Ay papi voy a tener que ponerme seria. Es que soy muy alérgica al cilantro. Es como el cacahuate para algunas personas, si ingiero una molécula de cilantrinium, me hincho como una pelota y voy directo al hospital."
"Bueno, pero eso qué tiene que ver? Yo también soy alérgico a algunas cosas, una vez me picó una abeja y..."
"Papi, los tacos al pastor llevan cilantro?"
"Ahhhh, sí, normalmente llevan cilantro, pero como dan mal aliento, los pedi naturales para verte", mintió René.
Angela hizo una cara como de lástima. Le acarició la mano. "Estás seguro que no llevaban cilantro?". René hizo un hoyito entre su pulgar y su dedo índice y le dio un beso, jurando que "por esta" los había pedido sin cilantro.
Tomando la mano de René, se levantó, y lo llevó al espejo del vestidor del baño. René vio su pelo: estaba impecable. Su ropa: impecable, Su rostro: impecable, pero le faltaba un diente. Qué!? Se acercó al espejo, no le faltaba, estaba cubierto por una gran hoja de cilantro, que apresuradamente se limpió con un pañuelo.
"Papi, no tengo nada en contra del cilantro, lo hubiéramos podido resolver con un enjuague bucal que traigo, pero si tengo algo en contra de los mentirosos. Todos lo hombres mienten, pensé que tú eras diferente pero ya veo que me equivoqué".
"No no no Ángela espera, yo no soy de esos, te lo iba a confesar más adelante pero no quería amargar el momento, la estábamos pasando tan bien". Ángela hizo un gesto de sufrimiento, pues también se había emocionado con la posibilidad un tórrido y apasionado romance. Se dio la vuelta y se marchó moviendo las caderas seductoramente, pues no tenía otro caminar. Hasta encabronada era irresistiblemente seductora.
"Pues que sepas que prefiero el cilantro que a cualquier mujer!", le increpó, pero ella ni volteó. Estaba a punto de gritar otra cosa cuando sintió algo vibrar dentro de la bolsa donde había devuelto los shorts: un buttplug rosita con el que se hubieran divertido en un par de horas.
Maldito cilantro.
El humor en la vida: Ejercicio 1<br />
https://blank.page/?pageId=RA2YZE05Ze1IH2d940MC&pageType=pages
El humor en la vida: Ejercicio 2 (Parte 1)<br />
https://blank.page/?pageId=yb3H15x2HveJbnwPyzMe&pageType=pages
El humor en la vida: Ejercicio 2 (Parte 2)<br />
https://blank.page/?pageId=8KLJ4f934aOIxQPOrMl1&pageType=pages
El humor en la literatura, parte 1<br />
https://blank.page/?pageId=wrpwPfHxYN2zD729lsj7&pageType=pages
El humor en la literatura, parte 2<br />
2.1 <br />
https://blank.page/?pageId=YEKP6E7tGhF5M8BEOtes&pageType=pages<br />
2.3 <br />
https://blank.page/?pageId=FTAI66Zb8MfCgVagnxpb&pageType=pages
René is my friend and business partner at blank.page
<<list-links "[tag[Runge]]">>
http://colormind.io/<br />
https://www.happyhues.co/<br />
https://palettegenerator.colorion.co/<br />
https://colorcurves.app/<br />
https://colorhunt.co/<br />
https://coolors.co/<br />
https://www.palettelist.com/ff3737/36d8b7<br />
https://material.io/resources/color/#!/?view.left=0&view.right=0&primary.color=FF1744<br />
https://www.materialpalette.com/<br />
https://mycolor.space/<br />
https://colorsinspo.com/<br />
https://gradienta.io/<br />
https://image-color.com/<br />
I was at home, holed up working as always. I heard on the radio that an old wise sage lived on the outskirts of Madrid. I wanted to visit him. I looked out the window, it was getting dark. _I can't take the bike_ I thought. I need to reach him by foot. And so I begun walking, and at an intersection a naked woman dashed like a deer between cars, and in a patch of grass planted three full grown carrots. It began snowing, and I thought I wanted to follow her, so I ran behind her following her footprints. When I caught up with her we began sprinting together, like deer. _Do you have a spiritual name?_ she asked me, I said no. Well, my spiritual name is X. I thought it was naive that she had a spiritual name, but I remained quiet. I didn't want to ruin this exhilarating moment.
The Sabbath is a day in which work is dedicated to something other than the self.
It is to work for [[The One]] or for [[The Other]].
My current sabbath day is Friday.
I was working on my computer at home. Mom was in another room, and we were expecting dad for lunch. I was stressed out so I masturbated. Dad arrived and we went to the dining room. I needed to go to the bathroom, so I went there, and in the mirror I saw I had blobs of semen all over my shirt, I had forgotten to clean up after myself! I cleaned up hoping that dad wouldn't have noticed, but I was still covered in humid stains. I splashed myself with water to make it seem they were water stains.
I came back to the dining room as if nothing had happened, and saw a large pool of thick white semen on my chair. I wondered if I should try to scoop it up without being noticed, or if I should sit on it hoping not to have to stand up during lunch.
"""
Characters
The shaman
The architect
The father
The mother
Settings
The city
The prairies
Conflicts
The duality between the masculine and the feminine.
The duality between the ascending and the descending.
The duality between technology and nature.
The duality between courage and compassion.
The duality between harmony and conflict.
Notes:
Give to someone to read to see if they understand it
Write everything in one burst, then refine.
"""
<img alt="IMG_2488t.jpg" src="https://method.ac/writing/uploads/IMG_2488t.jpg" class="mt-image-none" style="width: 100%" />
I bought this singing bowl in Granada, on a whim. The seller could make it sing particularly loud, but I couldn't. I wanted to learn, so I bought it. It became a sacred object through a long story which I must explain to provide context.
I was walking the camino through Extremadura, near the Roman arch of Caparra. I was told that, on the other side of the hills lay the Jerte Valley, and that in Easter it became white from the flowering cherry trees in spring. It happened to be Easter and the hike didn't seem too difficult, so the next morning I left my backpack at the hostel I was staying and I said I'd be back at night.
It turned out to be an incredibly challenging hike, and when I reached the top I saw the cherry trees had already lost their flowers. But the valley was beautiful and I wanted to stay there, so I head down into the towns at the bottom of the valley.
It was crazy crowded. I found myself amidst easter festivities which in Spain often remind of the Ku Klux Klan.
<img alt="IMG_2340.jpg" src="https://method.ac/writing/uploads/IMG_2340.jpg" class="mt-image-none" style="width: 100%" />
Later in the night, streets full of people dining and drinking. I made my way to a hotel and asked if they had availability. Not only it was sold out, the entire valley was in full occupancy. I called a taxi to ask how much he would charge me to get me out of the valley. One hundred euros. I was in a dire situation and it was already midnight.
<img alt="IMG_5283.jpg" src="https://method.ac/writing/uploads/IMG_5283.jpg" class="mt-image-none" style="width: 100%" />
As I pondered my situation, the bells of the church rung. Could it be that there would be a midnight easter mass? There was indeed. I joined a handful of old locals to listen to the priest's sermon. It was about helping people in need. "Perfect" I thought, "there's no way he can refuse to help me". I struggled through mass to remain awake, as the hike had exhausted me, and at the end of mass I approached him.
--Father, I was doing the Camino de Santiago and this morning I came across the mountains to see the cherry trees flowering. I didn't know it would take me so much time and night has fallen upon me. I've tried to get a room, but the entire valley is booked. Can you help me?<br>
--And what do you want me to do?<br>
--Well, perhaps there's a place where I could stay, or a church member is willing to provide a bed for me.
--You know I can't ask my flock to host a stranger.<br>
--Well, then allow me to sleep inside the church, there's people partying outside and it looks they will be there all night.<br>
--No, that's absolutely impossible.<br>
--Well, then at least allow me to borrow a blanket, I didn't bring my backpack and I don't even have a jacket on me.<br>
--We don't have blankets here.<br>
--Well, allow me to turn around the question then: is there anything you can do for me, knowing that I have nothing other than the clothes I'm wearing and that I will sleep outside?<br>
The priest looked at me sternly and we locked our eyes for some seconds. Finally he caved in "aaaaalright, there is a parochial house where you can stay. It doesn't have hot water but there's a bed. You will be locked from the outside, and I will come in the morning to open the door for you".
I thanked him profusely and he took me to the house. My phone battery was almost depleted and I didn't have my charger on me, so I tried to memorize the route I would take hiking back outside the valley. The next morning the priest opened the door for me and gave me a liter of milk they store of distributing to people in need.
The first part of the hike was straightforward, following a dirt road up the mountains. But at certain point I took a wrong turn, and the dirt path faded out into wilderness. As I had no way of knowing how much I would need to backtrack to correct my mistake, I decided to hike through wilderness, I just needed to cross the mountain range to get out of the valley.
For a long time I followed a stream, but there was a point where it fell down a 30 meter wall of rock. The waterfall had a ledge where one could sit and relax while the falling water massaged your back. I stripped myself of my clothes and sat under the water jet. A heard a voice that said "you need to come back with mushrooms". Note taken.
<img alt="IMG_2797.jpg" src="https://method.ac/writing/uploads/IMG_2797.jpg" class="mt-image-none" style="width: 100%" />
With great difficulty avoiding peril, I climbed up the stone wall, and I came upon what seemed to be a magical vision: on the other side of the stream there was a green grass field, and in the middle of the field a massive oak tree, fenced. I understood that this place was special and that I would have to come back to it.
<img alt="IMG_2700 (2).jpg" src="https://method.ac/writing/uploads/IMG_2700%20%282%29.jpg" class="mt-image-none" style="width: 100%" />
When I went back to Madrid from the walk, I couldn't take the place out of my mind. I found out that the tree was called "[Roble de Prado Sancho](https://www.monumentaltrees.com/es/esp/extremadura/cabezueladelvalle/14353_prado/)" and that it was a protected tree in Extremadura. The waterfall and the tree were detailed in the blog of a hiker, but it warned about the difficulty getting there because there is no path.
I found a store in Madrid which sold magic mushroom kits and grew them at home. When the harvest was ready I made a tea out of them and put it in a jar. I had no idea about the dosage or about what I was doing in general, I just felt a shamanic calling which I had to answer. I packed my singing bowl and camping gear, and grabbed a bus to the Jerte Valley around three months after my first visit.
It wasn't difficult finding the same spot, but instead of climbing the stone wall I tried to find an easier alternative by climbing up the steep grass walls on the side of the stream. As I was doing this, I saw a shepherd with his flock on the other side of the stream. I waved and continued my climb. Just minutes later I was surprised to find him right in front of me.
--"How did you do that?", I asked.<br>
--"What?".<br>
--"Cross from one side of the stream to this side instantly!"<br>
--"Oh, we have our tricks", he replied.<br>
--"Like what?".<br>
--"Well, for one you are climbing up on the wrong side of the stream".<br>
--"What do you mean?".<br>
--"See the goats on the other side? Why do you think they are eating there and not here?".<br>
--"Errrm, I have no idea".<br>
--"It's because of the sun! Goats ain't stupid like we are. Now, where are you going?".<br>
--"To the oak tree at Prado Sancho. I'm staying there tonight".<br>
--"Very well, do you mind if I walk with you for a while?".<br>
--"Not at all".<br>
What followed was the most helpful chat about hiking I've ever had. He pointed at numerous things which were invisible to me at the time, but proved to be essential in my explorations.
1. You can drink the water of the streams, provided that there are no fields upstream. It is insecticide and fertilizer what renders water poisonous. Yes, some goat shit falls into the water, some people are sensitive but if you plan on hiking it's better to get your stomach trained.
2. Rock provides the best traction for hiking shoes. Good traction makes climbing uphill a pleasure. Less than ideal traction slows you down substantially.
3. Animals make paths of their own, if you look closely at grazed hills you will see numerous streaks. Animals don't have a destination but are smart about moving. If you understand their motivations, you can use their paths to get where you need.
4. A stick will make the hike much more pleasurable.
He told me that the grassland up from the waterfall now belonged to a family in Plasencia. They fenced the land but it was possible to go through. He lamented the fact that shepherds had traditionally lunched under the tree, but now that it was fenced they had to find other spots. He had a store in town where he sold cheese and milk from his goats. I promised to visit it when mis quest was over and bid farewell.
The night was cold and very early in the morning I was awakened by the harrowing howls of male deer in mating season. Never had I heard it before, and my first thought was that a Tyranosaurus Rex had made an appearance. I had breakfast and then meditated under the tree to ask it how it wanted the ceremony to be performed. It told me to drink the tea from the singing bowl and to hike down to the waterfall. I poured the tea into the singing bowl and drank it. I made the bowl sing and then made my way down to the waterfall.
The effect started kicking in as I was coming down the steep grassland walls. The sensory experience was remarkable, I saw the stream much further away and the steepness increased. I felt a tinge of fear which I countered with grunts, as to muster courage. But I felt my coordination failing, and a tremendous irrational fear overcame me. I thought I would fall down the wall and tumble all the way down. I sat down and grasped holding myself to the grass. I was in a state of panic and begun sweating, my heart pounding. I was carrying the bowl on one hand and another item on the other, I put them on the floor and reasoned my situtation:
> I'm in an altered state of mind, possibly a dangerous situation given my state. I have no phone reception to call for help, nor I want to call for help unless I really need it. I can't stay like this, grasping at grass on a steep wall, I need to find a safer place to gather myself.
I grabbed my stuff and head towards some bushes nearby. I was shaking and fear was extremely intense. I curled myself under the bushes and I felt like an animal hiding from a predator. "Shhhh shhhh" I consoled myself by caressing my own arms, but what was felt was like a splitting of the psyche, a gentle human hand calming down a nervous irrational animal. I howled like a deer and then soothed myself, alternating the expression of fear as to not let it build up, and then performing a calming action which would ease out the fear.
I brought myself to peace by this action, but the prospect of moving again terrified me. Unfortunately, an equally irrational thirst besieged me and I knew I wouldn't be able to withstand it under the bushes, so I had to expose myself to the terrifying view of the barranco again. I slowly made some progress down, trying to reach the stream at the bottom, but a slight trip made me drop my singing bowl and it tumbled down to a location which was out of sight, under some ferns. But the last thing I was concerned with was retrieving it, as the trip triggered panic again and I'd have to find a place to calm myself down again.
I saw a tree and thought it might be a better resting spot, and as I made my way to it I heard the tingling of water. I looked down and pushed aside some ferns, there was a tiny stream of water running through! Never had water tasted so delicious, and I drank until I couldn't take in anymore. Then I made my way to the tree and found a flat spot where to lie down. I spent the trip with my eyes closed in a dream like state, seeing all my acquaintances in the form of animals. Some were nervous squirrels, others wise elephants and so forth. The ones I held in high esteem were dragons. I was hearing the bells of the goats of the shepherd in the distance, and they were getting closer. I was unconcerned about it, in my state I thought the shepherd was a shaman himself and that he would give me guidance if he made an appearance, but he never did. His goats, however, surrounded me and looked at me quizzically with their strange goat eyes.
"I'm an animal too!" I thought. "I'm a dog!". I saw a brown, muscular middle sized dog, mixed breed. Versatile in its profession. I could chase mice, rabbits, boars, guard flocks, provide companionship, protect, give affection. I felt a particular pride in being this animal. I growled and barked at the goats, and they went on their way.
The trip lasted some five hours, and after the effects wore off I head back to the tree and found the shepherd with his flock. We exchanged some words and I excused myself, for I was quite exhausted from the emotional ordeal. I slept better the second night, and in the morning I tried to locate the singing bowl I had dropped, but it was nowhere to be found.
I head back to Madrid quite disconcerted from the whole experience, why would a waterfall ask me to come and then give a harrowing experience? I came to understand it as a lesson in irrationality. The panic attack had little basis in reality, I could not think myself out of it, only through finding a calming energy within myself I had been able to both express it and soothe it. I gained a very valuable insight: irrational fears are not quenched with rational discourse. Underlying our sophisticated rationality is an animal who has its own inclinations.
Months later I realized it hadn't rained in a while, finding my bowl again could be quite trivial if the vegetation had dried out. It took me weeks to convince myself to go again. I was resentful at the place for playing a difficult switch-a-roo on me, but I thought I ought to give it another (now sober) chance. It was amazing.
I found the items almost immediately. I slept in the open, under a moonless sky, and the milky way was stunning. I found a beautiful place to meditate. I felt connected to the cosmos. Psychedelics were clearly obsolete in my personal development. It all came together: the place asked me to bring psychedelics so that I could contrast the experience sober.
<img alt="IMG_2840.jpg" src="https://method.ac/writing/uploads/IMG_2840.jpg" class="mt-image-none" style="width: 100%" />
Skin Tone
The past summer my Mexican passport expired and I went to the consulate to renew it. After handing in the required documentation, they made me sit in an office with a bored beaurocrat who handed me a form to fill in. One of the questions set me aback:
It asks the color of your skin. The options are:
- Light brown
- Brown
- Black
- White
- Yellow
- Pink[ish]
—"I'm not sure how to answer this question, what skin tone do you think I am?", I asked, hoping to get a conversation started on why this was even asked if it doesn't appear on the passport.
–"just tick whatever you identify more with", he answered with without taking his eyes off the monitor, with a tinge of annoyance. He surely wanted to be done with me as soon as possible to get back to playing minesweeper on his legacy Windows desktop, and I knew my grudge wasn't against him personally, so I didn't press further.
In Mexico your skin tone has social connotations that go beyond your visual appearance, so ticking these boxes feels more like placing yourself in the social hierarchy rather than describing your visual appearance. And, as the answer is utterly useless and subjective, the first inclination is to protest.
But I knew it would be of no use. I ticked off pink[ish], in part because I was slightly sunburned from the hot Spanish summer, but mostly because I could not shake the feeling I was making a hierarchy assessment otherwise. I went back home and stared myself for a long time in the mirror.
Why was this question so difficult to answer? Hy hair and eyes are light brown, for sure, I have no trouble identifying that. But I look in the mirror and I don't see a white person, even though most people in Mexico would identify me as white. But I was in Spain, and here I would be a bit "moreno", and in Canada (my country of birth), I'd be tanned white dude.
It is impossible to describe skin tone without resorting to an implicit context. Should a truly white or yellow person show up to renew his passport, they'd probably suggest seeing a doctor instead. I've seen Spanish people bake themselves to brown in the sun, yet nobody would describe them as "marrón" (brown). We say people turn red, but if that really happened I'd surely think he's being possessed by the devil.
Throughout these work logs I've noticed a pattern: in states of mania I hallucinate visually before falling asleep, and in states of depression I hallucinate verbally (I hear voices).
I was at David's and Monse's apartment in Mexico City (I am here right now IRL). In the morning, Monse went out for a run with Veruka, and I went downstairs with them to bid them farewell or some other reason.
When I came back up there was nobody home, so I went into my room and smoked a joint in bed. I repeatedly told myself that this was smooth weed and it wouldn't leave any odour.
> It is a disgrace to grow old through sheer carelessness before seeing what manner of man you may become by developing your bodily strength and beauty to their highest limit. But you cannot see that, if you are careless; for it will not come of its own accord.” (http://perseus.uchicago.edu/perseus-cgi/citequery3.pl?dbname...)
It's not the time of the morning you wake up, it's the time it takes you to spring from bed into action.
But how is one going to spring into action, if one can't find a reason to get out of bed?
What gets you out of bed? There seems to be a spectrum, let us list it.
What gets me out of bed*, from dysfunctional to functional:
1. Threat or danger
2. Routine
3. Obligation
4. Boredom
5. Commitment
6. Duty
7. Motivation
8. Inspiration
* Discounting bodily function
I think it's valid to aim for eight, don't you think?
People think they must choose one single thing to chase their entire life, so they may say "my reason to get out of bed is to become rich", and great many have squandered their lives in this way. But the same can be said out of anything that doesn't come out of a deeper inner understanding.
One's reason to get out of bed can be transitory. It can (and often should) last one day. For example: I must pick up my mother at the airport. But _normal days_, one ought to open his or her eyes and think _Ah, this is why I'm doing this, let's get started".
I was in a mall searching for something I had to buy. I came out of the store and to the stairs, which went downwards. Instead of stairs it was a steep ramp, which had a right angle turn at the middle. Though I understood this meant to be an accesibility feature meant to be walked, I sat down and slid, accelerating at a dangerous pace. When I reached the turn I flexed my legs to "land" at the ledge.
A teenaged girl behind me did the same thing as I did, but landed with a thump. I hoped that she didn't get the idea from me, and was afraid that she might have hurt herself, but was relieved to see that she was unharmed. Behind her, her friend did the same thing, but instead of landing on the ledge she jumped over it.
I asked her if she was OK, to which she replied "I did it on purpose"
Procrastination
How to choose what you wish to work on yourself
We have a single mission, this mission changes throughout life. Do not attach to your life mission, but treat it as such.
My mission is to help others help themselves.
The project which channels the actions towards this end is the V.
To learn how to help others, first I need to learn how to help myself.
Where do I need help at this time?
1. (resources) I need to find sustenance for myself. Make enough money to continue my work.
2. (status) I need to end my isolation and engage with the world, both virtual and in real life.
3. (reproduction) I need to become a better animal, make gradual steps towards being able to act upon meeting a potential life time partner.
Now that the depression is resolved, it is time to work towards these things, which still are at the next stage of development. Let us resolve conflict where conflict is felt.
RESOURCES
I believe that the less I consume, the less I harm the planet and the less "space" I take up. In the past I justified making money through zakat, but then I painfully observed how the money became useless consumption. The resources that I have stored are enough to figure out how to proceed, and thus, fortunately I am not in a desperate position. But, what I usually do to overcome these kind of blocks is that I wait until the last moment so that I have no other option than making money. A sure sign of wisdom during this period would be not to resort to loans as I did last time. This is a true cognition.
It is possible to accumulate resources without damaging the planet. The secret lies in this: resources that are converted into status (material possessions meant to show off) come from vanity, anything else is either neutral or virtue. But, in order to cognate this into true action, I must find a better motivation other than the removal of the innaccurate belief. Why is it that I would wish to accumulate resources?
One is in preparation for parenthood. But since I don't see a lifetime partner in my horizon this does not motivate me much. Travel has taken a secondary seat at this time, I'm deeply engaged in work and I don't feel much need to explore the world at this time. I can wait for my stock options to convert. I've found it, and I've thought this many times before:
Though I've always believed that the business of money making is what compromises virtue, the opposite is also true. Money saving also compromises virtue. "I shall make the best use of my time possible" becomes "I shall go clean Prosperidad in order to save more money". "I will buy this hungry man a meal" becomes "I hope he finds something to eat", while turning my eyes away. I think this is the first time I've worked it out: money saving is also a morally challenging terrain, just one where I feel more comfortable. How to accumulate resources without selling your time, liberty or values is high virtue. I'm currently selling my time and my liberty out of my avoidance of money making. The virtuous path is that of resource accumulation while avoiding compromise, but embracing constraint.
STATUS
I believe that my isolation helps me keep my focus. I believe that most people are superficial, or that they are deeply engaged with their own nightmare and they would like some company inside of it. I think I wrote this because it rings true to myself. I navigate great storms alone in my boat. If only I had someone with whom to share the burden. But this cognition is flawed. Though to frame the problem as "how do I obtain status" is completely wrong and against the Tao.
My intuition tells me that status is gained through deep flow, but I know not how to make the cognitive leap. Allow me to build the bridge: I have felt that I shouldn't involve anybody else in my work, because my work is sacred and allowing unvouched hands to touch my work is to introduce corruption into a labour of love. Who, in my mind, approaches work like this and yet is high status? Only true artists. True artists are who they are, unapologetically. I have great trouble displaying myself. I prefer to pass inadvertedly, hiding my eccentricity until I loosen up.
I need to work this out first: what is status? is it being above or below others? Certainly not. That definition of status needs to be transcended. Status to the eyes of god? God considers all his children equal. I must not puff myself as this is a source of peril. How does one obtain status in true humility? Without seeking it. Ah, now I see the direction of the intuition. It is good that I shun status, because the desire for creation is greater. Because I have evidenced how status improves wellbeing, but the act of status seeking is a very ugly spectacle, these two are in conflict. And thus, in avoidance, I have hid in isolation not wanting to play the game.
The game, then, is played by not apologizing for whom one is, nor it's opposite, propping oneself up. The highest status is to be deeply engrossed in life effortlessly. It is the girl who loses herself dancing at the nightclub, the engrossed academic at the library, the engaged conversationalist at the cocktail party. Relaxed yet deeply engaged in what one is doing. Though, at this time, nobody is to admire my relaxation-engagement to the computer, it is from the result of this relaxed engagement that status will be obtained. As the cognition feels intuitively true, let us completely drop status seeking and have faith that relaxed concentration will result in natural status.
REPRODUCTION
With the dis-satisfaction that comes from the accumulation of libido, comes conflicting emotions: the desire the find a sexual partner, yet the knowledge that it would be unwise to do it now. I have tried the transmutation of energies, but there is a conflict of interest: I must not transform my sexual energy, I must channel it in the direction of reproduction. My faulty reasoning is this: I will not speak to women because I do not want to get sexually involved with anybody at this time. It is the same reasoning that people apply to the gym: I don't go to the gym because don't want to get too muscular. It is a way of justifying to myself my avoidance.
I thus challenge myself: at least once a day, any woman I see that I think "Yeah, I would get laid with her if I had the chance", I will approach and ask a useless question: "excuse me, do you know where is an estanco?". Even this causes hesitance. I see, if I avoid this task, I will step back and begin asking anybody on the street. Because my fear of beautiful women is preceeded by a generalized shyness that might need some work before tying this task.
At various times I have intuited that it is important for me to choose my life partner. Though this sounds like totalizing thought, it is not quite that, a great many of my partners have been people who have chosen me, and I play the receptive role when this happens. I become the supporter, the listener, the recipient of love instead of the giver of love. The fucked instead of the fucker. The passive and not the active. This happens because it is the other person who demonstrates agency.
I see: it is possible for both people to show agency. It is not necessary for me to be the one choosing, ideally it would be choosing each other. Yes, it has become clear now: I will not marry into somebody whom I feel chosen because it implies a flow of will into me, not me either flowing into another person, or (ideally) the combination of two great clean streams into a crystaline river.
The best option, then, is to seek awesome chemistry. I believe I give off good vibes (probably not at this very moment), but as the woman whom I found in Alicante, I could only feel her energy when I asked her the question (and basically instantly fell in love with her). Ah, though I knew in my heart that she was not for me, I fell in love for the day and it felt beautiful. Here lies the secret of inner work.
CONCLUSION
I come to the study hall after a binge of pot smoking at home. It always seems strange: why do I do this to myself? If the world is experienced as a bit of a nightmare in this state, why is it that I still seek these things? I see my addictions in sleep: they come feeling inevitable and perhaps it is even healthy to allow the addiction to take possession, for these are moments that are meant to be experience with great humility.
I know, from experience, that writing under the effects of your master is useless, and yet here I am, sitting stoned at the Study Hall. I opened Sublime Text, but then remembered the promise I would make to myself: to never touch the code when I was high, as this would cause corruption. I take a peek at the code, and though I may not touch the code, would it corrupt the product, to think about it while stoned? Indeed, pot induced flights of fancy demonstrably don’t take off. Indeed, once should not get stoned in pregnancy.
And so here I am, trapped in my mind, with narrowing possibilities of thought. I cannot write about addiction, and I cannot think about the virtuegraph. What can I do? And the topic circles back to addiction. I shall allow myself to look into the experience from consciousness: how to describe the experience, what is is that I find here that I do not find when I am sober? I shall describe the circumstances:
I am at a study hall, of modern architecture. I feel comfortable here, I have been coming often, and usually bring a thermos of tea and soberly code what I am producing at this stage of my life. I sometimes cause myself these dramatic shifts in conscience, I come to suspect, is to be brave enough to confront the world in the form of adventure. I see this person is more akin to the kid, painfully shy, receptive to the fault. A beautiful student just came to sit close to me, she is wearing the kind of blouse that I like. I take notes of where my attention goes without judgement. Let us experience the focus of attention.
Can one control the direction of attention? I would have answered in the negative before meditation, but now I see it as a question of focus. Focus is simply placing your attention at a single point of existence, and this is best accomplished through meditation. Let us escape this “living nightmare” sensation of pot induced paranoid thoughts, and to come into reality.
I breathe in, and I feel my lungs constrained, allow us to find the best position to write. Endless procrastination is pot, but these things are useful for the person who works sober, so allow us to use the increased “inner world” to investigate into it. Yes, I can think about this, there is not harm in this exploration.
I sit straight, my neck always cranes down, I could go get my aliminimum support, but I know it is useless. The endless tweaking of one’s workplace is a trap which I know. What can I do, with the things I have. Relax the shoulder. Close the eyes, there is no need to see what one is writing. Editingwill come later. I listen to Spanish music in the background. I was enchanted by Paco de Lucía, and then came to see him play Dos Aguas with his eyes closed, deeply focused. “There is flow!”, this is where we ought to be all the time. I have opened my eyes and the rush has flowed away. I am back in state of no-flow. Allow us to see what slides we have to continue thought.
I become aware of my legs, my legs are curled underneath my chair. It strikes me as a rather gollum like position. Let us plant feet on the ground. Feel the energies come up through the floor. Your feet are connected to a living Planet. A living City. A living Building. A living Room. A living Person. In this fractal of livingry, I am the last expression of consciousness, because everything that precedes me collected itself in the wisdom of humanity, and thus the fractal into which I project myself becomes infused with earthiness. Shall I come into the Shamanic experience to explain this? If I come into a deeply personal aspect, I will need to put this off limits for publishing. It is already perhaps. I’m guessing only an older, sober person can decide of this should be published, and that I give myself the liberty to write about the freedom of the heart.
Indeed, let us go into this aspect of living, how can we accomplish freedom in the heart, so that we accomplish freedom from what enslaves us. I look in the heart and it aches, I am still healing, for I have an underlying sense of pain. There is no reason to have pain in existence, but even my back feels tense, allow us to come deeply into relaxation. There we go. I breathe with my stomach, and continue the train of though. It is 16:26, and I will have to receive visitors soon. I will have to go back home and perhaps I need to prepare anything? Yes, I had to tasks:
- [x] Let Alberto know about the free days
- [x] Answered whatsapp messages
I was thinking, perhaps a better technique would be to write about the philosophy of action while stoned. Indeed, the philosophy of action must be confronted by it’s nemesis, because as of late I come to smoke and do nothing but lazy about while thinking my supposedly sophisticated thoughts. What non-sense is this. I am an isolated human being, I am, I am, the ego complains all the time. I am the awareness, but what relation should one keep to the ego? It is a little child, we need to allow it to play while sober, not enough play is provided. This is true. If all action is play, the purpose is not capacity but enjoyment. How will I come to enjoy that which is what I’m doing?
The students ahead have gotten distracted and are not helping in concentration, though they are beautiful and a blessing to all of existence, what beautiful mandalas does the world provide to us. The capacity for beauty to take our problems away, and to immerse ourselves in experience should be appreciated. Everything that is flow is sacred.
Action. I shall come back home and pick up the package for Prosperidad. I would like to fix that goddamn window, and it seems that the hot season has begun, so we must allow ourself to fix the windows of the airbnb apartment. Jordanka lands 21:14, I estimate she will arrive around 23:00. So I have plenty of time. I have my last joint waiting for me at home, and I now that shall be smoked at a victory joint for a good day. So this is action:
- [x] Go pick up the prosperidad package.
How to maximize experience according to the virtuegraph conventions. Allow us to close our eyes, and to come to investigate what is is that we can find about our normal commute back and forth from home to the study hall. To find the micro improvements that one can incorporate into life. I see that there is a jumping park under the bridge, but that I seldom go there and do anything. Even a couple of bars is fine. You don’t need to do all exercise, but you need to add some oxygen to the brain, to pass the effects of pot and the laziness induced.
- [x] Do at least a couple of bars before going home.
I was thinking to myself: perhaps I ought to register how much time it takes me to come back home, but this information is useless, it depends on the traffic signals, and I’m not going to be running around in order to save time. Let us simply go where experience is maximized.
- [x] Write about the next steps as they are done.
I am actually enjoying this form of experience, it is like when I had my journal and I would come to dump my consciousness as it happened, no judgement. I will accomplish these tasks, and then come to write about it again, and in this state I can reflect on the experience and not worry too much. I have five hours starting now, until the guests arrive, I shall be sober surely by then. It is time to leave.
I came for the propsperidad package,
I did NOT do at least a couple of bars, this can be explained,
And I am writing about the next steps to be done.
I have served myself the tea which I forgot to bring. Allow us to taste it. It is black tea. It is bitter. It has an unpleasant flavor, which I think comes from Stevia. The Stevia bottle costed 2,5Euros, rather than ruin my 5eur tea with it, I shall forgo it in the future. Be more aware of Flavor. But this is Future Work. Allow us to make the list:
Experience flavor Let us see that we add notes each day
No, not here, a virtuegraph needs to be built, it shall be a simple table, indeed. I begun building my virtuegraph, but I need my application to actually do this.
- [x] Spoke with mom
Actually Mom called me, but I put this as “spoke with mom” as it is virtue and comes without effort. We must not associate effort with virtue, it is quite the contrary. We don’t “work hard” we “work smart”, putting effort where it is most important. I breathe and I feel a contraction in the brain. I get this when I smoke pot, and I like to think about them as muscle. I have been doing kegel exercises, and it is somewhat akin to discovering parts of the body which were unknown to you. The brain too, contracts itself as a muscle, and though not thought pass through it, it expunges the thoughts that are not useful, separates the wheat from the chaff. No cleverness in the approach.
All I need to accomplish today is to have the prosperidad apartment ready. I can take my computer and keep on this activity stream, as it is interesting. I was seeing double with my left eye upon coming home. I was completely weirded out by the experience, for I did not experience it before going to the study hall. It seems to stem from dryness of the eyes, the residue of pot smoking, for as it dries the mouth (which has been ameliorated with the tea), it also dries the eyes. To be able to see clearly again, seems to be a worthy goal:
- [x] Recover my vision
I did not have any sort of eyedrops, so I simply used water. I this enough? it seems not, but there is little else I can do about it, so I shall accept it. 5:50, let us say that we desire to be there between 7pm and 8pm. Let us see the time at which the hardware shop closes:
- [x] Find at what time the store closes
But I seem to be unable to get google. Ferretería closes at 8pm, so I need to arrive, take the handle out, and bring it to the store. Let us put the limit at 19:30pm. It is 18:00. That is one hour away. I find myself thinking I might find it more fun if I smoke now instead of later, these thoughts they tempt me at each step. That is why I don’t like keeping pot around, I cannot control myself and I feel stupid for it.
But there is no source of conflict, it is conflict in the un acceptance of this reality, the avoidance of conflict is what brings me here, to this state, so that I can notice there is nothing wrong with reality. Spain is a beautiful place, very unique mandala, which is healthy.
I see that I left a bit of a mess in the kitchen since the morning, I shall use this spare hour to clean this house, so that I can go and proceed with the house in Prosperidad. For how dare one go clean another person’s house, and not keep his own in the utter most organized state. How dare one have the room of a stranger better prepared than his own? Well, let us not get high on the horse, stop writing, putting everything in it’s place for at least 45 minutes, and then leave for prosperidad. This is god’s will.
- [ ] Pick up what is out of it’s place.
I was in an Oxxo with my friend Rabetzi, sitting on a bench. The place looked like a school cafeteria, with lots of young people sitting and eating on long tables.
Rabetzi went up to the counter and I followed him hesitantly, as I wasn't carrying any money, but I was hungry. There was an old peperonni pizza sitting directly on the counter which looked greasy, flat and old, and others within glass enclosures which were puffy, hot and appetizing. I was hoping I would not have to eat the old pizza.
Rabetzi started joking with the attendants, two older women who were delighted with his vivaciousness. He grabbed a bottle of habanero sauce and squeezed it upward, getting sauce all over me. I wiped it off submissively, as I wanted Rabetzi to pay for my food and I couldn't stand up for myself.
One of the women asked Rabetzi how many years he thought she was, "76" he said, and I protested: "No, she is much younger", but I didn't want to push back, because again, I was wanting to be a sidekick so that he would invite me the Pizza. The woman looked dejected at being guessed such an old age.
I wanted to say she was fifty-something, but then I detected a bias: I was really estimating thirty-something, but I didn't want to offend Rabetzi. I looked closely to make an accurate asessment, and in a matter of seconds her hair went white, wrinkles appeared on her face, and the uniform she was wearing disappeared, and her body went from firm and rounded to wrinkled and saggy.
She served me the old pizza and charged me a 18 pesos, which I was carrying in coins. She gave me back two of the 5 peso coins and told me they were two peso coins, which had the size of the larger denomination but the number of the lower denomination, and the copper colored inside was off-center.
I tried swallowing one of the coins, but I choked and spit it out. I read a notice that said that any coins which were multiples of 2 and any bills which were multiples of 64 would be accepted as payment, but only if you swallowed them.
The experiment is simple: try to get exposed to early sunlight, preferably shirtless. The sun seems to dispel the groginess of the morning. The proof is that [[Nina]] does this by nature. She goes out to the front-yard and catches the first rays of the sun.
It can be as simple as a walk in the morning with a stop at a sunny spot, but it is necessary to expose body parts which are not usually exposed to the sun. The feeling of white flesh baking in the sun is marvelous.
If one is to meditate under the sun, one should meditate about [[The One]], as one meditates about [[The Duality]] under the moon.
In the existential crises one understands the dimensions of one’s existence in the scheme of things: one is a microbe on a meaningless rock which circles an unremarkable star in a medium sized galaxy, not in any way special from the billions of others galaxies. Why then, I give so much importance to my own life? Such a vain thing to search for purpose in my life when my life is incomprehensably insignificant. An ant has a more significant life at a globe scale than I do at a universe scale.
We think in this way because we identify our life with our biological functioning. Look inside and you will find the fundamental laws of the universe. You need no-one to point you the way, you simply have to meditate on it. How is it that, through deep concentration and unexplainable intuition geniuses can find the fundamental laws that govern the universe? It is consciousness itself which is composed of the same matter as the universe. Your representation as matter is incredibly limited, but your soul contains a universe in itself.
These things cannot be demonstrated, and though all spiritual paths contain essences of it, they are not taught, because they are not understood unless one has embarked and seen things through his own eyes. What justice should I do describing foreign lands, when they are one sitting session away? These things ought to be explored by each one of us.
A deep skeptic mind is necessary indeed. But openness too.
A psychology professor once mentioned something that seems a profound truth: when we find a song that says exactly what we feel, it is not that the author has put our experience into words, it is that we really didn’t know what we felt until we heard the song and anchored it in language. In this way, your own exploration is sacred, and you shouldn’t delve too much into spiritual literature, but attempt to work it out yourself. If you could experience romantic love for the first time without the bondage of experience, how would you honor it? This is a chance to fall in love for the first time with the divine. Honor it.
Follow the signs that life puts in front of you. You continually sabotage meaning in your life. Begin with things that are small, see what happens. Some symbols are dead-ends, others open up new doors. Some doors are not interesting at all. But the exploration itself is what brings practical meaning. Soon enough life becomes inundated. You continually satisfy your own self-narrative of a meaningless life. It doesn’t have to be this way.
The ten thousand things are all the things of this world, material and immaterial.
Everything is an instance of the great master.
There is a beauty to most things.
Those that are unpalatable are decisions of morality,
But indeed: look closely to the eyes and ask,
is this person beautiful? Without regard to his or her sex or age.
See? A ten-thousand-thing-thought.
Let us go to sleep, the ten thousand things will call upon us tomorrow.
My father was in the hospital for a bone infection that resurfaced from an accident on a motorcycle decades ago. I was living in Spain, but had the fortunate coincidence that I would be visiting for winter holidays, so I got to spend time with him in the hospital. He had surgery and was in his usual equanimous mood, and we enjoyed time working together.
I was exploring some old family wounds, and I debated if this was a good time to bring it up, but a psychologist friend of my dad whom was his mentor had just visited him, and made me know this was the time to address it. She said something along the lines of "you never know when you will have a chance to speak again, so say what is important". After she left I told my dad "by what she said I know this is the time to speak about it, but I was hesitant because of your illness, and this may not be a good time for you if you are recovering". My father assured me that it was fine, that we could speak without delay.
We spoke about the issue I was carrying, and his entaglement in it. Everybody, men and women, have "daddy issues", and I am immensely fortunate in having a deeply spiritual and wise father, so we were able to resolve these issues together in the space of perhaps two hours speaking. Of course, release is not immedate but you leave with homework to do, and he pointed me in the direction of the Akashic records.
He gave me a name and a phone number, and said that he would pay the session. I've always found Akashic records disreputable, it amounts to little more than a cold reading, prodding through your reactions to navigate your inner landscape. So I was very skeptical of the process, but I wanted to try it anyways. Everything that is new, teaches.
I made an appointment with a friendly lady who answered the phone. Yes I know your dad, we're friends. Yes, I would love to read your Akashic records. Here's the address, see you soon bye.
I googled the address and saw a small, one-story humble house. My mind conjured the interior in the style of Andalusian gypsies, but this being Mexico it would need more //santos// and altars. I was wanting to hate the experience before having it, and so I expected nothing but perhaps some insight following up on what is a clear spiritual task which I would have not pursued on my own calling.
On the day of my appointment I arrived at the place, but found that the number I had seen on Google Street View was wrong, it was the house next to it. This was an elegant and well-kept middle class house, and suddenly I felt my entire perception of the events shift: if this person can make such a good living reading Akashic records, then it must be good for them and good for others. I had a sudden leap of faith in the process, and hurriedly rang the bell.
After explaining I had an appointment and I was looking for X, a lady informed me I had the wrong address. The fantasy projection I had created based on the home I had seen
---
thinking it would be a cold reading in which my own reaction would direct the reading at the "seer's" navigation. And so I was unwillingly set to prove that I didn't want to disclose much of myself in order to see if what she told me was
and—now that I remember it—I notice one should allow oneself to be "navigated" by the seer. The ego-problem that happened to me was that I wanted to prove that she could not read me if I didn't want to
I was vacationing in a small town in Mexico. I came across a priest who was making a speech at the town square, surrounded by younger crowd. I came closer and I heard him explaining about the yearly pilgrimage: three consecutive days of walking, each day in a circular route, where we would come back for an examination in which we would write an essay. I was ecstatic to take part in it, and when I came back I wrote a very inspired essay.
The next day, however, I hung out with the wrong crowd. They were the "cool" guys with the alternative girls, and they took a long time on the walk, mostly fooling around and complaining about the length. We came back into town quite late, and these people didn't want to do the examination. I reached the church where it was taking place, but the front door was closed. I supposed the examination was over, and dejectedly worked my way through crowds to get back to my alternative friends.
On my way there I saw an exotic character dressed in drag upon a lectern, he was the host of a fancy restaurant and he told me that there was a side entrance to the church. Even though it was too late, I wanted to explain to the priest what had happened.
I went to the side entrance and I found most people still busy at their exam. The people in the examination had a very different energy: they were happy, involved, and friendly. But as I came in, the priest told them time was over, and they all begun exiting the building. I caught up with the priest and excused myself for being late. "Don't worry" he said "you already have 10". I was a bit disappointed because what mattered to me was the essay, not the grade.
They alternative guys joined the crowd. I saw a girl with tattoos whom I liked who was flirting with one of the cool guys. I had a moment of conflict: if I joined the "cool" people I could hook up with her. We walked together a couple of steps when we encountered a scene with two young men kissing. I looked around to see if anyone was disgusted, nobody was, not even myself. I looked closer at their faces and knew that the men were not actually gay, they were just fooling around. Then I was disgusted.
A neighbor from Puebla needed me to give him back something that I had borrowed from him, but he wasn't going to be at home, we was going to be in a neighborhood near Moncloa, in Madrid, and he needed it by 9:00AM. I thought it would be difficult, but not impossible.
Then I found myself biking up Princesa Avenue and I turned left, reaching Moncloa station. I reached for my phone, but I noticed I wasn't carrying my backpack, and my shorts didn't have any pockets, and I begun to regret not having the foresight of packing my phone while trying to reach an unknown address. But I patted myself down and felt a rectangular bulge on the side of my hip, my phone was lodged in the elastic of my shorts.
I begun suspecting this was a dream, because nothing seemed to make sense, so when I pulled out my phone I looked at it closely and weigh it on my hand with up and down motions, it felt like reality. I squished the phone and it didn't bulge, it felt cold and solid. "Well", I thought, "if this is a dream and the interface works, it must mean I'm the best UI designer in the world, because I can imagine an operating system interface". So I pressed the power button and the interface came alive, exactly as how it would in real life. The time was 8:55. As my home button doesn't work, I used the assistance UI which revealed itself exactly in the way it does in real life, and I became convinced this was not a dream.
I opened google maps and zoomed into Moncloa, I looked closely and saw that Princesa was not coming from the south, as I expected from reality. It was coming from the east. The labels began jumbling and the map rotated and then I woke up from the dream.
I was walking in an open mexican marketplace //tianguis//, I saw a very poor woman selling spare cigarettes. I wanted a smoke, so I reached into my pockets to find spare change. Instead, I found a pack, but no lighter. So I deliberated how much lighting my cigarette was worth, and I concluded it was three pesos. I handed the money to the woman and lighted my cigarette, but she gave me the money back saying it was not necessary.
I was resting upon a meadow in a forest when a female presence came to me. It whispered:
--"You are dead". <br>
--"How is that? Am I in heaven?"<br>
--"No, he said. You are already revived, but you exist only in what you would have called digital form".<br>
--How long ago did I die?<br>
--Your material form faded away five million years ago.<br>
--That's... that's impossible, the accident was a moment ago.<br>
--Everybody says that.<br>
--So the Hindus had it right and everyone is reincarnated?<br>
--Well, not exactly. Not everybody is reincarnated.<br>
--Oh that's a relief, there's so many assholes I wouldn't want to meet again. You surely don't reincarnate the assholes, right?<br>
--I'm afraid I wouldn't be here speaking to you, Mr. Smith.<br>
--So it's not virtue what brought me here. What was it then?<br>
--Your creativity.<br>
--Pffffft come on! I didn't know they were such ass lickers in heaven!<br>
--Mr. Smith, we have come a long way from your times, once reincarnated you will be introduced to a society very much different than your own.<br>
--So you're all prudes! You can lick my ass too!<br>
--I'm not grouped with _them_. They are not prudes, they don't waste time in trifling conflict. They are very straightforward people now, Robert.<br>
--I respect that.<br>
--Yes, we have important matters to attend. Here is what happened: after your death, everything your published online remained archived in a layer, not unlike geological layers. A bot collected all your photos, videos, texts, and other crumbs, and then the master computer modeled a consciousness that would be capable of producing what you created in your lifetime. We have refined the process through the years, but we still need a considerable amount of creation in order to reverse engineer the consciousness.<br>
--Oh, so it's like I'm modeled after my photos and my writing and...<br>
--I am not getting through, Mr. Smith. We recreated a consciousness that would be capable of producing the same things as you did. You are what you do, and if what you do is registered, we are capable of recreating it. <br>
--Have you recreated Jesus?<br>
--It was in the scriptures, wasn't it?<br>
--Are you Christians now?<br>
--That is for you to discover<br>
--How can you ask me to step into a society which I do not know?<br>
--Look, Mr. Smith. Not everyone can be recreated. All those who used their time consuming TV shows, music, books, literature and even learning is useless. We need evidence of your thinking in order to recreate you, and unfortunately from your period, a lot of souls are missing.
--But what about the pre-digital era?<br>
--Well, almost every author, artist, musician or scientist that you can name from history has been resurrected. But the vast majority of people from before your era left no record, so we could not recreate them.<br>
--Just let me know something: are we still on planet Earth?<br>
--The answer is irrelevant. Look, you don't have to make the choice now. But look around you: this place is empty, what do you think that means?<br>
--Hmmm that everybody prefers the material world than the digital one?
--That's right.<br>
--But you're hanging out here aren't you?<br>
--Oh I enjoy silence and solitude.<br>
--And you greet newly spanned souls?<br>
--I do<br>
--Can I be your assistant?<br>
--You would really prefer to be in the material world, Robert.<br>
--I'll tell you what: just let me greet the next soul to span.<br>
--That would be unwise.<br>
--I'll just follow your script, it's kinda fun.<br>
The female entity turned inside out for a moment, and came back with an answer: yes, I would be able to do it, but just for the next soul.
When the next soul appeared, I grabbed him by the shoulder and told him "Dude we're fucking dead!". The soul appeared shocked. The female entity just remained present. I understood: she already knew I would do that. She knew not only that, but every branch of every decision I would ever take. Almost incapable of moving I manage to step aside. The angel comforted the newly rebirthed soul.
The scene faded away and I opened my eyes in this new world.
I was in a booth inside something akin to a medical amphitheater. Through the windows I could see ugly demon-like creatures thrashing about. Someone explained—or I already knew, that these creatures had been human beings who were transformed into demons by childhood trauma.
One of these demons had been my yoga teacher. I observed her attentively, and I saw that wings sprouted out of her back, and she begun flying in the confined space of the amphitheater. But she was not a flying demon, she had transformed into a dragon, and as she let out a scream the demons below here dropped to the ground, unconscious, and slowly each one of them reverted back to their human form, and then regained consciousness, confused about why and how they got there.
The divine spark is a metaphor for the window in which individual consciousness exists. The metaphor refers to our common origin, we are consciousness that comes from a larger source of consciousness, and when we separate from this larger source we only then come to experience ourselves as individuals. It is said that the infant knows know boundaries between himself and his mother.
Suppose a child is being carried in a bundle on the back of her mother. The child peeks out, and sees a small dog which arises her curiosity. The child wills to move closer to look at the dog, and shuffles inside the bundle trying to get there. Her mother, perceiving the willness of her child to approach the dog, yields to her movements. To the child her whole being moved as one, her mother is part of herself, and when she is not with her she feels incomplete.
An older child would tug at her mom so that she pointed at the dog, even if non verbal, the parent has become separate from the child's experience. This we understand very well, the experience of the baby not so much. I should brush up on developmental psychology if I wish to avoid building upon shaky premises at something which is not logical, so let us drop this line of reasoning.
These things are awkward to explain by reason, because I must separate myself from embodying the divine spark in order to describe it. Perhaps if I try to come into it by means of focusing the breath, but not at this time.
This is terrible but I intend to rewrite it. How should I tag this? Rewrite for the time being.
_or why I avoid the _I_.
This is the only article in which I will not avoid writing _I_. It would simply be too awkward. When attention turns towards it's thinker for enough time, once notices that the thinker is in reality a psychological entity which exists only in one's mind. The "I" is an illusion of consciousness.
What to do with this? Legend says that you are meant to kill it. I've tried numerous times, yet I admit my failure. I've come to terms with the thinker: I'll stop trying to kill you if you behave properly. Don't go around seeking attention or validation, stop calling "look at me!" as a child would do, and do not scheme and seek favour from others.
My higher self lacks all common sense. It assumes everything he's told is true, that all people have good intentions, that you must love your enemies. I am blind, yet I seem to have a guide dog who notices the crooks, the pretenders, and those whom soul is corrupted. If the ego weren't useful, nature wouldn't have provided consciousness with one.
Yet, as we lack senses, we tend to think _we_ are the dog. We see, hear, smell, taste and feel through the dog. This is the animal part of human nature. But we must also know there's a higher consciousness in charge of it. Some of us grow vicious it when it misbehaves, kicking or screaming at it as we'd never do with any other person's dog. Others allow the dog free reign, it can shit eat and fuck whenever it pleases, the owner being pulled around by it.
There are some people who seem to have a naturally good relationship with their dog. The dog knows where and when to play, protect, eat, have sex, and do all those things mammals do. These seem to arise either from loving well-structured families, or from lucking out at the doggy lottery. But most intruguing to me are those who, through great effort and patience, have come to form a good relationship with their animal components.
My own dog is the kind dog who stands on his hind legs and makes a sad face hoping that you pet him. Many of those who write on Medium have dogs like this. In my attempts to educate my dog, I instruct him to get off of you in his intentions of seeking attention. My way of doing this is avoiding the use of the word _I_. However, in my experience attempting to educate my dog, some experience is gained, and to transmit it instead of using "I", I refer to him as "your servant". I came to this through my Mexican upbringing where we say _su servidor_ to speak about ourselves from a humble standpoint.
Though these intentions come from
The neighborhood had flooded and I was walking around inspecting damage with Margaret. She said that it was strange that some of the lower houses had not been flooded, while some of the higher ones had. We walked alongside the river and I was surprised to see that the river was now crystal clear, but as we passed behind some houses we had to cross streams of polluted water that dumped into the river. As we crossed one of these small streams I accidentally took a gulp of foul water, and was worried I'd become sick.
We eventually reached a very nice house which was undamaged by the flood. We sat at the dining room which was was a sort of open air terrace, and other neighbors joined in. The owner of the house was a famous feminist lady who was traveling at the time, but Margaret told me it was fine because they were women, and thus had permission to be there and they could extend the invitation to other men such as myself. I was annoyed at the gender-centeredness of the whole thing and asked her the name of this lady, but she refused to give it to me.
I entered the green bathroom and it was quite clean. I opened the toilet lid to find that it was filled to the brim with diarrhea and the edges with nuggets of shit. I was disgusted and went to the kitchen to fetch a rag to clean up.
In the hallway my mother had hung up some old canvas cloth which acted as curtains. I thought it looked shabby and grew angry, I heard my thoughts of recrimination "my mother still doesn't respect my aesthetic sensibilities" or something along the lines.
I made it to the kitchen and found many rags. I sniffed through them, trying to find the ones that most stunk of old humid rag, but they didn't seem to have any odor. Finally I decided on an old one, and went back to the bathroom to clean up.
An ancient race of people had written in their sacred book that they ought to inhabit the highest shelter in the highest mountain. They climbed a up the tallest rocky mountain known to them, and found a shelter. They furnished it with all kind of comforts and called it home.
Out of curiosity, a young man climbed up a difficult passage to an unknown side of the mountain. On this side, he found a shelter at a higher place. He came down excited to tell the elders about his discovery.
The most progressive elder said "the shelter you describe sounds much like a cave further down the mountain. I am sure you are confused, and you thought you were ascending, when in reality you were descending."
The most clever elder said "The scriptures say that we must inhabit the highest shelter in the highest mountain, but it does not refer to altitude, but to comfort. Thus, we must inhabit the most comfortable shelter in the most comfortable mountain."
The most conservative elder said "How dare you to question the wisdom of Melchiades who discovered this shelter! You have none of the courage, the beauty, the intelligence to even hold a candle to him. Go away!".
"I will go away" the young man replied, "for I see none of you has the conviction necessary to follow our sacred scripture". So he took his few possessions and inhabited the cold and lonely shelter higher up the mountain. His younger brother would soon follow suit. Between the two of them, through years of hard work, they made a cozy dwelling out of the bare cave.
They were never pariahs to their former tribe. If anything, people thought of them as eccentrics or rebel youth. Old people warned the kids that, if they misbehaved, they would turn out to be like the brothers. However, their bodies and their character was chiseled by the hard work they had to perform, which not only gained the admiration of the children, but of numerous women of their former tribe. Soon, disobeying their parents, a pair of love-struck sisters emigrated to the higher shelter, and a new tribe arose from their marriage.
Eons afterwards, a young man came to the shelter, and proclaimed to have found yet another higher shelter in a different mountain. "How dare you, young rascal, question the wisdom of the founding brothers! God himself led Melchiades to this mountain, and through his lineage produced another prophet who brought us to the highest of shelters, go away!".
An ancient race of people had written in their sacred book that they ought to inhabit the highest shelter in the highest mountain. They climbed a up the tallest rocky mountain known to them, and found a shelter. They furnished it with all kind of comforts and called it home.
Out of curiosity, a young man climbed up a difficult passage to an unknown side of the mountain. On this side, he found a shelter at a higher place. He came down excited to tell the elders about his discovery.
The most progressive elder said "the shelter you describe sounds much like a cave further down the mountain. I am sure you are confused, and you thought you were ascending, when in reality you were descending."
The most clever elder said "The scriptures say that we must inhabit the highest shelter in the highest mountain, but it does not refer to altitude, but to comfort. Thus, we must inhabit the most comfortable shelter in the most comfortable mountain."
The most conservative elder said "How dare you to question the wisdom of Melchiades who discovered this shelter! You have none of the courage, the beauty, the intelligence to even hold a candle to him. Go away!".
"I will go away" the young man replied, "for I see none of you has the conviction necessary to follow our sacred scripture". So he took his few possessions and inhabited the cold and lonely shelter higher up the mountain. His younger brother would soon follow suit. Between the two of them, through years of hard work, they made a cozy dwelling out of the bare cave.
They were never pariahs to their former tribe. If anything, people thought of them as eccentrics or rebel youth. Old people warned the kids that, if they misbehaved, they would turn out to be like the brothers. However, their bodies and their character was chiseled by the hard work they had to perform, which not only gained the admiration of the children, but of numerous women of their former tribe. Soon, disobeying their parents, a pair of love-struck sisters emigrated to the higher shelter, and a new tribe arose from their marriage.
Eons afterwards, a young man came to the shelter, and proclaimed to have found yet another higher shelter in a different mountain. "How dare you, young rascal, question the wisdom of the founding brothers! God himself led Melchiades to this mountain, and through his lineage produced another prophet who brought us to the highest of shelters, go away!".
_I begun reading an explanation on Taoist ethics by Paul Carus from [a book on the internet archive](https://archive.org/details/laotzestaotehkin00laoz/page/146/mode/2up) (God bless them). I found Carus' exposition to as clear as still water, and I typed it out in an effort to absorb more of it._
_I put this online for three reasons: for future reference, because the plain-text version of the Internet Archive is a very poor OCR rendition, and because the curious reader might enjoy stumbling upon it._
!! The Ideal of Lao-Tze's Ethics
By Paul Carus, 1898.
Upon his faith in the seasonabless, goodness and unfailing rightness of the Tao, Lao Tze builds his ethical system, trusting that through the Tao the crooked shall be straightened, the imperfect shall be made complete, the lowly shall receive abundance as sure as valleys naturally and without any effort of their own fill themselves with water. Thus the Tao resembles water. Lao Tze demands the surrender of personal ambition and all selfish strivings. His aim is not to fashion, not to make, not to push or force things, but to let them develop according to their own nature.
Virtue, according to Lao Tze, is simply the imitation of the Tao. The Tao acts, but does not claim; it begets and quickens, but does not own; it directs and arranges, but does not rule. The sage will not make a show of virtue, of benevolence, of justice, of propriety; his virtue is _pu teh_, or unvirtue. He will make no pretense of being virtuous, but simply imitate all things Heaven's Tao. In a word, the ideal of morality consists in realising _wu ming chih p'u_, the simplicity of the Ineffable, of the nameless or unnamable Tao.
This, according to Lao Tze, he acts a part in the world, as a player does on the stage; he who endeavors to bring about artificial conditions; he who meddles with the natural growth of society, will fail in the end, and virtue is simply _wu wei_ or "not acting, not making, not doing". Non-action or _wu wei_ cannot mean inactivity, for it is with Lao Tze a principle of action. He never tires preaching _wei wu wei_, to act non-action; he expressly declares that "an able man acts resolutely" and assures us that "through non-action everything can be accomplished".
Lao Tze's propositions "to act non-action" and "to accomplish everything by non-action," appear paradoxical, but his idea is simple enough. He who attempt to alter the nature of things will implicate himself in a struggle in which even the most powerful creature must finally succumb. But he who uses things according to their nature, directing their course, can do with them whatever he pleases. Build strong walls and heavy dams to prevent the landslide caused by the waters that sink into the ground, and the waters will break through and carry your dam down into the valley; but provide the under-ground water with outlets in the places where it naturally endeavors to flow, and there will be no danger of a catastrophe.
The same is true of the social conditions of mankind. Lao Tze requests the government not to govern, but to simply administer. Rulers should not interfere with the natural development of their people, but practice not acting, not meddling, non-interference, or, as the French call it, _laissez faire_, so that the people shall scarcely know that they have rulers. The less laws and prohibitions there are, the less crime there will be. The less the welfare of the people is forced by artificial methods, the greater will be their wealth and prosperity.
Lao Tze's principle of "not-acting" is accordingly not inactivity; it is simply not acting a part; not doing things in an artificial way; it not not forcing the nature of things. The term (wu wei) is best explained by its synonym _wu yü_, being without desire. Man is requested not to have a will of his own, but to do what according to the eternal and immutable order of things he ought to do. It is the surrender of attachment to self, and the utter omission of _jhren tao_, of man's Tao, the peculiar and particular Tao of oneself and following the course prescribed by the eternal Tao. It is, briefly, not "non-action" but "non-assertion" and this is the translation by which _wu wei_ is rendered in the present translation as coming nearest to the original meaning.
Zhuang Tze, Lao Tze's most accomplished disciple, characterises _wu wei_ as follows:
> Non action makes one lord of all glory; non action makes one the treasury of all plans; non-action makes one the burden of all offices; non-action makes one the lord of all wisdom. The range of the true man's action is inexhaustible, but there is no-where any trace of his presence. He fulfills all that he has received from Heaven, but he has not seen that he was the recipient of anything. A pure vacancy (of his own and private affairs) characterises him. When the perfect man employs his mind, it is a mirror. It conducts nothing and anticipates nothing; it responds, but does not retain. Thus he is able to deal successfully with all the things and injures none.
_wu wei_ is the condition of genuine virtue. It leads to simplicity, to emptiness of heart, to sincerity, to stillness and purity, to righteousness, to plain-ness, to truth. The application of Lao Tze's ethics is tersely expressed in the sentence: "Recompense hatred with goodness".
Lao Tze further characterises his ethics as _kwei ken_ returning to the root. There is no idea (except perhaps the ideas of simplicity and purity) on which Lao Tze dwells with more emphasis than upon the ideal of pacification, which he calls _stillness, peace, equanimity and ease_.
The ideal of non-action as the basis of ethics in the sense in which Lao Tze understands it, is very different from the expressions and moral preachings that the Western people, the energetic children of the North, are accustomed to. Nevertheless, there are remarkable coincidences with Lao Tze's ethics not only in Buddhism, but also in the Bible and the literatures of Western saints and sages.
The virtue of the Taoist, which is _tranquility_, _quietude_, _rest_, corresponds to the Biblical injunction: "Rest in the Lord!" and "In quietude and in confidence shall be your strength!", or as the Apostle has it: "We beseech you, brethen, that ye study to be quiet."
This tranquillity, if acquired by all, would become peace on earth to the men of good-will.
The Bible characterises God in words that would have been very congenial to Lao Tze. We read:
> He maketh wars to cease unto the end of the earth; he breaketh the bow and cuteth the spear in sunder; he burneth the chariot in the fire".
And the ethics of this God, who is the ideal of peace on earth, is stillness. The Psalmist continues:
> "Be still and know that I am God."
That God should be conceived as non-action was a favorite idea of Philo, the Neo-Platonist, the same who for the first time used the term Logos in the sense in which is was adopted by the author of the Fourth Gospel. Philo calls God the non-actor, not in the sense of being passive but as absolute existence. Indeed, _activity is as natural to God as burning is to fire_, but God's activity is of a peculiar kind; it is efficiency, not exertion; it is not a particular work that he performs, but an omnipresent effectiveness which Philo finds difficult to characterise without falling a prey to mysticism. Philo was a mystic, and God to him is the Unnamable and Unspeakable.
Stillness, that is to say, self-possessed tranquility, or quietude of soul is the condition of purity. Anything that agitates the mind disturbs it, for troubled waters cannot be limpid. Zhuang Tze says:
> Sadness and pleasure show a depraving element in virtue; joy and anger show some error in their course; love and hatred show a failure of their virtue... It is the nature of water, when free from admixture, to be clear, and, when not agitated, to be leve; while, if obstructed and not allowed to flow, it cannot preserve its clearness--being an image of the virtue of Heaven. Hence it is said to be guileless and pure, and free from all admixture; to be still and uniform, without undergoing any change; to be indifferent and not self-asserting; to move and yet to act like Heaven:--this is the way to nourish the spirit".
Christianity and Buddhism are classified by Schopenhauer as the religions of pessimism, because they recognise the existence of evil in the world from which we must seek salvation, and in addition to several other similarities the Taoist philosophy would fall under the same category. Zhuang-Tze lets the robber Chi express his view on happiness in these words, which apparently voice the author's opinion:
> The greatest longevity man can reach is a hundred years; a medium longevity is eighty years; the lowest longevity is sixty. Take away sickness, pining, bereavement, mourning, anxieties, and calamities, the times when, in any of these, one can open his mouth and laugh, are only four or five days in a month. Heaven and earth have no limit of duration, but the death of man has its (appointed) time".
The world is full of anxiety and misery; and salvation consists solely in a surrender of that selfish craving for pleasures which, in common people, in the main-spring of action.
Lao-Tze's ethics of returning, and becoming quiet, remind us of Isaiah's word "In returning and rest shall ye be saved" and the Psalmist says: "Return unto thy rest, O my soul". Lao Tze insists on faith as much as St.Paul, saying:
> He whose faith is insufficient shall receive no faith
Further, Lao Tze says
> The softest overcomes the world's hardest.
> The weak conquer the strong, the tender conquer the rigid
St. Paul uses the same expression:
> God hath chosen the weak things of the world to confound the things which are mighty"
> When I am weak, then I am strong
> My (God's) strength is made perfect in weakness.
As the Tao is the same to all people, so the sage is the same to all people. He makes no discrimination. Lao Tze says: _The good I meet with goodness, the not-good, I also meet with goodness". Since genuine merit can be accomplished only through non-assertion, the condition of greatness is modesty of lowliness. As the water that benefits all the world seeks always the lowest places, so the sage abhors self-exaltation. As Christ says, "Whosoever shall exalt himself shall be abased" and "he that shall humble himself be exalted", so Lao Tze compares the Tao of Heaven to a bow, he says _it brings down the high and exalts the lowly". Lao Tze says that the imperfect will be restored, the crooked shall be straightened, the valleys shall be filled, which reminds one of the words of Isaiah:
> Every valley shall be exalted, and every mountain and hill shall be made low : and the crooked shall be made straight and the rough places plain.
Christian philosophers of the Middle Ages, especially the Mystics, present an even more striking analogies to Lao Tze's terminology than St. Paul. As Lao Tze speaks of the "Tao's course" as a "regress" or "a return homeward" and of man's necessity of "returning to the root" so Scotus Erigena in his book _De divisione naturae_, 519 AD, declares:
> God gathers all in one and resolves them in Himself in an ineffable regress.
Master Eckhart's sermons contain many passages that might have been written by Lao Tze; so especially his praise to the virtue of simplicity, his recommendation of quietude and rest, the importance which he attributes to unity, and his identification of the highest height and with the deepest depth of humility.
There is no doubt, the Taoists could claim Eckhart as one of their own.
Johannes Scheffler, called Angelus Silesius, a born Protestant, who was so much affected by mystic sentiment that he turned Roman Catholic, says:
> We pray, but lo! God has no will; stillness he is for me
> Rest is the highest good; indeed were God not rest; I'd turn away from Him, as being no longer blest.
The Tao Te Ching exercised a strong influence on Tolstoy. He too, speaks of non-action, _le non-agir_. Labor, in his opinion, is no virtue; labor is useless, no, pernicious, for labor keeps men too busy to leave them time for thought, is the curse of the world. Most of us, says Tolstoy, have not time for the consideration of truth and goodness, because we are rushed. An editor must arrange his journal, the general organises his troops, the engineer constructs an Eiffel tower, men of affairs arrange the World's Fair, the naturalist investigates heredity, the philologist must count the frequency of various phrases in certain authors, and no one has leisure enough for a moment of rest; no one has time for finding that peace of soul which the world cannot give. They do anything except that which they ought to do first.
Tolstoy is right, for thinking reforms the world, not laboring. Thought is the rudder that changes the course of the ship of toiling mankind; the energy of the steam that labors in turning the wheels is useful only so long as it is controlled by thought in the right way. For acquiring the right ideal that will guide us in the right direction, we need not labor, nor need we excert ourselves, on the contrary, says Tolstoy, we must abandon all exertion and become calm. If all men would only employ the tenth part of the energy that is wasted on the acquisition of purely material advantages, to settling the questions of their conscience, the world would soon be reformed.
A peculiar parallelism of Lao Tze's Taoism with Christianity consists in Lao Tze's belief in an original stat of innocence and paradisial happiness. He attributes all the evils that now prevail to a deviation form the original simplicity enjoined by the eternal Tao. The conscious discrimination between good and evil, the studied wisdom of the age, the prevailing method of teaching virtue which does not make men good, but merely induces them to be hypocritical, the constan interference of the government with the affairs of the people are the causes of all disorders. His ideal state would be a return to the paradisial innocence and simplicity, a society of simple-minded people who seek their happiness at home.
There are so many remarkable passages in the Tao Te Ching, such as the trinity in unity; the preservation of him who will not perish when he dies; that the weak conquer the strong; that we must become like little children; that the holy man knows himself as the child of the Tao; the the Tao can be had for the mere seeking of it; that the son of heaven (king or emperor) must bear the sins of the people, etc; but we must leave them to the reader who will find enough in Lao Tze's little book that will set him to thinking.
The natural result of Lao Tze's philosophy is the ethical ideal of the sage, the saintly man, who is also called the superior sage, or, as later Taoists have it, the Truth-Man, i.e. the man of truth or the true man.
Zhuang Tze says:
> The human spirit goes forth in all directions, flowing on without limit, reaching heaven above, and wreathing round the earth beneath. It transforms and nourishes all things, and cannot be represented by any form. Its name is "Divinity (in man)". It is only the path of pure simplicity which guards and preserves the Spirit. When this path is preserved and not lost, it becomes one with the Spirit; and in this ethereal amalgamation it acts in harmony with the orderly operation of Heaven.
> There is a common saying, "The multitude of men consider gain to be the most important thing; pure scholars, fame; those who are wise and able value their ambition; the sage prizes essential purity". Therefore simplicity is the denomination of that in which there is no admixture; purity of that in which the sprit is not impaired. It is he who can embody the simplicity and purity whom we call the True Man.
An exhaustive description of the True Man is given by Zhuang Tze in Book VI, where we read:
> What is meant by 'the True Man'?
> The True men of old did not reject the views of the few; they did not seek to accomplish their ends like heroes (before others); the did not lay plans to attain those ends. Being such, though they might make mistakes, they had no occasion for repentance; though they might succeed, they had no self-complacency. Being such, they could ascend the loftiest heights without fear; they could pass through water without being made wet by it; they could go into fire without being burned; so it was that by their knowledge they ascended to and reached the Tao.
> The True men of old did not dream when they slept, had no anxiety when they awoke, and did not care that their food should be pleasant. Their breathing came deep and silently.
> When men are defeated in argument, their words come from their gullets as if they were vomiting. Where lusts and desires are deep, the springs of the Heavenly are very shallow.
> The True men of old knew nothing of the love of life or the hatred of death. Entrance into life occasioned them no joy; the exit form it awakened no resistance. Composedly they went and came. They did not forget what their beginning had been, and they did not inquire into what their end would be. They accepted their lot and rejoiced in it; they forgot fear of death and returned to their state before life. This there was in them what is called the want of any mind to rest the Tao, and of all attempts by means of the Human to assist the Heavenly. Such were they who are called True men.
> The True men of old presented the aspect of judging others aright, but without being partisans; of feeling their own insufficiency, but without flattery or cringing. Their peculiarities were natural to them, but they were not obstinately attached to them; their humility was evident, but there was nothing of unreality of display about it.
Lao Tze declares that the True Man is not hurt by fire or water, and that he need not fear either the rhinoceros or tiger, which is explained by Zhuang Tze in Book XVII:
> Fire cannot burn him who is perfect in virtue, nor water drown him; neither cold nor heat can affect him injuriously; neither bird nor beast can hurt him. This does not mean that he is indifferent to these things; it means that he discriminates between where he may safely rest and where he will be in peril; that he is tranquil equally in calamity and happiness; that he is careful what he avoids and what he approaches;--so that nothing can injure him. Hence it said: "What is heavenly is internal; what is human is external".
> Virtue is in what is heavenly. If you know the operation of what is heavenly and what is human, you will have your root in what is heavenly and your position in virtue.
The sage is above death; he is one with the Tao:
> Death and life are great considerations, but they could work no change in him. Though heaven and earth were to be overturned and fall, they would occasion him no loss. His judgement is fixed on that in which there is no element of falsehood; and, while the other things change, he changes not. The transformations of things are to him the developments prescribed for them, and he keeps fast of the author of them.
The same ideas are expressed by Horace in his ode _Integer vitae_ in which the Roman poet praises the perfect and faultless man who needs no arms of any description, who may roam through mountain wilderness without fear of the wolf and will not suffer from the heat of the desert. Horace exclaims in another ode that the virtuous man would remain firm even if the world broke down upon him.
It was natural that in the course of the further development of the Taoist movement the old philosopher was more and more regarded as _the_ True Man, beside whom all the others were mere aspirants for saintiliness. his life was adorned with tales which remind us of Buddhist legends, and he became the central figure of a triune deity called the Three Pure Ones, which are even in appearance very similar to the Buddhist Trinity of the Buddha, the Dharma, and the Sangha.
!This is an encrypted Tiddler
Science only acknowledges senses for the material world: you see, you hear, you feel, you smell, you taste. But how is it that we can also sense how we feel inside? We are able to quiet the mind we can perceive sensations which have nothing to do with the material world: the tingling of aliveness, a lightness or heaviness in the heart, our biological urges. When the outer landscape recedes, the inner landscape emerges naturally.
This way of sensing inwardly is an introversion, which, through considerable effort, allows us to observe what is going inside our mind. We might be initially afraid to even peek inwardly, and with good reason: exploring the inner maze is not for those faint of heart.
When we first encounter these lands, we ignorantly believe they are our own property. We might feel we are sad, which inwardly feels like a cold drizzling overcast day, and believe that by our own will we can make the clouds part and have the sun shine on us. We say: “put on a smile and think positively!” but when the sky fails to clear we think it is because of our own incompetence in controlling our emotions.
The part of our inner world that is under our control is paralleled by the material world. We are not able to control the weather, but we are able to provide shelter for ourselves. We can’t make the clouds part and the sun shine over us, but we can sit comfortably inside our homes sipping tea while we watch the rain.
Yet, because we are ignorant about inner matters, instead of putting effort into our homes, we raise up our fists and scream to the sky “stop raining, I want it to be sunny!”.
In the 16th century, at the age of 38, Michel de Montaigne retired from public life and isolated himself completely from the outer world into a tower filled with books. He wrote the Essais, an intense and honest introspection into his soul. In seclusion he expected to put his mind in order, instead he finds this:
[My mind] is like a horse that has broke from his rider, who voluntarily runs into a much more violent career than any horseman would put him to, and creates me so many chimaeras and fantastic monsters, one upon another, without order or design, that, the better at leisure to contemplate their strangeness and absurdity, I have begun to commit them to writing, hoping in time to make it ashamed of itself.
Here is the crux of inner exploration: a non-judgemental curiosity about what happens inside of us, not desiring to control but to understand. In this way of perceiving the world, you are more intrigued about your reaction to an event rather than the event itself. If someone annoys you, you don’t think I wish this person would leave so that I can regain my serenity nor I shouldn’t be annoyed at this person but ah, that’s interesting, what is it about this person that makes annoyance arise in me?, observing emotion from a place of non-identification.
When you read philosophy classics of antiquity it is evident that this way of knowing has been largely lost in modern times. In a world that had little recorded knowledge, no mass media, and a generalized lack of information, it is amazing that the thinker of antiquity was able to deduce a large amount of knowledge through inner exploration, simply by following the advice inscribed at the temple of Delphi: ΓΝΩΘΙ ΣΑΥΤΟΝ, Know thyself.
Where the philosopher of antiquity lacked in information about the outer world, he made up in tools he had to access inner knowledge. With a rich model for the composition of the metaphysical parts of the psyche: logos, spirit and soul, the philosopher had the necessary tools extract knowledge from himself. He would not use this precious information to gain power, riches or any other selfish motive (those were sophists), but instead would explore within “on the behalf of the many”, in words of Buckminster Fuller (edited for clarity).
In 1927 when I started to explore for the faculties with which we are all endowed, I was doing so only for one fundamental drive: because I had considered suicide, I decided that my warrant for not committing suicide was that I would turn my experiences to the advantage of others. Whatever I have been able to uncover of these faculties comes from wishing to employ them to the advantage of the many.
The self-centeredness of the spiritual quest ultimately turns inside out. As Ramana Maharshi famously states: “By the inquiry ‘Who am I?’, the thought ‘who am I?’ will destroy all other thoughts, and like the stick used for stirring the burning pyre, it will itself in the end get destroyed. Then, there will arise Self-realization”.
This the most paradoxical aspect of the spiritual quest: the work you perform on yourself is ultimately for others. Though the act of inner exploration is deeply intimate, it ends up connecting us to all of humanity, because the things you feel and sense inside are the same things everyone experiences, and thus by understanding yourself you end up understanding others.
In architecture, the keystone is the final piece placed during construction of an arch. It's the piece that bears less stress, yet it is what allows the arch to be held together by the force of gravity. The metaphor to virtuegraph work is adept, as this is the final task that marks the symbolic dawn of a new day, and the construction of a new arch.
The keystone is the only prescribed task in virtuegraph work. Fortunately the task is exceedingly simple: after waking up every morning, and as soon as you remember, perform a deliberate action that marks the end of the previous day. This action can be as simple or as elaborate as you wish, but it has to be done consciously.
Your servant rises every morning, touches his feet, and says "I am awake". But the form of this ritual is meaningless, what matters is that by the simplest act of will, you demonstrate that you are not on autopilot. Find something you wouldn't stumble upon by habit, and try to do it as close to getting out of bed as possible.
It is important that the task is not done _in_ bed, as one can easily perform it, go back to sleep, and then wake up again to our usual zombie-like state of being. But you should also perform it soon after getting out of bed. The reason is to notice how much time passes between entering waking state and actual conscious state. Do not be frustrated if you notice late in the day (if you notice at all), this is simply information about your state of being. By simple observation, you will find that the gap shortens with practice.
The virtuegraph is meant to be used without reminders. If you are not conscious, why even attempt to self-transform? Yet your humble servant struggled greatly with this constraint, the biggest challenge is break our established habits, and our most ingrained habit it to go about life sleep-walking. If this habit cannot be broken at this time, then it is best to hold off self-transformation work for more desperate times. One becomes more conscious in times of distress.
How to verify from direct experience
A principle of the virtuegraph is to have no dogma. Though prescribed and added by default, you are welcome to remove The Keystone if you wish to experiment what it feels without renewal of the day. If you forget about your transformation goals, do no let yourself be seduced by the comfort of slumber. Come back to the virtuegraph and redouble your commitment to The Keystone.
The western version of the tao.
The source of [[ten thousand things]]. The master blueprint that reproduces itself in a never-ending fractal. That which cannot be spoken about, because words are things.
There is an inner logos and and outer logos, but they come from the same source. As is inside, is outside. These two come together. The world causes impressions on us only so much as we perceive them, but this is not the outer logos, it is the inner logos, and when one is in synchrony with the logos wonderful things happen.
Everything eventually comes back to The One, because The One is the source of all things.
My fellow [[Human Being]].
if I (or anyone) is to extract anything useful from what I write, I should take the poetic Eckermann approach, which requires one to reenact settings, sensations and activities, rather than simply marking what work was done.
I need to warm up my fingers and let the speed of my mind catch to catch up. What I indent to do in this session is to achieve full concentration in thought, and to describe the inner experience as one would wear a virtual reality mask and would be describing verbally. What I feel right now, in reality. I need to achieve a relaxed position that will allow me to forget about the physical world for a while. Any position will do, but I must type comfortably with my eyes closed. To forget that I have hands, and that I'm typing, to allow thought to come thought and forget about the syntax or the accuracy. Backspace does not exist. Meditate. Meditate. Meditate. Meditate. Meditate. Meditate. Meditate. Meditate. Meditate. Meditate. Meditate. Meditate. Meditate. Meditate.
The situation I brought up myself into is a bit difficult to explain. It is not worth telling, for having a story in the long wrong limits you to one storyline. To be solving your problems is to live your storyline, you can be anyone you want if you pay the price of letting go the other guy. The problem is that indeed it wont let go unless you package properly. A mess can't be left at the former house, for you always come back. Why do these existential issues follow around, is the inquiry? Can we let go and forget about it?
The answer is that you can jump from one state to the other. You will always come back to a house that hasn't been cleaned, and so the challenge is to keep your house clean, fresh and comfortable. Never mind the mummy that is in the closet.
THE MUMMY IN THE CLOSET
Warming up the hands again. Meditate. Meditate. Meditate. The mummy in the closet is that irreductible part of yourself that is in the past, that can't be change, and that isn't really bothersome. It's not thrown away out of habit, or because it would be very shameful to dispose of it in front of others. Jodorowsky would have said that you can make a physical representation of it with your own underwear and then bury it. I will perhaps do that in the desert.
This is not meant to be written at this time, for a sense of immaturity is sensed.
{{TreismanXArticle.pdf}}
<p>In 1974 Phillip Uri Treisman, a calculus teacher at Berkeley, had been trying to get his students interested in Math through collaboration and creative problem solving, innovative techniques at the time. The students had met his experiments with certain reluctance: "is this going to be on the test?" they would ask. He had no idea if he was a good or a bad teacher. </p>
<p>Turns out his method was giving good results, and he was given a grant to study why there was a performance gap in Black and Hispanic students. It was a problem that had vexed him for some time, and he was willing to tackle it head on.</p>
<p>He begun by surveying his colleagues for possible hypothesis, and he found four widely-held beliefs:</p>
<ol>
<li>Minority students are not as motivated as other groups</li>
<li>They come unprepared, as they often enter university with fewer credit hours of science and math.</li>
<li>Their families lack a strong cultural and intellectual background, and thus lack understanding of the importance of higher education.</li>
<li>That the income gap reflects on the educational gap, and if those variables are controlled there would be no performance gap.</li>
</ol>
<p>All these beliefs sound reasonable, however, when he looked at the actual data, he noticed these hypothesis were entirely wrong. Being an elite university, minority students--especially black students-- had to make huge social sacrifices to get accepted into Berkeley. <em>Motivation</em> was not the problem, it was <em>disorientation</em>.</p>
<p>They were also surprised to find that, among Black students, calculus grades correlated negatively with good math grades in high school. Black men with high SAT scores often faced academic dismissal. It was the students in the middle range who were the best math students in university.</p>
<p>They interviewed the families of the students to find if that was the cause of their poor performance. What they found was a strong network of support, parents made a conscious effort into getting their kids into college, and quite a few of them were college graduates too.</p>
<p>Perhaps the most unexpected finding was that family income was <em>negatively correlated with performance</em>. This is because many of the poorest students come from families where the parents would work in public schools and don't earn much, but had a long standing tradition of education.</p>
<p>So, after going through all the data and interviews, they were at a blank state again. They decided to do some ethnographic research: follow the students around, videotape them in the least conspicuous way possible, let them grow to their presence.</p>
<p>So they decided to follow a group of Chinese students and a group of Black students. Black students would go to class, take notes, study eight hours per week, and then fail. What was surprising was the difference they saw with the Chinese students:</p>
<blockquote><p>They studied calculus for about 14 hours a week. They would put in 8 to 10 hours working alone. In the evenings, they would get together. They might make a meal together and then sit and eat or go over the homework assignment. They would check each others' answers and each others' English. If one student got an answer of "pi" and all the other got an an answer of "82", the first student knew that he or she was probably wrong.</p></blockquote>
<blockquote><p>It was interesting to see how the Chinese students learned from each other. The would edit one another's solutions. A cousin or an older brother would come in and test them. They would regularly work problems from old exams, which are kept in public file in the library.</p></blockquote>
<p>Based on these findings, Prof. Treisman obtained funding for creating what was essentially a "learning group". Berkeley had previously tried to enroll minority students in optional preparation courses, but he knew that minority students dismissed them as <em>something for underperforming students</em>.</p>
<p>His learning group was--in essence--a place to tackle problems together.</p>
<blockquote><p>Most visitors to the program thought that the heart of our project was group learning. They were impressed by the enthusiasm of the students and the intensity of their interactions as they collectively attacked challenging problems. But the real core was the problem sets which drove group interaction. One of the greatest challenges that we faced and still face today was figuring out suitable mathematical tasks for the students that not only would help them to crystalize their emerging understanding of the calculus, but that would show them the beauty of the subject.</p></blockquote>
<blockquote><p>We were able to convoke the students in our orientation that success in college would require them to work with their peers, to create for themselves a community based on shared intellectual interests and common professional aims. However, it took some doing to teach them <em>how</em> to work together. After that, it was really rather elementary pedagogy.</p></blockquote>
<p>The results of this program were surprising: Black and Latino participants outperformed not only their minority peers, but their White and Asian classmates as well. Black students with Math <span class="caps">SAT </span>scores in the low-600s were performing comparably to White and Asian students whose Math <span class="caps">SAT</span>s where in the mid-700s.</p>
The soul is that which contains [[reason | Reason]], passion, and spirit. The Soul in the Ancient Greek sense. When we speak about our true selves, we speak from our soul. In modernity the soul has been mocked, much to the disgrace of the entire of humanity: we suffer much because we deny the very meaning of life. We feel like cogs of a machine: we work our entire lives, we have a family, we grow old, and then we die. And then what?
The soul answers to this question. Because the healthy human being has a good dose of reason,
Todo: Describe and document the virtuegraph
Project Arete:
The Virtuegraph for depression
### Introduction
As this is written, your servant is coming out from a depressive episode. An attempt was made towards writing it _during_ the depressive episode, but a voice I was too dull to accomplish it. This is the catch of depression: in it's hopelessness and self-brame, you are not in a good position to reason your way out of depression on your own.
Sometimes we have a clear idea of the source of the depression: it might be childhood or adult trauma, a source of constant stress such as demanding yet unfulfilling job, or a restless mind that builds up anxiety and then releases it in the form of panic attacks. Our first impulse is to go for the root cause and slay it. But soon we discover that in our current state it only makes the situation worse.
Quitting the stressful job ends up in an unemployment rut, confronting the trauma puts a hot potato in ones hands on top of the depression, and even minimal exposure to the source of anxiety leaves one in a worse state than before. Soon all hope is lost, and we lay in bed, ruminating on all that is wrong with our lives.
We go through what has been accomplished in life: very little to amount to. Why is it that we put ourselves in this situation? The tinge of meaningless-ness pervades the vision. I need not to get too deep in it, as it's mere thought causes one to stare into an abyss. One does not go to war beaten up, one prepares for it in solitude. The questions will come to an answer, if you think through it from a better position.
The immediate demand, then, is that you prepare your mind and body for such a task. Face things from the point you’re at, and slowly climb yourself back into a healthy position. Health later blooms into experience, but allow us to think only on depression for now. Experience under depression is very gray or even downright hostile, a clear invitation to retreat from the world and look inside to understand what’s broken.
This task has driven more than one mad, so if you suffer from a highly neurotic state mind at this time at this time, I would recommend to explore this path being handheld by a therapist. I am confident that this product is an excellent companionship for CBT therapy, and I encourage you to reach out a therapist first if you truly find yourself in dark place. And even if you’re not in a dark place, it’s about getting skillful in the use of cognitive tools for mental health.
Let us then begin by explaining some concepts.
# nothing
Get enough sleep?
Get nutritious food?
Be friendly to other dogs?
Get enough activity for my shape and age?
Where is my libido released?
It is not time to tackle the addictions yet, because though they are a great source of accomplishment, it requires one to become well prepared. We waste a lot of energies in the form of inner conflict, but for our own interest it's best to begin tracking them and treat them strictly under observance, without attempting to judge them. Let us treat addictions in a future cycle, for these require a different form of art. We have enough work for now.
Do I get enough sleep?
I will come around to tackling addiction at it's time. Observe for now.
Loook inside, you have attempted to do this with some success. The purpose is to, just like I do in my diary, to tump all that comes through the mind. The consciousness has posed itself towards the way in which I type my letters. The mind is disperesed, because of pot, and this will require a fiar amount of effort, so allow us to look inside. There is a source of suffering,
Sleep
It is best
Do you get enough love?
Do you get enough sunshine?
Do you get enough exercise?
It might be useful to think about ourselves as dogs
How many times we've opened the window to allow an insect to fly out to nature, where it belongs, only to discover that the senses of the fly do not allow it to know there's an escape nearby. In the matters of the inner world, we seem to go blindly bumping against invisible walls, hoping that if we just push hard enough, we might be able to cross to the other side, only to find ourselves exhausted, and as soon enough energies are mustered, again we bang against the same window, unaware that if we approached the problem differently, we might find the exit.
Though we definetely need to address the root cause, in our current state it akin to operating on an unstable patient. Stabilize the vital signs first, then cut open to remove the tumor. We need to find a way to think straight before reason is of any assistance in our plight.
Sleep
Meditation
Exercise
Nutrition
Sunshine
Medication
Therapy
Gratitude
Acknowlegements
Before I start detailing how to position yourself in the direction of recovery, the acknowledgement should be made towards the influences that have informed me through the process. They are listed in the order of apparition in my life, and though at the time I didn’t know it would influence my work, their thought is throughly recognized.
I was on a dirt road with my hands down my shorts, feeling my testicles. I instead of two testicles, I clearly felt three. "Strange", I thought, "one must be a tumor, I hope it is not cancer". Then, from a gate to the side of the road slid out a very big and long weasel dressed in red, with a harness on its body. The harness was attached to a large amount of scrap metal which it dragged with ease. Out of my view it was being called by its owner, who was inside the gate.
After writing the previous thought I had a nap. I dreamed (in a dimmed, unlively fashion) that I was snacking on chunks of fish while chatting with my Canadian uncle (whom is visiting in real life). I put a large piece of piece of fish in my mouth and I felt a fish bone get caught in my throat. I thought: I must breathe calmly to see if my airway is obstructed. It was difficult, but I was able to breathe. I kept on listening to my uncle chatting at me while I pretended nothing happened.
---
I was concealing the weed plants I had in the rooftop. I felt I was being inauthentic by hiding my lifestyle choice.
Waking life<br>
Hermanosis<br>
The antipodis of the mind<br>
To dance with angels<br>
Jeffrey Hinton<br>
Crisp<br>
Los cinco lenguajes<br>
Office space<br>
Experiments: http://arvindguptatoys.com/toys.html
By pure chance following links about the small web, I came across [[philosopher.life|https://philosopher.life]] and I was enthralled by it. The words spoke truth to me, but I found myself utterly lost in a tangled mess of navigation which I could not understand, and at first I thought this wiki software was the creation of the author, but then I followed his TiddlyWiki link and found myself with a clearer picture of what I was seeing.
I saw a video on YouTube with Jeremy Ruston and Joe Armstrong, and I just knew this was exactly what I needed: something which starts in utter simplicity, and the complexity is introduced by the user in the form of his own structuring of thoughts and one's egoic impulses towards building grandoise structures which never become inhabited.
I was packing up to move away from a rooftop apartment. From the other side of the street, on the terrace of an adjacent building, some people started throwing rocks at 'us' (I was accompanied, but I ignore who were these people). The rocks were large, and the intention seemed to be physical harm rather than property damage. The windows cracked, but did not break.
<$list filter="[!lsort[]]">
<$macrocall $name="length" tiddler={{!!title}}/>
<$link><$view field=title/></$link>
</$list>
https://tipotype.com/about-us/
I recall a proto-dream in which a character was trying to kill something, and this something integrated into him, and his desire to kill it disappeared and he was in peace. But I can't explain how I experienced this, there may have been very vague images and words which I somehow strung together, but it mainly took place in a sensory realm which precedes symbolic language, like the feelings experienced with gut feelings which then you translate into verbal language.
''Tomorrow''
* Go to gym
* Go to yoga
* Pick up clothes
* Go to market
* Design exploration.work
* Rolling stats per month
* Buy damiana
* Send proposal to Tatsuya
* Answer blindness
* Lunch with cousins
* Write account of the day
''Next month''
* Memberspace and Circle
* Complete platonic solids
* Inquire re-opening UDLA Campus
* Sweep rooftop
* Print espiral
* Bathe Nina
* Document grill and goethe and yoga bag
* blank.page Memberstack
* Answer Haji
* Kitchen installation electricity
* Fix front bathroom
* Contact plumber
* Plant avocados and chillies
* Write Monse wax seals
* Ver Melancolía
* Pick up clothes
* Sacar mariposas
* Escribir a Keith
* Bathe Nina
* Listen Tim Ferris Podcast
* Ir por la ropa
* Encontrar el teléfono
* Llamar a la UDLA
* Set up work station
* Answer Gala
* Hablar a mi tío Cone
* Preguntar a papá
* Contact Ganesha Yoga
* Hacer reserva gimnasio
* Instalar pantalla
* Ver capítulos
* Lavar la mochila
* Terminar de pasar las entries
* Instalar Echo Dot
* Pagar Yoga
* Subir días faltantes blog
* Escribir a René
* Go to the gym
* Corrección bug brows
* Fix gmail response
* Add names to donations
* Llamar UDLA
* Work log
* Inquire grill
* Buy flea comb
* Preparar documentos Conagua
* Print Goethe's Theory of Colors
* Contactar herrero
* Install screen
* Meeting René
* Pick up phone
* Buy cheap cigarettes
* Pick up grill
* Pick up goethe
* Send back Amazon packages
* Comprar palanca del baño
* Give back straps mat
* Pick up grill
* Answer René
* Contact Jitachi
* Buy flea soap and mosquitos
* Call Amazon
* Receive chair
* Answer René
* Go to yoga
Hace unos meses, al principio de la cuarentena, acompañé a mi tía al aeropuerto para tomar su vuelo de regreso a Canadá. Estaba muy nerviosa y no quería irse en autobús, por lo que un primo se ofreció a llevarnos.
En el camino mi primo me preguntó en qué andaba ahora, y le conté de mis proyectos. Me dijo "que raro, si Héctor dice que andas de huevón sin hacer nada, que antes tenías chamba y lana pero ahora ya ni quieres trabajar". Sentí ese ardor en el pecho que se siente cuando el ego es herido, guardé un momento de silencio para saborear el dolor: Héctor es mi primo más querido, y el cabrón estaba enterrando un cuchillo en donde más dolía.
"Héctor no entiende", pensé. Para mi el trabajo es tan sagrado que escribo a diario sobre ello, y si bien mi definición de trabajo es bastante distinta a lo que la mayor parte del mundo entiende como trabajo, prácticamente estoy trabajando todo el tiempo, interior y exteriormente.
Pero no me podía quitar la espina, y decidí hablar con él de manera casual, para dejar atajado el asunto. Pero cuando lo vi no sentí esa energía de desprecio. Cuando la gente piensa mal de ti, se nota. Héctor habla mal de todo el mundo, es un mal hábito, "cómo pude pensar que yo iba a ser la excepción", pensé. "Si tengo que hablar con él, será para aconsejarle que no ande hablando mal de la gente".
Pero pasó el tiempo y lo dejé pasar. Hice alarde con él de lo "muy ocupado" que estaba, e hice conversación respecto a mis proyectos, cosa que normalmente no hago, pues la gente asocia el trabajo con tener un empleo, y si no tienes uno asumen que te la pasas echando la hueva.
Pero el fin de semana pasado Héctor me habló por teléfono: "Oye Mark, me pidieron el rostro de esta niña para unas playeras en serigrafía, no estoy en mi casa, me puedes echar una mano con Photoshop pasándolo a una tinta?". Mi primer impuso fue decir "ni madres", pero le expliqué que estaba en el super y que tenía que hacer unos pendientes regresando a casa, pero que me lo enviara para ver qué tan complicado era.
Era complicado. "No es trivial, mejor busca a alguien más que te eche la mano". Insistió. Lo llamé por teléfono, le dije "mira, voy a ser honesto contigo, no puedes andar diciendo que ando de huevón y luego pedirme que haga tu trabajo", se ofendió "yo cuando dije eso?", "mira, si quieres hablamos de eso después, mientras busca a alguien que te lo haga porque yo no lo voy a hacer". Me colgó. Minutos después envió mensajes de "me encabrona que pienses que yo ando diciendo eso de ti...", drama. "No voy a discutir esto por whatsapp, me pongo en contacto contigo en la semana para hablar".
Ayer llegó el día. Estabamos los dos calmados y en la mejor disposición de arreglar las cosas. Le dije: "mira, para mi el trabajo es sagrado, cuando me enteré que andabas diciendo que era un huevón pensé 'si Héctor no sabe lo que hago, es natural que asuma que no hago nada', pero de ahí a que me estés pidiendo hacer tus chambitas ya es demasiado"—"pues es que tú mismo me lo dijiste cuando llegaste, que andabas de huevón pero bueno, siempre has trabajado un chingo y pensándolo mejor es normal que te des un descanso". Esta parte fue fácil de resolver, pero lo difícil era explicar que andar hablando mal de la gente es ir contra el patrón de patrones.
Recurrí a una historia.
"Cuando tenía catorce años iba cada fin a casa de Óscar (otro primo un año mayor que yo). Había una vieja que quería con él, pero a Óscar no le gustaba, y se acercó conmigo, seguramente para provocarle celos. Se puso a hablar mal de Óscar, y como Óscar era a veces culero conmigo, pues yo también me puse a hablar mal de él".
Héctor y yo nos reímos de mi ingenuidad. Proseguí con la historia.
"Al día siguiente llegó y me dijo: mira MacKay, nomás porque sé que eres bien pendejo, ni siquiera me enojo contigo. Hay algo que tienes que entender: a pesar de que lo que hayas dicho sea verdad, no debes hablar mal de tus amigos. Si tienes un pedo conmigo, dímelo a mi, no a esa vieja que va buscando sembrar discordia".
Y le dije a Héctor "desde ese día lo entendí perfectamente: existe un círculo de confianza, y ese círculo de confianza jamás se traicona. Si no le puedes decir algo a la cara a un amigo, mucho menos se lo vas a decir a otra persona. En esencia tú y yo nos emputamos de la misma cosa: yo porque porque hablaste mal de mi algo que no has confrontado conmigo, y tú porque le creí a alguien menos cercano que tú. Los dos estábamos violando un pacto implícito de lealtad".
Y así, sin razonarlo demasiado, llegamos al meollo del asunto. Nos dimos un abrazo y el asunto quedó zanjado.
Todo es trabajo, inclusive esto.
I just came back from yoga class. Most yoga teachers nowadays, in Spain and in Mexico, call their students with inclusive diplomacy. Instead of saying "todos" they say "todos y todas". I used to think it was unnecessarily complex until I had a teacher who said the same phrase, but inverted: "todas y todos". Sometimes she would make a pause: "todas... y todos". During the pause I would hear my ego protest: hey, I'm here too! And then it would relax after it was acknowledged.
The trick made me notice _it feels nice to be acknowledged_. I have the sense that if I were to address a mixed group I'd call them out in the same way.
However, today I had a teacher who just said "todas" and didn't acknowledge my masculine ego. My practice didn't suffer from it, though I could hear the little child inside of me claiming for acknowledgement, recriminating his _feminist teacher_. "Shhhh little ego, you have feminine essence too, you are both a woman and a man, because our dualist nature encompasses the feminine".
If gender is not important, why do we throw a fit if somebody does not address us in the way that we want? The true issue here is not gender, it's identity, and in its infinite immaturity the ego cries of you call him "miss" instead of "mister" in the same way a boy cries if you say he's a girl.
I do not place myself above the fact that I do feel feel burned when I'm not acknowledged as a man. But, at the same time, I acknowledge the absurdity of the fact.
It is not uncommon that people are outwardly patient and tolerant, but flip into impatience and intolerance in their intimate circle. When one forces tolerance and patience, the opposite is expressed in unpredictable ways.
One of the steps in reaching serenity is to tolerate intolerance (within oneself and from others).
>In spite of the fact that during these fifteen years I regarded writing as a trivial endeavor, I continued to write.* I had already tasted the temptations of authorship, the temptations of enormous monetary rewards and applause for worthless work, and I gave myself up to it as a means of improving my material situation and as a way of stifling any questions in my soul concerning the meaning of my life and of life in general.
It was during this period, when he "regarded writing as a trivial endeavor,"
that Tolstoy produced War and Peace (1869).
Me iba a trabajar a Cancún a trabajar para Sergio González otra vez. Resultaba que mi amigo Gullermo C. estaba trabajando ahí también, y yo tenía que concertar una colaboración con él. Iba a sus oficinas y me lo encontraba afuera, tomándose una cuba, mirando a las chicas entrar a un antro que estaba junto a la oficina.
Se me hizo natural, puesto Memo es un profesional, y comencé a hablar de trabajo. Me dijo que estaba muy ocupado, que le habían encargado hacer un reverse image search, como Google Images en los viejos tiempos. Yo quería orientar la conversación a mi propio proyecto, pero estaba muy distraído viendo a las chicas entrar al antro. Al fin me invitó a ver una película en su oficina. Entonces decidí que Memo no era el profesional que yo pensaba, y que tendría que hacer el proyecto yo solo.
_I began reading an explanation on Taoist ethics by Paul Carus from [a book on the internet archive](https://archive.org/details/laotzestaotehkin00laoz/page/146/mode/2up) (God bless them). I found Carus' exposition to as clear as still water, and I typed it out in an effort to absorb more of it._
_I put this online for three reasons: for future reference, because the plain-text version of the Internet Archive is a very poor OCR rendition, and because the curious reader might enjoy stumbling upon it._
!!! The Ideal of Lao-Tze's Ethics
By Paul Carus, 1898.
Upon his faith in the seasonabless, goodness and unfailing rightness of the Tao, Lao Tze builds his ethical system, trusting that through the Tao the crooked shall be straightened, the imperfect shall be made complete, the lowly shall receive abundance as sure as valleys naturally and without any effort of their own fill themselves with water. Thus the Tao resembles water. Lao Tze demands the surrender of personal ambition and all selfish strivings. His aim is not to fashion, not to make, not to push or force things, but to let them develop according to their own nature.
Virtue, according to Lao Tze, is simply the imitation of the Tao. The Tao acts, but does not claim; it begets and quickens, but does not own; it directs and arranges, but does not rule. The sage will not make a show of virtue, of benevolence, of justice, of propriety; his virtue is _pu teh_, or unvirtue. He will make no pretense of being virtuous, but simply imitate all things Heaven's Tao. In a word, the ideal of morality consists in realising _wu ming chih p'u_, the simplicity of the Ineffable, of the nameless or unnamable Tao.
This, according to Lao Tze, he acts a part in the world, as a player does on the stage; he who endeavors to bring about artificial conditions; he who meddles with the natural growth of society, will fail in the end, and virtue is simply _wu wei_ or "not acting, not making, not doing". Non-action or _wu wei_ cannot mean inactivity, for it is with Lao Tze a principle of action. He never tires preaching _wei wu wei_, to act non-action; he expressly declares that "an able man acts resolutely" and assures us that "through non-action everything can be accomplished".
Lao Tze's propositions "to act non-action" and "to accomplish everything by non-action," appear paradoxical, but his idea is simple enough. He who attempt to alter the nature of things will implicate himself in a struggle in which even the most powerful creature must finally succumb. But he who uses things according to their nature, directing their course, can do with them whatever he pleases. Build strong walls and heavy dams to prevent the landslide caused by the waters that sink into the ground, and the waters will break through and carry your dam down into the valley; but provide the under-ground water with outlets in the places where it naturally endeavors to flow, and there will be no danger of a catastrophe.
The same is true of the social conditions of mankind. Lao Tze requests the government not to govern, but to simply administer. Rulers should not interfere with the natural development of their people, but practice not acting, not meddling, non-interference, or, as the French call it, _laissez faire_, so that the people shall scarcely know that they have rulers. The less laws and prohibitions there are, the less crime there will be. The less the welfare of the people is forced by artificial methods, the greater will be their wealth and prosperity.
Lao Tze's principle of "not-acting" is accordingly not inactivity; it is simply not acting a part; not doing things in an artificial way; it not not forcing the nature of things. The term (wu wei) is best explained by its synonym _wu yü_, being without desire. Man is requested not to have a will of his own, but to do what according to the eternal and immutable order of things he ought to do. It is the surrender of attachment to self, and the utter omission of _jhren tao_, of man's Tao, the peculiar and particular Tao of oneself and following the course prescribed by the eternal Tao. It is, briefly, not "non-action" but "non-assertion" and this is the translation by which _wu wei_ is rendered in the present translation as coming nearest to the original meaning.
Zhuang Tze, Lao Tze's most accomplished disciple, characterises _wu wei_ as follows:
> Non action makes one lord of all glory; non action makes one the treasury of all plans; non-action makes one the burden of all offices; non-action makes one the lord of all wisdom. The range of the true man's action is inexhaustible, but there is no-where any trace of his presence. He fulfills all that he has received from Heaven, but he has not seen that he was the recipient of anything. A pure vacancy (of his own and private affairs) characterises him. When the perfect man employs his mind, it is a mirror. It conducts nothing and anticipates nothing; it responds, but does not retain. Thus he is able to deal successfully with all the things and injures none.
_wu wei_ is the condition of genuine virtue. It leads to simplicity, to emptiness of heart, to sincerity, to stillness and purity, to righteousness, to plain-ness, to truth. The application of Lao Tze's ethics is tersely expressed in the sentence: "Recompense hatred with goodness".
Lao Tze further characterises his ethics as _kwei ken_ returning to the root. There is no idea (except perhaps the ideas of simplicity and purity) on which Lao Tze dwells with more emphasis than upon the ideal of pacification, which he calls _stillness, peace, equanimity and ease_.
The ideal of non-action as the basis of ethics in the sense in which Lao Tze understands it, is very different from the expressions and moral preachings that the Western people, the energetic children of the North, are accustomed to. Nevertheless, there are remarkable coincidences with Lao Tze's ethics not only in Buddhism, but also in the Bible and the literatures of Western saints and sages.
The virtue of the Taoist, which is _tranquility_, _quietude_, _rest_, corresponds to the Biblical injunction: "Rest in the Lord!" and "In quietude and in confidence shall be your strength!", or as the Apostle has it: "We beseech you, brethen, that ye study to be quiet."
This tranquillity, if acquired by all, would become peace on earth to the men of good-will.
The Bible characterises God in words that would have been very congenial to Lao Tze. We read:
> He maketh wars to cease unto the end of the earth; he breaketh the bow and cuteth the spear in sunder; he burneth the chariot in the fire".
And the ethics of this God, who is the ideal of peace on earth, is stillness. The Psalmist continues:
> "Be still and know that I am God."
That God should be conceived as non-action was a favorite idea of Philo, the Neo-Platonist, the same who for the first time used the term Logos in the sense in which is was adopted by the author of the Fourth Gospel. Philo calls God the non-actor, not in the sense of being passive but as absolute existence. Indeed, _activity is as natural to God as burning is to fire_, but God's activity is of a peculiar kind; it is efficiency, not exertion; it is not a particular work that he performs, but an omnipresent effectiveness which Philo finds difficult to characterise without falling a prey to mysticism. Philo was a mystic, and God to him is the Unnamable and Unspeakable.
Stillness, that is to say, self-possessed tranquility, or quietude of soul is the condition of purity. Anything that agitates the mind disturbs it, for troubled waters cannot be limpid. Zhuang Tze says:
> Sadness and pleasure show a depraving element in virtue; joy and anger show some error in their course; love and hatred show a failure of their virtue... It is the nature of water, when free from admixture, to be clear, and, when not agitated, to be leve; while, if obstructed and not allowed to flow, it cannot preserve its clearness--being an image of the virtue of Heaven. Hence it is said to be guileless and pure, and free from all admixture; to be still and uniform, without undergoing any change; to be indifferent and not self-asserting; to move and yet to act like Heaven:--this is the way to nourish the spirit".
Christianity and Buddhism are classified by Schopenhauer as the religions of pessimism, because they recognise the existence of evil in the world from which we must seek salvation, and in addition to several other similarities the Taoist philosophy would fall under the same category. Zhuang-Tze lets the robber Chi express his view on happiness in these words, which apparently voice the author's opinion:
> The greatest longevity man can reach is a hundred years; a medium longevity is eighty years; the lowest longevity is sixty. Take away sickness, pining, bereavement, mourning, anxieties, and calamities, the times when, in any of these, one can open his mouth and laugh, are only four or five days in a month. Heaven and earth have no limit of duration, but the death of man has its (appointed) time".
The world is full of anxiety and misery; and salvation consists solely in a surrender of that selfish craving for pleasures which, in common people, in the main-spring of action.
Lao-Tze's ethics of returning, and becoming quiet, remind us of Isaiah's word "In returning and rest shall ye be saved" and the Psalmist says: "Return unto thy rest, O my soul". Lao Tze insists on faith as much as St.Paul, saying:
> He whose faith is insufficient shall receive no faith
Further, Lao Tze says
> The softest overcomes the world's hardest.
> The weak conquer the strong, the tender conquer the rigid
St. Paul uses the same expression:
> God hath chosen the weak things of the world to confound the things which are mighty"
> When I am weak, then I am strong
> My (God's) strength is made perfect in weakness.
As the Tao is the same to all people, so the sage is the same to all people. He makes no discrimination. Lao Tze says: _The good I meet with goodness, the not-good, I also meet with goodness". Since genuine merit can be accomplished only through non-assertion, the condition of greatness is modesty of lowliness. As the water that benefits all the world seeks always the lowest places, so the sage abhors self-exaltation. As Christ says, "Whosoever shall exalt himself shall be abased" and "he that shall humble himself be exalted", so Lao Tze compares the Tao of Heaven to a bow, he says _it brings down the high and exalts the lowly". Lao Tze says that the imperfect will be restored, the crooked shall be straightened, the valleys shall be filled, which reminds one of the words of Isaiah:
> Every valley shall be exalted, and every mountain and hill shall be made low : and the crooked shall be made straight and the rough places plain.
Christian philosophers of the Middle Ages, especially the Mystics, present an even more striking analogies to Lao Tze's terminology than St. Paul. As Lao Tze speaks of the "Tao's course" as a "regress" or "a return homeward" and of man's necessity of "returning to the root" so Scotus Erigena in his book _De divisione naturae_, 519 AD, declares:
> God gathers all in one and resolves them in Himself in an ineffable regress.
Master Eckhart's sermons contain many passages that might have been written by Lao Tze; so especially his praise to the virtue of simplicity, his recommendation of quietude and rest, the importance which he attributes to unity, and his identification of the highest height and with the deepest depth of humility.
There is no doubt, the Taoists could claim Eckhart as one of their own.
Johannes Scheffler, called Angelus Silesius, a born Protestant, who was so much affected by mystic sentiment that he turned Roman Catholic, says:
> We pray, but lo! God has no will; stillness he is for me
> Rest is the highest good; indeed were God not rest; I'd turn away from Him, as being no longer blest.
The Tao Te Ching exercised a strong influence on Tolstoy. He too, speaks of non-action, _le non-agir_. Labor, in his opinion, is no virtue; labor is useless, no, pernicious, for labor keeps men too busy to leave them time for thought, is the curse of the world. Most of us, says Tolstoy, have not time for the consideration of truth and goodness, because we are rushed. An editor must arrange his journal, the general organises his troops, the engineer constructs an Eiffel tower, men of affairs arrange the World's Fair, the naturalist investigates heredity, the philologist must count the frequency of various phrases in certain authors, and no one has leisure enough for a moment of rest; no one has time for finding that peace of soul which the world cannot give. They do anything except that which they ought to do first.
Tolstoy is right, for thinking reforms the world, not laboring. Thought is the rudder that changes the course of the ship of toiling mankind; the energy of the steam that labors in turning the wheels is useful only so long as it is controlled by thought in the right way. For acquiring the right ideal that will guide us in the right direction, we need not labor, nor need we excert ourselves, on the contrary, says Tolstoy, we must abandon all exertion and become calm. If all men would only employ the tenth part of the energy that is wasted on the acquisition of purely material advantages, to settling the questions of their conscience, the world would soon be reformed.
A peculiar parallelism of Lao Tze's Taoism with Christianity consists in Lao Tze's belief in an original stat of innocence and paradisial happiness. He attributes all the evils that now prevail to a deviation form the original simplicity enjoined by the eternal Tao. The conscious discrimination between good and evil, the studied wisdom of the age, the prevailing method of teaching virtue which does not make men good, but merely induces them to be hypocritical, the constan interference of the government with the affairs of the people are the causes of all disorders. His ideal state would be a return to the paradisial innocence and simplicity, a society of simple-minded people who seek their happiness at home.
There are so many remarkable passages in the Tao Te Ching, such as the trinity in unity; the preservation of him who will not perish when he dies; that the weak conquer the strong; that we must become like little children; that the holy man knows himself as the child of the Tao; the the Tao can be had for the mere seeking of it; that the son of heaven (king or emperor) must bear the sins of the people, etc; but we must leave them to the reader who will find enough in Lao Tze's little book that will set him to thinking.
The natural result of Lao Tze's philosophy is the ethical ideal of the sage, the saintly man, who is also called the superior sage, or, as later Taoists have it, the Truth-Man, i.e. the man of truth or the true man.
Zhuang Tze says:
> The human spirit goes forth in all directions, flowing on without limit, reaching heaven above, and wreathing round the earth beneath. It transforms and nourishes all things, and cannot be represented by any form. Its name is "Divinity (in man)". It is only the path of pure simplicity which guards and preserves the Spirit. When this path is preserved and not lost, it becomes one with the Spirit; and in this ethereal amalgamation it acts in harmony with the orderly operation of Heaven.
> There is a common saying, "The multitude of men consider gain to be the most important thing; pure scholars, fame; those who are wise and able value their ambition; the sage prizes essential purity". Therefore simplicity is the denomination of that in which there is no admixture; purity of that in which the sprit is not impaired. It is he who can embody the simplicity and purity whom we call the True Man.
An exhaustive description of the True Man is given by Zhuang Tze in Book VI, where we read:
> What is meant by 'the True Man'?
> The True men of old did not reject the views of the few; they did not seek to accomplish their ends like heroes (before others); the did not lay plans to attain those ends. Being such, though they might make mistakes, they had no occasion for repentance; though they might succeed, they had no self-complacency. Being such, they could ascend the loftiest heights without fear; they could pass through water without being made wet by it; they could go into fire without being burned; so it was that by their knowledge they ascended to and reached the Tao.
> The True men of old did not dream when they slept, had no anxiety when they awoke, and did not care that their food should be pleasant. Their breathing came deep and silently.
> When men are defeated in argument, their words come from their gullets as if they were vomiting. Where lusts and desires are deep, the springs of the Heavenly are very shallow.
> The True men of old knew nothing of the love of life or the hatred of death. Entrance into life occasioned them no joy; the exit form it awakened no resistance. Composedly they went and came. They did not forget what their beginning had been, and they did not inquire into what their end would be. They accepted their lot and rejoiced in it; they forgot fear of death and returned to their state before life. This there was in them what is called the want of any mind to rest the Tao, and of all attempts by means of the Human to assist the Heavenly. Such were they who are called True men.
> The True men of old presented the aspect of judging others aright, but without being partisans; of feeling their own insufficiency, but without flattery or cringing. Their peculiarities were natural to them, but they were not obstinately attached to them; their humility was evident, but there was nothing of unreality of display about it.
Lao Tze declares that the True Man is not hurt by fire or water, and that he need not fear either the rhinoceros or tiger, which is explained by Zhuang Tze in Book XVII:
> Fire cannot burn him who is perfect in virtue, nor water drown him; neither cold nor heat can affect him injuriously; neither bird nor beast can hurt him. This does not mean that he is indifferent to these things; it means that he discriminates between where he may safely rest and where he will be in peril; that he is tranquil equally in calamity and happiness; that he is careful what he avoids and what he approaches;--so that nothing can injure him. Hence it said: "What is heavenly is internal; what is human is external".
> Virtue is in what is heavenly. If you know the operation of what is heavenly and what is human, you will have your root in what is heavenly and your position in virtue.
The sage is above death; he is one with the Tao:
> Death and life are great considerations, but they could work no change in him. Though heaven and earth were to be overturned and fall, they would occasion him no loss. His judgement is fixed on that in which there is no element of falsehood; and, while the other things change, he changes not. The transformations of things are to him the developments prescribed for them, and he keeps fast of the author of them.
The same ideas are expressed by Horace in his ode _Integer vitae_ in which the Roman poet praises the perfect and faultless man who needs no arms of any description, who may roam through mountain wilderness without fear of the wolf and will not suffer from the heat of the desert. Horace exclaims in another ode that the virtuous man would remain firm even if the world broke down upon him.
It was natural that in the course of the further development of the Taoist movement the old philosopher was more and more regarded as _the_ True Man, beside whom all the others were mere aspirants for saintiliness. his life was adorned with tales which remind us of Buddhist legends, and he became the central figure of a triune deity called the Three Pure Ones, which are even in appearance very similar to the Buddhist Trinity of the Buddha, the Dharma, and the Sangha.
I came outside the house and saw huge trash bags lined up the street, they must have been more than 2m tall. I regretted not having brought out the trash, because now it was too late [I do not understand this logic]. Neighbors started coming out, and now there was a crowd. A neighbor asked me if I had heard the news about the boy who had tried committing suicide. I said I hadn't. He said that the boy wanted something that couldn't be had, so in a tantrum he cut his veins, and he showed me the tree where this had happened.
It was soaking in blood. I looked around and saw everything was covered in fresh blood. "There is no way this kid could have survived", I thought.
There are two types of Truth, objective truth and relative truth.
The post-modernist says that objective truth does not exist.
The modernist will say that objective truth is the only thing that exists.
It would seem obvious both exist.
I had a nap and I dreamed about the _fiestas_ of a Spanish _pueblo_. They had let loose two bulls: one was young and energetic, but too inexperienced and clumsy to be a threat. The other was old and tired, unwilling to give a chase.
In the nap I dreamed that I was meeting up with two of my friends from high school. I was wearing two hats, one was a panama hat and the other was a more feminine hat with flowers. I put both on and went to the meeting place. One of my friends called me as he couldn't find me, and I saw him go right by me, but he didn't recognize me because of the hat. He entered a building. As I was following him, my other friend came out of the building, looked at the hat, then looked at me strangely, and then asked for my computer. I opened my backpack to pull it out, but the laptop seemed stuck. My friend pulled hard and broke it.
Estaba en la universidad y tenía que inscribir una materia pendiente para sacar mi título. No me la habían podido dar de alta en el decanato por no sé qué historia, así que fui a la sala de cómputo y me senté en una Mac, abrí terminal, y me conecté al sistema que tenían antes (via linea de comandos). Alguien junto a mi parecía muy impresionado, pero yo le decía que eso era lo normal en mis tiempos.
Sin embargo, al final no podía inscribir la materia porque me hacía falta hacer un pago. Así que fui a la caja—una vitrina en un sótano oscuro, modelado en mi memoria del área de consultas del Hospital Ramón y Cajal en Madrid, a hacer el pago.
David E. aparecía detrás mío y se encargaba del pago, porque yo no tenía dinero. Mientras él hacía los trámites financieros, me distraía con un catálogo de billetes extranjeros. Eran preciosos, increíblemente barrocos, pero a la vez reticulados y de colores indescriptibles, como tornasoles holográficos. Quedé como hipnotizado ante esos papeles tan hermosos.
Dear Keith,
I hope you are well. From Twitter in general it would seem there is an emotional shift, and even when I ruthlessly unfollow people who tweet about politics the effect is still felt, and I sense this in your latest tweets too. Outer chaos is difficult to ignore! It is a world event and its effects are felt in Mexico too.
I write to you because I sense a pretty honest commitment to following the progress of my own health, and I think as a specialist on the body you are of invaluable help in this endeavor. The idea is to have an self-performed annual check-up. I am in currently in good shape, I've been going to yoga during 6 months (divided due to COVID) and I currently consistently and effortlessly hit the gym every day, but I've been on and off for years.
My weight lifting routine is pogressive overload and through your own example I realize I am not supposed to be trying to outperform on a daily basis!
I already track my gym progress on a daily basis, but through yoga and examples such as yourself, I've learned that looking at the numbers is looking at the spedometer instead of the road. Besides registering my deadlift, bench press, squat, in numbers, I ought to register myself in video as you do yourself.
So my direct question to you would be:
What are some poses/exercises which depend solely on standing on even floor available to me which best reflect the state of my strength and flexibility? Reaching your toes for sure. Downward facing dog. Torsions. Arm bends. Lifting your leg on a straight back. The list could be yoga poses, but there's a probably a better and more clear way of demonstrating flexibility, balance and strength.
I plan to add blood work and other health markers into it, but my budget is meager and if I am to measure myself at this time, it should be by almost free methods, such as blowing into a balloon (surely there are measured balloons?) and whatever convenient means are available to me, but I think doing some basic blood work may be cheap. But these are the ten thousand things.
I hope that you agree to my humble proposition to offer you credit for your help, in a way to make it a public consultation. This I intend to post to https://exploration.work which will be a sort of "paths of development" that I have for myself.
My intention was to have lunch at a park next to the study hall, but it turned out to be a concrete park. How can architects come up with this? Perhaps the client request is to repel people as much as possible. Across the street I saw a generous strip of grass lined with trees, and sat for lunch under a red plum tree. As this wasn't marked as a park by google maps, I switched my basemap to satellite, this should give me a better vision of nature within the city.
Why vibrate with the same energy that people present to you? Because you have trained your emotional regulation. The reason we avoid resonating at certain frequencies is because we are afraid of becoming stuck in them. I do not want to become sad for the person who is sad because I avoid feeling like that, so I give that person a "toughen up" treatment instead.
Consider a sage who has a sister who won the lottery. The sister comes to him excited to share the good news. What should the sage say? "Congratulations, but we don't know yet if this is a blessing or if this is a curse" is a valid answer, but saying it vibrating with the excited positive energy transmits hope instead of despair into the warning.
Consider too, that most people do this unconsciously, and that the energy first put forward is the energy that you would like to receive from this person in return. You act formal when you want to be treated formally, you act friendly when you want to be treated like a friend.
I like digital products that scale to the viewport of the monitor. More than an issue of "wasting space", it seems to me necessary to use the full dimensions available. When young and foolish I lived in Puerto Vallarta. My bedroom had "ocean view": if you looked outside the window, it would meet directly to the window of the kitchen of a bar that actually had ocean view. You could see all through the bar and catch the tiniest frame of the horizon. Looking through this window you could see all the frames that encompassed what you actually wanted to see: the bedroom window frame, the kitchen window, the bar terrace frame, and then the ocean view.
This is the case with digital products too, the product is constrained in a monitor frame, which is constrained in an operating system frame, which is then constrained in a browser window. We have this deeply nested hierarchy of boxes and some designers think they need another frame yet!
Many dreams were had, among them one in which I was in a lab with a researcher who handed me a VR set.
He instructed me to go outside unto the street, and with the headset on I would experience a sort of themed/skinned reality in realtime, but with a slight delay. This was originally a technological constraint (lag), but they wanted to investigate the intentional binding phenomena. I put on the headset and went outside, and was quite amazed at how real everything seemed. The streets were empty and I worried about bumping into someone inside reality, so I was going quite slow, experiencing some lag between my movements and what happened in VR. After some time of this I grew anxious (like when you walk with your eyes closed) so I stripped off the VR headset and saw that it was simply transparent, like a diving mask. I felt duped but then I understood the study was about inducing the sensation of lag in reality.
The last laugh was had by the mind, which simulated all of this.
Virtuegraph Design Statement
The purpose
The purpose is need driven and simple: in order to self-perfect ourselves, be it as a recovery from depression or riding the awesome waves that life brings, we need a mirror to show us who we are. If you want no further instruction, simply follow your own intuitive trend towards what is good. This in itself requires not necessarily software, but does require a true commitment towards accomplishing objectivity in your own life.
This is how the mirror shows you back who you are. It is very difficult to paint a fair picture, and be warned that we have an aggrandized view of the ego, and the first lesson is a lesson in humility. This will cause pain: how can someone look at the self and recognize that one has to be truthful with oneself. This is more an idea than software itself, my work is simply a prototype which I build with the intention of sharing.
Following a path requires a certain amount of self-accountability, even if it's a personal path. Fortunately there are ready made paths, from which we can adopt proven patterns of well-being. Your servant himself is in process of a major depression recovery. This time the process of recovery involves sharing the bounty. But be aware that depression itself
I agree that there is a
Self-observation in a mirror often causes
Inner principles
Stick to truth
Observe first, action second.
Make no judgement of the kind of life you live.
Stop using it as soon as possible.
The dangers
Tendencies of self-preservation
The tendencies in the self towards self-preservation are strongly
because that art is only done within the true self, the software is simply a reflection of what you see, and for this art it is required that the software and the idea is completely free.
I wish not to bore anyone on why I take this approach, but it is said that when one complete's his hero's quest, the solution is simply to show the way to others. And this comes from the humility of depression. One suffers from all
we need a mirror in which we can
<table>
<tr>
<th>Day</th>
<td style="background: var(--z15)">[[01|2020 10 06 The to-do list was interesting]]</td>
<td style="background: var(--z15)">[[02|2020 10 08 Law of attraction]]</td>
<td style="background: var(--z15)">[[03|2020 10 09 High vs low]]</td>
<td style="background: var(--z15)">[[04|2020 10 10 Nude modelling project]]</td>
<td style="background: var(--z15)">[[05|2020 10 11 Flowing]]</td>
<td style="background: var(--z15)">[[06|2020 10 13 Hypocrisy]]</td>
<td style="background: var(--z15)">[[07|2020 10 14 Choose projects]]</td>
<td style="background: var(--z15)">[[08|2020 10 15 State altered]]</td>
<td style="background: var(--z15)">[[09|2020 10 16 Family lunch]]</td>
<td style="background: var(--z15)">[[10|2020 10 18 Blood donation]]</td>
<td style="background: var(--z15)">[[11|2020 10 19 The esoteric supper]]</td>
<td style="background: var(--z15)">[[12|2020 10 20 Delete, overwrite and respawn]]</td>
<td style="background: var(--z15)">[[13|2020 10 21 Vice]]</td>
<td style="background: var(--z15)">[[14|2020 10 22 Óscar's meditation]]</td>
<td style="background: var(--z15)">[[15|2020 10 24 Comfort zone]]</td>
<td style="background: var(--z15)">[[16|2020 10 25 Garden work]]</td>
<td style="background: var(--z15)">[[17|2020 10 26 Action, not writing about action]]</td>
<td style="background: var(--z15)">[[18|2020 10 27 What will I do with all this writing?]]</td>
<td style="background: var(--z15)">[[19|2020 10 28 Three ways to respond]]</td>
<td style="background: var(--z15)">[[20|2020 10 29 Alienation]]</td>
<td style="background: var(--z15)">[[21|2020 10 30 Bike repair]]</td>
<td style="background: var(--z15)">[[22|2020 10 31 End of October]]</td>
</tr>
<tr>
<th>[[Sun shower]] ([[Keystone|The keystone]])</th>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
<td style="background: var(--a3)"></td>
</tr>
<tr>
<th>[[Look in the eyes]]</th>
<td style="background: var(--e12)"></td>
<td style="background: var(--e15)"></td>
<td style="background: var(--e5)"></td>
<td style="background: var(--e12)"></td>
<td style="background: var(--e15)"></td>
<td style="background: var(--e5)"></td>
<td style="background: var(--e12)"></td>
<td style="background: var(--e15)"></td>
<td style="background: var(--e15)"></td>
<td style="background: var(--e15)"></td>
<td style="background: var(--e15)"></td>
<td style="background: var(--e5)"></td>
<td style="background: var(--e5)"></td>
<td style="background: var(--e3)"></td>
<td style="background: var(--e3)"></td>
<td style="background: var(--e15)"></td>
<td style="background: var(--e15)"></td>
<td style="background: var(--e15)"></td>
<td style="background: var(--e15)"></td>
<td style="background: var(--e15)"></td>
<td style="background: var(--e15)"></td>
<td style="background: var(--e15)"></td>
</tr>
<tr>
<th>[[Meditation]]</th>
<td style="background: var(--d12)"></td>
<td style="background: var(--d15)"></td>
<td style="background: var(--d12)"></td>
<td style="background: var(--d10)"></td>
<td style="background: var(--d10)"></td>
<td style="background: var(--d10)"></td>
<td style="background: var(--d7)"></td>
<td style="background: var(--d8)"></td>
<td style="background: var(--d8)"></td>
<td style="background: var(--d6)"></td>
<td style="background: var(--d6)"></td>
<td style="background: var(--d6)"></td>
<td style="background: var(--d6)"></td>
<td style="background: var(--d3)"></td>
<td style="background: var(--d3)"></td>
<td style="background: var(--d6)"></td>
<td style="background: var(--d6)"></td>
<td style="background: var(--d3)"></td>
<td style="background: var(--d10)"></td>
<td style="background: var(--d6)"></td>
<td style="background: var(--d10)"></td>
<td style="background: var(--d3)"></td>
</tr>
<tr>
<th>[[Material Work]]</th>
<td style="background: var(--g8)"></td>
<td style="background: var(--g12)"></td>
<td style="background: var(--g10)"></td>
<td style="background: var(--g10)"></td>
<td style="background: var(--g3)"></td>
<td style="background: var(--g5)"></td>
<td style="background: var(--g4)"></td>
<td style="background: var(--g6)"></td>
<td style="background: var(--g6)"></td>
<td style="background: var(--g6)"></td>
<td style="background: var(--g6)"></td>
<td style="background: var(--g4)"></td>
<td style="background: var(--g4)"></td>
<td style="background: var(--g6)"></td>
<td style="background: var(--g12)"></td>
<td style="background: var(--g4)"></td>
<td style="background: var(--g2)"></td>
<td style="background: var(--g2)"></td>
<td style="background: var(--g6)"></td>
<td style="background: var(--g12)"></td>
<td style="background: var(--g6)"></td>
<td style="background: var(--g6)"></td>
</tr>
<tr>
<th>[[Body Work]]</th>
<td style="background: var(--h3)"></td>
<td style="background: var(--h3)"></td>
<td style="background: var(--h3)"></td>
<td style="background: var(--h10)"></td>
<td style="background: var(--h10)"></td>
<td style="background: var(--h3)"></td>
<td style="background: var(--h5)"></td>
<td style="background: var(--h2)"></td>
<td style="background: var(--h5)"></td>
<td style="background: var(--h10)"></td>
<td style="background: var(--h7)"></td>
<td style="background: var(--h3)"></td>
<td style="background: var(--h3)"></td>
<td style="background: var(--h3)"></td>
<td style="background: var(--h3)"></td>
<td style="background: var(--h7)"></td>
<td style="background: var(--h3)"></td>
<td style="background: var(--h3)"></td>
<td style="background: var(--h3)"></td>
<td style="background: var(--h3)"></td>
<td style="background: var(--h5)"></td>
<td style="background: var(--h5)"></td>
</tr>
</table>
```
VirtueList
Purpose:
The virtuegraph
Activities that support the purpose:
Writing
Drawing
Programming
Experimenting
Photographing
Health
Getting things off my plate efficiently
Use the board
Routine
Things to figure out
Where to work outside of home
Become interested in other people's goals
Concepts to research
Personality
Goals
Habit formation
Observe
Rapport
Met someone new
Libido
Stared steadily
Mood
Sharpness
Meditation
Gym
Parkour
Stretch
Lotus
Mind silence
Imagination
Truth
Scared myself
New experience
Ask for opinion
Deliberate question
Morning run
Tobacco
Pot
Alcohol
Porn
Connection
Enjoyed my current life
Made myself visible
Created tension
Gave a compliment
```
INAH localiza una piedra-mapa de hace 2 mil años en Colima
https://www.mexicodesconocido.com.mx/inah-localiza-una-piedra-mapa-de-hace-2-mil-anos-en-colima.html
https://goo.gl/maps/cS66DpZUhQebwhu76
> I was in a cave consorting with the elders about how to proceed, I said "here is what I'm planning to do:". A voice from outside the cave interrupted "Yeah, what are you going to do?". I turned my face and screamed "Shut up!". I couldn't let go of my anger and I screamed again "I'm going to eat you alive! That's what I'm going to do!".
[img class="thumb" [RungeSphere]]
Runge is a color notation system accompanied by a [[color palette generator]] inspired by [[Goethe's exploration in color]] and materialized in [[Runge's Color Sphere]]. Runge allows you to easily create and manipulate color schemes by treating color as hierarchical data. How many times have we wished: I want this same design, but in dark/green/blue? What would seem to be a straightforward task becomes more difficult to resolve because we do not posess the thinking tools to properly manage color.
The premise is very simple: if you produce a color scheme with equidistant luminance in each of it's steps, it is possible to switch color schemes on the fly, with the certainty that every element which uses color will be changed appropriately. This makes designing for darkmode almost reduntant, since the information hierarchy is respected.
However, color in design not only posseses hierarchical values, it contains implicit ones. Consider: a design with a gray background and white cards in darkmode is not a gray background with black cards, it is a black background with light gray cards, so a straight color inversion does not work, there is another dimension of implicit meaning in the design: that of height.
What is the Virtuegraph
I don’t know how to define it
I have circled around many definitions for the Virtuegraph. What stroke me was that I came up with the most varied definitions, depending on how I was using to tool. By patience and observation, it was seen that it’s uses are varied, but it’s always meant for inner work. Depending on my state, I’ve described it as an instrument that assists in fulfilling personal potential. Boots to cross some shitty terrain. Kanban for personal development. A mirror reflecting my ugly face. A staircase where going “up” feels intuitive.
Let’s explore what it is
I’ve pondered if I should call it a tool, an instrument, or a technique. It is a tool because it is the hammer that flints off the stone to build a handaxe. The skill relies entirely in the user of the hammer, the hammer itself is useless without a skilled user. It is very clearly an instrument: it’s a measuring device that can serve as a dashboard of your own performance throughout a cycle. It is a technique, because skill improves with use, and sometimes guidance is needed on how to get unstuck. The best metaphor I can come up with is “inner abacus”, so the concept of a tool that serves as an instrument which requires technique is well-represented.
Let’s explore it’s validity
To this day, the user is only one, and my own accomplishments are questionable. I cannot rely it’s validity on my reputation, for this is involving one’s ego in the game, so I would work towards protecting my ego instead of becoming the objective scientist required to do this task. I cannot even claim to have great results, under most measures of society I would be a failure. But I am happy with myself and I find a lot of meaning in my life.
Then, what is it that makes the virtuegraph valid? I do not posses any evidence, and here is some work to be done.
inwardly I have proved the hypothesis, but outwardly there is work to do.
====
What is a virtuegraph
A virtuegraph is a method for self development. It's both a technique and a tool, in the same way Kanban is a technique and a tool for project management. I've used it on myself for a number of years, and I've seen good results using it. No grandiose claims are made about it's effectiveness. In the same way Kanban doesn't transform a small company into a great one, it will not transform you from a lacking person into a self-actualized one, but it facilitates the actions required to get there.
At it's heart is is simply a way of registering commitments you make to yourself, and following up on them. The current generation of tools for self-development seem to come from people who have an opinion on what it means to "live a good life", and thus try to put a life-coach in your pocket. The virtual life-coach reminds you to meditate, he cheers when you accomplish a goal, encourages streaks, gives you tips on how to get out of a rut, and so on. In theory it sounds great, but in practice it's having MS Clippy in your pocket.
Honoring the great variety of personalities and approaches to life, a virtuegraph does not have an opinion on what a "good life" entails. That is for yourself to work out. You can use it for following your ambition, your pleasures,
What is the virtuegraph
At a certain point in life, the big questions of life come in full force: why am I here? What is the meaning of my life? How to I become who I am supposed to be? If one has scratched at the surface, the answer always points in one direction: seek within yourself.
But, how is one supposed to seek within the self? An internal dialogue is established, and as one keeps on digging some gems constitute the bounty that one was supposedly looking for. But it never seems to be enough, the inner complexity takes on so many forms, and from every head we cut off it seems twice as many sprout out.
How one lives this process is his own territory. I cannot explain except in the vaguest terms what constitutues this inner struggle. Attention comes forcefully to the big questions, but the process of each one of us is a universe in itself.
That I describe the territory that I have explored is beyond the point. I, for sure, would have lost interest in the task of following a stranger's life into the unknown. However, as one comes back into the known, it is noticed that—in order to fully come into reality, it is necessary to point towards the right direction.
But, what is the right direction? If each one of us comes from different genetics and different upbringing, who am I to say "this is your path"? And thus I can only recommend: seek within yourself, you will find your answers through experience. There is no path of the soul, but paths where we might encounter our soul.
Fortunately, each one of us carries within an intuition about where to find it. It inhabits our deepest longings, our highest goals, our intolerable itches, and our conscious and unconscious dreams. How is it that we would be granted awareness of our own inner landscape, and yet be crippled to explore it?
Yet, in the matter of inner life, many of us act like insects: we are flies with teared wings who insist they can fly, spiders missing legs that go hobble along wondering why we don't move as fast as before, or simply larvae that feast on the first thing that appeared to us, oblivious that more nutritious sources of sustenance at hand.
If you disagree with this assertion, you can verify it by taking mental note of all the "shoulds" that come up in your life: I should be more careful, social, or responsible. Or the other side of the coin: I should be less pessimistic, less indulging, or less caring. Track them in the virtuegraph and see if you can do anything about them. If you are indeed able to take charge of them (and I've known a few people who indeed can), you can stop reading here. You don't need further instruction.
From here is where we ought to start. Why is it that I know the direction of my self-realisation, and yet I seem uncapable of accomplishing it?
In the last few months I've experimented a lot with workplaces. I've visited more than 50 different libraries and study halls, plus the ocasional session from a co-working space, a café, a pool, or even under a tree in the park. Not to mention former years working full-time at offices of varying quality. I've worked standing up, sitting on chairs, and lying down either on grass or on the bed.
Surprisingly, I'd say there's not much correlation between my work setting and my focus. There are only two consistent impediments in my experience: proneness to interruption and bright sunlight.
Bright sunlight requires little explanation: you evidently work under the shade, but the overly bright environment causes unsustainable strain on the eyes, and pretty soon you'll be forced to cease work. Still, I used to enjoy the one hour of work I was able to get done at the pool, so I'd find a smaller task to tackle, and knowing that my time was limited made me hurry with the task.
Proneness to interruption needs not to come from the environment. You can work in a bar in the flurry of activity and noise, and as long as a waiter doesn't come to check on you, you can be equally focused as in a library. Funnily enough, for me one of the most challenging places to work is home, even if I'm alone.
For example, I'm currently writing this from a private library in the center of Madrid. I'm finding the task a chore: it doesn't feel like an interesting essay, or that I'm contributing a unique perspective on the topic. I'm not in a state of flow. I feel a vague sensation that I could use a restroom break, but since this would require me to pack my laptop, I'm putting it off. At home I'm certain I would have taken that break. I would have probably come back and seen that what I had written was not good, checked on Twitter; you know how the story goes.
The same thing happens with the most minimum excuse: feeling just a bit thirsty? Get a glass of water. Sleepy? Prepare a cup of coffee or take a nap. At this very moment I'm noticing all these things, yet they're not within reach so I'm not abandoning the task. At home I would.
Some weeks ago I made an experiment: what if I close the door to remind myself not to take unnecessary breaks? Soon enough I was opening the door and leaving the room without even noticing. I obstructed the door with a suitcase, and yet I'd find myself pulling at the handle having forgotten that I had obstructed the door. In the same way the mind can wander towards a different topic from what you're supposed to be thinking while at work, the body can also wander away from its workplace without you noticing.
What interrupts or distracts you is highly idiosyncratic. At this very moment, the woman in front of me is chatting on her phone. I have no idea why, but this consistently distracts me. In this library I once saw a woman snap at a guy who dragged a chair, the man responded calmly: "I'm sorry to tell you, but if this upsets you so much, studying here is not a good idea". Awareness of losing focus is difficult, but perhaps necessary if we are to create or find the best workplace for ourselves.
Yet, lack of distractions and interruptions are not everything. Focus and flow are reinvigorating, but when coupled with beautiful settings, it has a therapeutic effect on the soul. Yesterday I found what I consider to be the best public workplace in Madrid: the library of the Prado Museum. It seems to be relatively unknown. I was alone there most of the time, and I was surprised to have missed it in my compilation of [public access workspaces in Madrid](https://www.google.com/maps/d/viewer?mid=18Cqw1TswU0UcIZ9CSb2W8Qhevtn0rnnV&ll=40.45201402024507%2C-3.6672416356445865&z=12).
<img alt="Library of Casón del Buen Retiro" src="https://method.ac/writing/uploads/fdf2fda10b447d74442fa9553e3dba0e.jpg" class="mt-image-none" style="width: 100%;" />
The setting is inspiring: a former ballroom for royalty decorated with [a beautiful fresco](https://www.museodelprado.es/en/the-collection/art-work/vault-with-the-allegory-of-the-golden-fleece-or/6bd56ee8-029e-4534-ac84-c83292602d0b) by Luca Giordano on the domed ceiling, large canvases beautiful paintings adorning the walls, modern high quality furniture, absolute silence. Art books all around. Bathrooms are sparkling clean and incredibly spacious and private.
I came out at lunch time, crossed the street to Retiro park (the former strolling grounds of the king), and just 20 meters ahead, under the [oldest tree of Madrid](https://www.miradormadrid.com/el-arbol-mas-antiguo-de-madrid/), I had lunch. I mused: the best workplaces not only remove distractions, they inspire through beauty.
The purpose of writing this is to make an assesment of my life at this time, a kind of snapshot or slice of my current life, so that I can assess what progress means to me. This, I would consider, is a challenging spiritual exercise, because to be completely truthful and doing so in public is a challenge beyond my current comfort zone.
Let us see then, where do I stand at this precise moment in life.
I came back to my childhood home after spending some four years in Spain, and for the last two years I've been working as least as possible in order to finance my "sabbatical". I am completely broke financially with my credit card maxed out and negative balance in my bank account. It's not terrible: $4,000 USD in debt.
I am strangely unconcerned, I just have the feeling things will turn out right if I pursue what interests me the most at this moment, which is the joint venture I have with René Galindo, but it does look like a wick which holds very little wax. Should I meet failure, the flame would be put out.
But some chasms are meant to be crossed and one must be corageous if one wants to accomplish anything in life. Let us continue as we have been until now: utterly unconcerned about money, yet spending nothing. I will continue walking the path of semi-monastic life into 2020.
Where am I right now? Allow me to speak from spirit, the reality beyond reality. What do I see?
I am performing a lot of psychological work. I have come to understand the boundaries with my family. But there is something inwardly silent that is unveiling, and I'm looking with a lot of interest at it, and at times I feel like a moth circling a light bulb. I cannot consume myself in the light until I satisfy the purpose of my ego in this life. And then I become afraid that it is simply a trick of the ego to give himself more time.
All is resolved, yet *I* continue to be an entity who types online almost every day.
It is said that once you find the passage, it is impossible not to come back and help other cross it. This passage is the passage to freedom. I'd say I've only seen it, I have not been in it. My role in this world is to be a scout. If I follow that direction I will not be able to come back. I do not want to be enlightened. I commit to continue exploring this experience called life. I will cross to that land when I am ripe for it.
Indeed, when is one ripe for transformation?
In Morelia, Mexico; monarch butterflies come to spend the winter, and then migrate north to Canada in the warmer months. The migration north is multi-generational: butterflies arrive to a certain spot, mate, die, and their children continue their way north. Once in Canada, a _super butterfly_ is born which completes the multigenerational trip in a single fly, arriving in large numbers to Morelia, Michoacán. I must see them! When? November to March. I must be patient. I have no money for these whims.
I sidetracked. It's desire, sorry.
Once may not notice, but we are continously dying in order to give raise to new things. We "rebirth" when we wake up in the morning with refreshed intentions. The blank page feeling of life: what will today bring? and let the answer never be _drudge, toil, exhaustion_ but _curiosity, flow, attention_.
I can say in all honesty that I love my life at this time. Yet, outwardly, I'm serious. I took root quickly because I knew this land, but I would like to deepen my Mexican roots now that I am in Mexico.
I yearn for pilgrimages that few people know about, pilgrimages from the heart. If I want to fulfil my explorer archetype, a good option would be to retrace the route of Cortés. I would love to walk the camino of Cortés. I ought to read his letters to the king once more. Indeed, allow us to just move the book to the bath room, this way it remains at the right place at the right time.
I'm kinda high and I know this kind of insight requires sobriety to let it sink in. As the guy from the camino said: _la maría es una gran maestra, lo que pasa es que no le hacemos caso_ and so I keep this for next year. Allow us to continue a different exercise: write in the middle of motion.
Who am I?
This post is not meant to describe the author, it is meant as a guide to inquire into the true nature of the self. Let us make a mental exercise:
Should I lose all my possessions, would I still be me?
Should I be fired from my job tomorrow, would I still be me?
Should I lose the use of my body and become paraplegic, would I still be me?
Should I lose all my family and close friends in an accident, would I still be me?
Should I change my political alliance, would I still be me?
Should I wake up tomorrow and find I don’t remember anything about my past, would I still be me?
Should I have stroke and have my personality changed drastically, would I still be me?
Should I lose the capacity to earn my living as I’ve always done (lose my profession) would I still be me?
Should switch my spiritual polarity, and lose or gain religion, would I still be me?
Should I wake up with my sexual preferences inverted, would I still be me?
Should my nation declare me undesirable and exile me, would I still be me?
Should I lose my sanity and become Schizophrenic or Psychotic, would I still be me?
Should my physical appearance become mangled in a horrific accident, would I still be me?
Should I eat meat exclusively, would I still be me?
Should I eat plants exclusively, would I still be me?
Am I what I do?
Am I still me when I’m very drunk?
Am I still me when I’m very high?
Am I still me when I’m very depressed?
Am I still me in my dreams?
Am I still me lost in dance?
Am I still me lost in sex?
Am I still me lost in anger?
The purpose here is not to project the grief, but to
I have blogged for, what is it now? Probably two years and a half years of mostly stream of thought writing with an ultra simple text editor I built with [[René Galindo]] called [[Blank Page]]. It was not our intention to make a "simple editor", but that is how the project started and we both enjoyed writing on it, so we've kept it clutter free. Now I refuse to write longish format anywhere else.
I noticed that the tool you use shapes your thinking. Even those damn underlines distract you from what is truly important: that you express what your mind is thinking. When you write for yourself in your notebook, you are not concerned with your handwriting, it is not meant for anyone but yourself, and this is also the approach I want to take with this notebook. Everything is written in [[Blank Page]] with spellcheck disabled, stream of thought with light editing, so that I allow to express myself with more freedom.
I also wish to reclaim all the content that I've left scattered in abandoned blogs and social media presences, it seems this place is perfect for that. We want to abandon social media yet we must find alternate ways of archiving and organizing our life. Are you really going to leave that to facebook? And I must add that I do not find that unappealing, delegating your dating, your social circle, your shopping, and having all your media archived by using their platform is such a good proposition that most of the world has decided to take it, but many have already realized this is a trap.
But I must also be honest with myself, and say that I have had this intention before, but I did not act on my intentions because I knew the piece of software I was using (Moveable Type) was a dead end, and I had to switch to something else.
I observed two directions: one of utter simplicity, most probably using a static blog generator, and outputting my words into the void, and the other was of utter complexity, trying to link and organize all the bits that come out of daily writing.
The first direction offered the possibility of infinite customization, but not on the authorship part. I could express ideas as standalone interactive pieces, but I know from experience this to be a lofty idea. This is why I installed Movable Type in the first place, I knew it inside out so I could do what I wanted, but I discovered I simply wanted to write. I was already programming enough as it was.
So I thought it better to use a wiki software, but a long time ago I had to make a theme for mediawiki and I saw how overly complicated it was to customize a theme, and I was not looking forward to that task. Instead, I stumbled upon wiki.js. It looked sleek. Surely I could just change a couple of things, how complicated could it be?
I spun up a Digital Ocean instance with their image and sure enough, I was up and running in five minutes. Amazing! Now, what do I need to do to customize it? Oh, there's no themeing support yet, you have to and dive into their vue codebase and build it from scratch. Fair enough. I could use it as it is. Now, let's write our first entry.. How to I automatically link an existing page? Oh crap, this is not a wiki!
But this is clever thinking to put off the first professional mantra: always be shipping. Action trumps manifestos. Allow for work to do the talking. Let us get to work, the only task is to communicate, what allows for clear communication?
I then had a nap and dreamed about code, but this time it was very vivid, I was seeing actual code and a cursor, and I was jumping between functions changing things so that they would work.
> I was in a vacation resort staying with some friends at an apartment within a water park. My friends didn't like the place, and booked an airbnb outside the resort, a large house in a residential neighborhood. I entered the house, turned left, opened the door, and found a small reading room with a nice chair, a desk and a window. I was delighted and thought it would be the perfect place to work. Then I exited the reading room, turned right, and found a large kitchen which I thought would be appropriate for preparing my meals.
>
> Then I went upstairs, turned right, and found a kitchen just like the one downstairs, with a breakfast table. "Oh, this must be one of those fancy houses with two kitchens, what a waste" I thought. Then I turned left and saw the bedrooms: three of them, each with two single beds. "Oh, everyone is going to sleep with someone except me" I thought. I saw a fancy office with a large desk in the center "nah, I will not work there" I thought.
Worldviews
We are raised in a constrained worldview.
If we are exposed to things that do not fit in this worldview; we either condenm it, or grow our worldview to include it.
If our current worldview is maladaptive to our environment, we either grow resentful until we become neurotic, or we seek to adopt a new one (change religion).
We tend to regard other worldviews as wrong.
We seek affirmation of our worldview from the spokespeople of it. We confirm the worldview with our peers.
We are all too willing to exchange liberty for certainty.
There is a hierarchy of worldviews, from more exclusive to more inclusive
May 20, 2017. Last night I had a dream which told me to begin writing again.
I was in the house where I grew up in Puebla, Mexico. It was no longer my parents' home, it was mine; and I had done some renovations to it. I was waiting for my mother to arrive, but I still hadn't installed a doorbell (to this day it doesn't have one--it never has). I went up a newly installed staircase to the rooftop to be able to see her coming.
I saw mom arrive as cheerful as always, with a large backpack on her back. She made a pause at the park in front of the house, looked up and turned around as if seeking something. "the house is here mom"--I shouted from the rooftop, thinking her memory was failing her. "I know darling"--she responded with a smile--"I'm just admiring the stars". I looked up and was surprised that it was already dark, there seemed to be daylight just moments ago, and instead of the constellations there where dozens of stars the size of dwarf moons, hugged by clouds "those are some strange stars!" I exclaimed from the rooftop, "they look like pearls inside open oysters". We admired the scene for some time, and then went inside.
"You should begin writing again", my mother told me, as we entered the living room. "Mom, there's no need now, I'm well established and I have no need to promote myself". "But it was never about self-promotion, do you remember you used to lock yourself in your room to write when I organized family gatherings?". I conceded. "Do you remember how much you wrote when you broke up with your girlfriend? You didn't leave your room in a month". Ah, I had forgotten about this too. "But I don't see the point mom, what would I be escaping now?". And so I woke up with this question in my mind.
Would writing be a form of escapism at this time? Was it ever a form of escapism? In former times, writing was a way of understanding design. I would go into seclusion not only to avoid socialization but from a desire to understand. Nowadays my obsession lies in attempting to understand more about myself. Perhaps by writing about it, the obsession will burn itself in the same way it burned design away.
# When you perceive a "sign", pursue it instead of dismissing it. Write an account of what happened.
# Write from a place of intense curiosity
# Write something you will know you will do in the near future as if it were the present moment
# Recall one of your first memories in at least 500 words. If you don't find enough words, fill it out with fiction.
# Write about how you feel while sleepy or hungry. Inspect the sensations.
# Condense an essay into an aphorism
# List things that would get you out of bed immediately
# When was the last time you cried? Why did you cry?
# Describe the guilt a dog feels after he ripped open the doggie bag without the permission of his owner.
# Write a letter of forgiveness (try to be honest)
# Accomplish silence, then write your stream of thought.
# Imagine yourself at your worst (angry, stressed, depressed, etc) and then have you at your best (happy, wholesome) soothe you.
# Write your stream of thought as soon as you wake up.
# Write a dream as soon as you wake up, then store it. One week later rewrite the dream without looking at the original dream. Compare.
# Form a cast of archetypes so that you can use them in dialogue.
# Describe small tweaks that you think would lead to vast improvements in the life of a person close to you.
# Do you remember the last time you lied? Why did you lie?
# Trim, shape and reorganize a stream of thought.
# Find the oldest piece of substantial text you've written, and become your own editor. Improve your piece and write tips for your former self.
# Play out inner conflict through characters
# Play out inner reconciliation through characters
# What are you grateful about today?
# Show and tell: describe a personal object that carries personal significance.
# Write about the shadows of light and the light of shadows (find the bad in the good and the good in the bad).
# Describe an emotional state in metaphor.
# Describe the day you will live tomorrow. When tomorrow comes, describe the day as it actually was. Contrast your expectation with your experience.
# Describe your day in reverse. Begin from the present moment and trace back the day 24 hours.
# Register your current experience taking into account senses and emotions: where you are, what do you see, what do you smell, where you are emotionally, how does it feel sitting on a chair, and so on.
# You did something really naughty and now you're on trial. Create a dialogue with these characters: a judge, the devil, an angel, and yourself.
# Describe the person who speaks in your head.
# Describe who you are in the most detailed and comprehensive way possible. Then remove everything that is non essential so your essence is recognized.
# Stoic exercise: rehearse responding to setbacks with wisdom. Choose a real recent example of a setback or frustration and write how you would have handled it in the wisest way possible.
# Describe the most embarrassing moment you're willing to admit, but write it in a humorous tone.
# Stand up and spin until you are dizzy. Describe the experience of dizziness while dizzy.
# Think about something that makes you uncomfortable and then do it. Describe the feeling of discomfort. Describe the outcome.
# Describe your inner experience in an altered state of mind.
# Describe your day, then remove everything that is routine. What remains?
# What do you think is your purpose in life?
# You inherit an empty house under the condition that you inhabit and furnish it within a year. You receive an allowance of $1,000 USD/mo to furnish the house. Describe in chronological order the things that you buy and the justification to buy them.
# Describe your perfect day
# Soothe yourself with acceptance
# Stoic exercise: meditate on the impermanence of everything
# Recreate an emotionally powerful moment you've had, but now multiply your feelings by ten.
# Recreate an emotionally powerful moment you've had, but now diminish your feelings to nearly nothing.
# Express inner experience in metaphor
# Write a letter of acceptance to yourself.
# Describe a character of complete competence.
# Describe a character of complete incompetence.
# Go inside a difficult feeling and confront it.
# Describe an imaginary dinner with someone you admire.
# Describe a dream you remember well, but from the perspective of another character within the dream
# Think about a long-lost friend from childhood. How is he or she as an adult?
# The embassy of Morocco demands an immediate apology for your behavior at last night's reception. You don't remember what happened
# If somebody asked an immediate family member to describe you, what would they say?
# Think about something that scares you, then describe yourself in a situation where you overcome it"
# During ten minutes, close your eyes and put attention on your breath. Each time you attention wanders, write down where it wandered
# Describe a day in the life of a dolphin from the first person perspective (as if it was you)"
# Think about a controversial issue you feel strongly about. Make a convincing argument for the other side
---
[[Philosopher Life Prompts|https://philosopher.life/#Draft%20of%20'Contrived%20Prompts%20Ideabag':Root%20Whirlwind%20%5B%5BLegal%20Notice%5D%5D%20%5B%5BDraft%20of%20'Contrived%20Prompts%20Ideabag'%5D%5D]]
* If you were dictator of the world, country, state, county, city, neighborhood, family, and any other archetypal governmental contexts (feel free to use lateral thinking in naming these contexts), what would you do? How would you lead?
* Why don't you follow philosophy like someone standardly interested in it? When you are obsessed with something, you usually enjoy reading every little thing about it. You don't do that with philosophy. Why not?
* Can you speak to the relationship between Moral Excellence, Excelllence of Personhood, Homo Sapien Excellence, etc.? For example, it seems completely possible that the pursuit of morality taken to maximum excellence will drive a person crazy. I legitimately think that people who are sane aren't trying hard enough to be moral.
//I did not generate this list. To whatever degree it makes sense to say it, I'm trying to be objective in answering questions I didn't ask.//
# [[What is your interpretation of one of your recent dreams?|2021 03 03 Interpretación de un sueño reciente]]
# What does death teach us about life?
# When you look at an elderly person's hands what do you see?
# Which disease known to humankind do you hate the most? Explain why.
# What was your last dream about?
# What seemed unusual on your morning commute today?
# Tell me about an old friend you've lost touch with.
# What's your earliest holiday memory?
# What's your favorite charitable cause and why?
# What do you think your life will be like ten years from now?
# What actor would you hire to play you in your TV movie biography, and why?
# If you died tomorrow, what would you most be remembered for?
# Name three people whose lives have been improved by knowing you, and explain why.
# If your life was a reality TV show, what would be the hook that would draw viewers in?
# When was the last time you cried?
# What is the earliest memory you have of a sibling?
# What is the earliest photograph of yourself that you have that you remember when it was taken?
# What is the longest you've had a "borrowed" item but not been able to return it because they moved?
# What did you eat as a child that you can't stand now as an adult?
# What is one thing that happened today that I really want to remember 10 years from now?
# Did I do something today that I can be proud of?
# What is one thing that I am grateful for today?
# Did something happen to make me sad?
# Who is the one relative that I miss the most?
# What would I say to them if I could see them again?
# Why is it important to be genuine?
# Why do you think wars exist in the world?
# Why would we say that someone is "bananas"?
# Why do you think ability to focus is an important quality?
# Explain why we say, "Dead as a door nail".
# How do you feel about using humans in medical research?
# What does "copy cat,? mean to you?
# What do you think about quasi ghosts?
# What does "holds water? mean to you?What is your first memory?
# How did you meet your first boyfriend or girlfriend?
# Describe your typical day, from wake to sleep.
# What would be your ideal birthday present, and why?
# If you could take home any animal from the zoo, which would it be, and what would you do with it?
# Think of a loved one that you have lost. If you could ask this person one question, what would you ask, and what do you think they would say?
# Where do you think you will be in five years?
# If you were to die today what would like people to say about you?
# What is your proudest accomplishment?
# If you could be anybody, who would you be?
# What is the most important aspect of your life and why?
# Where would you travel, if you could go anywhere?
# What time period you would like to be born in?
# What extinct animal would you bring back, if you could?
# What profession would you have chosen, if not your current one?
# What book setting would you like to visit, if you could?
# Given the chance to give your child only one quality as a person, which would you choose? How about if that choice were unavailable, what would be your second and maybe third choices? Why are these so important to you?
# Which superpower would you choose to have if you had the option and why? Conversely, which superhero do you find to be the most overrated and why?
# You have one week to do whatever you want, all-expenses-paid, what things would you want to do? Where would you go?
# If your best friend came to you depressed and upset like you've never seen before, how would you react?
# In what ways do you sometimes wish to act to be a better friend, but don't? Why do you find yourself unable to do these things?
# You have one hour to come up with the most interesting television show you can and describe/pitch it.
# "If someone gains, someone else loses." How much does this reflect life, and how much does it come up short. Reflecting upon this, how could your attitudes have been different during events in your past?
# Would you be a different person today if you had a different childhood? How?
# Consider some of the parents others had growing up. What type of person would you be if you had those situations?
# What if your life had been harder or easier? How do you think you'd be different?
# Am I happy with my job, life, and situation? What parts are good? What parts are bad?
# If I could change one thing about my spouse/lover, what would I change?
# What is the greatest vacation I have taken and what lessons can I take from it?
# If you won a million dollars but had to give it all away, who would you give it to and why?
# What was your first pet? Why did you choose this pet?
# If you could build a car customized just for you, what would it contain?
# What did you want to be when you grew up?
# If you had to write your life story, what would the title be? Why?
# How do you feel when you see something beautiful? Have you ever seen something so beautiful it makes you cry?
# What are you thankful for?
# This morning, when I got out of bed, I ?.. Before bed tonight, I will?.
# What do you think about as you are falling asleep?
# What is the most beautiful thing you have ever seen?
# What is your favorite thing to do outdoors? Why?
# What would you write in a letter you could send back in time to yourself as a teen-ager?
# What would you write in a letter you could send forward in time to yourself in 10 years?
# When did you first realize you would someday be old or someday die?
# Describe what it was like to fall in love.
# Explain how you chose your career path.
# When have you realized you were really wrong in your judgment about someone?
# How do you react when you realize you've made a mistake?
# What situation has caused you to confront your ethics recently?
# If you had to sacrifice one of your senses (taste, touch, smell, sight, hearing), which would you choose and why?
# What about a goal makes you most likely to procrastinate?
# What would it be like to be in a tornado?
# Where would you go to relax and why?
# How do you make ice cream?
# Why does the ocean have a tide?
# Who has more power the government or the people?
# Did I recently have an interesting conversation?
# What is a scary dream that I remember from my past?
# Who is the person that I feel has altered the course of my morals and values, and how did they effect me?
# Where do I see myself, so far as my goals, personal development, residence, or job, in five years, and do I have a plan to arrive at this destination?
# What is my earliest or happiest memory?
# Which amendment to the constitution is the most important to you and why?
# Is speech always free? When and where might it not be free?
# Put yourself in Anne Frank's place how would you have survived?
# If you witnessed a fight at school would you report it? What could the repercussions be if you told the truth?
# What was(will be) the first thing that you did(do) when you got your driver's license?
# What would you do if you woke up one morning with a tail?
# How would you react if you were to find out you would be the first child in space?
# Who would you most like to be like if you could change your personality?
# If you were born in another time, what time would you choose and why?
# Where would you most like to watch the sun come up? Why?
# How do you think instant riches would affect your friendships and familial relationships?
# How do you think sudden loss of millions would affect your familial relationships and friendships?
# How do you imagine humans would move to Mars in the event of world wide catastrophe?
# If you were elected President, what do you think would be your most difficult tasks?
# Describe something you feel most passionate about to a complete stranger.
# Describe your favorite memory about an amusement park or county fair you visited.
# When was the last time you lied and why.
# What was your closest brush with death.
# Where would you want to live if Earth was uninhabitable.
# Remember the last time you spoke to a person who later died.
# If you were to die tomorrow, what would you want your last words to be?
# Write about the last time weather scared you.
# Who was the best teacher you ever had, and why?
# Describe your favorite sound.
# When were you the happiest this year?
# What would you do on a snow day?
# What are you saving up for?
# What caused me to wince today?
# Who did I run in to today that I would like to spend more time with?
# What tempted me today?
# What yes or no questions should I decide by flipping a coin?
# What trait did you admire in a relative, friend, classmate, or coworker today?
# How do you feel when you stare at the stars?
# What would you say to your loved ones if you could tell them absolutely anything?
# If you could tell your boss what you really want to do in your job, what would it be?
# How are you going to make tomorrow a joyful day?
# Recall a place, person or event, what emotion do you remember feeling most strongly?
# If you could return in time to a set time to relive it, but not change anything, what would you choose and why?
# What is your strongest memory, as a child, of your parents and what were you all doing at the time?
# You are given 24 hours to do whatever you would like, money no object. What do you do and why?
# You have to invite 5 people to dinner, dead or alive. Who do you invite and why?
# What makes your favorite song so special? How do you personally relate to it?
# What are some colors you see the most in your every day life?
# What is your fondest memory of an animal or pet you once had?
# If you could go back and relive one of your past trips, whom from your current entourage would you take with you?
# What happens in the latest movie you saw?
# Can you picture yourself in the shoes of any of the protagonists?
# What is the best gift you've ever given someone? Why? Why do you like/dislike the city where you live?
# What's your most treasured memory from high school?
# Which friend has had the greatest impact on your life and why?
# Which photo of yourself do you hate the most, and why?
# Who inspires you the most, and why?
# Can you buy happiness?
# Imagine you're stuck on the roof of a house that has been carried away by a flood. Which person would you most like to be on the roof with you?
# Which would you choose: immense wealth in obscurity or poverty and fame (think "starving artist")?
# What animal do you identify with most closely?
# What is your favorite season and why?
# Imagine you are attending your dream concert?what songs would you want to be played? What does the stage look like?
# What's your favorite place to escape from life temporarily? A park? A mall?
# What's one job you would never want to do?
# Has a friend ever broken something or yours? How did you react?
# What's the best memory you have from the last year?
# How do you feel about politicians openly sharing their religious beliefs?
# What characteristics or personality traits are most important to you in a politician?
# If you could trade places with a famous person for a day, who would you like to be and why?
# If you could learn any new language, which one would you choose and why?
# If you had to choose between having a personal chef, a housekeeper, or a personal trainer, which would you pick and why?
# What is the weather like today? How do you feel about it?
# What season do you like best?
# What do you wish you could tell someone, and who do you wish you could tell?
# When you close your eyes and think of where you want to live, what comes to the surface? Specifically, what do you want your space to look like? And what do you think that reflects about you?
# If you don't believe in reincarnation, forget about that for a minute. What would you like to be reincarnated as? What do you think you WOULD be reincarnated as, if karma had its way with you?
# What are things that you wish people knew about you without your having to tell them?
# What are a few qualities you dislike in other people, and why?
# What music makes you want to get up and dance? Why don't you?
# If you need inspiration and put on your favorite CD, which one is it? What is your favorite song on this CD? Why do these lyrics "speak" to you? If you met the artist, what would you ask him? If you could be in the front row, where would you see him/her in concert?
# If you were in the band, what instrument would you be playing?
# When do you think about your regrets the most often?
# What is your most prized possession?
# What is your favorite lie to tell?
# Who do you live for?
# What is a secret about you?
# What family item has changed your view or ideas about a family member?
# Write about your best friend as if they were a stranger.
# If you could build a soundtrack to your life, who would be on it?
# If you suddenly gained the ability to tell whether someone was lying, would you use it?
# How would handle life in an arctic climate?
# Describe your perfect career or job. Where would it be? Would you want financial or pe